6

私のアプリケーションでは、WM_HELPメッセージを処理してから、このメソッドを使用してコントロールのツールチップを作成しています:

から取得: http://msdn.microsoft.com/en-us/library/bb760252(v=vs.85).aspx

HWND CreateToolTip(int toolID, HWND hDlg, PTSTR pszText)
{
    if (!toolID || !hDlg || !pszText)
    {
        return FALSE;
    }
    // Get the window of the tool.
    HWND hwndTool = GetDlgItem(hDlg, toolID);

    // Create the tooltip. g_hInst is the global instance handle.
    HWND hwndTip = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,
                              WS_POPUP |TTS_ALWAYSTIP | TTS_BALLOON,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              hDlg, NULL, 
                              g_hInst, NULL);

   if (!hwndTool || !hwndTip)
   {
       return (HWND)NULL;
   }                              

    // Associate the tooltip with the tool.
    TOOLINFO toolInfo = { 0 };
    toolInfo.cbSize = sizeof(toolInfo);
    toolInfo.hwnd = hDlg;
    toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
    toolInfo.uId = (UINT_PTR)hwndTool;
    toolInfo.lpszText = pszText;
    SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo);

    return hwndTip;
}

マウス ポインターを移動するとすぐにツールチップが消えます。

私の質問は次のとおりです。

  1. ツールチップは破棄されていますか、それとも単に非表示になっていますか?
  2. それが隠されている場合、それを破壊する方法と時期は?

ありがとう。

4

3 に答える 3

4

WinAPIプログラミングを行ってからしばらく経ちましたが、メモリが役立つ場合は...

を呼び出すと、ダイアログウィンドウがツールチップの親になることを意味するhWndParentパラメータとしてCreateWindowEx渡されます。hDlg

関数に関するMSDNドキュメントからDestroyWindow

指定されたウィンドウが親ウィンドウまたは所有者ウィンドウである場合、DestroyWindowは、親ウィンドウまたは所有者ウィンドウを破棄するときに、関連付けられた子ウィンドウまたは所有ウィンドウを自動的に破棄します。この関数は、最初に子ウィンドウまたは所有ウィンドウを破棄し、次に親ウィンドウまたは所有ウィンドウを破棄します。

したがって、ツールチップウィンドウが最終的に破棄されると想定できます。CreateToolTipすべてのメッセージに応答して呼び出す場合は、ダイアログが閉じて最終的に呼び出されるWM_HELPまで、メモリ内に多数のツールチップウィンドウがぶら下がってしまうので注意してください。DestroyWindow

vz0が指摘したように、ツールチップを一度作成し、ウィンドウハンドルを押したままにして、ヘルプメッセージに応答してツールチップを再度作成するのではなく表示することができます。

vz0の回答に対するコメントで、次のように述べています。

ツールチップがうまくいかない方法は複数あります。例:マウスの移動、タイムアウトなど。

これらはすべて、ウィンドウが非表示になるだけなので、ツールチップへのハンドルは引き続き有効であり、を使用して再表示できますShowWindow

于 2011-02-01T12:15:40.650 に答える
2

CreateWindowEx呼び出しごとに、一致するDestroyWindow呼び出しが必要です。

別の方法として、毎回ウィンドウを作成して破棄する代わりに、ShowWindow呼び出しをSW_SHOWとで使用しSW_HIDEて、ポップアップを表示および非表示にすることができます。

于 2011-01-31T13:37:10.330 に答える