【MFC】具有提示功能的工具栏
00. 目錄
文章目錄
- 00. 目錄
- 01. 案例概述
- 02. 開發(fā)環(huán)境
- 03. 關(guān)鍵技術(shù)
- 04. 程序設(shè)計
- 05. 秘笈心法
- 06. 源碼下載
- 07. 附錄
01. 案例概述
在文檔\視圖結(jié)構(gòu)的應(yīng)用程序中,默認情況下,當(dāng)鼠標(biāo)在工具欄按鈕上停留片刻,會出現(xiàn)一個工具提示條。那么在基于對話框的應(yīng)用程序中能夠?qū)崿F(xiàn)該功能嗎?運行本案例,將鼠標(biāo)移至工具欄上的某一按鈕上,即可看到該工具按鈕的提示信息,效果如下圖所示。
02. 開發(fā)環(huán)境
系統(tǒng)環(huán)境:Windows 10
開發(fā)環(huán)境:Visual Studio 2019
03. 關(guān)鍵技術(shù)
使工具欄具有提示功能,需要同時具備幾個條件。一是工具欄具有CBRS_TOOLTIPS風(fēng)格,二是工具欄的父窗口需要處理TTN_NEEDTEXT通知消息。在MFC類庫中,CFrameWnd默認處理了TTN_NEEDTEXT通知消息,因此,在文檔\視圖結(jié)構(gòu)的應(yīng)用程序中,只要工具欄具有CBRS_TOOLTIPS風(fēng)格,就能夠顯示提示信息。
如果在對話框中添加TTN_NEEDTEXT通知消息,需要在消息映射部分添加如下代碼:
ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipNotify)
其中,OnToolTipNotify是處理TTN_NEEDTEXT消息的函數(shù),函數(shù)原型如下:
OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
參數(shù)說明:
參數(shù)id是發(fā)送消息的控件ID,但此處沒有用,因為控件ID可以來自于pNMHDR。
參數(shù)pNMHDR是一個NMHDR(實際應(yīng)該是NMTTDISPINFO結(jié)構(gòu)指針)結(jié)構(gòu)指針,NMHDR結(jié)構(gòu)記錄了發(fā)送消息的控件ID、句柄等信息。
參數(shù)pResult表示結(jié)果代碼指針,TTN_NEEDTEXT消息可以忽略該參數(shù)。
04. 程序設(shè)計
(1)新建一個基于對話框的工程。
(2)在對話框類中定義一個CToolBar變量m_ToolBar。在工作區(qū)的資源視圖中創(chuàng)建一個工具欄資源。
(3)在對話框的OnInitDialog方法中創(chuàng)建工具欄。
(4)在對話框的消息映射部分添加TTN_NEEDTEXT消息映射宏。
(5)向?qū)υ捒蛑刑砑覱nToolTipNotify方法,代碼如下:
頭文件
// CMy4ToolDlg 對話框 class CMy4ToolDlg : public CDialogEx { // 構(gòu)造 public:CMy4ToolDlg(CWnd* pParent = nullptr); // 標(biāo)準(zhǔn)構(gòu)造函數(shù)CToolBar m_ToolBar;CString m_Str;// 對話框數(shù)據(jù) #ifdef AFX_DESIGN_TIMEenum { IDD = IDD_MY4TOOL_DIALOG }; #endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 實現(xiàn) protected:HICON m_hIcon;// 生成的消息映射函數(shù)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg BOOL OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult);DECLARE_MESSAGE_MAP() };源文件
BEGIN_MESSAGE_MAP(CMy4ToolDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipNotify) END_MESSAGE_MAP()BOOL CMy4ToolDlg::OnInitDialog() {CDialogEx::OnInitDialog();// 將“關(guān)于...”菜單項添加到系統(tǒng)菜單中。// IDM_ABOUTBOX 必須在系統(tǒng)命令范圍內(nèi)。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != nullptr){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 設(shè)置此對話框的圖標(biāo)。 當(dāng)應(yīng)用程序主窗口不是對話框時,框架將自動// 執(zhí)行此操作SetIcon(m_hIcon, TRUE); // 設(shè)置大圖標(biāo)SetIcon(m_hIcon, FALSE); // 設(shè)置小圖標(biāo)// TODO: 在此添加額外的初始化代碼UINT array[10];for (int i = 0; i < 10; i++){if (i == 3 || i == 7)array[i] = ID_SEPARATOR; //第4、8個按鈕為分隔條elsearray[i] = i + 1001;}m_ToolBar.Create(this);m_ToolBar.SetButtons(array, 10);m_ToolBar.SetButtonText(0, TEXT("新建"));m_ToolBar.SetButtonText(1, TEXT("打開"));m_ToolBar.SetButtonText(2, TEXT("保存"));m_ToolBar.SetButtonText(4, TEXT("剪切"));m_ToolBar.SetButtonText(5, TEXT("復(fù)制"));m_ToolBar.SetButtonText(6, TEXT("粘貼"));m_ToolBar.SetButtonText(8, TEXT("打印"));m_ToolBar.SetButtonText(9, TEXT("幫助"));m_ToolBar.LoadBitmap(IDB_BITMAP1); //加載位圖m_ToolBar.SetSizes(CSize(36, 36), CSize(16, 16)); //設(shè)置按鈕和按鈕位圖大小m_ToolBar.EnableToolTips(TRUE);RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //顯示工具欄return TRUE; // 除非將焦點設(shè)置到控件,否則返回 TRUE }BOOL CMy4ToolDlg::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult) {TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pNMHDR;//獲取工具欄按鈕IDUINT nId = pNMHDR->idFrom;//根據(jù)ID獲取按鈕索引int index = m_ToolBar.GetToolBarCtrl().CommandToIndex(nId);//根據(jù)索引獲取按鈕文本m_ToolBar.GetButtonText(index, m_Str);//設(shè)置顯示的提示信息pTTT->lpszText = m_Str.GetBuffer(0);pTTT->hinst = AfxGetResourceHandle();return TRUE;}05. 秘笈心法
信息提示的實現(xiàn)
信息提示的方法有很多,實例中使用的是處理TTN_NEEDTEXT消息的方法,同樣還可以使用ctooltip控件的方法來實現(xiàn)提示效果。
06. 源碼下載
下載:【MFC】具有提示功能的工具欄.rar
07. 附錄
參考: 《Visual C++從入門到精通(項目案例版)》
總結(jié)
以上是生活随笔為你收集整理的【MFC】具有提示功能的工具栏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【MFC】可调整按钮位置的工具栏
- 下一篇: 【MFC】在工具栏中添加编辑框