在Dialog中使用Menu和Toolbar

前言

在用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));

好了,编译运行看看效果吧!希望本文能够给您一些提示! 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SysTray控件用法详解 VB SYSTRAY 托盘图标 用VB6自带的systray.ocx控件实现托盘图标程序 : 补充: 然后在自己的VB程序添加改控件(工程-部件-浏览)。   最好把这个ocx放到C:\WINDOWS\system32。   改控件的属性InTray属性用来设置是否显示在托盘,True为显示在托盘,False为不显示。TrayIcon属性是在托盘显示的图标式样。TrayTip属性是鼠标移到改控件上面显示的提示文字。如果要使程序最小化时显示到托盘,如下:   Private Sub Form_Resize()    If Me.WindowState = vbMinimized Then    cSysTray1.InTray = True    Me.Visible = False End If   End Sub   点击托盘图标后让程序显示出来,如下:   Private Sub cSysTray1_MouseDown(Button As Integer, Id As Long)    Me.WindowState = vbNormal    Me.Visible = True    cSysTray1.InTray = False    Me.SetFocus   End Sub '单击关闭不退出程序 Private Sub Form_Unload(Cancel As Integer) 主程序.Hide Cancel = False End Sub '单击关闭不退出程序 Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) Cancel = 1 主程序.Hide End Sub ’tui为窗体菜单-退出选项名称 Private Sub tui_Click()’快捷键设ALT+F1 End End Sub '注:"主程序"代表一个窗体(Form),窗体菜单-退出选项需设置快捷键ALT+F1 '这个控件有一个小小的问题,如果托盘菜单有退出选项,不能直接用"End 语句",否则在编译后运行期间用户选择退出后,操作系统会报错,以上使用发送按键方法避免出错 ,当然还有其他避免出错方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值