使用CMFCPropertyGridCtrl,当鼠标移动到内容过长的编辑框时,如何避免提示?

使用CMFCPropertyGridCtrl,当鼠标移动到内容过长的编辑框时,如何避免提示?,mfc,Mfc,使用CMFCPropertyGridCtrl, 当鼠标移动到内容太长的编辑框时,如何避免提示?您是否看过使用: 它接受一个BOOL参数 补充资料 我查看了属性网格的源代码,并注意到以下内容: void CMFCPropertyGridCtrl::Init() { CRect rectDummy; rectDummy.SetRectEmpty(); if (GetGlobalData()->m_hcurStretch == NULL) {

使用
CMFCPropertyGridCtrl

当鼠标移动到内容太长的编辑框时,如何避免提示?

您是否看过使用:

它接受一个
BOOL
参数


补充资料 我查看了属性网格的源代码,并注意到以下内容:

void CMFCPropertyGridCtrl::Init()
{
    CRect rectDummy;
    rectDummy.SetRectEmpty();

    if (GetGlobalData()->m_hcurStretch == NULL)
    {
        GetGlobalData()->m_hcurStretch = AfxGetApp()->LoadCursor(AFX_IDC_HSPLITBAR);
    }

    if (GetGlobalData()->m_hcurStretchVert == NULL)
    {
        GetGlobalData()->m_hcurStretchVert = AfxGetApp()->LoadCursor(AFX_IDC_VSPLITBAR);
    }

    InitHeader();

    HDITEM hdItem;
    hdItem.mask = HDI_TEXT | HDI_FORMAT;
    hdItem.fmt = HDF_LEFT;
    hdItem.pszText = _T("Property");
    hdItem.cchTextMax = 100;

    GetHeaderCtrl().InsertItem(0, &hdItem);

    hdItem.pszText = _T("Value");
    hdItem.cchTextMax = 100;

    GetHeaderCtrl().InsertItem(1, &hdItem);

    m_wndScrollVert.Create(WS_CHILD | WS_VISIBLE | SBS_VERT, rectDummy, this, AFX_ID_SCROLL_VERT);

    m_ToolTip.Create(this, TTS_ALWAYSTIP);
    m_ToolTip.Activate(TRUE);
    if (GetGlobalData()->m_nMaxToolTipWidth != -1)
    {
        m_ToolTip.SetMaxTipWidth(GetGlobalData()->m_nMaxToolTipWidth);
    }

    m_ToolTip.SetWindowPos(&wndTop, -1, -1, -1, -1, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSIZE);

    m_IPToolTip.Create(this);

    CWnd* pWndParent = GetParent();
    m_bControlBarColors = pWndParent == NULL || !pWndParent->IsKindOf(RUNTIME_CLASS(CDialog));

    AdjustLayout();
    CreateBoldFont();
    CalcEditMargin();
}
我没有访问头文件的权限,因此我不知道
m\u ToolTip
变量是否为公共变量。有趣的是,当您阅读有关该类的内容时,它确实指出:

MFC自动创建此控件并在
CMFCPropertyGridCtrl
类中使用它

如果工具提示对象未公开,则可能可以创建从基类派生的自己的属性网格类,然后可以公开
m_工具提示
控件或将其停用,或者执行任何您想执行的操作


我还在
CMFCPropertyGridProperty
类的代码中看到对以下内容的引用:

m_pWndList->m_ToolTip.AddTool(m_pWndList, LPSTR_TEXTCALLBACK, rectName, m_pWndList->m_nTooltipsCount + 1);
m_pWndList->m_nTooltipsCount ++;
可能值得检查MFC代码,以查看工具提示的使用位置和方式,然后您将能够更好地在派生类中重写它们的行为

我的电脑上的MFC代码路径:

C:\ProgramFiles(x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29910\atlmfc\src\mfc


如何做
  • 显示类向导:

  • 添加MFC类:

  • 为其命名并选择属性网格控件作为基类:

您可以使用此类定义网格控件,现在可以添加一个公共方法:

void CMyPropertyGrid::DeactivateToolTips()
{
    m_ToolTip.Activate(FALSE);
}

理论上,如果您在正确的时间调用此
DeactivateToolTips
方法,它应该禁用提示。请记住,工具提示控件处理许多元素的提示,因此最终的解决方案可能不是这么简单,但它应该能让您朝着正确的方向前进。

您是否考虑过使用:

它接受一个
BOOL
参数


补充资料 我查看了属性网格的源代码,并注意到以下内容:

void CMFCPropertyGridCtrl::Init()
{
    CRect rectDummy;
    rectDummy.SetRectEmpty();

    if (GetGlobalData()->m_hcurStretch == NULL)
    {
        GetGlobalData()->m_hcurStretch = AfxGetApp()->LoadCursor(AFX_IDC_HSPLITBAR);
    }

    if (GetGlobalData()->m_hcurStretchVert == NULL)
    {
        GetGlobalData()->m_hcurStretchVert = AfxGetApp()->LoadCursor(AFX_IDC_VSPLITBAR);
    }

    InitHeader();

    HDITEM hdItem;
    hdItem.mask = HDI_TEXT | HDI_FORMAT;
    hdItem.fmt = HDF_LEFT;
    hdItem.pszText = _T("Property");
    hdItem.cchTextMax = 100;

    GetHeaderCtrl().InsertItem(0, &hdItem);

    hdItem.pszText = _T("Value");
    hdItem.cchTextMax = 100;

    GetHeaderCtrl().InsertItem(1, &hdItem);

    m_wndScrollVert.Create(WS_CHILD | WS_VISIBLE | SBS_VERT, rectDummy, this, AFX_ID_SCROLL_VERT);

    m_ToolTip.Create(this, TTS_ALWAYSTIP);
    m_ToolTip.Activate(TRUE);
    if (GetGlobalData()->m_nMaxToolTipWidth != -1)
    {
        m_ToolTip.SetMaxTipWidth(GetGlobalData()->m_nMaxToolTipWidth);
    }

    m_ToolTip.SetWindowPos(&wndTop, -1, -1, -1, -1, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSIZE);

    m_IPToolTip.Create(this);

    CWnd* pWndParent = GetParent();
    m_bControlBarColors = pWndParent == NULL || !pWndParent->IsKindOf(RUNTIME_CLASS(CDialog));

    AdjustLayout();
    CreateBoldFont();
    CalcEditMargin();
}
我没有访问头文件的权限,因此我不知道
m\u ToolTip
变量是否为公共变量。有趣的是,当您阅读有关该类的内容时,它确实指出:

MFC自动创建此控件并在
CMFCPropertyGridCtrl
类中使用它

如果工具提示对象未公开,则可能可以创建从基类派生的自己的属性网格类,然后可以公开
m_工具提示
控件或将其停用,或者执行任何您想执行的操作


我还在
CMFCPropertyGridProperty
类的代码中看到对以下内容的引用:

m_pWndList->m_ToolTip.AddTool(m_pWndList, LPSTR_TEXTCALLBACK, rectName, m_pWndList->m_nTooltipsCount + 1);
m_pWndList->m_nTooltipsCount ++;
可能值得检查MFC代码,以查看工具提示的使用位置和方式,然后您将能够更好地在派生类中重写它们的行为

我的电脑上的MFC代码路径:

C:\ProgramFiles(x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29910\atlmfc\src\mfc


如何做
  • 显示类向导:

  • 添加MFC类:

  • 为其命名并选择属性网格控件作为基类:

您可以使用此类定义网格控件,现在可以添加一个公共方法:

void CMyPropertyGrid::DeactivateToolTips()
{
    m_ToolTip.Activate(FALSE);
}

理论上,如果您在正确的时间调用此
DeactivateToolTips
方法,它应该禁用提示。请记住,工具提示控件处理许多元素的提示,因此最终的解决方案可能不是这么简单,但它应该可以让您朝正确的方向前进。

此开关在两种操作模式之间切换:无条件显示工具提示,或仅当显示文本被截断时才显示工具提示。这无助于OP解决他们的问题。不知道这个开关的作用是可以理解的,因为MFC的文档是完全无用的。@IInspectable Oops。很抱歉。我试图找到一个解释,正如你所说的帮助是无用的。AlwaysShowUserToolTip(FALSE)没有任何效果,当鼠标移动upm_时仍会显示提示。ToolTip是受保护的variable@Andrew非常感谢您的帮助!此开关可在两种操作模式之间切换:无条件显示工具提示,或者仅当显示文本被截断时才显示工具提示。这无助于OP解决他们的问题。不知道这个开关的作用是可以理解的,因为MFC的文档是完全无用的。@IInspectable Oops。很抱歉。我试图找到一个解释,正如你说的,帮助是无用的。总是显示用户工具提示(错误)没有任何效果,当鼠标移动upm\U时仍将显示提示工具提示受保护variable@Andrew非常感谢您的帮助!为您更新了我的答案并提供了更多详细信息。为您更新了我的答案并提供了更多详细信息。