给对话框添加菜单 工具栏 状态栏简易方法

先建立一个基于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>

你可能感兴趣的:(对话框)