0

我正在使用我自己的工具提示在我的编辑器中使用的自动完成列表框中显示有关当前选定项目的快速帮助。就像 VS 对源代码编辑器所做的那样,当发生新的选择时,工具提示会永久并立即弹出当前选择的旁边,并一直保留在那里,直到自动完成列表框的新选择消失。如果重要的话,这是一个 WTL 项目。

我创建 amd 的方式显示我的工具提示:

    m_hwndTooltip = CreateWindowEx(WS_EX_TOPMOST,
                            TOOLTIPS_CLASS,
                            NULL,
                            TTS_NOPREFIX | TTS_ALWAYSTIP,       
                            CW_USEDEFAULT,
                            CW_USEDEFAULT,
                            CW_USEDEFAULT,
                            CW_USEDEFAULT,
                            NULL,
                            NULL,
                            NULL,
                            NULL
                           );

    // INITIALIZE MEMBERS OF THE TOOLINFO STRUCTURE
    m_toolTipInfo.cbSize = TTTOOLINFOA_V2_SIZE;
    m_toolTipInfo.uFlags = TTF_TRACK;
    m_toolTipInfo.hwnd = NULL;
    m_toolTipInfo.hinst = NULL;
    m_toolTipInfo.uId = 0;  // ??
    m_toolTipInfo.lpszText = (LPTSTR) messsssssssage.c_str();       
    // Tool_tip control will cover the whole window
    m_toolTipInfo.rect.left = 0;
    m_toolTipInfo.rect.top = 0;
    m_toolTipInfo.rect.right = 0;
    m_toolTipInfo.rect.bottom = 0;

    ::SendMessage(m_hwndTooltip, TTM_SETMAXTIPWIDTH, 0, MAX_TOOLTIP_WIDTH); //set max width in pixels, AND(!!) enable multi-line support

    // SEND AN ADDTOOL MESSAGE TO THE TOOLTIP CONTROL WINDOW
    ::SendMessage(m_hwndTooltip, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &m_toolTipInfo);

    ::SendMessage(m_hwndTooltip, TTM_TRACKPOSITION, 0, (LPARAM)(DWORD) MAKELONG(x, y));
    ::SendMessage(m_hwndTooltip, TTM_TRACKACTIVATE, true, (LPARAM)(LPTOOLINFO) &m_toolTipInfo);

这一切都很好,就像一个魅力。

但是,当我传递太高的 Y 坐标,这会使工具提示在底部的屏幕之外(例如:屏幕高度:1000,我传递 Y:950,工具提示将是 100 高度),然后工具提示出现在Y=0,所以屏幕顶部位置,而不是重新定位到 900。但是,这是水平工作的,所以如果它在右侧(通过的 X 太高),它会向左移动工具提示,直到它可以适合屏幕上。

这很奇怪很奇怪?!

谁能给我提示这里有什么问题?更不用说,Tooltip的大小是由win tooltip自动确定的,根据要显示的消息+最大宽度+使用的字体+行号,所以在显示之前我无法计算出正确的X,Y位置,所以我需要依赖在工具提示控件上。

4

1 回答 1

0

由于没有回复,我找到了解决方案,我将其分享给其他人:

当工具提示无法适应屏幕时,最初的 0,0 似乎是一种后备。

所以我做什么,而不是

 m_toolTipInfo.rect.top = 0;
 m_toolTipInfo.rect.buttom = 0;
   --->
 m_toolTipInfo.rect.top = rcWorkingArea.bottom - 5;
 m_toolTipInfo.rect.bottom = rcWorkingArea.bottom - 5;

如果工具提示不能适合屏幕底部,则将使用此值。

仍然很奇怪为什么它会自动与 X 坐标一起工作......但没关系。

于 2013-04-04T11:24:40.367 回答