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,  內容是: 打開文件

在運行的時候,將鼠標放在按鈕上面就會提示 "打開文件"了

這樣就完成了所有的步驟。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM