Доброго времени суток, возникла проблема,которую мне не удаётся решить.Проблема заключается в неправильной работе tooltip'а,если в программе присутствует манифест.Неправильная работа означает следующее: если после появления tooltip'а нажать на соответствующий контрол или дождаться автоматического исчезновения tooltip'а,то последний больше не появляется. Вот ссылки на два архива с тестовой программкой: в одном случае с манифестом,в другом без него: http://www.sendspace.com/file/45qecz http://www.sendspace.com/file/rildcn У меня - xp sp2 - без манифеста работает,а с ним - работает как описано выше. Как исправить ситуацию?
Сам с "неким конфликтом" не сталкивался, но вот первое, что выскочило в гугле на "tooltip mahifest": win32 programmer ui Tooltip disappears after showing once ...
В общем,исходя из того топика,я так понял,что решения данной проблемы нет... Там у чувака абсолютно такая же проблема как у меня - ему там советают всё,что угодно,но вся эта вода не помогает. Выходит,что это глюк винды...или как?
>Выходит,что это глюк винды...или как? Черт его знает, у меня на XP-pro-sp2 воспроизвести не удается. Но если выложите к.н. минимальную демку с этим феноменом (т.е. чтобы она хотя бы у вас 100% работала) - можно будет попытаться прощупать.
...дык,один из файлов,на которые я давал ссылки в первом посте,идёт с манифестом.Там и можно наблюдать этот феномен.Другой файл без манифеста - там всё работает.Исходники приложены.
2 момента: 1) не скачиваю оттуда, где требуют включить js, 2) изготовление минимальной демки неизбежно приведет вас к лучшему пониманию, а то и решению проблемы.
...как всё сложно то...Рапида надеюсь подойдёт? http://rapidshare.com/files/248412280/Test_with_manifest.rar.html http://rapidshare.com/files/248412705/Test_simple.rar.html ...это и есть минимальная демка,которая и привела меня к лучшему пониманию,что проблема вызвана манифестом.
Айайай, сколько иронии. А вот - не подойдет: тоже хочет js. Ну да ладно. А вот и не минимальная: содержит немало элементов, совершенно лишних для нашего феномена. Да и не надо было двух демок: достаточно одной, с манифестом отдельным файлом. В общем, ниже - мой вариант минимальной демки, с вроде бы отремонтированной тултипизацией батона (хотя может где-то и напортачил, проверьте). (Сам же казус - просто еще один пример несуразностей XP стиля). .asm Код (Text): .586 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\comctl32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\comctl32.lib .const MAIN_DIALOG equ 998 IDB_CHECK equ 104 .data _tt db "Tooltips_class32",0 _txt db "Please remember to use punctuation marks like commas and dots!",0 .data? hinst dd ? hwtt dd ? ti TOOLINFO <> .code DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .if uMsg==WM_CLOSE invoke EndDialog,hWnd,0 .elseif uMsg==WM_INITDIALOG invoke CreateWindowEx,0,offset _tt,0,TTS_ALWAYSTIP or TTS_BALLOON,0,0,0,0,0,0,hinst,0 mov hwtt,eax xor ecx,ecx mov ti.cbSize,sizeof ti mov ti.uFlags,TTF_IDISHWND or TTF_SUBCLASS mov ti.hWnd,ecx mov ti.rect.left,ecx mov ti.rect.top,ecx mov ti.rect.right,ecx mov ti.rect.bottom,ecx mov ti.hInst,ecx invoke GetDlgItem,hWnd,IDB_CHECK mov ti.uId,eax mov ti.lpszText,offset _txt jmp @f .elseif uMsg==WM_COMMAND && wParam==IDB_CHECK ; ... @@: invoke SendMessage,hwtt,TTM_ADDTOOL,0,addr ti .else xor eax,eax jmp @f .endif xor eax,eax inc eax @@: ret DlgProc endp start: invoke GetModuleHandle,0 mov hinst,eax invoke DialogBoxParam,eax,MAIN_DIALOG,0,offset DlgProc,0 invoke ExitProcess,eax invoke InitCommonControls end start .rc Код (Text): #include "\masm32\include\resource.h" #define MAIN_DIALOG 998 #define IDB_CHECK 104 MAIN_DIALOG DIALOG 150, 150, 80, 35 STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Top_level" FONT 12, "Times new roman" { CONTROL "Check", IDB_CHECK, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 45, 10, 25, 15 }
Посмотрел с утречка - ё-моё! Вроде, вот так оно получше будет: Код (Text): .586 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\comctl32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\comctl32.lib .const MAIN_DIALOG equ 998 IDB_CHECK equ 104 .data _tt db "Tooltips_class32",0 _txt db "Please remember to use punctuation marks like commas and dots!",0 _ft db "%d",0 .data? hinst dd ? hwtt dd ? hwbt dd ? ti TOOLINFO <> flag dd ? .code DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .if uMsg==WM_CLOSE invoke EndDialog,hWnd,0 .elseif uMsg==WM_INITDIALOG invoke CreateWindowEx,0,offset _tt,0,TTS_ALWAYSTIP or TTS_BALLOON,0,0,0,0,0,0,hinst,0 mov hwtt,eax xor ecx,ecx mov ti.cbSize,sizeof ti mov ti.uFlags,TTF_IDISHWND or TTF_SUBCLASS mov ti.hWnd,ecx mov ti.rect.left,ecx mov ti.rect.top,ecx mov ti.rect.right,ecx mov ti.rect.bottom,ecx mov ti.hInst,ecx invoke GetDlgItem,hWnd,IDB_CHECK mov hwbt,eax mov ti.uId,eax mov ti.lpszText,offset _txt jmp @f .elseif uMsg==WM_SETCURSOR mov eax,hwbt .if (eax==wParam && eax!=flag) || (eax!=wParam && eax==flag) mov eax,wParam mov flag,eax @@: invoke SendMessage,hwtt,TTM_ADDTOOL,0,addr ti .endif jmp @f .else @@: xor eax,eax jmp @f .endif xor eax,eax inc eax @@: ret DlgProc endp start: invoke GetModuleHandle,0 mov hinst,eax invoke DialogBoxParam,eax,MAIN_DIALOG,0,offset DlgProc,0 invoke ExitProcess,eax invoke InitCommonControls end start
kero, в общем-то, благодарю за решение.Метод,конечно,достаточно хардкорный,но видимо иначе тут не пройдёт.Пробовал просто активировать тултип с помощью сообщения TTM_ACTIVATE вместо повторного добавления - не помогает.
Оказывается, пройдет Вместо перерегистраций (TTM_ADDTOOL) можно применить, например, TTM_UPDATE. Но и TTM_ACTIVATE сгодится, только двойное: SendMessage(TTM_ACTIVATE,FALSE) + SendMessage(TTM_ACTIVATE,TRUE). Приложенный третий пример отличается от предыдущего еще и экономией на переменной flag, путем hWnd+1 в духе соседней ветки. Впрочем, вернуть коду пристойный вид нетрудно. Код (Text): .const MAIN_DIALOG equ 998 IDB_CHECK equ 104 .data _tt db "Tooltips_class32",0 _txt db "Please remember to use punctuation marks like commas and dots!",0 .data? hinst dd ? hwtt dd ? hwbt dd ? ti TOOLINFO <> .code DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .if uMsg==WM_CLOSE invoke EndDialog,hWnd,0 .elseif uMsg==WM_INITDIALOG invoke CreateWindowEx,WS_EX_TOPMOST,offset _tt,0,TTS_ALWAYSTIP or TTS_BALLOON,0,0,0,0,0,0,hinst,0 mov hwtt,eax xor ecx,ecx mov ti.cbSize,sizeof ti mov ti.uFlags,TTF_IDISHWND or TTF_SUBCLASS mov ti.hWnd,ecx mov ti.rect.left,ecx mov ti.rect.top,ecx mov ti.rect.right,ecx mov ti.rect.bottom,ecx mov ti.hInst,ecx invoke GetDlgItem,hWnd,IDB_CHECK mov hwbt,eax mov ti.uId,eax mov ti.lpszText,offset _txt invoke SendMessage,hwtt,TTM_ADDTOOL,0,addr ti .elseif uMsg==WM_SETCURSOR mov eax,hwbt and eax,0fffffffeh .if eax==wParam && eax==hwbt inc hwbt ; (HWND+1) ; invoke SendMessage,hwtt,TTM_UPDATE,0,0 invoke SendMessage,hwtt,TTM_ACTIVATE,FALSE,0 invoke SendMessage,hwtt,TTM_ACTIVATE,TRUE,0 .elseif eax!=wParam mov hwbt,eax .endif jmp @f .else @@: xor eax,eax jmp @f .endif xor eax,eax inc eax @@: ret DlgProc endp start: invoke GetModuleHandle,0 mov hinst,eax invoke DialogBoxParam,eax,MAIN_DIALOG,0,offset DlgProc,0 invoke ExitProcess,eax invoke InitCommonControls end start