Нужно ли уничтожать всплывающую подсказку? - PullRequest
4 голосов
/ 31 января 2011

В моем приложении я обрабатываю сообщение 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. Если она скрыта, то как ее уничтожить и когда?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 01 февраля 2011

Прошло много времени с тех пор, как я занимался любым программированием на WinAPI, но если мне не изменяет память ...

Вызов CreateWindowEx передает hDlg как hWndParent параметр, означающий, что диалоговое окно теперь является родителем всплывающей подсказки.

Из документации MSDN по функции DestroyWindow говорится:

Если указаноОкно является родительским или владельцем окна, DestroyWindow автоматически уничтожает связанный дочерний или принадлежащий окна, когда он уничтожает родительское или владелец окна.Функция сначала уничтожает дочерние или собственные окна, а затем разрушает родительское или родительское окно.

Таким образом, вы можете предположить, что ваше окно всплывающей подсказки будет уничтожено со временем .Будьте осторожны, если вы звоните CreateToolTip в ответ на каждое сообщение WM_HELP, так как в результате вы получите несколько окон с подсказками, которые будут висеть в памяти, пока ваше диалоговое окно не будет закрыто и, наконец, не будет вызван DestroyWindow.

Как указал vz0, вы можете создать всплывающую подсказку один раз, повесить на дескриптор окна, а затем показать подсказку в ответ на сообщение справки, а не создавать ее снова.

В своем комментарии к ответу vz0 вы сказали:

Есть несколько способов, которыми всплывающая подсказка может появиться.пример: движение мыши, тайм-аут и т. д.

Все это приводит только к тому, что окно скрыто, поэтому дескриптор подсказки все еще действителен и его можно снова отобразить с помощью ShowWindow.

2 голосов
/ 31 января 2011

Для каждого CreateWindowEx вызова требуется соответствующий DestroyWindow вызов.

В качестве альтернативы, вместо создания и уничтожения окна каждый раз, когда вы можете использовать ShowWindow вызов с SW_SHOW и SW_HIDE, чтобы показать и скрыть всплывающее окно.

0 голосов
/ 11 января 2018

По моему опыту, мне нужно было DestroyWindow() во всплывающей подсказке, чтобы HFONT (ресурс шрифта GDI) был правильно выпущен.В обоих окнах одновременно существовала связь родитель-ребенок - но моя система меняет это во время выполнения и может быть виновата.Вероятно, это не повредит, если ваша система это обобщает.

...