toolbar + tooltips

引自:http://www.vckbase.com/document/viewdoc/?id=265

在Dialog中使用Menu和Toolbar
作者:xujian

本文適合初學者

前言
在用VC編程時,界面製作遠不如Delphi、VB容易。我又常常用到基於Dialog編寫應用程序。而在直接在Dialog使用Toolbar和Menu的資料很少。而我有機會可以總結一些經驗,供大家分享,希望能得到指教。

下載本文示例工程 大小:11.2K

運行效果如下圖



我們先建立一個基於Dialog 的程序,我給他起了個名字叫:DlgMenuToolbar。

一、如何往基於Dialog的程序添加菜單

[1.1] 先添加菜單(IDR_MENU1)資源,並加上需要的菜單項。
[1.2] 編輯對話框資源IDD_DLGMENUTOOLBAR_DIALOG的屬性,在屬性對話框中選擇IDR_MENU1即可。


[1.3] 假如您不希望在對話框屬性中直接設置菜單,而通過代碼在程序中動態生成可以採用如下方法:
[1.3.1]在CDlgMenuToolbarDlg類聲名中添加成員變量CMenu m_menu
再在CDlgMenuToolbarDlg::OnInitDialog() 中添加如下代碼:
//加載菜單
m_menu.LoadMenu(IDR_MENU1);
//設置當前菜單
SetMenu(&m_menu);
//當你不需要菜單時可以用 SetMenu(NULL);來取消當前菜單
二、如何往基於Dialog的程序添加工具欄

[2.1] 先添加工具欄(IDR_TOOLBAR1)資源,並畫好各個按鈕。
[2.2] 在CDlgMenuToolbarDlg類聲名中添加成員變量 CToolBar m_wndtoolbar;
[2.3] 在CDlgMenuToolbarDlg::OnInitDialog() 中添加如下代碼
 //添加一個平面工具條
if (!m_wndtoolbar.CreateEx( this,TBSTYLE_FLAT ,  WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS,
    CRect(4,4,0,0)) ||	!m_wndtoolbar.LoadToolBar(IDR_TOOLBAR1) )
{
	TRACE0("failed to create toolbar/n");
	return FALSE;
}
m_wndtoolbar.ShowWindow(SW_SHOW);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
三、爲工具欄添加工具提示

[3.1] 在CDlgMenuToolbarDlg類定義中手工添加消息映射函數的定義,如下黑體部分
  	//{{AFX_MSG(CDlgMenuToolbarDlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()

[3.2] 在CDlgMenuToolbarDlg.cpp添加函數的實現代碼
//工具欄提示
BOOL CDlgMenuToolbarDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
{
	ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);
	
	// UNICODE消息
	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爲工具條的HWND 
		nID = ::GetDlgCtrlID((HWND)nID);
	}
	
	if (nID != 0) //不爲分隔符
	{
		strTipText.LoadString(nID);
		strTipText = strTipText.Mid(strTipText.Find(''/n'',0)+1);
		
#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;
		
		// 使工具條提示窗口在最上面
		::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,SWP_NOACTIVATE|
			SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); 
		return TRUE;
	}
	return TRUE;
}
[3.3] 在CDlgMenuToolbarDlg.cpp中添加消息映射,請看如下代碼中的黑體部分
BEGIN_MESSAGE_MAP(CDlgMenuToolbarDlg, CDialog)
	//{{AFX_MSG_MAP(CDlgMenuToolbarDlg)
	ON_WM_PAINT()
	ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipText )
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

四、其它

爲了使你的程序看起來更酷,還可以在CDlgMenuToolbarDlg::OnPaint()中修改代碼實現Dialog 填充顏色。
CPaintDC dc(this);
CRect rect; 
GetClientRect(rect); 
dc.FillSolidRect(rect, RGB(60,110,170)); 

好了,編譯運行看看效果吧!希望本文能夠給您一些提示!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章