Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 是否可以在CMFCToolbar中的CMFCToolbar ComboboxButton上添加自定义工具提示?_Visual Studio 2008_Mfc_Tooltip_Mfc Feature Pack - Fatal编程技术网

Visual studio 2008 是否可以在CMFCToolbar中的CMFCToolbar ComboboxButton上添加自定义工具提示?

Visual studio 2008 是否可以在CMFCToolbar中的CMFCToolbar ComboboxButton上添加自定义工具提示?,visual-studio-2008,mfc,tooltip,mfc-feature-pack,Visual Studio 2008,Mfc,Tooltip,Mfc Feature Pack,是否可以在CMFCToolbar中的CMFCToolbar ComboboxButton上添加自定义工具提示 现在,我可以使用资源文件中定义的“默认”工具提示文本,但无法找到在工具栏的组合框上动态更改工具提示文本的方法 资源: IDR_TOOLBAR1 TOOLBAR 16, 15 BEGIN BUTTON ID_BUTTON32771 BUTTON ID_BUTTON32772 BUTTON ID_BUTTON32773 END STRINGTABL

是否可以在CMFCToolbar中的CMFCToolbar ComboboxButton上添加自定义工具提示

现在,我可以使用资源文件中定义的“默认”工具提示文本,但无法找到在工具栏的组合框上动态更改工具提示文本的方法

资源:

IDR_TOOLBAR1 TOOLBAR 16, 15
BEGIN
  BUTTON      ID_BUTTON32771
  BUTTON      ID_BUTTON32772
  BUTTON      ID_BUTTON32773
END

STRINGTABLE
BEGIN
  ID_BUTTON32771 "Button 1\nButton 1"
  ID_BUTTON32772 "Button 2\nButton 2"
  ID_BUTTON32773 "Button 3\nButton 3"
END
工具栏创建正常,显示良好;我在OnToolbarReset(AFX_WM_RESETTOOLBAR的处理程序)中将按钮“替换”为CMFCToolBarComboxButtonCsCombo

此操作正常,按钮将替换为组合框,并显示默认工具提示文本

现在,我希望能够动态更改工具提示文本

我试图在主框架(甚至在我的派生工具栏类中)中处理TTN_NEEDTEXT(以及TTN_NEEDTEXTA和TTN_NEEDTEXTW),但没有为工具栏调用它

我尝试派生我自己的CMFCToolBarComboxButton类,并重写我可以找到的两个虚拟方法,这应该是我所期望的:

class MyComboBox : public CMFCToolBarComboBoxButton
{
public:
  MyComboBox ();
  MyComboBox (UINT uiID, int iImage, DWORD dwStyle = CBS_DROPDOWNLIST, int iWidth = 0);

  virtual BOOL OnGetCustomToolTipText(CString& );
  virtual BOOL OnUpdateToolTip(CWnd* , int , CToolTipCtrl& , CString& );

  virtual ~MyComboBox ();
  DECLARE_SERIAL(MyComboBox )

};

这两个虚拟方法从未被调用;那么,在打开申请和关闭申请时都会调用它们,;但当应用程序正常运行时,当用户将鼠标移动/悬停在工具栏中的组合框顶部时,绝对不会

我尝试查看工具提示管理器(CTooltipManager),并通过调用或不调用InitTooltipManager来启用或不启用工具提示管理器

(我很快就用VS2012尝试了这一点,得到了相同的“不工作”结果)

是否有一些步骤我错过了能够做到这一点

谢谢


Max.

如果我理解您的问题,我相信您可以从CMFCToolBar派生并重写

virtual BOOL OnUserToolTip(CMFCToolBarButton* pButton, CString& strTTText) const 
按需控制工具提示

virtual BOOL GetToolbarButtonToolTipText(CMFCToolBarButton*/*pButton*/, CString&/*strTTText*/);
virtual void GetMessageString(UINT nID, CString& rMessage) const;
是为CMFCToolBar和CMFCToolBar按钮执行此操作的方法

编辑:您需要覆盖大型机中的GetMessageString。 对于您提供的每个id,请提供一个描述:

void CMainFrame::GetMessageString(UINT nID, CString& rMessage) const 
{
    switch (nID)
    {
        case 1:
        rMessage = "Hello World";
        break;
    }
} 

它显示id为1的按钮的描述。

任何人在这里寻找答案,我就是这样做的。 创建了一个扩展类CMFCToolBarEx,并编写了如下函数

   BOOL CMFCToolBarEx::OnNeedTipText(UINT /*id*/, NMHDR* pNMH, LRESULT* /*pResult*/)
{
    TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMH;
    CString strTip = _T("");

    CPoint point;
    ::GetCursorPos(&point);
    ScreenToClient(&point);
    INT_PTR nHit = ((CMFCToolBar*)this)->HitTest(point);

    if(nHit == -1)
        return FALSE;

    CMFCToolBarButton* pButton = GetButton((int)nHit);
    strTip = pButton->m_strText;
    _tcscpy(pTTT->lpszText , strTip.GetBuffer(0));

    return TRUE;
}
通知范围(TTN\U NEEDTEXT、0、0xFFFF和CMFCToolBarEx::onnedTiptText)上的消息映射

这是指您自己添加按钮,而不是通过InsertButton函数添加资源。
它对我来说很好,只是没有显示说明。

关于如何动态更改CMFCToolBarButton工具提示,我也遇到了同样的问题。现在还没有解决。如果您不使用CMFCToolBar和CMFCToolBar按钮,我认为这是一个解决方案:您没有指定覆盖GetMessageString的位置或方式-这不是CMFCToolBar的方法。您好,欢迎使用StackOverflow,感谢您参与帮助人们完成您的答案。但是,您不需要在评论中提供任何解释。您只需编辑答案并在此处提供详细信息。还有,看看
void CMainFrame::GetMessageString(UINT nID, CString& rMessage) const 
{
    switch (nID)
    {
        case 1:
        rMessage = "Hello World";
        break;
    }
} 
   BOOL CMFCToolBarEx::OnNeedTipText(UINT /*id*/, NMHDR* pNMH, LRESULT* /*pResult*/)
{
    TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMH;
    CString strTip = _T("");

    CPoint point;
    ::GetCursorPos(&point);
    ScreenToClient(&point);
    INT_PTR nHit = ((CMFCToolBar*)this)->HitTest(point);

    if(nHit == -1)
        return FALSE;

    CMFCToolBarButton* pButton = GetButton((int)nHit);
    strTip = pButton->m_strText;
    _tcscpy(pTTT->lpszText , strTip.GetBuffer(0));

    return TRUE;
}