BeginPaint ... EndPaint. Проблема с перерисовкой элементов формы.

Тема в разделе "WASM.BEGINNERS", создана пользователем rza, 16 июн 2009.

  1. rza

    rza New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2009
    Сообщения:
    21
    Ситуация такая. На форме создаю "SysTabControl32", на закладке рисую рамку "DrawEdge". При событии "WM_PAINT" пытаюсь все перерисовать и вот что получается: Если в событии ничего не делать с закладкой все нормально растягисвается по форме и т. д, но рамки соответственно нет. Если вставить BeginPaint ... EndPaint и указать хендл "SysTabControl32" рамка перерисовывается нормально но сам "SysTabControl32" теряет форму, если указать хендл главного окна, нормально перерисовывается "SysTabControl32", но рамка при это вообще не отображается.
    Подскажите как правильно перерисовывать?

    Код (Text):
    1. WMPaint:
    2.     lea        eax, Ps
    3.     push    eax
    4.     push    hMainWindow
    5.     call    BeginPaint
    6.     mov hDC, eax
    7.    
    8.     lea eax, rct
    9.            push eax
    10.            push hTabControl
    11.            call GetClientRect
    12.  
    13.     add rct.left, 3
    14.     add rct.top, 23
    15.     sub rct.right, 3
    16.     sub rct.bottom, 3
    17.  
    18.     push    BF_RECT
    19.     push    EDGE_ETCHED
    20.     lea eax, rct
    21.     push    eax
    22.     push    hDC
    23.     call    DrawEdge
    24.  
    25.     lea eax, Ps
    26.     push    eax
    27.     push    hMainWindow
    28.     call    EndPaint
     
  2. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    1) Ты не вызываешь стандартный код отрисовки. То есть
    Код (Text):
    1. CallWindowProc(GetWindowLong(hTabControl,GWL_WNDPROC),hTabControl,WM_PAINT,0,0);
    2) hDC можно узнать при создании окна, тогда BeginPaint будет не нужен. А EndPaint замени на ValidateRect.
     
  3. rza

    rza New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2009
    Сообщения:
    21
    Попробывал поэксперементировать с "CallWindowProc", "GetWindowLong" ситуация не изменилась. Пробывал и до отрисовки рамки и после.

    Насколько я понял "ValidateRect" не обязательно хоть и лучше вариант. Сначало отресую что бы работало, потом код улучшу.

    Код (Text):
    1.     lea eax, Ps
    2.     push    eax
    3.     push    hTabControl
    4.     call    BeginPaint
    5.     mov hDC, eax
    6.    
    7.     lea eax, rct
    8.            push eax
    9.            push hTabControl
    10.            call GetClientRect
    11.  
    12.     add rct.left, 3
    13.     add rct.top, 23
    14.     sub rct.right, 3
    15.     sub rct.bottom, 3
    16.  
    17.     push    BF_RECT
    18.     push    EDGE_ETCHED
    19.     lea eax, rct
    20.     push    eax
    21.     push    hDC
    22.     call    DrawEdge
    23.  
    24.     lea eax, Ps
    25.     push    eax
    26.     push    hTabControl
    27.     call    EndPaint
    28.  
    29.     push    GWL_WNDPROC
    30.     push    hTabControl
    31.     call    GetWindowLong
    32.    
    33.     push    0
    34.     push    0
    35.     push    WM_PAINT
    36.     push    hTabControl
    37.     push    eax
    38.     call    CallWindowProc
     
  4. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Вот рабочий пример на FASM`е
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include 'windows.inc'
    5.  
    6. section '' code readable writeable
    7.   start:
    8.   xor    esi,esi
    9.   invoke CreateWindowEx,esi,class_static,esi,WS_VISIBLE+WS_OVERLAPPEDWINDOW,esi,esi,200,200,esi,esi,esi,esi
    10.   push   esi
    11.   push   esi
    12.   push   esi
    13.   push   eax
    14.   invoke SetWindowLong,eax,GWL_WNDPROC,wndproc
    15.   invoke CreateWindowEx,esi,class_SysTabControl32,esi,WS_VISIBLE+WS_CHILD,0,0,192,168
    16.   push   tabproc
    17.   push   GWL_WNDPROC
    18.   push   eax
    19.   invoke GetDC,eax
    20.   mov    [DC],eax
    21.   call   [SetWindowLong]
    22.   mov    [defTabProc],eax
    23.  
    24.   @@:invoke GetMessage,msg,esi,esi,esi
    25.      invoke DispatchMessage,msg
    26.   jmp @b
    27.   call   [InitCommonControls]
    28.  
    29. proc wndproc wnd,msg,wparam,lparam
    30.   cmp [msg],WM_CLOSE
    31.   jne @f
    32.   invoke ExitProcess,esi
    33.   @@:
    34.   invoke DefWindowProc,[wnd],[msg],[wparam],[lparam]
    35. ret
    36. endp
    37.  
    38. proc tabproc wnd,msg,wparam,lparam
    39.   cmp [msg],WM_PAINT
    40.   jne @f
    41.      invoke CallWindowProc,[defTabProc],[wnd],[msg],[wparam],[lparam]
    42.      invoke DrawEdge,[DC],rect,EDGE_ETCHED,BF_RECT
    43.      invoke ValidateRect,[wnd],0
    44.      ret
    45.   @@:
    46.   invoke CallWindowProc,[defTabProc],[wnd],[msg],[wparam],[lparam]
    47. ret
    48. endp
    49.  
    50. class_static          db 'STATIC',0
    51. class_SysTabControl32 db 'SysTabControl32',0
    52. msg                   MSG
    53. rect                  RECT 10,10,182,158
    54. DC                    rd 1
    55. defTabProc            rd 1
    56.  
    57. section '' import data readable writeable
    58.  
    59.   library kernel,'KERNEL32.DLL',\
    60.           user,'USER32.DLL',\
    61.           comctl,'COMCTL32.DLL'
    62.  
    63.   import kernel,\
    64.          ExitProcess,'ExitProcess'
    65.  
    66.   import user,\
    67.          CreateWindowEx,'CreateWindowExA',\
    68.          GetMessage,'GetMessageA',\
    69.          DispatchMessage,'DispatchMessageA',\
    70.          GetDC,'GetDC',\
    71.          SetWindowLong,'SetWindowLongA',\
    72.          CallWindowProc,'CallWindowProcA',\
    73.          DefWindowProc,'DefWindowProcA',\
    74.          ValidateRect,'ValidateRect',\
    75.          DrawEdge,'DrawEdge'
    76.  
    77.   import comctl,\
    78.          InitCommonControls,'InitCommonControls'
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    rza
    Работать то будет и без ValidateRect (вместо BeginPaint/EndPaint), только посмотри на загрузку процессора ;)
    ValidateRect нужна чтобы уже отработанный WM_PAINT не приходил снова и снова и снова до бесконечности.
     
  6. rza

    rza New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2009
    Сообщения:
    21
    Большое спс. Все получилось.