Некий конфликт между tooltip'ом и манифестом

Тема в разделе "WASM.WIN32", создана пользователем DillerInc, 23 июн 2009.

  1. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    Доброго времени суток,
    возникла проблема,которую мне не удаётся решить.Проблема заключается в неправильной работе tooltip'а,если в программе присутствует манифест.Неправильная работа означает следующее: если после появления tooltip'а нажать на соответствующий контрол или дождаться автоматического исчезновения tooltip'а,то последний больше не появляется.

    Вот ссылки на два архива с тестовой программкой: в одном случае с манифестом,в другом без него:
    http://www.sendspace.com/file/45qecz
    http://www.sendspace.com/file/rildcn
    У меня - xp sp2 - без манифеста работает,а с ним - работает как описано выше.

    Как исправить ситуацию?
     
  2. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
  3. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    в гугле набирал все-таки "tooltip manifest", не "tooltip mahifest" :)
     
  4. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    В общем,исходя из того топика,я так понял,что решения данной проблемы нет...
    Там у чувака абсолютно такая же проблема как у меня - ему там советают всё,что угодно,но вся эта вода не помогает.
    Выходит,что это глюк винды...или как?
     
  5. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    >Выходит,что это глюк винды...или как?

    Черт его знает, у меня на XP-pro-sp2 воспроизвести не удается.
    Но если выложите к.н. минимальную демку с этим феноменом (т.е. чтобы она хотя бы у вас 100% работала) - можно будет попытаться прощупать.
     
  6. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    ...дык,один из файлов,на которые я давал ссылки в первом посте,идёт с манифестом.Там и можно наблюдать этот феномен.Другой файл без манифеста - там всё работает.Исходники приложены.
     
  7. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    2 момента:
    1) не скачиваю оттуда, где требуют включить js,
    2) изготовление минимальной демки неизбежно приведет вас к лучшему пониманию, а то и решению проблемы.
     
  8. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    ...как всё сложно то...Рапида надеюсь подойдёт?
    http://rapidshare.com/files/248412280/Test_with_manifest.rar.html
    http://rapidshare.com/files/248412705/Test_simple.rar.html
    ...это и есть минимальная демка,которая и привела меня к лучшему пониманию,что проблема вызвана манифестом.
     
  9. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Айайай, сколько иронии.
    А вот - не подойдет: тоже хочет js.
    Ну да ладно.
    А вот и не минимальная: содержит немало элементов, совершенно лишних для нашего феномена.
    Да и не надо было двух демок: достаточно одной, с манифестом отдельным файлом.
    В общем, ниже - мой вариант минимальной демки, с вроде бы отремонтированной тултипизацией батона (хотя может где-то и напортачил, проверьте).

    (Сам же казус - просто еще один пример несуразностей XP стиля).

    .asm
    Код (Text):
    1. .586
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5.  include \masm32\include\windows.inc
    6.  include \masm32\include\kernel32.inc
    7.  include \masm32\include\user32.inc
    8.  include \masm32\include\comctl32.inc
    9.  includelib \masm32\lib\kernel32.lib
    10.  includelib \masm32\lib\user32.lib
    11.  includelib \masm32\lib\comctl32.lib
    12.  
    13. .const
    14.  MAIN_DIALOG equ 998
    15.  IDB_CHECK   equ 104
    16. .data
    17.  _tt  db "Tooltips_class32",0
    18.  _txt db "Please remember to use punctuation marks like commas and dots!",0
    19. .data?
    20.  hinst dd ?
    21.  hwtt  dd ?
    22.  ti    TOOLINFO <>
    23. .code
    24.  
    25. DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    26.   .if uMsg==WM_CLOSE
    27.     invoke EndDialog,hWnd,0
    28.   .elseif uMsg==WM_INITDIALOG
    29.     invoke CreateWindowEx,0,offset _tt,0,TTS_ALWAYSTIP or TTS_BALLOON,0,0,0,0,0,0,hinst,0
    30.     mov hwtt,eax
    31.       xor ecx,ecx
    32.       mov ti.cbSize,sizeof ti
    33.       mov ti.uFlags,TTF_IDISHWND or TTF_SUBCLASS
    34.       mov ti.hWnd,ecx
    35.       mov ti.rect.left,ecx
    36.       mov ti.rect.top,ecx
    37.       mov ti.rect.right,ecx
    38.       mov ti.rect.bottom,ecx
    39.       mov ti.hInst,ecx
    40.     invoke GetDlgItem,hWnd,IDB_CHECK     
    41.       mov ti.uId,eax
    42.       mov ti.lpszText,offset _txt
    43.       jmp @f
    44.   .elseif uMsg==WM_COMMAND && wParam==IDB_CHECK
    45. ;   ...
    46. @@:
    47.       invoke SendMessage,hwtt,TTM_ADDTOOL,0,addr ti
    48.   .else
    49.     xor eax,eax
    50.     jmp @f
    51.   .endif
    52.   xor eax,eax
    53.   inc eax
    54. @@:
    55.   ret
    56. DlgProc endp
    57.  
    58. start:
    59.   invoke GetModuleHandle,0
    60.   mov hinst,eax
    61.   invoke DialogBoxParam,eax,MAIN_DIALOG,0,offset DlgProc,0
    62.   invoke ExitProcess,eax
    63.   invoke InitCommonControls
    64. end start
    .rc
    Код (Text):
    1. #include "\masm32\include\resource.h"
    2. #define MAIN_DIALOG 998
    3. #define IDB_CHECK 104
    4. MAIN_DIALOG DIALOG 150, 150, 80, 35
    5. STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
    6. CAPTION "Top_level"
    7. FONT 12, "Times new roman"
    8. {
    9.    CONTROL "Check", IDB_CHECK, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 45, 10, 25, 15
    10. }
     
  10. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Посмотрел с утречка - ё-моё!
    Вроде, вот так оно получше будет:
    Код (Text):
    1. .586
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5.  include \masm32\include\windows.inc
    6.  include \masm32\include\kernel32.inc
    7.  include \masm32\include\user32.inc
    8.  include \masm32\include\comctl32.inc
    9.  includelib \masm32\lib\kernel32.lib
    10.  includelib \masm32\lib\user32.lib
    11.  includelib \masm32\lib\comctl32.lib
    12.  
    13. .const
    14.  MAIN_DIALOG equ 998
    15.  IDB_CHECK   equ 104
    16. .data
    17.  _tt  db "Tooltips_class32",0
    18.  _txt db "Please remember to use punctuation marks like commas and dots!",0
    19.  _ft  db "%d",0
    20. .data?
    21.  hinst dd ?
    22.  hwtt  dd ?
    23.  hwbt  dd ?
    24.  ti    TOOLINFO <>
    25.  flag  dd ?
    26. .code
    27.  
    28. DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    29.  
    30.   .if uMsg==WM_CLOSE
    31.     invoke EndDialog,hWnd,0
    32.    
    33.   .elseif uMsg==WM_INITDIALOG
    34.     invoke CreateWindowEx,0,offset _tt,0,TTS_ALWAYSTIP or TTS_BALLOON,0,0,0,0,0,0,hinst,0
    35.     mov hwtt,eax
    36.       xor ecx,ecx
    37.       mov ti.cbSize,sizeof ti
    38.       mov ti.uFlags,TTF_IDISHWND or TTF_SUBCLASS
    39.       mov ti.hWnd,ecx
    40.       mov ti.rect.left,ecx
    41.       mov ti.rect.top,ecx
    42.       mov ti.rect.right,ecx
    43.       mov ti.rect.bottom,ecx
    44.       mov ti.hInst,ecx
    45.     invoke GetDlgItem,hWnd,IDB_CHECK
    46.     mov hwbt,eax
    47.       mov ti.uId,eax
    48.       mov ti.lpszText,offset _txt
    49.       jmp @f
    50.      
    51.   .elseif uMsg==WM_SETCURSOR
    52.     mov eax,hwbt
    53.     .if (eax==wParam && eax!=flag) || (eax!=wParam && eax==flag)
    54.         mov eax,wParam
    55.         mov flag,eax
    56. @@:
    57.         invoke SendMessage,hwtt,TTM_ADDTOOL,0,addr ti
    58.     .endif
    59.     jmp @f
    60.   .else
    61. @@:
    62.     xor eax,eax
    63.     jmp @f
    64.   .endif
    65.   xor eax,eax
    66.   inc eax
    67. @@:
    68.   ret
    69. DlgProc endp
    70.  
    71. start:
    72. invoke GetModuleHandle,0
    73. mov hinst,eax
    74. invoke DialogBoxParam,eax,MAIN_DIALOG,0,offset DlgProc,0
    75. invoke ExitProcess,eax
    76. invoke InitCommonControls
    77. end start
     
  11. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    kero, в общем-то, благодарю за решение.Метод,конечно,достаточно хардкорный,но видимо иначе тут не пройдёт.Пробовал просто активировать тултип с помощью сообщения TTM_ACTIVATE вместо повторного добавления - не помогает.
     
  12. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Оказывается, пройдет :)
    Вместо перерегистраций (TTM_ADDTOOL) можно применить, например, TTM_UPDATE.
    Но и TTM_ACTIVATE сгодится, только двойное: SendMessage(TTM_ACTIVATE,FALSE) + SendMessage(TTM_ACTIVATE,TRUE).

    Приложенный третий пример отличается от предыдущего еще и экономией на переменной flag, путем hWnd+1 в духе соседней ветки.
    Впрочем, вернуть коду пристойный вид нетрудно.
    Код (Text):
    1. .const
    2.  MAIN_DIALOG equ 998
    3.  IDB_CHECK   equ 104
    4. .data
    5.  _tt  db "Tooltips_class32",0
    6.  _txt db "Please remember to use punctuation marks like commas and dots!",0
    7. .data?
    8.  hinst dd ?
    9.  hwtt  dd ?
    10.  hwbt  dd ?
    11.  ti    TOOLINFO <>
    12. .code
    13.  
    14. DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    15.  
    16.   .if uMsg==WM_CLOSE
    17.     invoke EndDialog,hWnd,0
    18.    
    19.   .elseif uMsg==WM_INITDIALOG
    20.     invoke CreateWindowEx,WS_EX_TOPMOST,offset _tt,0,TTS_ALWAYSTIP or TTS_BALLOON,0,0,0,0,0,0,hinst,0
    21.     mov hwtt,eax
    22.     xor ecx,ecx
    23.     mov ti.cbSize,sizeof ti
    24.     mov ti.uFlags,TTF_IDISHWND or TTF_SUBCLASS
    25.     mov ti.hWnd,ecx
    26.     mov ti.rect.left,ecx
    27.     mov ti.rect.top,ecx
    28.     mov ti.rect.right,ecx
    29.     mov ti.rect.bottom,ecx
    30.     mov ti.hInst,ecx
    31.     invoke GetDlgItem,hWnd,IDB_CHECK
    32.     mov hwbt,eax
    33.     mov ti.uId,eax
    34.     mov ti.lpszText,offset _txt
    35.     invoke SendMessage,hwtt,TTM_ADDTOOL,0,addr ti
    36.  
    37.   .elseif uMsg==WM_SETCURSOR
    38.     mov eax,hwbt
    39.     and eax,0fffffffeh
    40.     .if eax==wParam && eax==hwbt
    41.        inc hwbt  ; (HWND+1)
    42. ;      invoke SendMessage,hwtt,TTM_UPDATE,0,0
    43.       invoke SendMessage,hwtt,TTM_ACTIVATE,FALSE,0
    44.       invoke SendMessage,hwtt,TTM_ACTIVATE,TRUE,0
    45.     .elseif eax!=wParam
    46.       mov hwbt,eax
    47.     .endif
    48.     jmp @f
    49.  
    50.   .else
    51. @@:
    52.     xor eax,eax
    53.     jmp @f
    54.   .endif
    55.   xor eax,eax
    56.   inc eax
    57. @@:
    58.   ret
    59. DlgProc endp
    60.  
    61. start:
    62. invoke GetModuleHandle,0
    63. mov hinst,eax
    64. invoke DialogBoxParam,eax,MAIN_DIALOG,0,offset DlgProc,0
    65. invoke ExitProcess,eax
    66. invoke InitCommonControls
    67. end start