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