【问题标题】:Cannot get tooltip to show on MFC ActiveX Com Control Dialog无法在 MFC ActiveX Com 控件对话框上显示工具提示
【发布时间】:2020-03-14 09:58:08
【问题描述】:

我创建了一个 MFC ActiveX 控件,并在其中创建了一个将在 .NET 环境中使用的子对话框。在对话框中,我有一个按钮,当您将鼠标悬停时,我放置了一个工具提示,它应该显示工具提示。出于某种原因,当我在 .NET 环境中使用对话框时,它不起作用。

我创建了一个 MFC 对话框应用程序并执行了相同的操作,它工作正常,但在将它放入 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,但上面显示的代码可以,但它不适用于我。

感谢任何帮助!

【问题讨论】:

    标签: c# .net mfc com activex


    【解决方案1】:

    我不知道这是否正是您所需要的。在我想要工具提示的 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 控件上下文。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 2011-09-30
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多