我正在使用我自己的工具提示在我的编辑器中使用的自动完成列表框中显示有关当前选定项目的快速帮助。就像 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位置,所以我需要依赖在工具提示控件上。