本文介绍,在CDialog下工具栏的实现和优化
1. 为CDialog添加工具栏
2. 使toolbar以多行显示
3. 为toolbar添加提示信息(TipText)
4. VC6下显示包含多彩色图片的工具栏
一. 为CDialog添加工具栏
首先需要建立相应的TOOLBAR资源
将工具栏按钮摆放好,将相应的提示信息(TipText)写入,最好也将相应事件先生成好
在OnInitDialog()函数内添加代码:
-
//工具条(其中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属性
实现代码:
-
//其中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)
添加事件声明和消息映射
-
//添加事件声明(最好写在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 )
添加事件实现
-
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. 添加代码
-
//相应成员变量
-
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 );
完成,这样就在对话框上不错的效果的工具栏了,试试吧