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

 

 

 

 

posted @ 2012-12-06 17:37  小金马  阅读(12363)  评论(0编辑  收藏  举报