Скины, реализация через суперклассинг?

Тема в разделе "WASM.BEGINNERS", создана пользователем vover, 21 янв 2009.

  1. vover

    vover Владимир

    Публикаций:
    0
    Регистрация:
    21 авг 2008
    Сообщения:
    202
    Задача, сделать интерфейс с поддержкой скинов.
    Ознакомился с уроком Iczelion'а Суперклассинг. И возник вопрос:
    если в процедуре обработки сообщений(?), на которую мы заменяем(или добавляем ?) едиту стандартную.
    Код (Text):
    1. mov wc.lpfnWndProc, OFFSET EditWndProc
    2. ....
    3. EditWndProc PROC hEdit:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
    4. ....
    5. EditWndProc endp
    если я добавлю
    Код (Text):
    1. uMsg==WM_PAINT
    , то я смогу заменить стандартную отрисовку едита на свою?
     
  2. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    а ты попробуй и потом расскажешь что получилось
     
  3. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
  4. vover

    vover Владимир

    Публикаций:
    0
    Регистрация:
    21 авг 2008
    Сообщения:
    202
    что то не получаться, эдит всё равно затирает, что я рисую (
    Код (Text):
    1. EditWndProc PROC hEdit:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
    2.     LOCAL hdc:HDC
    3.     LOCAL ps:PAINTSTRUCT
    4.     LOCAL rect:RECT
    5.      .if uMsg==WM_PAINT
    6.      
    7.         invoke BeginPaint,hEdit, ADDR ps
    8.         mov    hdc,eax
    9.         invoke GetClientRect,hEdit, ADDR rect
    10.         invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
    11.         invoke EndPaint,hEdit, ADDR ps
    12.        
    13.     .elseif ....
    14. .......
    15. .......
    16. ...... 
    17. EditWndProc endp
     
  5. vover

    vover Владимир

    Публикаций:
    0
    Регистрация:
    21 авг 2008
    Сообщения:
    202
    Ой, ступил, всё нормально... не затирается где надо.
     
  6. vover

    vover Владимир

    Публикаций:
    0
    Регистрация:
    21 авг 2008
    Сообщения:
    202
    вот что то не получается с кнопкой, должно выводиться окно с надписью, на главной форме. подскажите что не так ?
    Код (Text):
    1. CreateButton    proc hWndForm:HWND
    2.         LOCAL wc:WNDCLASSEX
    3.            
    4.         ; создаём класс будущей кнопки
    5.         mov   wc.cbSize, SIZEOF WNDCLASSEX
    6.             mov   wc.style, CS_HREDRAW or CS_VREDRAW
    7.        
    8.             mov   wc.lpfnWndProc, OFFSET MYPushWndProc
    9.        
    10.         mov   wc.cbClsExtra, NULL
    11.         mov   wc.cbWndExtra, NULL
    12.    
    13.             push  hInstance
    14.         pop   wc.hInstance
    15.    
    16.         mov   wc.hIcon, NULL
    17.         mov   wc.hIconSm, eax
    18.        
    19.         invoke LoadCursor, NULL, IDC_ARROW
    20.         mov   wc.hCursor, eax
    21.         mov   wc.hbrBackground, COLOR_WINDOW+1
    22.         mov   wc.lpszMenuName, NULL
    23.                     mov   wc.lpszClassName, OFFSET ButtonClassName         
    24.  
    25.         ; Регистрация класс кнопки
    26.         invoke RegisterClassEx, addr wc
    27.        
    28.  
    29.              invoke CreateWindowEx,WS_EX_STATICEDGE, ADDR ButtonClassName, ADDR ButtonAppName, WS_VISIBLE or WS_CHILD,\
    30.         110, 70, 90, 40, hWndForm, 1, hInstance, NULL
    31.        
    32.         ret
    33. CreateButton    endp
    34.  
    35. ; === Обработка событий главного окна ===
    36. WndProc         proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    37.        
    38.             .if uMsg==WM_CREATE
    39.  
    40.             invoke CreateButton ,hWnd
    41.    
    42.         .elseif uMsg==WM_DESTROY
    43.             invoke PostQuitMessage, NULL
    44.         .else
    45.             invoke DefWindowProc, hWnd, uMsg, wParam, lParam       
    46.             ret
    47.         .endif
    48.         xor eax,eax
    49.         ret
    50. WndProc         endp
    51.  
    52. ; === Обработка событий кнопки ===
    53. MYPushWndProc   proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    54.         local hdc:HDC        
    55.         local ps:PAINTSTRUCT
    56.         local rect:RECT    
    57.              
    58.             .if uMsg==WM_PAINT
    59.                 ; Отрисовка текста кнопки
    60.             invoke BeginPaint,hWnd, ADDR ps
    61.             mov    hdc,eax
    62.             invoke GetClientRect,hWnd, ADDR rect
    63.             invoke DrawText, hdc,ADDR ButtonAppName,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
    64.             invoke EndPaint,hWnd, ADDR ps
    65.                
    66.             .elseif uMsg==WM_KEYUP
    67.    
    68.             .elseif uMsg==WM_LBUTTONUP
    69.    
    70.             .endif
    71.            
    72.                 invoke DefWindowProc,hWnd,uMsg,wParam,lParam
    73.         ret
    74. MYPushWndProc   endp
    И ещё есть хорошая книжка или статьи по этой теме ?
     
  7. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    vover
    по кокой?
     
  8. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    vover
    Может стоит нарисовать весь интерфейс во флеше (swf), а потом подгружать его через ActiveX?
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    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.
     
  10. Romm

    Romm New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2007
    Сообщения:
    12
    я вон в теме "? про простейшую отрисовку с 2й буфферизацией" поднимал смежный вопрос, и пока я тут эксперементирую, вроде заметил почему твой едит затирает твою кнопку. у него скорей всего не стоит стиль WS_CLIPCHILDREN. поясню - я рисую на диалоге сделанном в ред. ресов, и ситуация в принципе таже что и при суперклассинге: я подменяю стандартную функцию отрисовки своей; так вот если я поставлю кнопочку на диалоге, то при WM_PAINT я зарисовываю все что есть на диалоге, а если я укажу WS_CLIPCHILDREN, то обновляемый регион отсекается дочерними окнами. При OWNERDRAW - по названию даже ясно, что когда дочернее окно получает вм_паинт, то она шлет сообщение род.окну, а там ты уже предусматриваеш обработку WM_DRAWITEM.
     
  11. vover

    vover Владимир

    Публикаций:
    0
    Регистрация:
    21 авг 2008
    Сообщения:
    202
    murder, мои религиозные убеждения противоречат этому, хотя возможно это очень перспективно.
     
  12. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    vover
    прилепите к проге каиро и рисуйте в векторах не хуже флэша без нарушения религий.
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _basmp_
    Нифига подобного, лучше заюзать OpenGL или DX. ^)
     
  14. vover

    vover Владимир

    Публикаций:
    0
    Регистрация:
    21 авг 2008
    Сообщения:
    202
    Я бы OpenGL и юзал, но меня мучает скептицизм по поводу реализации полу прозрачности окошек, и того насколько быстро будет переключаться hDC между окнами.
     
  15. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Не - рисовать ты будешь в одном окне: тебе придётся реализовать свои контролы Button, Edit и т.д.
     
  16. vover

    vover Владимир

    Публикаций:
    0
    Регистрация:
    21 авг 2008
    Сообщения:
    202
    Вот свои Button, Edit я и хочу сделать, путём создания оконного класса. Как я понял, все Батоны и эдиты, что предоставляет винда, это просто окна. Значет можно создать свой(пустой) класс окна в обработке сообщений которого и реализовывать его функционал(скажем на событие WM_PAINT рисовать его, на WM_LBUTTONDOWN обрабатывать нажатие). То есть спихнуть на виндовз всю работу по определении нажатия, факта перерисовки итд. Вопрос в том, можно ли так сделать ? Уф... всё в голове перемешалось XD.
     
  17. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    см. #9
     
  18. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    murder
    даже видел такой тулкит. кросс (огл), симпатичный, ос.

    vover
    можно и достаточно несложно (особенно бирки). батоны тоже на раз плюнуть (и скорей в кассу)