北大南山附中教师招聘:工具栏自绘设计方案
来源:百度文库 编辑:偶看新闻 时间:2024/05/03 06:42:15
方案分析
工具栏是程序界面设计的主要元素之一,它的外观直接影响界面的整体效果。因此,在设计工具栏时,工具栏效果应与界面协调。下面介绍两种不同风格的工具栏,效果如图1、图2所示。
图1 工具栏自绘设计方案一
图2 工具栏自绘设计方案二
上述的两种工具栏采用来不同的方式进行设计。第一种方式是使用了CReBar类作为工具栏的容器,通过在该类中设置背景图片,使工具栏背景透明,实现了工具栏的背景效果图。第二种方式是通过从工具栏类CToolBarCtrl派生一个子类实现的,在子类中根据工具栏按钮的不同状态,绘制工具栏按钮,以实现工具栏的特殊效果。工具栏按钮的绘制方式与菜单不同,不同通过重载DrawItem、MeasureItem等函数实现,而是通过处理“NM_CUSTOMDRAW”通知消息实现的。下面分别介绍这两种方式的具体实施过程。
实施过程
1 使用CReBar类设计背景工具栏
(1)创建一个基于对话框的应用程序,在对话框中添加Picture控件。
(2)向对话框类中添加CRebar、CToolBar等类型成员变量。
CDrawTool m_ToolBar;
CimageList m_ImageList;
CMenu m_Menu;
(3)在对话框初始化时创建工具栏,设置工具栏按钮图标。
BOOL CBKToolbarDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
m_ImageList.Create(32,32,ILC_COLOR24|ILC_MASK,1,1);
m_HotImageList.Create(32,32,ILC_COLOR24|ILC_MASK,1,1);
//向图像列表中添加图标
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_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON5));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON6));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON7));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON8));
m_HotImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON9));
m_HotImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON10));
m_HotImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON11));
m_HotImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON12));
m_HotImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON13));
m_HotImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON14));
m_HotImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON15));
m_HotImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON16));
UINT array[10];
for (int i = 0;i<9;i++)
{
if (i==3 || i==7)
array[i] = ID_SEPARATOR; //第4、8个按钮为分隔条
else
array[i] = i+1001;
}
m_ToolBar.CreateEx(this,TBSTYLE_FLAT);
m_ToolBar.SetButtons(array,10);
m_ToolBar.SetButtonText(0,"新建");
m_ToolBar.SetButtonText(1,"打开");
m_ToolBar.SetButtonText(2,"保存");
m_ToolBar.SetButtonText(4,"剪切");
m_ToolBar.SetButtonText(5,"复制");
m_ToolBar.SetButtonText(6,"粘贴");
m_ToolBar.SetButtonText(8,"打印");
m_ToolBar.SetButtonText(9,"帮助");
//关联图像列表
m_ToolBar.GetToolBarCtrl().SetImageList(&m_ImageList);
m_ToolBar.GetToolBarCtrl().SetHotImageList(&m_HotImageList);
m_ToolBar.SetSizes(CSize(40,40),CSize(32,32)); //设置按钮和图标的大小
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_BITMAP1));
m_Rebar.GetReBarCtrl().SetBandInfo(0,&info);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); //显示工具栏
return TRUE;
}
2 从CToolBarCtrl类派生子类设计工具栏
(1)创建一个基于对话框的应用程序,在对话框中添加Picture控件。
(2)从CToolBarCtrl类派生一个子类CDrawTool。在CDrawTool类中添加如下成员变量。
COLORREF m_TextColor;
COLORREF m_HotColor;
COLORREF m_LineColor;
COLORREF m_HotTextColor;
BOOL m_IsDraw;
(3)向CDrawTool类中添加DrawButton方法,根据工具栏按钮的不同状态绘制相应的工具栏按钮。
void CDrawTool::DrawButton(CDC *pDC, const RECT &rect, UINT uState)
{
CPoint pt;
GetCursorPos(&pt);
ScreenToClient(&pt);
CRect rect1;
GetClientRect(rect1);
if (rect1.PtInRect(pt))
{
if (uState & CDIS_HOT)
{
CPen pen(PS_SOLID, 1, m_LineColor);
CPen *pOldPen = pDC->SelectObject(&pen);
CBrush brush(m_HotColor);
CBrush *pOldBrush = pDC->SelectObject(&brush);
pDC->Rectangle(&rect);
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
}
}
}
(4)向CDrawTool类中添加OnOwnerDraw方法,用于处理“NM_CUSTOMDRAW”通知消息。
void CDrawTool::OnOwnerDraw(NMHDR *pNotifyStruct, LRESULT *pResult)
{
NMTBCUSTOMDRAW *pCustomDraw = (NMTBCUSTOMDRAW *)pNotifyStruct;
CDC dc;
dc.Attach(pCustomDraw->nmcd.hdc);
if (pCustomDraw->nmcd.uItemState &CDIS_HOT )
pCustomDraw->clrText =m_HotTextColor;
else
pCustomDraw->clrText =m_TextColor;
switch (pCustomDraw->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT:
DrawButton(&dc, pCustomDraw->nmcd.rc, pCustomDraw->nmcd.uItemState);
*pResult = TBCDRF_NOEDGES; //不绘按钮边框
break;
}
dc.Detach();
}
(5)向CDrawTool类中添加通知消息映射宏。
BEGIN_MESSAGE_MAP(CDrawTool, CToolBarCtrl)
//{{AFX_MSG_MAP(CDrawTool)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnOwnerDraw)
END_MESSAGE_MAP()
(6)在对话框类中定义一个CDrawTool类对象,并在对话框初始化时创建工具栏。
BOOL CDrawToolBarDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
m_Menu.LoadMenu(IDR_MAINMENU);
SetMenu(&m_Menu);
m_ImageList.Create(22,22,ILC_COLOR24|ILC_MASK,1,1);
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
m_ImageList.Add(AfxGetApp()->LoadIcon( IDI_ICON3));
m_ImageList.Add(AfxGetApp()->LoadIcon( IDI_ICON4));
m_ImageList.Add(AfxGetApp()->LoadIcon( IDI_ICON5));
m_ImageList.Add(AfxGetApp()->LoadIcon( IDI_ICON6));
m_ToolBar.Create(WS_CHILD|TBSTYLE_FLAT|WS_VISIBLE|CBRS_NOALIGN
,CRect(0,0,0,0),this,111);
m_ToolBar.SetImageList(&m_ImageList);
TBBUTTON buttons[5];
for (int i = 0; i<5; i++)
{
buttons[i].idCommand = 100+i;
buttons[i].iBitmap = i;
buttons[i].fsStyle = TBSTYLE_FLAT ;
buttons[i].fsState = TBSTATE_ENABLED ;
buttons[i].iString = IDS_ABOUTBOX;
}
m_ToolBar.AddButtons(5,buttons);
TBBUTTONINFO bInfo;
bInfo.cbSize = sizeof(TBBUTTONINFO);
bInfo.dwMask = TBIF_TEXT;
bInfo.pszText = "系统登录";
BOOL ret = m_ToolBar.SetButtonInfo(100,&bInfo);
bInfo.pszText = "商品销售";
m_ToolBar.SetButtonInfo(101,&bInfo);
bInfo.pszText = "销售查询";
m_ToolBar.SetButtonInfo(102,&bInfo);
bInfo.pszText = "系统帮助";
m_ToolBar.SetButtonInfo(103,&bInfo);
bInfo.pszText = "关于";
m_ToolBar.SetButtonInfo(104,&bInfo);
m_ToolBar.SetButtonWidth(50,80);
m_ToolBar.MoveWindow(10,10,100,50);
return TRUE;
}
http://221.8.65.77/mrbccd_m/vc/%B7%BD%B0%B8/%BD%E7%C3%E6%C9%E8%BC%C6/%B9%A4%BE%DF%C0%B8%D7?%E6%C9%E8%BC?%BD%B0%B8.htm