Подскажите как на кнопке поместить картинку и текст? (аналогично классу TBitBtn в Delphi) Пробовал обрабатывать сообщение WM_DRAWITEM, но в этом случае проходится рисовать кнопку самому, а используя функцию DrawFrameControl кнопка не воспринимает стиль XP.
oleg_nalad4ik На сайте WASM.RU в разделе исходники двадцать способов создания кнопки в том числе с картинками, неправильной формы и т.д. создание диалога с единственной кнопкой через редактор ресурсов, через заполнение структур, программное создание кнопки в диалоге и в окне, создание диалога через DialogTemplate используйте поиск на сайте и форуме...
Спасибо, но этот пример( buttonspgm.zip ) я уже изучал. В нем кнопки также не воспринимают стиль XP. Меня интересуют вот такие кнопки:
oleg_nalad4ik Сабклассируй и рисуй после оригинальной отрисовки либо (лучше) почитай про визуальные стили и используй функции Theme API вместо DrawFrameControl.
Сабклассинг тоже пробовал. Через функцию SetWindowLong устанавливал новую процедуру окна. Не получается правильно обработать сообщение WM_PAINT, кнопки или не отображаются или не воспринимаю мои команды. Вот мой код: .code start: invoke GetModuleHandle, NULL mov hInstance, eax invoke InitCommonControls invoke DialogBoxParam, hInstance, IDD_MAIN, 0, offset DlgProc, 0 invoke ExitProcess, eax DlgProc proc hWinWORD,uMsgWORD,wParamWORD,lParamWORD mov eax,uMsg .if eax == WM_INITDIALOG mov hButn,FUNC(GetDlgItem,hWin,IDB_BUTTON1) invoke SetWindowLong,hButn,GWL_WNDPROC,ButnProc mov lpButnProc_Old, eax .elseif eax == WM_CLOSE invoke EndDialog, hWin, 0 .endif xor eax,eax ret DlgProc endp ButnProc proc hCtlWORD, uMsgWORD, wParamWORD, lParamWORD .if uMsg == WM_PAINT invoke DrawIcon,wParam,0,0,FUNC(LoadIcon,0,IDI_HAND) .else invoke CallWindowProc,lpButnProc_Old,hCtl,uMsg,wParam,lParam .endif ret ButnProc endp end start
oleg_nalad4ik IceStudent написал же Код (Text): invoke CallWindowProc,lpButnProc_Old,hCtl,uMsg,wParam,lParam .if uMsg == WM_PAINT invoke DrawIcon,hCtl,0,0,FUNC(LoadIcon,0,IDI_HAND) .endif И еще, LoadIcon() при каждой отрисовке совсем нехорошо.
IceStudent Это не всегда работает, могут быть проблемы с миганием и прочими гадостями из-за того, что два раза вызывается BeginPaint. Можно через GetDC, но тоже не всегда спасает, так что лучше всё же ThemeAPI. oleg_nalad4ik DrawIcon,wParam - ошибка, т.к. контекст не всегда передаётся в WM_PAINT. Тем более, это не документировано. Правильнее вызывать BeginPaint, либо проверять wParam (если не NULL, то берём этот контекст, в противном случае получаем его сами).
Спасибо, но опять не то. Я пытаюсь изобразить на стандартной кнопке текст+изображение, а в bmpbutton картинка рисуется вместо кнопки .
Одновременно и текст и изображение может не получиться... Что значит - рисутся вместо кнопки? Не рисуется ничего - создается окно ( объект ), создается ещё один объект - окно, на которое будет вешаться картинка, потом все эти окна сабклассируются и обрабатываются сообщения от мыша, касающиеся их.... ТО ЖЕ САМОЕ и при создании стандартной кнопки, но доступ к её свойствам ограничен...
Если кому интересно вот что получилось. Но осталось два нерешенных вопроса: 1. Не срабатывает ODS_HOTLIGHT ? 2. Как вкл./откл. стиль с помощью манифеста ?