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

 

网上资料:

在基于单文档和基于多文档的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)加入:

 

//添加一个平面工具栏

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

//使工具栏图标显示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_COLOR8, 4, 4);

m_ilToolBar.Add(&bm,(CBitmap*)NULL);

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,  内容是: 打开文件

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

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

posted @ 2013-03-13 10:34  紫清婷  阅读(4558)  评论(0编辑  收藏  举报