北大南山附中教师招聘:工具栏自绘设计方案

来源:百度文库 编辑:偶看新闻 时间: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