使用过OFFICE2000人都知道它界面尤其是菜单和工具条可谓是让人耳目新虽然Visual C开发工具也提供了对工具条支持但通常只是按纽集合不能直接加入组合框等Control控件实现OFFICE2000风格工具条本例子针对其中个细节讲述了在Windows环境下用Visual C6.0在工具条中加入平面组合框Control控件思路方法并实现了组合框消息响应使得我们看上去更加专业编译运行后效果如图所示:
图、工具栏中平面组合框Control控件
、实现思路方法
用应用向导(AppWizard)生成个基于单文档工程(Project)首先打开VC工具条资源编辑器在工具条要加入组合框地方加个空按纽并将资源共享ID定义为ID_TOOL_ZOOM
其次从面向对象思想出发个工具条作为个整体应该封装为个类组合框Control控件应该作为这个类个成员变量因此用Visual C类向导CLASSWIZARD生成个以CToolBar为基类新类CMainToolBar并加入成员变量CFlatComboBox m_combobox(CflatComboBox为平面组合框类
在向工具条添加Control控件过程中CToolBar::GetItemID()来获取每个按钮ID直到搜索到\"空\"按钮CToolBar::GetItemID()原型为:UINT GetItemID( nIndex ) const参数nIndex为当前按钮在工具条中索引号该索引号基准值为\"0\"找到\"空\"按钮后CToolBar::SetButtonInfo()设置按钮宽度信息最后CComBox::Create()、CcomBox::AddString()等动态创建平面组合框Control控件下面代码实现了平面组合框Control控件动态创建:
//设置指定工具项宽度并获取新区域 80是宽度
m_wndToolBar.SetButtonInfo(index, ID_TOOL_ZOOM, TBBS_SEPARATOR, 80);
m_wndToolBar.GetItemRect(index, &rect);
//设置位置
rect.top2;
rect.bottom 200;
// 创建并显示
(!m_wndToolBar.m_wndZoom.Create(WS_CHILD|WS_VISIBLE |
CBS_AUTOHSCROLL|CBS_DROPDOWNLIST |
CBS_HASSTRINGS ,rect, &m_wndToolBar, ID_TOOL_ZOOM))
{
TRACE0(\"Failed to create combo-box\\n\");
FALSE;
}
m_wndToolBar.m_wndZoom.ShowWindow(SW_SHOW);
//填充内容
m_wndToolBar.m_wndZoom.AddString(\"25%\");
m_wndToolBar.m_wndZoom.AddString(\"50%\");
m_wndToolBar.m_wndZoom.AddString(\"75%\");
m_wndToolBar.m_wndZoom.AddString(\"100%\");
m_wndToolBar.m_wndZoom.AddString(\"125%\");
m_wndToolBar.m_wndZoom.AddString(\"150%\");
m_wndToolBar.m_wndZoom.AddString(\"175%\");
m_wndToolBar.m_wndZoom.AddString(\"200%\");
m_wndToolBar.m_wndZoom.SetCurSel(3);
但是仅仅产生平面组合框是不够必须实现组合框消息响应才能方便地运用组合框在Vsiaul C中消息响应通常都是用类向导来实现但是此处由于组合框是用创建所以必须亲自动手来写代码也并不麻烦和类向导生成代码格式是样可以参照来写下面代码定义了组合框选择变化消息响应:
///////////////////////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE
ON_CBN_SELENDOK(ID_TOOL_ZOOM, _disibledevent=> ////////////////////////////////////////////////////
// FlatComboBox.h : header file
# !d(FLATCOMBOBOX_H_INCLUDED)
# FLATCOMBOBOX_H_INCLUDED
# _MSC_VER > 1000
#pragma _disibledevent=>
#end // !d(FLATCOMBOBOX_H_INCLUDED)
///////////////////////////////////////////
# \"stdafx.h\"
# \"FlatComboBox.h\"
#def _DEBUG
# DEBUG_NEW
#undef THIS_FILE
char THIS_FILE = __FILE__;
#end
///////////////////////////////// CFlatComboBox
CFlatComboBox::CFlatComboBox
{
m_bLBtnDown = false;
}
CFlatComboBox::~CFlatComboBox
{}
BEGIN_MESSAGE_MAP(CFlatComboBox, CComboBox)
//{{AFX_MSG_MAP(CFlatComboBox)
ON_WM_MOUSEMOVE
ON_WM_LBUTTONDOWN
ON_WM_LBUTTONUP
ON_WM_TIMER
ON_WM_PAINT
//}}AFX_MSG_MAP
END_MESSAGE_MAP
///////////////////////////////// CFlatComboBox message handlers
void CFlatComboBox::OnMouseMove(UINT nFlags, CPo po)
{
SetTimer(1,10,NULL);
CComboBox::OnMouseMove(nFlags, po);
}
void CFlatComboBox::OnLButtonDown(UINT nFlags, CPo po)
{
m_bLBtnDown = true;
CComboBox::OnLButtonDown(nFlags, po);
}
void CFlatComboBox::OnLButtonUp(UINT nFlags, CPo po)
{
m_bLBtnDown = false;
Invalidate;
CComboBox::OnLButtonUp(nFlags, po);
}
void CFlatComboBox::OnTimer(UINT nIDEvent)
{
POINT pt;
GetCursorPos(&pt);
CRect rcItem;
GetWindowRect(&rcItem);
bool bPaed = false;
// _disibledevent=> KillTimer (1);
(bPaed true) {
DrawCombo(FC_DRAWPRESSD, ::GetSysColor(COLOR_BTNSHADOW),::GetSysColor(COLOR_BTNHIGHLIGHT));
bPaed = false;
}
;
}
// If mouse leaves, show flat.
(!rcItem.PtInRect(pt)) {
KillTimer (1);
(bPaed true) {
DrawCombo(FC_DRAWNORMAL, ::GetSysColor(COLOR_BTNFACE), ::GetSysColor(COLOR_BTNFACE));
bPaed = false;
}
;
}
// _disibledevent=> ;
{
bPaed = true;
DrawCombo(FC_DRAWRAISED, ::GetSysColor(COLOR_BTNSHADOW), ::GetSysColor(COLOR_BTNHIGHLIGHT));
}
}
CComboBox::OnTimer(nIDEvent);
}
void CFlatComboBox::OnPa
{
Default;
DrawCombo(FC_DRAWNORMAL, ::GetSysColor(COLOR_BTNFACE),::GetSysColor(COLOR_BTNFACE));
}
void CFlatComboBox::DrawCombo(DWORD dwStyle, COLORREF clrTopLeft,
COLORREF clrBottomRight)
{
CRect rcItem;
GetClientRect(&rcItem);
CDC* pDC = GetDC;
// Cover up dark 3D shadow.
pDC->Draw3dRect(rcItem, clrTopLeft, clrBottomRight);
rcItem.DeflateRect(1,1);
(!IsWindowEnabled) {
pDC->Draw3dRect(rcItem, ::GetSysColor(COLOR_BTNHIGHLIGHT), ::GetSysColor(COLOR_BTNHIGHLIGHT));
}
{
pDC->Draw3dRect(rcItem, ::GetSysColor(COLOR_BTNFACE),::GetSysColor(COLOR_BTNFACE));
}
// Cover up dark 3D shadow _disibledevent=> pDC->Draw3dRect(rcItem, ::GetSysColor(COLOR_BTNFACE),
::GetSysColor(COLOR_BTNFACE));
// Cover up normal 3D shadow _disibledevent=> rcItem.bottom 1;
pDC->Draw3dRect(rcItem, ::GetSysColor(COLOR_BTNHIGHLIGHT),::GetSysColor(COLOR_BTNHIGHLIGHT));
rcItem.left -= 1;
pDC->Draw3dRect(rcItem, ::GetSysColor(COLOR_BTNHIGHLIGHT),::GetSysColor(COLOR_BTNHIGHLIGHT));
;
FC_DRAWRAISED:
rcItem.top -= 1;
rcItem.bottom 1;
pDC->Draw3dRect(rcItem, ::GetSysColor(COLOR_BTNHIGHLIGHT),::GetSysColor(COLOR_BTNSHADOW));
;
FC_DRAWPRESSD:
rcItem.top -= 1;
rcItem.bottom 1;
rcItem.OffRect(1,1);
pDC->Draw3dRect(rcItem, ::GetSysColor(COLOR_BTNSHADOW),::GetSysColor(COLOR_BTNHIGHLIGHT));
;
}
ReleaseDC(pDC);
}
CFlatComboBox::Off
{
// Thanks to Todd Brannam for this suggestion...
::GetMetrics(SM_CXHTHUMB);
}
/////////////////////////// MainToolBar.h: erface for the CMainToolBar .
# !d(AFX_MAINTOOLBAR_H__76CF28F4_005F_11D7_8F58_00E04C0BECE6__INCLUDED_)
# AFX_MAINTOOLBAR_H__76CF28F4_005F_11D7_8F58_00E04C0BECE6__INCLUDED_
# _MSC_VER > 1000
#pragma _disibledevent=> # DEBUG_NEW
#end
CMainToolBar::CMainToolBar
{}
CMainToolBar::~CMainToolBar
{}
////////////////////////////////////////////////////////////
CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
(CFrameWnd::OnCreate(lpCreateStruct) -1)
-1;
(!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\");
-1; // fail to create
}
(!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators,
(indicators)/(UINT)))
{
TRACE0(\"Failed to create status bar\\n\");
-1; // fail to create
}
// TODO: Delete these three lines you don\'t want the toolbar to be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
index = 0;
RECT rect;
//找到指定工具项
while(m_wndToolBar.GetItemID(index)!=ID_TOOL_ZOOM)
index;
//设置指定工具项宽度并获取新区域 80是宽度
m_wndToolBar.SetButtonInfo(index, ID_TOOL_ZOOM, TBBS_SEPARATOR, 80);
m_wndToolBar.GetItemRect(index, &rect);
//设置位置
rect.top2;
rect.bottom 200;
// 创建并显示
(!m_wndToolBar.m_wndZoom.Create(WS_CHILD|WS_VISIBLE |
CBS_AUTOHSCROLL|CBS_DROPDOWNLIST |
CBS_HASSTRINGS ,rect, &m_wndToolBar, ID_TOOL_ZOOM))
{
TRACE0(\"Failed to create combo-box\\n\");
FALSE;
}
m_wndToolBar.m_wndZoom.ShowWindow(SW_SHOW);
//填充内容
m_wndToolBar.m_wndZoom.AddString(\"25%\");
m_wndToolBar.m_wndZoom.AddString(\"50%\");
m_wndToolBar.m_wndZoom.AddString(\"75%\");
m_wndToolBar.m_wndZoom.AddString(\"100%\");
m_wndToolBar.m_wndZoom.AddString(\"125%\");
m_wndToolBar.m_wndZoom.AddString(\"150%\");
m_wndToolBar.m_wndZoom.AddString(\"175%\");
m_wndToolBar.m_wndZoom.AddString(\"200%\");
m_wndToolBar.m_wndZoom.SetCurSel(3);
0;
}
void CMainFrame::OnSelectZoomed
{
CString strContent;
m_wndToolBar.m_wndZoom.GetWindowText(strContent);
AfxMessageBox(strContent);
}
4、小结
为了实现OFFICE2000风格工具条本例子介了种比较巧妙思路方法利用Visual C6.0已有开发环境支持在工具条中加入了平面组合框Control控件并实现了组合框消息响应用户选择组合框中某项后会弹出个对话框提示用户所选择信息 131
最新评论