为对话框设计美观的工具栏 (Add toolbar for CDialog)
本文介绍,在CDialog下工具栏的实现和优化
1. 为CDialog添加工具栏
2. 使toolbar以多行显示
3. 为toolbar添加提示信息(TipText)
4. VC6下显示包含多彩色图片的工具栏
一. 为CDialog添加工具栏
首先需要建立相应的TOOLBAR资源
将工具栏按钮摆放好,将相应的提示信息(TipText)写入,最好也将相应事件先生成好
在OnInitDialog()函数内添加代码:
1 2 3 4 5 6 |
//工具条(其中CBRS_LEFT属性是为了工具栏多行显示而添加) m_ToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE|CBRS_SIZE_FIXED|CBRS_LEFT|CBRS_TOOLTIPS|CBRS_FLYBY, CRect(0,0,0,0)); m_ToolBar.LoadToolBar(IDR_TOOLBAR); //获取资源 RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); |
ps: 如果不要多行显示需要,更改相应的属性
二. 使CDialog多行显示
注意如果要工具栏多行显示,需要加入CBRS_LEFT属性
实现代码:
1 2 3 4 5 6 7 8 9 |
//其中TBBS_WRAPPED为换行属性 m_ToolBar.SetButtonInfo(0,ID_BUTTON_1,TBBS_BUTTON,0); m_ToolBar.SetButtonInfo(1,ID_BUTTON_2,TBBS_BUTTON|TBBS_WRAPPED,1); //换行 m_ToolBar.SetButtonInfo(2,ID_BUTTON_3,TBBS_BUTTON,2); m_ToolBar.SetButtonInfo(3,ID_BUTTON_4,TBBS_BUTTON|TBBS_WRAPPED,3); //换行 m_ToolBar.SetButtonInfo(4,ID_BUTTON_5,TBBS_BUTTON,4); m_ToolBar.SetButtonInfo(5,ID_BUTTON_6,TBBS_BUTTON, 5); |
三. 为toolbar添加提示信息(TipText)
添加事件声明和消息映射
1 2 3 4 5 6 |
//添加事件声明(最好写在AFX_MSG宏外,否则可能出现编译错误) afx_msg BOOL OnToolTipText(UINT nID, NMHDR* pNMHDR, LRESULT* pResult); //添加消息映射(最好写在AFX_MSG_MAP宏外,否则可能出现编译错误) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW,0,0xFFFF,OnToolTipText) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA,0,0xFFFF,OnToolTipText) |
添加事件实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
BOOL CToolBarDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult) { ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW); // if there is a top level routing frame then let it handle the message if (GetRoutingFrame() != NULL) return FALSE; // to be thorough we will need to handle UNICODE versions of the message also !! TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; TCHAR szFullText[512]; CString strTipText; UINT nID = pNMHDR->idFrom; if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) || pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND)) { // idFrom is actually the HWND of the tool nID = ::GetDlgCtrlID((HWND)nID); } if (nID != 0) // will be zero on a separator { AfxLoadString(nID, szFullText); strTipText=szFullText; #ifndef _UNICODE if (pNMHDR->code == TTN_NEEDTEXTA) { lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText)); } else { _mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText)); } #else if (pNMHDR->code == TTN_NEEDTEXTA) { _wcstombsz(pTTTA->szText, strTipText,sizeof(pTTTA->szText)); } else { lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText)); } #endif *pResult = 0; // bring the tooltip window above other popup windows ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); return TRUE; } return FALSE; } |
四. VC6下显示包含多彩色图片的工具栏
VC6下只支持256色的工具栏图片,要想使用多彩色工具栏图片,如下所示
1. 先将相应的bmp图片导入VC6中,形成图片资源文件
2. 添加代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//相应成员变量 CImageList m_ilToolBar; CBitmap bm; //IDB_BITMAP为图片资源ID /////////////////////////////////////// //实现代码 HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP), IMAGE_BITMAP, //按位图格式 0,0, // cx,cy LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS ); bm.Attach(hbm); m_ilToolBar.Create(20,20,ILC_COLOR24, 4, 4); m_ilToolBar.Add(&bm,(CBitmap*)NULL); ////////////////////////////////////// //将图片选入toolbar即可 m_ToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar); |
完成,这样就在对话框上不错的效果的工具栏了,试试吧
Trackback from your site.