我正在使用自己的工具提示來顯示有關當前在我的編輯器中使用的自動完成列表框中當前選定項目的快速幫助。就像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控件。