VC 中一些控件的使用方法(TabControl, 工具欄)


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();

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM