Задача, сделать интерфейс с поддержкой скинов. Ознакомился с уроком Iczelion'а Суперклассинг. И возник вопрос: если в процедуре обработки сообщений(?), на которую мы заменяем(или добавляем ?) едиту стандартную. Code (Text): mov wc.lpfnWndProc, OFFSET EditWndProc .... EditWndProc PROC hEdit:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD .... EditWndProc endp если я добавлю Code (Text): uMsg==WM_PAINT , то я смогу заменить стандартную отрисовку едита на свою?
что то не получаться, эдит всё равно затирает, что я рисую ( Code (Text): EditWndProc PROC hEdit:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD LOCAL hdc:HDC LOCAL ps:PAINTSTRUCT LOCAL rect:RECT .if uMsg==WM_PAINT invoke BeginPaint,hEdit, ADDR ps mov hdc,eax invoke GetClientRect,hEdit, ADDR rect invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER invoke EndPaint,hEdit, ADDR ps .elseif .... ....... ....... ...... EditWndProc endp
вот что то не получается с кнопкой, должно выводиться окно с надписью, на главной форме. подскажите что не так ? Code (Text): CreateButton proc hWndForm:HWND LOCAL wc:WNDCLASSEX ; создаём класс будущей кнопки mov wc.cbSize, SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET MYPushWndProc mov wc.cbClsExtra, NULL mov wc.cbWndExtra, NULL push hInstance pop wc.hInstance mov wc.hIcon, NULL mov wc.hIconSm, eax invoke LoadCursor, NULL, IDC_ARROW mov wc.hCursor, eax mov wc.hbrBackground, COLOR_WINDOW+1 mov wc.lpszMenuName, NULL mov wc.lpszClassName, OFFSET ButtonClassName ; Регистрация класс кнопки invoke RegisterClassEx, addr wc invoke CreateWindowEx,WS_EX_STATICEDGE, ADDR ButtonClassName, ADDR ButtonAppName, WS_VISIBLE or WS_CHILD,\ 110, 70, 90, 40, hWndForm, 1, hInstance, NULL ret CreateButton endp ; === Обработка событий главного окна === WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .if uMsg==WM_CREATE invoke CreateButton ,hWnd .elseif uMsg==WM_DESTROY invoke PostQuitMessage, NULL .else invoke DefWindowProc, hWnd, uMsg, wParam, lParam ret .endif xor eax,eax ret WndProc endp ; === Обработка событий кнопки === MYPushWndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM local hdc:HDC local ps:PAINTSTRUCT local rect:RECT .if uMsg==WM_PAINT ; Отрисовка текста кнопки invoke BeginPaint,hWnd, ADDR ps mov hdc,eax invoke GetClientRect,hWnd, ADDR rect invoke DrawText, hdc,ADDR ButtonAppName,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER invoke EndPaint,hWnd, ADDR ps .elseif uMsg==WM_KEYUP .elseif uMsg==WM_LBUTTONUP .endif invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret MYPushWndProc endp И ещё есть хорошая книжка или статьи по этой теме ?
vover Почитай ещё в msdn про стиль кнопки BS_OWNERDRAW, который специально для этого и задумывался: Creates an owner-drawn button. The owner window receives a WM_DRAWITEM message when a visual aspect of the button has changed. Do not combine the BS_OWNERDRAW style with any other button styles.
я вон в теме "? про простейшую отрисовку с 2й буфферизацией" поднимал смежный вопрос, и пока я тут эксперементирую, вроде заметил почему твой едит затирает твою кнопку. у него скорей всего не стоит стиль WS_CLIPCHILDREN. поясню - я рисую на диалоге сделанном в ред. ресов, и ситуация в принципе таже что и при суперклассинге: я подменяю стандартную функцию отрисовки своей; так вот если я поставлю кнопочку на диалоге, то при WM_PAINT я зарисовываю все что есть на диалоге, а если я укажу WS_CLIPCHILDREN, то обновляемый регион отсекается дочерними окнами. При OWNERDRAW - по названию даже ясно, что когда дочернее окно получает вм_паинт, то она шлет сообщение род.окну, а там ты уже предусматриваеш обработку WM_DRAWITEM.
Я бы OpenGL и юзал, но меня мучает скептицизм по поводу реализации полу прозрачности окошек, и того насколько быстро будет переключаться hDC между окнами.
Вот свои Button, Edit я и хочу сделать, путём создания оконного класса. Как я понял, все Батоны и эдиты, что предоставляет винда, это просто окна. Значет можно создать свой(пустой) класс окна в обработке сообщений которого и реализовывать его функционал(скажем на событие WM_PAINT рисовать его, на WM_LBUTTONDOWN обрабатывать нажатие). То есть спихнуть на виндовз всю работу по определении нажатия, факта перерисовки итд. Вопрос в том, можно ли так сделать ? Уф... всё в голове перемешалось XD.
murder даже видел такой тулкит. кросс (огл), симпатичный, ос. vover можно и достаточно несложно (особенно бирки). батоны тоже на раз плюнуть (и скорей в кассу)