如何给基于对话框的应用程序加入一个工具栏?
2008-05-11 18:58
453 查看
一、添加工具栏
1、先添加工具栏(IDR_TOOLBAR1)资源,并画好各个按钮。
2、在CXXXDlg类声名中添加成员变量 CToolBar m_wndtoolbar;
3、 在CXXXDlg::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);
二、为工具栏添加工具提示
1、 在CXXXDlg类定义中手工添加消息映射函数的定义,如下黑体部分
//{{AFX_MSG(CXXXDlg)
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
2、在CXXXDlg.cpp添加函数的实现代码
//工具栏提示
BOOL CXXXDlg::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、在CXXXDlg.cpp中添加消息映射,请看如下代码中的黑体部分
BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)
//{{AFX_MSG_MAP(CXXXDlg)
ON_WM_PAINT()
ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipText )
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
更多技术文章请参看施昌权的个人网站: http://www.joyvc.cn
1、先添加工具栏(IDR_TOOLBAR1)资源,并画好各个按钮。
2、在CXXXDlg类声名中添加成员变量 CToolBar m_wndtoolbar;
3、 在CXXXDlg::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);
二、为工具栏添加工具提示
1、 在CXXXDlg类定义中手工添加消息映射函数的定义,如下黑体部分
//{{AFX_MSG(CXXXDlg)
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
2、在CXXXDlg.cpp添加函数的实现代码
//工具栏提示
BOOL CXXXDlg::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、在CXXXDlg.cpp中添加消息映射,请看如下代码中的黑体部分
BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)
//{{AFX_MSG_MAP(CXXXDlg)
ON_WM_PAINT()
ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipText )
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
更多技术文章请参看施昌权的个人网站: http://www.joyvc.cn
相关文章推荐
- mfc基于对话框的应用程序,如何设置初始对话框大小,移动控件位置
- VC 常见问题百问~确定应用程序的路径~~如何在对话框中显示一个位图?~~窗口重绘
- 基于对话框的MFC应用程序加入Accelerator
- 【云的等待】基于一个对话框的应用程序Game
- 编写一个基于对话框的应用程序可以用来打开及显示文本文件设置所显示的文本的字体颜色。
- 基于对话框的应用程序,点击按钮打开一个网页
- 如何在一个基于对话框的程序中添加 Menu 菜单
- 基于对话框的MFC应用程序加入Accelerator
- 基于对话框的应用程序,点击button打开一个网页
- 基于对话框的MFC应用程序,在“工程名.cpp”文件里如何调用“工程名+Dlg.cpp”文件里“工程名+Dlg”类的public成员函数?
- 基于对话框的应用程序,点击button打开一个网页
- 云效(原RDC)如何构建一个基于Maven的Java项目
- 01 如何将百度地图加入IOS应用程序?
- 每一天都有更多的数据、用户和应用在加入Apache Hadoop这个日益壮大的集群中来。虽然对于整个数据驱动的组织来说这是一个好消息,但对于安全管理员和监察人员来说,如何让终端用户在现存的Hadoop
- 如何制作一个基于Tile的游戏 Cocos2d-x 2.0.4
- 如何设计一个基于Lotus的可配置的工作流
- 如何在一个程序中打开另一个应用程序
- 基于对话框的应用程序添加启动画面
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序)
- 我建了一个QQ群,别人如何不需要验证就能加入我的群