Хочу задать очень тупой вопрос, но либо я дурак, либо это гены Хочу получить иконку окна: Код (Text): invoke GetWindowLong, hWnd, GWL_HINSTANCE invoke LoadIcon, eax, IDI_APPLICATION .IF (eax==0) invoke SendMessage, hWnd, WM_GETICON, ICON_SMALL, 0 .IF (eax==0) invoke SendMessage, hWnd, WM_GETICON, ICON_BIG, 0 .ENDIF .ENDIF Не работает! Точнее не для всех окон. Я что-то не так делаю? Как надежно получить иконку окна (желательно 16x16, т.е. ICON_SMALL)?
nobodyzzz Полезная ссылочка. Не знал про ограничение WM_GETICON/WM_SETICON. А насчет не надо - чай не дурак, с этого и начал... если кому интересно, то вот так получилось: Код (Text): invoke GetClassLong, hWnd, GCL_HICON .IF (eax==0) invoke GetClassLong, hWnd, GCL_HICONSM .IF (eax==0) invoke SendMessage, hWnd, WM_GETICON, ICON_BIG, 0 .IF (eax==0) invoke SendMessage, hWnd, WM_GETICON, ICON_SMALL, 0 .IF (eax==0) invoke GetWindowLong, hWnd, GWL_HINSTANCE invoke LoadIcon, eax, IDI_APPLICATION .ENDIF .ENDIF .ENDIF .ENDIF Все, тема закрыта. Спасибо nobodyzzz
IceStudent Ладно, это вырежу... И учту на будущее. И еще вопрос. Он не по теме, но не хочется засорять форум новыми ветками. При использовании функции GetTextExtentPoint32() всегда выдается результат превышающий реальный размер. В чем дело? Есть вариант, что используется не тот шрифт, но я вызываю GetTextExtentPoint32() при событии WM_MEASUREITEM, в котором непосредственно получить текущий HFONT не получается. Я получаю его через GetCurrentObject(GetDC(hMainWnd), OBJ_FONT). Но толку никакого. Объясните, в чем дело? Добавление пункта меню: Код (Text): MenuItemData STRUCT hWnd HWND ? hFont HFONT ? MenuItemData ENDS TaskBar_AddItemToMenu proc hParentPopupMenu:DWORD, hWnd:DWORD LOCAL mid : DWORD invoke GetDC, hMainWnd push eax ; HDC invoke GetCurrentObject, eax, OBJ_FONT push eax ; HFONT invoke LocalAlloc, LMEM_FIXED, sizeof(MenuItemData) mov mid, eax m2m [eax].MenuItemData.hWnd, hWnd pop ecx ; HFONT mov [eax].MenuItemData.hFont, ecx pop eax ; HDC invoke ReleaseDC, hMainWnd, eax invoke AppendMenu, hParentPopupMenu, MF_OWNERDRAW, hWnd, mid ret TaskBar_AddItemToMenu endp Обработка сообщения MEASUREITEM Код (Text): .ELSEIF (uMsg==WM_MEASUREITEM) invoke Proc_MeasureItem, lParam ret Proc_MeasureItem proc lParam:DWORD LOCAL hItemWnd : DWORD LOCAL strSz : SIZEL LOCAL buff[200] : BYTE LOCAL hDC : HDC LOCAL mid : DWORD LOCAL hFont : HFONT push ebx mov ebx, lParam .IF ([ebx].MEASUREITEMSTRUCT.CtlType == ODT_MENU) mov eax, [ebx].MEASUREITEMSTRUCT.itemData mov mid, eax m2m hItemWnd, [eax].MenuItemData.hWnd m2m hFont, [eax].MenuItemData.hFont invoke IsWindow, hItemWnd .IF (eax) invoke GetDC, 0 mov hDC, eax invoke SelectObject, hDC, hFont push eax ; hOldFont invoke GetWindowText, hItemWnd, addr buff, 200 invoke StrLen, addr buff xchg eax, ecx invoke GetTextExtentPoint32, hDC, addr buff, ecx, addr strSz m2m [ebx].MEASUREITEMSTRUCT.itemWidth, strSz.x m2m [ebx].MEASUREITEMSTRUCT.itemHeight, 34 pop eax ; hOldFont invoke SelectObject, hDC, eax invoke ReleaseDC, 0, hDC pop ebx retv(1) .ENDIF .ENDIF pop ebx ret0 Proc_MeasureItem endp
Тот же, что и при получении размеров строки. Все, я сам разобрался с проблемой. Всем большое спасибо!