在基于对话框的MFC中添加工具栏以及工具栏提示信息并改变图标支持256色

来源:互联网 发布:淘宝c 编辑:程序博客网 时间:2024/04/30 13:04

 在基于单文档和基于多文档的MFC中,工具栏是自动添加的,但是在基于对话框的MFC中则需要编者用代码添加,而且工具栏的提示信息的添加也较SDIMDI要复杂的多,下面就是我总结的如何在基于对话框的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.ResourceViewString资源里,将工具栏中每个按钮的ID都对应上希望显示的提示信息即可,例如:

toolbar中有一按钮的IDIDC_OPENFILE,希望显示的提示信息为“打开文件”那么,你需要做的就是在string资源中加入一条ID同样是IDC_OPENFILE 内容是:打开文件

在运行的时候,将鼠标放在按钮上面就会提示 "打开文件"

这样就完成了所有的步骤。