轉(zhuǎn)自:http://suhuaiqiang.blog.163.com/blog/static/123191840200962883012444/
先建立一個基于Dialog 的程序,我給他起了個名字叫:DlgMenuToolbar。
一、如何往基于Dialog的程序添加菜單
[1.1] 先添加菜單(IDR_MENU1)資源,并加上需要的菜單項。
[1.2] 編輯對話框資源IDD_DLGMENUTOOLBAR_DIALOG的屬性,在屬性對話框中選擇IDR_MENU1即可。
[1.3] 假如您不希望在對話框?qū)傩灾兄苯釉O(shè)置菜單,而通過代碼在程序中動態(tài)生成可以采用如下方法:
[1.3.1]在CDlgMenuToolbarDlg類聲名中添加成員變量CMenu m_menu
再在CDlgMenuToolbarDlg::OnInitDialog() 中添加如下代碼: //加載菜單
m_menu.LoadMenu(IDR_MENU1);
//設(shè)置當(dāng)前菜單
SetMenu(&m_menu);
//當(dāng)你不需要菜單時可以用 SetMenu(NULL);來取消當(dāng)前菜單
二、如何往基于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類定義中手工添加消息映射函數(shù)的定義,如下黑體部分 //{{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添加函數(shù)的實現(xiàn)代碼 //工具欄提示
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()中修改代碼實現(xiàn)Dialog 填充顏色。
CPaintDC dc(this);
CRect rect;
GetClientRect(rect);
dc.FillSolidRect(rect, RGB(60,110,170));
五、添加狀態(tài)欄
static UINT indicators[] =
{
// ID_SEPARATOR, // status line indicator
ID_TEST_ITEM, //自己在STRING TABLE中所定義的ID
ID_USB_STATE,
IDS_POWER_STATE,
ID_DATE,
ID_TIME,
// ID_INDICATOR_CAPS,
// ID_INDICATOR_NUM,
// ID_INDICATOR_SCRL,
};
void CThreadDemoDlg::OnInitDialog()
{
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create statusbar\n");
return -1; // fail to create
}
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
}
void CThreadDemoDlg::OnButton1()
{
CStatusBar* pStatus=&this->m_wndStatusBar; //對狀態(tài)欄字符進行修改
if(pStatus)
{
pStatus->SetPaneText(0,"測試0");
pStatus->SetPaneText(1,"測試1");
pStatus->SetPaneText(2,"測試2");
pStatus->SetPaneText(3,"測試3");
pStatus->SetPaneText(4,"測試4");
}
}