在基于对话框的MFC中添加工具栏以及工具栏提示信息并改变图标支持256色
来源:互联网 发布:淘宝c 编辑:程序博客网 时间:2024/04/30 13:04
在基于单文档和基于多文档的MFC中,工具栏是自动添加的,但是在基于对话框的MFC中则需要编者用代码添加,而且工具栏的提示信息的添加也较SDI和MDI要复杂的多,下面就是我总结的如何在基于对话框的MFC中添加工具栏,以及工具栏的提示信息,以及改变工具栏的图标,使其支持256色。
1.在ResourceView里加入Toolbar资源,命名IDR_TOOLBAR1
2.在主程序的.h文件中加入变量:
CToolBar m_wndtoolbar;//添加工具栏
CImageList m_ilToolBar;//使工具栏图标显示256色
3.在主程序的.h文件中加入函数:
afx_msg BOOL OnToolTipText(UINT NID, NMHDR* pNMHDR, LRESULT* pResult);//使工具栏显示提示信息
4.在主程序的.h文件中的BEGIN_MESSAGE_MAP(CDetectorDlg, CDialog)函数里加入:
ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipText )//使工具栏显示提示信息
5.在主程序的.cpp文件中,在初始化的地方(OnCreate或者OnInitDialog)加入:
//注意, 这里只能在OnInitDialog中创建它的工具按钮才能过用,如果在OnCreate创建, 虽然ToolBar可以创建成功,但是按钮是灰色的, 就是你给这些按钮添加响用消息也是灰色的, 所以最好在OnInitDialog中写入ToolBar的创建代码
//添加一个平面工具栏
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非常重要,否则即便成功创建了ToolBar没有这句重定位,你的ToolBar也不会在窗口上显示出来。
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
//使工具栏图标显示256色
HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDR_TOOLBAR1), //加载IDB_TOOLBAR
IMAGE_BITMAP, //按位图格式
0,0, // cx,cy
LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS );
CBitmap bm;
bm.Attach(hbm);
m_ilToolBar.Create(24,24,ILC_COLOR32|ILC_MASK, 4, 4);
//注意ILC_MASK的作用是将背景色透明!
m_ilToolBar.Add(&bm,(CBitmap*)NULL);
//这里就要注意了上面的Create中选择了ILC_MASK这个属性的话,那么m_ilToolBar.Add(&bm,(CBitmap*)NULL);中的(CBitmap*)NULL就应该改成图标背景色的颜色值,如你的图标背景色颜色是白色那么就用RGB(255,255,255)替换掉(CBitmap*)NULL
那么就变成了:m_ilToolBar.Add(&bm,RGB(255,255,255));否则你的背景色不会被透明处理掉!到这里你也应该明白了,那就是图标的背景色不能用渐进色,否则背景透明处理很难看,因为背景透明处理就是将上面的RGB(X,X,X)颜色设置为透明,显然这里的GRB只能是一个颜色,那它就只能透明处理这一个颜色,背景上的其它颜色没法处理,那对于那些想要一个渐进色背景但图标要和按钮颜色融合的怎么办呢?把背景色单独做一个图片贴上去就可以了。
m_wndtoolbar.GetToolBarCtrl().SetImageList(&m_ilToolBar);
6.在主程序的.cpp文件中编译函数OnToolTipText//使工具栏显示提示信息
BOOL CDetectorDlg::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;
}
7.在ResourceView的String资源里,将工具栏中每个按钮的ID都对应上希望显示的提示信息即可,例如:
toolbar中有一按钮的ID是IDC_OPENFILE,希望显示的提示信息为“打开文件”那么,你需要做的就是在string资源中加入一条ID同样是IDC_OPENFILE, 内容是:打开文件
在运行的时候,将鼠标放在按钮上面就会提示 "打开文件"了
这样就完成了所有的步骤。
- 在基于对话框的MFC中添加工具栏以及工具栏提示信息并改变图标支持256色
- MFC实现256色工具栏图标及工具栏提示信息
- MFC实现256色工具栏图标及工具栏提示信息
- 在对话框中添加工具栏的提示
- MFC中对话框添加工具栏以及去除工具栏上方的横线
- MFC 基于对话框的工具栏加载图标问题
- 带图标工具栏的创建以及提示功能的添加
- MFC 给自定义工具栏添加提示信息
- 在MFC对话框界面中添加工具栏,控制条
- qt中添加资源文件以及添加菜单图标、工具栏中菜单的快捷方式、窗口以及对话框的icon
- qt中添加资源文件以及添加菜单图标、工具栏中菜单的快捷方式、窗口以及对话框的icon
- qt中添加资源文件以及添加菜单图标、工具栏中菜单的快捷方式、窗口以及对话框的icon
- 对话框工具栏信息提示的实现
- MFC基于对话框的工具栏定制效果
- 基于对话框程序,自定义工具栏(支持真彩色图标,可添加文字)
- [VC]基于对话框程序,自定义工具栏(支持真彩色图标,可添加文字)
- MFC对话框程序中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息
- MFC对话框程序中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息
- 阶乘问题
- leetcode之Palindrome Partitioning
- 域名基础知识
- View的setOnClickListener的添加方法
- 【Android 调用谷歌语音识别】
- 在基于对话框的MFC中添加工具栏以及工具栏提示信息并改变图标支持256色
- Freemarker的使用
- Power of Cryptography poj 2109 精度问题
- adb常用命令
- vi编辑器快捷键
- 关于JAVA匿名内部类的一点讨论.
- ios框架详解系列(一)----UIViewController
- 登录查询学生信息
- Linux网络代码导读v0.2