概述:VC++ 6.0中用MFC编程,实现窗口的工具条上加各种控制,举例实现加入组合框(CComboBox)和复选框(CCheckBox)。
举例如下:
一、加入组合框(CComboBox)
1.用资源编辑器在工具条资源上加一个按钮,位置是你想要放组合框的位置。给这个按钮一个资源名。
注意要在这个按钮的两边留空,否则会出错。
2.从CToolBar类派生一个类,给它一个CComboBox类的成员变量。
class CMyToolBar : public CToolBar
{
public:
CComboBox m_wndsnap;
};
3.在你的主框架.h文件中用你新建的类实例替换CToolBar类的实例。
protected: // control bar embedded members
cstatusbar m_wndstatusbar;
CMyToolBar m_wndToolBar;
注意要加入第一步定义的类的包含说明;
4.在你的主框架OnCreate函数中用以下方法替换掉用来占位的按钮。
if(!creatToolbar())
return -1;
creatToolbar()是我定义的主框架类函数,实现如下:
BOOL CMainFrame::creatToolbar()
{
/////////////////////////////////////////
//body of on create goes here
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |
WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS |
CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return false; // fail to create
}
#define snap_width 100 //组合框的宽度
//设置组合框控制为下拉式选择框
//首先得到占位符在工具条上的位置
int index = 0;
CRect rect;
while(m_wndToolBar.GetItemID(index)!=IDP_COMBOBOX) index++;
//接着把占位符转换成一个分割条
m_wndToolBar.SetButtonInfo(index,IDP_COMBOBOX,
TBBS_SEPARATOR, snap_width);
m_wndToolBar.GetItemRect(index, &rect);
//定义矩形框大小使组合框能放下
rect.bottom += 200;
// 接着建立这个组合框并显示它
if (!m_wndToolBar.m_wndsnap.Create(WS_CHILD|WS_VISIBLE | CBS_AUTOHSCROLL |
CBS_DROPDOWNLIST | CBS_HASSTRINGS ,
rect, &m_wndToolBar, IDP_COMBOBOX))
{
TRACE0("failed to create combo-box\n");
return false;
}
m_wndToolBar.m_wndsnap.ShowWindow(SW_SHOW);
//填充这个组合框
m_wndToolBar.m_wndsnap.AddString("400%");
m_wndToolBar.m_wndsnap.AddString("200%");
m_wndToolBar.m_wndsnap.AddString("100%");
m_wndToolBar.m_wndsnap.AddString("50%");
m_wndToolBar.m_wndsnap.AddString("25%");
m_wndToolBar.m_wndsnap.SetCurSel(0);
return TRUE;
}
现在就可以看看效果了,觉得怎样?
还可以继续加入别的控制,下面就加一组复选框。复选框比组合框稍微复杂一点。二、加入复选框(CCheckBox)
1. 同上第一步,在工具条资源上加一个按钮。
2. 给CmyToolBar类加入新变量如下所示:
class CMyToolBar: public CToolBar
{
public:
CComboBox m_wndsnap;
CButton m_wndcenter;新加入的
CButton m_wndedge;
CButton m_wndtrack;
CButton m_wndzoom;
};
在主框架类中加一Cfont变量gsmallfont.
3. 在你的主框架OnCreate函数中加入实现代码。
if(!CreateCheckBox())
return -1;
CreateCheckBox()是我定义的主框架类函数,实现如下:
BOOL CMainFrame::CreateCheckBox()
{
////////////////////////////////
// body of oncreate here
//设置用于按钮文字的小字体
CClientDC dc(GetDesktopWindow());
long logical_pixels = dc.GetDeviceCaps(LOGPIXELSX);
if(logical_pixels <100)
{
gsmallfont.CreatePointFont(67,"缺省",NULL);
}else{
gsmallfont.CreatePointFont(50," 缺省",NULL);
}
//生成四个检查框
#define check_width 94
int index=0;
CRect rect;
CRect safe_rect;
while(m_wndToolBar.GetItemID(index)!=ID_MULTI_CHECK) index++;
// 生成"居中"检查框
m_wndToolBar.SetButtonInfo(index, ID_MULTI_CHECK, TBBS_SEPARATOR, check_width);
m_wndToolBar.GetItemRect(index, &rect);
safe_rect=rect;
rect.left +=2;
rect.right=rect.left + ((check_width / 2)-4);
rect.top=0; rect.bottom=rect.top + 10;
if (!m_wndToolBar.m_wndcenter.Create("居中
",BS_CHECKBOX|WS_CHILD|WS_VISIBLE,
rect, &m_wndToolBar, ID_MULTI_CHECK))
{
TRACE0("failed to create center check-box\n");
return false;
}
m_wndToolBar.m_wndcenter.SendMessage(WM_SETFONT,(WPARAM)HFONT(gsmallfont),true);
//生成"边界"检查框
rect.top=rect.bottom ;
rect.bottom=rect.top + 10;
if (!m_wndToolBar.m_wndedge.Create("边界
",BS_CHECKBOX|WS_CHILD|WS_VISIBLE,
rect, &m_wndToolBar, ID_MULTI_CHECK))
{
TRACE0("failed to create edge check-box\n");
return false;
}
m_wndToolBar.m_wndedge.SendMessage(WM_SETFONT,(WPARAM)HFONT(gsmallfont),true);
//生成"缩放"检查框
rect=safe_rect;
rect.left +=((check_width / 2)+4);
rect.top=0;
rect.bottom=rect.top + 10;
if (!m_wndToolBar.m_wndzoom.Create("缩放
",BS_CHECKBOX|WS_CHILD|WS_VISIBLE,
rect, &m_wndToolBar, ID_MULTI_CHECK))
{
TRACE0("failed to create zoom check-box\n");
return false;
}
m_wndToolBar.m_wndzoom.SendMessage(WM_SETFONT,(WPARAM)HFONT(gsmallfont),true);
//生成"跟踪"检查框
rect.top=rect.bottom ;
rect.bottom=rect.top + 10;
if (!m_wndToolBar.m_wndtrack.Create("跟踪
",BS_CHECKBOX|WS_CHILD|WS_VISIBLE,
rect, &m_wndToolBar, ID_MULTI_CHECK))
{
TRACE0("failed to create track check-box\n");
return false;
}
m_wndToolBar.m_wndtrack.SendMessage(WM_SETFONT,(WPARAM)HFONT(gsmallfont),true);
return TRUE;
}
至此,四个检查框就生成了,如要对其状态进行设置和检查,可以用classWizard增加响应函数,在响应函数中取得按钮的状态,即可进行。
其他的控制如进程条、树型框等都可以用上面的方法生成,希望上面写的方法,能抛砖引玉,大家互相学习,提高编程水平。
|