当它从底部出来时,Win32工具提示出现在屏幕顶部

时间:2013-04-04 09:59:57

标签: custom-controls tooltip wtl

我正在使用自己的工具提示来显示我的编辑器中使用的自动填充列表框中当前所选项目的快速帮助。就像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通过),它会向左移动工具提示,直到它可以适合屏幕。

这很奇怪而且很奇怪?!

任何人都可以给我一个提示,这里的问题是什么? 更不用说,工具提示大小由win工具提示自动确定,基于要显示的消息+最大宽度+使用的字体+行号,所以在显示之前我无法计算正确的X,Y位置,所以我需要依赖在工具提示控件上。

1 个答案:

答案 0 :(得分: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坐标一起工作......但没关系。