先建立一个基于Dialog的程序,我给他起了个名字叫:DlgMenuToolbar。
一、如何往基于Dialog的程序添加菜单
[1.1]先添加菜单(IDR_MENU1)资源,并加上需要的菜单项。
[1.2]编辑对话框资源IDD_DLGMENUTOOLBAR_DIALOG的属性,在属性对话框中选择IDR_MENU1即可。
[1.3]假如您不希望在对话框属性中直接设置菜单,而通过代码在程序中动态生成可以采用如下方法:
[1.3.1]在CDlgMenuToolbarDlg类声名中添加成员变量CMenum_menu
再在CDlgMenuToolbarDlg::OnInitDialog()中添加如下代码://加载菜单
m_menu.LoadMenu(IDR_MENU1);
//设置当前菜单
SetMenu(&m_menu);
//当你不需要菜单时可以用SetMenu(NULL);来取消当前菜单
二、如何往基于Dialog的程序添加工具栏
[2.1]先添加工具栏(IDR_TOOLBAR1)资源,并画好各个按钮。
[2.2]在CDlgMenuToolbarDlg类声名中添加成员变量CToolBarm_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("failedtocreatetoolbar/n");
returnFALSE;
}
m_wndtoolbar.ShowWindow(SW_SHOW);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
三、为工具栏添加工具提示
[3.1]在CDlgMenuToolbarDlg类定义中手工添加消息映射函数的定义,如下黑体部分//{{AFX_MSG(CDlgMenuToolbarDlg)
virtualBOOLOnInitDialog();
afx_msgvoidOnPaint();
afx_msgBOOLOnToolTipText(UINT,NMHDR*pNMHDR,LRESULT*pResult);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
[3.2]在CDlgMenuToolbarDlg.cpp添加函数的实现代码//工具栏提示
BOOLCDlgMenuToolbarDlg::OnToolTipText(UINT,NMHDR*pNMHDR,LRESULT*pResult)
{
ASSERT(pNMHDR->code==TTN_NEEDTEXTA||pNMHDR->code==TTN_NEEDTEXTW);
//UNICODE消息
TOOLTIPTEXTA*pTTTA=(TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW*pTTTW=(TOOLTIPTEXTW*)pNMHDR;
//TCHARszFullText[512];
CStringstrTipText;
UINTnID=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);
returnTRUE;
}
returnTRUE;
}
[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填充颜色。
CPaintDCdc(this);
CRectrect;
GetClientRect(rect);
dc.FillSolidRect(rect,RGB(60,110,170));
五、添加状态栏
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; //对状态栏字符进行修改
if(pStatus)
{
pStatus->SetPaneText(0,"测试0");
pStatus->SetPaneText(1,"测试1");
pStatus->SetPaneText(2,"测试2");
pStatus->SetPaneText(3,"测试3");
pStatus->SetPaneText(4,"测试4");
}
}
源文档 <http://blog.csdn.net/qj840828/archive/2008/10/17/3092318.aspx>