Подсказки Windows со стилем TTS_BALLOON не отображаются в некоторых установках - PullRequest
0 голосов
/ 16 декабря 2010

Я поддерживаю настольное приложение Win32, которое показывает всплывающие подсказки. Это пока работает довольно хорошо на многих установках XP и Windows 7.

Теперь мы получаем сообщения от нескольких клиентов о том, что они не видят наши подсказки. Всплывающая подсказка «Посмотрите прямоугольник» (которая не имеет атрибута TTS_BALLOON. Но те, которые созданы с TTS_BALLOON, не видны. Файлы журнала, отправленные отчетом клиента, который CreateWindowEx возвращает действительный дескриптор окна, а также координаты и содержащиеся строки верны. Соответствующая машина работает под управлением Windows XP и регулярно обновляется.

Кто-нибудь сталкивался с подобным поведением?

Как мы можем решить эту проблему?

Исходный код:

    gHintInfo.hwnd = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,
                            WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP | TTS_BALLOON, 
                            CW_USEDEFAULT, CW_USEDEFAULT,
                            CW_USEDEFAULT, CW_USEDEFAULT,
                            NULL, NULL, 
                            (HINSTANCE)xvt_vobj_get_attr(TASK_WIN, ATTR_WIN_INSTANCE),
                            NULL);

Trace(1, "\n### DrawHint %d, hwnd = %08x, Text =\n%s\n###\n\n", __LINE__, gHintInfo.hwnd, tx);

    if (gHintInfo.hwnd != NULL)
    {
        TOOLINFO ti;
        ti.cbSize = sizeof (ti);
        ti.uFlags = TTF_TRANSPARENT | TTF_ABSOLUTE;
        ti.hwnd = hwndParent;
        ti.uId = 0;
        ti.hinst = NULL;
        ti.lpszText = (char *) tx;
        GetClientRect (hwndParent, &ti.rect);

dbgrct(ti.rect);
dbgpnt(gHintInfo.LastHintLoc);

        SendMessage(gHintInfo.hwnd, TTM_TRACKPOSITION,0, MAKELONG(gHintInfo.LastHintLoc.v, gHintInfo.LastHintLoc.h));    
        SendMessage (gHintInfo.hwnd, TTM_ADDTOOL, 0, (long) &ti);
        SendMessage (gHintInfo.hwnd, TTM_SETDELAYTIME, TTDT_AUTOMATIC, -1);
        SendMessage (gHintInfo.hwnd, TTM_SETMAXTIPWIDTH, 0, 500);    
        SendMessage (gHintInfo.hwnd, TTM_TRACKACTIVATE, TRUE, (long) &ti);
    }

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

### DrawHint 474, hwnd = 00090112, Text =
Some text with 
multiple lines
###

ti.rect left = 0, top = 0, right = 1280, bottom = 978
gHintInfo.LastHintLoc h = 295, v = 539

(Мы устанавливаем ti.rect в координаты всего экрана, так как окна в любом случае изменяют размер всплывающей подсказки на содержащий текст.)

EDIT: Мы фактически добавили свойство конфигурации в наше Программное обеспечение, которое не делает ничего, кроме добавления или удаления атрибута TTS_BALLOON. Это решает проблему на соответствующих машинах.

1 Ответ

0 голосов
/ 04 июля 2012

Лучшее решение можно найти здесь .

Чтобы отключить всплывающую подсказку, установите EnableBalloonTips на 1

...