独自のツールチップを使用して、エディターで使用されているオートコンプリート リストボックスで現在選択されている項目に関するクイック ヘルプを表示しています。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位置を計算できないため、依存する必要がありますツールチップ コントロールで。