1 VC中TabControl控件使用方法
(1) 添加Tab Control控件並在Property屬性中設置ID為IDC_TAB,添加變量m_tabctrl,類型為CTabCtrl。
(2) 在對話框的初始化函數OnInitDialog里面添加如下代碼:
m_tabctrl.InsertItem(0, "memo0"); //添加參數一選項卡
m_tabctrl.InsertItem(1, "memo1"); //添加參數二選項卡
(3) 在對話框中添加兩個對話框資源,設置好ID,屬性設置為style:Child,Border為None,再適當調整寬度到適中尺寸,然后添加對應的基於CDialog類Cpara1,Cpara2.
(4) 在主工程類中添加兩個成員變量m_para1,m_para2.分別是鏈兩個子對話框的實例,代碼如下:
Cpara2 m_para2;
Cpara1 m_para1;
(5) 布置IDD_PARA1和IDD_PARA2
(6) 在主類中初始化部分添加代碼
//關聯對話框,並且將IDC_TABEST空間設為父窗口
m_para1.Create(IDD_PARA1, GetDlgItem(IDC_TAB1));
m_para2.Create(IDD_PARA2, GetDlgItem(IDC_TAB2));
//獲得IDC_TABTEST客戶區大小
Crect rs;
m_tabctrl.GetClientRect(&rs);
//調整子對話框在父窗口中的位置
rs.top += 20;
rs.bottom -= 20;
rs.left += 1;
rs.right -= 2;
//設置子對話框尺寸並移動到指定位置
m_para1.MoveWindow(&rs);
m_para2.MoveWindow(&rs);
//設置默認的選項卡
m_tabcrtl.SetCurSel(0);
(7)添加Tab Control空間的TCN_SELCHANGE事件響應函數OnSelchangeTabtest(…),代碼如下:
int CurSel = m_tabctrl.GetCurSel();
switch(CurSel)
{
case 0:
m_para1.ShowWindow(true);
m_para2.ShowWindow(false);
break;
case 1:
m_para1.ShowWindow(false);
m_para2.ShowWindow(true);
break;
default:
break;
*pResult = 0;
}
完成~
2 基於對話框添加工具欄
(1)在資源編輯器中插入工具條資源,並為每個按鈕創建ID,將它命名為IDC_TOOLBAR
(2)在對話框變量中添加一個工具條變量
CtoolBar m_wndToolBar;
(3)在初始化中添加如下代碼
if(!m_wndToolBar.Create(this) || !m_wndToolBar.LoadBar(IDR_TOOLBAR))
{
TRACE(“Failed to Create Dialog Toolbar\n”);
EndDialog(IDCANCEL);
}
Crect rcClientOld; //客戶區RECT
Crect rcClientNew; //加入TOOLBAR后的客戶區RECT
GetClientRect(rcClientOld);
//重新計算RECT大小
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,
AFX_IDW_CONTROLBAR_LAST,
0,
reposQuery,
rcClientNew);
//計算移動的距離
Cpoint ptoffset(rcClientNew.left – rcClient.left,
rcClientNew.top – rcClient.top);
CRect rcChild;
CWnd* pwndChild = GetWindow(GW_CHILD);//得到子窗口
while(pwndChild)// 處理所有子窗口
{
//移動子窗口
pwndChild -> GetWindowRect(rcChild);
ScreenToClient(rcChild);
rcChild.OffsetRect(ptOffset);
pwndChild -> MoveWindow(rcChild, FALSE);
pwndChild = pwndChild -> GetNextWindow();
}
CRect rcWindow;
GetWindowRect(rcWindow); //得到對話框的RECT
rcWindow.right += rcClientOld.Width() – rcCilentNew.Width(); //修改對話框尺寸
rcWindow.bottom += rcClientOld.Height() – rcCilentNew.Height();
MoveWindow(rcWindow, FALSE);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,
AFX_IDW_CONTROLBAR_LAST,0);
(4)為每個TOOLBAR子項添加按鈕
(5)為每個按鈕添加消息響應函數ON_BN_CLICKED(ID_BUTTON, OnButton);
(6)頭文件件定義afx_msg void OnButton()
OK ~
//簡單的如下
m_Toolbar.Create(this);//創建工具欄控件
m_Toolbar.LoadToolBar(IDR_TOOLBAR1);//裝載工具欄資源
//該函數用於顯示工具欄,並根據窗口大小自動調整工具欄的位置
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
2.1 工具欄按鈕上顯示真彩位圖
上例中工具欄按鈕顯示的圖形,不能超過256,以上方法無法顯示真彩位圖.使用SetImageList
(1)添加6張位圖,設定ID分別為IDB_BITMAP1, IDB_BITMAP2, IDB_BITMAP3, IDB_BITMAP4, IDB_BITMAP5, IDB_BITMAP6,大小為50*38
(2)在對話框中添加兩個成員變量
CToolBar m_Toolbar;
CimageList m_imageList;
(3)在對話類中添加以下宏定義
#define ID_BUTTON1 501
#define ID_BUTTON1 502
#define ID_BUTTON1 503
#define ID_BUTTON1 504
#define ID_BUTTON1 505
#define ID_BUTTON1 506
(4)對話框初始化OnInitDialog下添加語句
m_ImageList.Create(50,38,ILC_COLOR24|ILC_MASK,1,1);//圖片大小必須一致
CBitmap bmp;
for(int i=0;i<6;i++)
{
bmp.LoadBitmap(IDB_BITMAP1 + i);
m_ImageList.Add(&bmp,RGB(255,255,255));
bmp.DeleteObject();
}
UNIT nArray[6];
for(int i=0;i<6;i++)
{
bArray[i] = ID_BUTTON1 + i;
}
//創建工具控件CreateEx函數創建的工具欄,默認有浮動按鈕屬性
m_Toolbar.CreateEx(this);
//創建6個工作按鈕並設定ID,對應nArrary數組的元素
m_Toolbar.SetButtons(nArray, 6);
//按鈕比圖像要大具體要大7以上
m_Toolbar.GetToolBarCtrl().SetImageList(&m_ImageList); RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
如果要設置按鈕顯示文本的話,就是CToolBar類的 SetButtonText函數
2.2 設置工具欄背景位圖
用CReBar類可以實現在工具欄背景里顯示位圖,可以把工具欄設置成CReBar類對應的子窗口,以上面的工程為例子,再在對話類里添加一個成員變量: CReBar m_Rebar;接着導入一張位圖,用做工具欄的背景,ID號為ID_TOOLBACK,然后在OnInitDialog函數的RepositionBar(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);語句前面添加如下語句:
m_Rebar.Create(this);//創建窗口(控件)
m_Rebar.AddBar(&m_Toolbar);//添加m_Toolbar為子窗口
m_Rebar.RedrawWindow();//重畫窗口
REBARBANDINFO info;
info.cbSize=sizeof(info);
info.fMask=RBBIM_BACKGROUND;
m_Toolbar.ModifyStyle(0,TBSTYLE_TRANSPARENT);//設置工具欄背景色透明
info.hbmBack=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_TOOLBACK));//加載位圖
m_Rebar.GetReBarCtrl().SetBandInfo(0,&info);
2.3 為工具欄添加鼠標按鈕停留信息
以上面的工程為例子,在對話類里添加一個成員變量CString str;接着在m_Toolbar調用CreateEx函數后,調用這個語句: m_Toolbar.EnableToolTips();//激活信息提示功能
然后在對話類里添加一個成員函數(用於TTN_NEEDTEXT消息處理函數),格式如下:
BOOL OnDisplay(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
然后添加TTN_NEEDTEXT消息映射宏
ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnDisplay)
OnDisplay函數代碼如下:
TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
UINT nID=pNMHDR->idFrom;//獲取工具欄按鈕ID
UINT nIndex = m_Toolbar.CommandToIndex(nID);//根據按鈕ID獲取索引
str.Format("工具欄按鈕%d",nIndex);
pTTT -> lpszText = str.GetBuffer(str.GetLength());//設置按鈕提示信息
pTTT -> hinst = AfxGetResourceHandle();
return TRUE;
2.4 工具欄按鈕顯示圖標
首先向工程引入六個圖標,假設ID號分別為IDI_ICON1、IDI_ICON2....IDI_ICON6
以上面的工程為例:在OnInitDialog函數最后添加如下代碼:
m_ImageList.Create(48,48,ILC_COLOR24|ILC_MASK,1,1);//圖片大小必須一致
for(int i=IDI_ICON1;I <= IDI_ICON6; i++)
m_ImageList.Add(AfxGetApp()->LoadIcon(i));//添加圖標
UINT nArray[6];
for(i=0;i<6;i++)
{
nArray[i]=ID_BUTTON1+i;
}
m_Toolbar.CreateEx(this);//創建工具欄控件
m_Toolbar.EnableToolTips();//激活信息提示功能
m_Toolbar.SetButtons(nArray,6);
m_Toolbar.SetSizes(CSize(60,56),CSize(48,48));
m_Toolbar.GetToolBarCtrl().SetImageList(&m_ImageList);
m_Rebar.Create(this);
m_Rebar.AddBar(&m_Toolbar);
m_Rebar.RedrawWindow();
REBARBANDINFO info;
info.cbSize=sizeof(info);
info.fMask=RBBIM_BACKGROUND;
m_Toolbar.ModifyStyle(0,TBSTYLE_TRANSPARENT);//設置工具欄背景色透明
info.hbmBack=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_TOOLBACK));
m_Rebar.GetReBarCtrl().SetBandInfo(0,&info);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
2.5 設置工具欄按鈕熱點圖片
像前面的SetImageList函數設置工具欄按鈕正常顯示時的圖片,而SetHotImageList函數是設置工具熱點按鈕圖片,也就是當鼠標停留在按鈕上所顯示的圖片,用法跟SetImageList函數一樣,只是CImageList類關聯的圖片不一樣.
為了顯示熱點按鈕圖片,我們得准備兩組圖片,一組用於正常顯示,一組用於熱點顯示。這里我的圖片格式是圖標。還有一點要說明的是,工具欄必須具有TBSTYLE_FLAT(浮動按鈕)屬性,這一點在用CreateEx函數創建工具欄的時候,已經默認包含了.
首先向工程引入這十二個圖標:假設正常顯示的圖標ID號依次為:IDI_NORMAL1、IDI_NORMAL2、。。。IDI_NORMAL6
熱點圖標ID依次為:IDI_HOT1、IDI_HOT2、。。。IDI_HOT6
然后引入背景位圖,ID號為IDB_TOOLBACK
做完了這些,我們就向對話類里添加四個成員變量:
CToolBar m_Toolbar;
CImageList m_ImageList;
CImageList m_hotImageList;
CReBar m_Rebar;
然后增加五個宏定義:
#define ID_BUTTON1 501
#define ID_BUTTON2 502
#define ID_BUTTON3 503
#define ID_BUTTON4 504
#define ID_BUTTON5 505
接着在OnInitDialog函數添加如下代碼:
m_ImageList.Create(48,48,ILC_COLOR24|ILC_MASK,1,1);//圖片大小必須一致
m_hotImageList.Create(48,48,ILC_COLOR24|ILC_MASK,1,1);
for(int i=0;i<5;i++)
{
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_NORMAL1+i));
m_hotImageList.Add(AfxGetApp()->LoadIcon(IDI_HOT1+i));
}
UINT nArray[5];
for(i=0;i<5;i++)
{
nArray[i]=ID_BUTTON1+I;
}
m_Toolbar.CreateEx(this);//創建工具欄控件
m_Toolbar.SetButtons(nArray,5);
m_Toolbar.SetSizes(CSize(60,56),CSize(48,48));
m_Toolbar.GetToolBarCtrl().SetImageList(&m_ImageList);
m_Toolbar.GetToolBarCtrl().SetHotImageList(&m_hotImageList);
m_Rebar.Create(this);
m_Rebar.AddBar(&m_Toolbar);
m_Rebar.RedrawWindow();
REBARBANDINFO info;
info.cbSize=sizeof(info);
info.fMask=RBBIM_BACKGROUND;
m_Toolbar.ModifyStyle(0,TBSTYLE_TRANSPARENT);//設置工具欄背景色透明
info.hbmBack=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_TOOLBACK));
m_Rebar.GetReBarCtrl().SetBandInfo(0,&info);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
2.6 CtoolBarCtrl 工具欄控制類
引入四個圖標文件到工程里,然后在對話框類定義兩個變量:
CImageList m_ImageList;
CToolBarCtrl m_TBarCtrl;
然后在OnInitDialog函數添加如下代碼:
TBBUTTON button[4];
m_ImageList.Create(32,32,ILC_COLOR32|ILC_MASK,0,0);
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON3));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON4));
m_TBarCtrl.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,1200);
m_TBarCtrl.SetImageList(&m_ImageList);
for(int i=0;i<4;i++)
{
button[i].fsState=TBSTATE_ENABLED;
button[i].fsStyle=TBSTYLE_BUTTON;
button[i].iBitmap=i;
}
m_TBarCtrl.AddButtons(4,button);
m_TBarCtrl.AutoSize();
m_TBarCtrl.SetStyle(TBSTYLE_FLAT|CCS_TOP);
2.7 CtoolBarCtrl 工具欄添加按鈕消息
上面的TBBUTON結構里有一個成員idCommand,這個成員跟菜單項的ID值一樣,用於標識工具欄按鈕項,也就是說idCommand是工具欄項ID號,就是最前面設置工具欄資源時,選擇一個按鈕,然后按回車,彈出一個對話框,里面有一個ID項,跟這個是一樣的。
所以呢,我們只要把上面的給TBBUTTON結構成員賦值的語句改成下面這樣就行了:
for(int i=0;i<4;i++)
{
button[i].fsState=TBSTATE_ENABLED;
button[i].fsStyle=TBSTYLE_BUTTON;
button[i].iBitmap=i;
button[i].idCommand=1100+i;//新加的語句
}
這樣我們只要添加ON_COMMAND消息映射就可以處理一個按鈕單擊消息了,如上面第一個按鈕的ID號是:1100;那么手工添加這個按鈕單擊消息映射的語句就是:
ON_COMMAND(1100,OnToolbar1)
OnToolbar1為消息處理函數,可自行添加。
3. listctrl內容進行大數據量更新時,避免閃爍
m_list.SetRedraw(FALSE);
//更新內容
m_list.SetRedraw(TRUE);
m_list.Invalidate();
m_list.UpdateWindow();