自由自在地使用工具欄
發表于:2007-07-14來源:作者:點擊數:
標簽:
VC提供的工程創建Wizard中只有在Doc/View結構的工程中提供了使用工具欄的選項,而對于一般基于對話框或者自己創建的普通窗口中如何使用工具欄呢? 下面介紹自由使用工具欄窗口的方法。 假設我們使用一個名為CMyWnd窗口類,首先我們要在此窗口類中定義一個CTo
VC提供的工程創建Wizard中只有在Doc/View結構的工程中提供了使用工具欄的選項,而對于一般基于對話框或者自己創建的普通窗口中如何使用工具欄呢?
下面介紹自由使用工具欄窗口的方法。
假設我們使用一個名為CMyWnd窗口類,首先我們要在此窗口類中定義一個CToolBarCtrl成員變量:
CToolBarCtrl m_wndToolBar;
在窗口的OnCreate函數中創建工具欄的窗口和定義工具欄的各個按紐,并為按紐附上圖片和文本信息。
例如,我們要為工具欄指定3個按紐,其ID分別為IDC_PLAY, IDC_PAUSE, IDC_STOP,我們需要這要做:
CMyWnd:: OnCreate(LPCREATESTRUCT lpCreateStruct)
{
…… // 其它處理
if (!m_ wndToolBar.Create(WS_CHILD | WS_VISIBLE |
TBSTYLE_FLAT | TBSTYLE_TOOLTIPS |
CCS_NORESIZE,
CRect(0, 0, 50, 20), this, // this為包含工具欄的父窗口的CWnd類型指針
IDR_TOOLBAR))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
// 初始化工具欄
// 添加圖片,指定為按紐數量為3,IDB_PLAYBOX為工具欄的位圖資源號
m_wndToolBar.AddBitmap(3, IDB_PLAYBOX);
// 添加標簽字符串。
// IDC_PLAY等為字符串資源號
m_ wndToolBar.AddString(IDC_PLAY);
m_ wndToolBar.AddString(IDC_PAUSE);
m_ wndToolBar.AddString(IDC_STOP);
// 向工具欄中添加按紐。
TBBUTTON tbbutton[3] =
{
{0, IDC_PLAY, NULL, TBSTYLE_BUTTON, 0, 0},
{1, IDC_PAUSE, NULL, TBSTYLE_BUTTON, 0, 1},
{2, IDC_STOP, NULL, TBSTYLE_BUTTON, 0, 2},
};
m_wndToolbar.AddButtons(3, tbbutton);
}
TBBUTTON結構的定義如下:
typedef struct _TBBUTTON {
int iBitmap; // 按紐在位圖中的索引,以0為基數
int idCommand; // 按紐的Command ID,當按紐被按下時將發送此Command ID
BYTE fsState; // 按紐狀態
BYTE fsStyle; // 按紐風格
DWORD dwData; // 用戶自定義數據
int iString; // 以0為基數的按紐標簽字符串的索引
} TBBUTTON;
通過以上次序創建的工具欄,當鼠標移動到按紐上時,如果工具欄具有TBSTYLE_TOOLTIPS屬性,則將向工具欄的父窗口發送一個TTN_NEEDTEXT消息,以獲得Tip的提示窗口所需的字符串。因此,在父窗口的消息處理程序中必須響應此消息,提供相應的字符串。具體做法如下:
在窗口的消息映射表中添加這樣的語句:
BEGIN_MESSAGE_MAP(CWndMusicFrame, CWndFrame)
file://{{AFX_MSG_MAP(CWndMusicFrame)
….. // 其它消息映射
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXT, 0, 0xFFFF, OnToolTipText)
….. // 其它消息映射
END_MESSAGE_MAP()
消息處理函數定義如下:
BOOL CMyWnd::OnToolTipText(UINT, NMHDR* pNMHDR,
LRESULT* pResult)
{
ASSERT(pNMHDR->code == TTN_NEEDTEXT);
TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pNMHDR;
// 獲得按紐的ID
UINT nID = pNMHDR->idFrom;
if (pTTT->uFlags & TTF_IDISHWND)
nID = ::GetDlgCtrlID((HWND)nID);
if(nID)
{
// 為其指定字符串的資源號和資源的Handle,當然,你也可能直接指定一個字符串,但更好的習慣是將這些字符串保存在資源中。
pTTT->lpszText = MAKEINTRESOURCE(nID);
pTTT->hinst = AfxGetResourceHandle();
// 將Tip窗口設為最上層窗口
::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,
SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);
return TRUE;
}
*pResult = 0;
return FALSE; // message was handled
}
以上為一個簡單的在一般窗口中使用自定義工具欄的例子。在此基礎上,大家可以為此工具欄補充更多的處理功能和樣式。
原文轉自:http://www.anti-gravitydesign.com