我创建了MFC ActiveX控件,并在其中创建了将在.NET环境中使用的子对话框。在对话框中,我有一个按钮,当您将鼠标悬停在鼠标上时,会放置一个工具提示,它应该显示该工具提示。由于某种原因,当我在.NET环境中使用对话框时,它将无法正常工作。
我创建了一个MFC Dialog Application,执行了相同的操作,并且工作正常,但是当它放在C#.NET环境中时,不能通过ActiveX运行。
这是我的代码:
MainDialog.h
CToolTipCtrl m_tooltip;
MainDialog.cpp
CButton *PlayButton = (CButton*)GetDlgItem(IDC_PLAY_BUTTON);
m_tooltip.Create(this);
m_tooltip.AddTool(PlayButton, L"Play");
m_tooltip.Activate(TRUE);
BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
MSG msg;
msg.wParam = wParam;
msg.lParam = lParam;
msg.message = message;
msg.hwnd = m_hWnd;
GetCursorPos(&msg.pt);
// Tooltips notification.
FilterToolTipMessage(&msg);
return CWnd::OnWndMsg(message, wParam, lParam, pResult);
}
我首先使用PreTranslateMessage
,但我读了http://forum.codejock.com/forum_posts.asp?TID=1361&title=task-panel-tooltips-in-activex-control
在这里它不适用于MFC,但是上面显示的这段代码可以,但是对我来说不起作用。
感谢您的任何帮助!
我不知道这是否正是您所需要的。在需要工具提示的MFC对话框中,我首先将其添加到标题中:
using ToolTipMap = std::map<UINT, UINT>;
然后,我添加此函数(在OnInitDialog
中调用):
void COptionsDlg::InitToolTips()
{
int i = 0;
CString strText = _T("");
ToolTipMap mapToolTips;
mapToolTips.emplace(IDC_COMBO_WATCHTOWER_DAY, IDS_COMBO_WATCHTOWER_DAY);
mapToolTips.emplace(IDC_COMBO_SCHOOL_DAY, IDS_COMBO_SCHOOL_DAY);
mapToolTips.emplace(IDC_EDIT_DATE_FORMAT, IDS_EDIT_DATE_FORMAT);
mapToolTips.emplace(IDC_CHECK_USE_CUSTOM_DATE, IDS_CHECK_USE_CUSTOM_DATE);
mapToolTips.emplace(IDC_CHECK_PLATFORM, IDS_CHECK_PLATFORM);
mapToolTips.emplace(IDC_CHECK_PLATFORM_MIKE, IDS_CHECK_PLATFORM_MIKE);
mapToolTips.emplace(IDC_COMBO_NUM_MIKE_USERS, IDS_COMBO_NUM_MIKE_USERS);
mapToolTips.emplace(IDC_COMBO_NUM_SOUND_USERS, IDS_COMBO_NUM_SOUND_USERS);
mapToolTips.emplace(IDC_COMBO_NUM_ATTEND, IDS_COMBO_NUM_ATTEND);
mapToolTips.emplace(IDC_BUTTON_HELP, IDS_BUTTON_HELP);
mapToolTips.emplace(IDC_COMBO_REPORT_MODE, IDS_COMBO_REPORT_MODE);
mapToolTips.emplace(IDC_COMBO_WEEKLY_DAY, IDS_COMBO_WEEKLY_DAY);
for (auto& kv : mapToolTips)
{
strText.LoadString(kv.second);
m_tooltip[i].Create(this, TTS_BALLOON);
m_tooltip[i].Activate(DisplayToolTips());
m_tooltip[i].AddTool(GetDlgItem(kv.first), strText);
i++;
}
}
上面的函数为每个需要显示工具提示的元素创建一个工具提示控件,并将其与STRINGTABLE
条目相关联。
最后,我得到了您所指的PreTranslateMessage
,但我是这样的:
BOOL COptionsDlg::PreTranslateMessage(MSG* pMsg)
{
for(int i = 0; i < NUM_OPTION_TOOLTIPS; i++ )
m_tooltip[i].RelayEvent(pMsg);
return CDialog::PreTranslateMessage(pMsg); // CG: This was added by the ToolTips component.
}
追溯到Visual C ++ 6,以前曾经有一个组件库,您可以在任何对话框类中插入工具提示支持。那些日子!
我不知道以上内容是否适合您的MFC ActiveX控件环境。