Получение иконки окна

Тема в разделе "WASM.BEGINNERS", создана пользователем Xerx, 8 авг 2007.

  1. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Хочу задать очень тупой вопрос, но либо я дурак, либо это гены :derisive:
    Хочу получить иконку окна:
    Код (Text):
    1.     invoke  GetWindowLong, hWnd, GWL_HINSTANCE
    2.     invoke  LoadIcon, eax, IDI_APPLICATION
    3.     .IF (eax==0)
    4.         invoke  SendMessage, hWnd, WM_GETICON, ICON_SMALL, 0
    5.         .IF (eax==0)
    6.             invoke  SendMessage, hWnd, WM_GETICON, ICON_BIG, 0
    7.         .ENDIF
    8.     .ENDIF
    Не работает! Точнее не для всех окон.

    Я что-то не так делаю? Как надежно получить иконку окна (желательно 16x16, т.е. ICON_SMALL)?
     
  2. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    http://rsdn.ru/Forum/Info/FAQ.winapi.getwindowicon.aspx
    use google =))
     
  3. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    nobodyzzz
    Полезная ссылочка. Не знал про ограничение WM_GETICON/WM_SETICON.
    А насчет
    не надо - чай не дурак, с этого и начал... :derisive:

    если кому интересно, то вот так получилось:
    Код (Text):
    1.     invoke  GetClassLong, hWnd, GCL_HICON
    2.     .IF (eax==0)
    3.         invoke  GetClassLong, hWnd, GCL_HICONSM
    4.         .IF (eax==0)
    5.             invoke  SendMessage, hWnd, WM_GETICON, ICON_BIG, 0
    6.             .IF (eax==0)
    7.                 invoke  SendMessage, hWnd, WM_GETICON, ICON_SMALL, 0
    8.                 .IF (eax==0)
    9.                     invoke  GetWindowLong, hWnd, GWL_HINSTANCE
    10.                     invoke  LoadIcon, eax, IDI_APPLICATION
    11.                 .ENDIF
    12.             .ENDIF
    13.         .ENDIF
    14.     .ENDIF
    Все, тема закрыта. Спасибо nobodyzzz :)
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Не получится - ты должен быть в целевом процессе.
     
  5. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    IceStudent
    Ладно, это вырежу... И учту на будущее.

    И еще вопрос. Он не по теме, но не хочется засорять форум новыми ветками.
    При использовании функции GetTextExtentPoint32() всегда выдается результат превышающий реальный размер. В чем дело? Есть вариант, что используется не тот шрифт, но я вызываю GetTextExtentPoint32() при событии WM_MEASUREITEM, в котором непосредственно получить текущий HFONT не получается. Я получаю его через GetCurrentObject(GetDC(hMainWnd), OBJ_FONT). Но толку никакого.

    Объясните, в чем дело?

    Добавление пункта меню:
    Код (Text):
    1. MenuItemData STRUCT
    2.     hWnd                    HWND    ?
    3.     hFont                   HFONT   ?
    4. MenuItemData ENDS
    5.  
    6. TaskBar_AddItemToMenu proc hParentPopupMenu:DWORD, hWnd:DWORD
    7. LOCAL mid       : DWORD
    8.     invoke  GetDC, hMainWnd
    9.     push    eax ; HDC
    10.     invoke  GetCurrentObject, eax, OBJ_FONT
    11.     push    eax ; HFONT
    12.  
    13.     invoke  LocalAlloc, LMEM_FIXED, sizeof(MenuItemData)
    14.     mov     mid,    eax
    15.     m2m     [eax].MenuItemData.hWnd,    hWnd
    16.     pop     ecx ; HFONT
    17.     mov     [eax].MenuItemData.hFont,   ecx
    18.    
    19.     pop     eax ; HDC
    20.     invoke  ReleaseDC, hMainWnd, eax
    21.  
    22.     invoke  AppendMenu, hParentPopupMenu, MF_OWNERDRAW, hWnd, mid
    23.     ret
    24. TaskBar_AddItemToMenu endp
    Обработка сообщения MEASUREITEM
    Код (Text):
    1.     .ELSEIF (uMsg==WM_MEASUREITEM)
    2.         invoke  Proc_MeasureItem, lParam
    3.         ret
    4.  
    5. Proc_MeasureItem proc lParam:DWORD
    6. LOCAL hItemWnd : DWORD
    7. LOCAL strSz : SIZEL
    8. LOCAL buff[200] : BYTE
    9. LOCAL hDC : HDC
    10. LOCAL mid : DWORD
    11. LOCAL hFont : HFONT
    12.  
    13.     push    ebx
    14.     mov     ebx,    lParam
    15.     .IF ([ebx].MEASUREITEMSTRUCT.CtlType == ODT_MENU)
    16.         mov     eax,        [ebx].MEASUREITEMSTRUCT.itemData
    17.         mov     mid,        eax
    18.         m2m     hItemWnd,   [eax].MenuItemData.hWnd
    19.         m2m     hFont,      [eax].MenuItemData.hFont
    20.         invoke  IsWindow, hItemWnd
    21.         .IF (eax)
    22.             invoke  GetDC, 0
    23.             mov     hDC,    eax
    24.            
    25.             invoke  SelectObject, hDC, hFont
    26.             push    eax ; hOldFont
    27.            
    28.             invoke  GetWindowText, hItemWnd, addr buff, 200
    29.             invoke  StrLen, addr buff
    30.             xchg    eax,    ecx
    31.             invoke  GetTextExtentPoint32, hDC, addr buff, ecx, addr strSz
    32.            
    33.             m2m     [ebx].MEASUREITEMSTRUCT.itemWidth,  strSz.x
    34.             m2m     [ebx].MEASUREITEMSTRUCT.itemHeight, 34
    35.            
    36.             pop     eax ; hOldFont
    37.             invoke  SelectObject, hDC, eax
    38.            
    39.             invoke  ReleaseDC, 0, hDC
    40.            
    41.             pop     ebx
    42.             retv(1)
    43.         .ENDIF
    44.     .ENDIF
    45.  
    46.     pop     ebx
    47.     ret0
    48. Proc_MeasureItem endp
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Xerx
    Какой фонт используется в WM_DRAWITEM для отрисовки пунктов меню?
     
  7. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Тот же, что и при получении размеров строки.

    Все, я сам разобрался с проблемой. Всем большое спасибо!