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

 

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

 

五、添加状态栏

 

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.youkuaiyun.com/qj840828/archive/2008/10/17/3092318.aspx>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值