返回首页

{A}{S0}简介{BR这种控制是CWnd类的基础上,可放置一个子窗口的任何地方,例如在客户区的框架或对话框。标签可以将子窗口的顶部或底部。用户可以使用鼠标拖动制表符。控制变焦(标签萎缩)和滚动标签模式。此外,如果有一个选项卡的标签领域都可以隐藏。使用代码
子窗口中添加使用的HWND,他们可以是任何类型,例如无模式对话框。 TabCtrl包括三个方面:控制区,标签区,窗户面积。
以创建控制和添加元素,你可以做下面的步骤:

  TabCtrlEx<tabctrlstyle_vs2003_client /> m_TabCtrl;

  CListCtrl m_List1, m_List2, m_List3;

  

  ...

  ...

  

  // Creation and initialization of TabCtrl.

  if(m_TabCtrl.Create(this,WS_CHILD | WS_VISIBLE,

  	CRect(0,0,0,0),100/*id of TabCtrl*/)==false) return -1;

  m_TabCtrl.SetBehavior(TAB_BEHAVIOR_SCROLL);

  

  CImageList imagelist, imagelistSys;

  CBitmap bmp, bmpSys;

  

  imagelist.Create(16,16,ILC_COLOR24 | ILC_MASK,3,0);

  bmp.LoadBitmap(IDB_BITMAP1);

  imagelist.Add(&bmp,RGB(255,0,255));

  

  imagelistSys.Create(14,14,ILC_COLOR24 | ILC_MASK,7,0);

  bmpSys.LoadBitmap(IDB_BITMAP2);

  imagelistSys.Add(&bmpSys,RGB(255,0,255));

  

  m_TabCtrl.SetImageLists(&imagelist,NULL);

  m_TabCtrl.SetSystemImageList(&imagelistSys);

  

  // Creation of child windows.

  if(m_List1.Create(WS_CHILD | WS_CLIPCHILDREN | LVS_SHOWSELALWAYS | 

  		LVS_REPORT,CRect(0,0,0,0),&m_TabCtrl,2001)==0 ||

     m_List2.Create(WS_CHILD | WS_CLIPCHILDREN | LVS_SHOWSELALWAYS | 

     		LVS_REPORT,CRect(0,0,0,0),&m_TabCtrl,2002)==0 ||

     m_List3.Create(WS_CHILD | WS_CLIPCHILDREN | LVS_SHOWSELALWAYS | 

     		LVS_REPORT,CRect(0,0,0,0),&m_TabCtrl,2003)==0)

     return -1;

     

  // Initialization of child windows.

  m_List1.InsertColumn(0,_T("Mail"),LVCFMT_LEFT,100);

  m_List1.InsertItem(0,_T("Mail 1"));

  m_List2.InsertColumn(0,_T("Calendar"),LVCFMT_LEFT,100);

  m_List2.InsertItem(0,_T("Calendar 1"));

  m_List3.InsertColumn(0,_T("Contacts"),LVCFMT_LEFT,100);

  m_List3.InsertItem(0,_T("Contact 1"));

  

  // Attaching of child windows to the TabCtrl.

  if(m_TabCtrl.Add(m_List1,_T("1.Mail"),0)==NULL ||

     m_TabCtrl.Add(m_List2,_T("2.Calendar"),1)==NULL ||

     m_TabCtrl.Add(m_List3,_T("3.Contacts"),2)==NULL)

     return -1;

     

  // Load state from registry and update.

  m_TabCtrl.LoadState(AfxGetApp(),_T("TabCtrl"),_T("State"));

  m_TabCtrl.Update();

类TabCtrl不执行任何渲染。对于它的绘图,它调用TabCtrlDraw接口的功能。在一般情况下,设置,你需要创建一个从接口ITabCtrlStyle继承的对象和一个指针传递给它的风格TabCtrl,使用的功能InstallStyle。这个接口应该提供一个指针TabCtrlDraw绘图,ITabCtrlRecalc指定其区域的大小和间距,ITabCtrlBehavior正确行为的控制和ITabCtrlToolTip定义自定义标签和按钮的工具提示。样式类的对象必须存在过程中的控制工作。要做到这一点,你可以创建一个像TabCtrlComplex这样的中间阶层。如果你只有一个样式,然后用模板类TabCtrlEx。例如,作为模板参数定义的样式类的名称是:{C}
有些款式已创建。例如,风格类似的工作文件和停靠/浮动面板在Visual Studio 2003,2008和2010年的标签。要创建自己的样式,请参阅类TabCtrlStyle_VS2003_client,TabCtrlStyle_VS2003_bars,TabCtrlStyle_VS2008_client_classic等类TabCtrlRecalcStub和TabCtrlBehaviorStub创建一个默认的功能ITabCtrlRecalc和ITabCtrlBehavior接口分别实施。您可以使用它们来创建自己的风格对象。
控制需要更新(真)的调用后添加或删除选项卡,以及更改其属性和状态。
如果不完全可见,并允许工具提示(ToolTipEnable)和鼠标光标在标签的标签的文本,然后工具提示显示其文本。但是,如果被称为功能SetTabTooltipText,那么指定的文本显示始终。
控制不发送消息到父窗口,并使用事件通知接口TabCtrlNotify。使用SetNotifyManager设置指针到您的TabCtrlNotify实施。
默认情况下,所有的绘制是基于双缓冲,它排除了任何闪烁。如果你想使用VirtualWindow:DoubleBuffering(假)禁止双缓冲。
好运气。历史第28届,2010年5月初始版本六月十日,2010年新增的子窗口重定向WM_NOTIFY消息TabCtrl控制的父六月十二日,2010年更正的错误显示工具提示。

回答

评论会员:会员8500817 时间:2012/01/26
第一,有了这个源

我所看到的,它是很好的来源

无论如何,我想知道如何才能创建选项卡上的CTRL splitView?

我等待的答案。

看到你
评论会员:Borodenko奥列格 时间:2012/01/26
也许它会帮你(从"lxshanye'后):

#include 

CListView *pListView;

 

...

 

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{  if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;

...

   if(m_TabCtrl.Create(this,WS_CHILD | WS_VISIBLE,CRect(0,0,0,0),AFX_IDW_PANE_FIRST)==false) return -1;

...

   pListView = (CListView *)RUNTIME_CLASS( CListView )->CreateObject();

   pListView->Create(NULL, NULL, WS_CHILD | WS_CLIPCHILDREN | LVS_SHOWSELALWAYS | LVS_REPORT,CRect(0,0,0,0), &m_TabCtrl, id);

... 

   m_TabCtrl.Add(*pListView,_T("1.Mail"),0);

...

   return 0;

}


评论会员:Yonghwi权 时间:2012/01/26
这是我见过的最好的控制
评论会员:!AlbertXiao 时间:2012/01/26
!它的美丽感谢您分享
评论会员:Dansveen 时间:2012/01/26
,这对我来说是非常有用的!
评论会员:Borodenko奥列格 时间:2012/01/26


我怎样才能把关闭按钮"选项卡上?

感谢
评论会员:hpking 时间:2012/01/26

有没有这样的功能
评论会员:valenfour 时间:2012/01/26
?为什么不添加一个
呵呵,好
评论会员:!valenfour 时间:2012/01/26
伟大的代码,很多的选择,运作良好,作者是响应的问题仍然
评论会员:!Borodenko奥列格 时间:2012/01/26
我是你的代码工作今日(优秀BTW)和一直有这个错误,而调试。看着它,我相信其64bit/32bit的问题,所以我知道我必须处理的东西。这是我还没有触及的领域很多,虽然我已经看到这个错误之前,知道它不会影响发行模式,我很好奇,如果你有什么秘诀。

它给我上绘制的问题:PixelAlpha (...)和Draw:DrawGradient(..)

在发布模式下进行编译时,这些都是产生运行时上述问题的警告... ...我应该怎么铸造下来?

1gt; \ TabCtrl.cpp(934):警告C4267:"回归":从"为size_t"转换到"int"的数据
可能发生的损失1gt; \ TabCtrl.cpp(954):警告C4267:"初始化":从"为size_t"转换到"int"的数据
可能发生的损失1gt; \ TabCtrl.cpp(1390):警告C4244:"回归":从"__w64 INT"转换到"int"的,可能丢失数据
1gt; \ TabCtrl.cpp(1440):警告C4244:'=':从"__w64 INT"转换到"int"的,可能丢失数据

任何提示表示赞赏。 ,

V.
评论会员:valenfour 时间:2012/01/26
是,它是我的不准确,我没有使用Wp64编译时的标志。你应该正确:

  return width + (int)m_vtrtabs.size()*(rcTabHorzMargin.left+rcTabHorzMargin.right);

instead of

  return width + m_vtrtabs.size()*(rcTabHorzMargin.left+rcTabHorzMargin.right);

 

  if(*i==HNDLtoPTR(hTab)) return (int)(i-m_vtrtabs.begin());

instead of

  if(*i==HNDLtoPTR(hTab)) return i-m_vtrtabs.begin();

感谢消息
评论会员:lxshanye 时间:2012/01/26
我一直致力于与您控制,我说你给上面的那些行。不过,我仍然看到在Draw.h两个地方,在第94行和162行这个错误。这是该方法返回RGB线(在Draw.h 162)发生错误:

	

	static COLORREF PixelAlpha(COLORREF src, COLORREF dst, int percent)

	{	int ipercent = 100 - percent;

		return RGB(

			(GetRValue(src) * percent + GetRValue(dst) * ipercent) / 100,

			(GetGValue(src) * percent + GetGValue(dst) * ipercent) / 100,

			(GetBValue(src) * percent + GetBValue(dst) * ipercent) / 100);

	}


不幸的是,我还是新的COLORREF的位掩码。但是从阅读的代码,你正在服用两个独立的COLORREF(DWORD),并将其转换到这里,使之一。创建一个较小的数据类型转换为。 MS的运行时错误,建议使用像这样:


char c = (i & 0xFF); 


为了掩盖/投下来。我已经尝试了各种方法,但我有没有运气。我不知道什么面膜使用,是否掩盖每一个人呼吁GetXValue或面具作为一个整体的RGB调用。

任何人都可以帮助了解一些,我想就如何掩盖下来摆脱运行时错误?任何想法表示赞赏和再伟大的文章和代码!


编辑尝试在更精确的问题。修改日(星期四),2011年2月10日下午06:51
评论会员:Borodenko奥列格 时间:2012/01/26
在此TabCtrl,如何添加到TabCtrlEx(m_TabCtrl)查看(如FormView的,EditView)
评论会员:?peinanh 时间:2012/01/26
C6}
评论会员:futurejo 时间:2012/01/26
非常好
评论会员:apopa 时间:2012/01/26
这是一个很好的的计划

谢谢
评论会员:linhai123 时间:2012/01/26
!喜奥列格

非常好的工作,你在这里。有一件事我认为是缺少...
这将是很好也有TAB_LAYOUT在垂直位置和两个新的
像TAB_LAYOUT_LEFT TAB_LAYOUT_RIGHT这样的常数。

谢谢您分享您的工作与我们联系

的问候,
安德烈
评论会员:。VUnreal 时间:2012/01/26
好,我只需要你这么多
this.thank
评论会员:!muou55555 时间:2012/01/26
看起来类似微软的控制
评论会员:Borodenko奥列格 时间:2012/01/26
它显示"tatal错误LNK1120 "当"TabCtrlEx m_TabCtrl"added.I不知道reason.What是我用错?感谢您的回答
评论会员:fele陈 时间:2012/01/26
你的东西忘了做。 Сompare您的项目的测试项目。你添加的TabCtrl.cpp文件和"#包括"在你的项目TabCtrl.h文件
评论会员:?hui168 时间:2012/01/26
尼斯工作
评论会员:。Borodenko奥列格 时间:2012/01/26
为什么不支持CDialog的?? IMG SRC ="/脚本/论坛/图片/ smiley_confused.gif"对齐="顶"ALT ="糊涂|:困惑:"/> 修改,2010年7月26日(星期一)下午03:49
评论会员:hui168 时间:2012/01/26
"添加子窗口使用的HWND,他们可以是任何类型,例如无模式对话框,"

看标签上的"无模式对话框"。但对话框必须是无模式
评论会员:。 时间:2012/01/26