我是这样创建工具条的:
if(!m_TBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS |CBRS_FLYBY | CBRS_BORDER_BOTTOM) || !m_TBar.LoadToolBar(IDR_TOOLBAR_USER))
{
TRACE("对话框中增加工具条失败");
EndDialog(IDCANCEL);
}
为什么没有TOOLTIPS提示呢?
if(!m_TBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS |CBRS_FLYBY | CBRS_BORDER_BOTTOM) || !m_TBar.LoadToolBar(IDR_TOOLBAR_USER))
{
TRACE("对话框中增加工具条失败");
EndDialog(IDCANCEL);
}
为什么没有TOOLTIPS提示呢?
// Dialog Data
//{{AFX_DATA(CSIMTOOLDlg)
enum { IDD = IDD_SIMTOOL_DIALOG };
CInfobarCtrl m_InfoBar;
CListCtrl m_OutlookBar;
//}}AFX_DATA // ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSIMTOOLDlg)
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL// Implementation
protected:
HICON m_hIcon; // Generated message map functions
//{{AFX_MSG(CSIMTOOLDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
//}}AFX_MSG
BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);
DECLARE_MESSAGE_MAP()
};BEGIN_MESSAGE_MAP(CSIMTOOLDlg, CDialogResize)
//{{AFX_MSG_MAP(CSIMTOOLDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
END_MESSAGE_MAP()BOOL CSIMTOOLDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
{
ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW); // need to handle both ANSI and UNICODE versions of the message
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
TCHAR szFullText[256];
CString cstTipText;
CString cstStatusText; UINT nID = pNMHDR->idFrom;
if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||
pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
{
// idFrom is actually the HWND of the tool
nID = ((UINT)(WORD)::GetDlgCtrlID((HWND)nID));
} if (nID != 0) // will be zero on a separator
{
AfxLoadString(nID, szFullText);
// this is the command id, not the button index
AfxExtractSubString(cstTipText, szFullText, 1, '\n');
AfxExtractSubString(cstStatusText, szFullText, 0, '\n');
} // Non-UNICODE Strings only are shown in the tooltip window...
if (pNMHDR->code == TTN_NEEDTEXTA)
lstrcpyn(pTTTA->szText, cstTipText,
(sizeof(pTTTA->szText)/sizeof(pTTTA->szText[0])));
else
_mbstowcsz(pTTTW->szText, cstTipText,
(sizeof(pTTTW->szText)/sizeof(pTTTW->szText[0])));
*pResult = 0; // bring the tooltip window above other popup windows
::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE); // message was handled
return TRUE;
}BOOL CSIMTOOLDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (m_hWnd)
{
if (IsWindow(m_ToolTipCtrl.m_hWnd))
m_ToolTipCtrl.RelayEvent(pMsg);
}
return CDialogResize::PreTranslateMessage(pMsg);
}
OnToolTipText你作为一个消息相应声名在上面的代码中可以找到他的声名
此方法适用于MFC派生类,在基于对话框的类中测试通过。具体步骤如下:
1、选择“Project”菜单,然后“Set Active Project” 。
2、选择“Project”菜单 -->“Add to Project” -->“Components and Controls” -->“VC++ Components” --> “ToolTip Support”
3、选择“Insert”
4、在对话框资源中加入一个按钮,ID为IDC_ToolTip
5、在 CDialog::OnInitDialog() 中找到下面的注释行:
// TODO: Use one of the following forms to add controls:
// m_tooltip.AddTool(GetDlgItem(IDC_), );
// m_tooltip.AddTool(GetDlgItem(IDC_), "");
然后在注释行后加入一行代码:
m_tooltip.AddTool(GetDlgItem(IDC_ToolTip), "显示 ToolTip");
经过上面的步骤之后:
头文件(*.h)中会自动加入下面的代码:
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
实现文件(*.cpp)会加入方法实现:
PreTranslateMessage(MSG* pMsg);
BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);在CPP文件的中
BEGIN_MESSAGE_MAP(CSIMTOOLDlg, CDialogResize)
//{{AFX_MSG_MAP(CSIMTOOLDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
// 下面的对应头文件中的函数声名
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
END_MESSAGE_MAP()然后在CPP中写函数体:这个函数你贴过去改一下类名就可以了
BOOL C~Dlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
{
ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW); // need to handle both ANSI and UNICODE versions of the message
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
TCHAR szFullText[256];
CString cstTipText;
CString cstStatusText; UINT nID = pNMHDR->idFrom;
if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||
pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
{
// idFrom is actually the HWND of the tool
nID = ((UINT)(WORD)::GetDlgCtrlID((HWND)nID));
} if (nID != 0) // will be zero on a separator
{
AfxLoadString(nID, szFullText);
// this is the command id, not the button index
AfxExtractSubString(cstTipText, szFullText, 1, '\n');
AfxExtractSubString(cstStatusText, szFullText, 0, '\n');
} // Non-UNICODE Strings only are shown in the tooltip window...
if (pNMHDR->code == TTN_NEEDTEXTA)
lstrcpyn(pTTTA->szText, cstTipText,
(sizeof(pTTTA->szText)/sizeof(pTTTA->szText[0])));
else
_mbstowcsz(pTTTW->szText, cstTipText,
(sizeof(pTTTW->szText)/sizeof(pTTTW->szText[0])));
*pResult = 0; // bring the tooltip window above other popup windows
::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE); // message was handled
return TRUE;
}
他里面的代码就是这样
BOOL CSIMTOOLDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
//
if (m_hWnd)
{
if (IsWindow(m_ToolTipCtrl.m_hWnd))
m_ToolTipCtrl.RelayEvent(pMsg);
}
return CDialogResize::PreTranslateMessage(pMsg);
}m_ToolTipCtrl是你定义的tooltip, 在 头文件中定义
CToolTipCtrl m_ToolTipCtrl;