CTabCtrl本次用途:CTabCtrl用来实现同一个DLG加载多个DLG功能,即在A对话框中可以通过标签将BCDE。。。对话框嵌入进来。
问题1:原对话框有底色,如何使得整个对话框颜色统一?
解决办法,继承CTabCtrl,重载OnEraseBkgnd函数。当然VC6通过ctrl+W加入。内容如下:
CBrush br(RGB(245,255,255));
CRect rc;
GetClientRect(rc);
pDC->FillRect(rc, &br);
return true;
在主对话框中使用继承的类来进行对象实例化。Then.Perfect!
问题2:Tab标签丑陋,希望加入自己绘制的按钮?
解决办法:在对话框中加入tabCtrl,实例化对象,改为上面描述的类。在OnInitDialog方法内。需要几个标签创建几个按钮,下面代码为m_BTN1-4,内嵌对话框,首先将style改为child,然后下文中m_tab_1-3为3个不同对话框在该类中的成员变量。最后将按钮移入该放入的位置.
CRect rs;
m_tab.GetClientRect(&rs);
rs.top+=32;
rs.bottom-=0;
rs.left+=0;
rs.right-=0;
m_tab.InsertItem(0,"");
m_tab.InsertItem(1,"");
m_tab.InsertItem(2,"");
m_tab.InsertItem(3,"");
m_tab_1.Create(IDD_Login,&m_tab);//或者Create(IDD_DIALOG1,GetDlgItem(IDC_TAB1));
m_tab_2.Create(IDD_Search,&m_tab);
m_tab_3.Create(IDD_BBS,&m_tab);
m_tab_1.MoveWindow(&rs);
m_tab_2.MoveWindow(&rs);
m_tab_3.MoveWindow(&rs);
m_tab_1.ShowWindow(true);
m_tab_2.ShowWindow(false);
m_tab_3.ShowWindow(false);
m_BTN1.LoadBitmaps(IDB_TOPLOGIN,IDB_TOPLOGIND,NULL,IDB_TOPLOGIND);
m_BTN2.LoadBitmaps(IDB_TOPSer,IDB_TOPSerD,IDB_TOPSerF,IDB_TOPSerD);
m_BTN3.LoadBitmaps(IDB_TOPBBS,IDB_TOPBBSD,IDB_TOPBBSF,IDB_TOPBBSD);
m_BTN4.LoadBitmaps(IDB_TOPBUY,IDB_TOPBUYD,NULL,IDB_TOPBUYD);
CRect rectItem;
for(int j=0; j< m_tab.GetItemCount();j++)
{
m_tab.GetItemRect(j, rectItem);
rectItem.top=75;
rectItem.bottom=105;
switch(j){
case 0:
m_BTN1.MoveWindow(rectItem);
break;
case 1:
m_BTN2.MoveWindow(rectItem);
break;
case 2:
m_BTN3.MoveWindow(rectItem);
break;
case 3:
m_BTN4.MoveWindow(rectItem);
break;
}
添加按钮响应函数:如下发送消息来切换内嵌对话框
m_tab.SetCurSel(2);
NMHDR nm;
nm.hwndFrom = m_tab.m_hWnd;
nm.code = TCN_SELCHANGE;
SendMessage(WM_NOTIFY,IDC_TAB1,(LPARAM)&nm);
添加OnSelchangeTab1:
switch(m_tab.GetCurSel())
{
case 0:
if(IsLogin){
break;
}
m_tab_1.ShowWindow(true);
m_tab_2.ShowWindow(false);
m_tab_3.ShowWindow(false);
break;
case 1:
if(!IsLogin){
break;
}
m_tab_1.ShowWindow(false);
m_tab_2.ShowWindow(true);
m_tab_3.ShowWindow(false);
break;
case 2:
if(!IsLogin){
break;
}
m_tab_1.ShowWindow(false);
m_tab_2.ShowWindow(false);
m_tab_3.ShowWindow(true);
break;
}
*pResult = 0;