我正在使用自己的工具提示来显示有关当前在我的编辑器中使用的自动完成列表框中当前选定项目的快速帮助。就像VS为源代码编辑器做的那样,当发生新的选择时,工具提示将永久地立即弹出到当前选择旁边,并保持到那里,直到新选择的自动完成列表框消失。 这是一个WTL项目,如果这很重要。Win32工具提示出现在屏幕顶部,当它出现在底部时
创建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工具提示自动决定的,基于要显示的信息+所用的最大宽度+字体+行号,所以我不能在显示它之前计算正确的X,Y位置,所以我需要依靠Tooltip控件。