WM_PAINT

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

  1. trr

    trr New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2006
    Сообщения:
    52
    Программа рисует в окне несколько прямоугольков, при наведении на них мышкой они меняют цвет - получилось своеобразное "menu". Но если поводить по этой менюшке секунд 15, то рисовать начинает не в окне программы, а поверх всего в левом верхнем углу. В чем может быть проблема и как это исправить?

    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap :none
    4.  
    5. include test.inc
    6.  
    7. .code
    8. start:
    9.     invoke GetModuleHandle,NULL
    10.     mov hInstance,eax
    11.     invoke InitCommonControls
    12.     invoke DialogBoxParam,hInstance,101,NULL,addr DlgProc,NULL
    13.     invoke ExitProcess,0
    14.  
    15.  
    16. DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    17.  
    18.     mov eax,uMsg
    19.     .if eax==WM_INITDIALOG
    20.         invoke GetDC,hWin
    21.         mov hdc,eax
    22.    
    23.     .elseif eax==WM_MOUSEMOVE
    24.         mov eax,lParam
    25.         mov MousePos,eax
    26.         jmp DRAW
    27.  
    28.     .elseif eax==WM_PAINT
    29.         DRAW:
    30.         invoke BeginPaint,hWin,offset ps
    31.         .if eax!=0
    32.             mov ax,word ptr [MousePos]
    33.             mov cx,word ptr [MousePos+2]
    34.             .if ax>=0 &&ax<= 250
    35.                 .if cx>0 && cx<20
    36.                     mov Selected,1
    37.                 .elseif cx>=20 && cx<40
    38.                     mov Selected,2
    39.                 .elseif cx>=40 && cx<60
    40.                     mov Selected,3
    41.                 .elseif cx>=60 && cx<80
    42.                     mov Selected,4
    43.                 .elseif cx>=80 && cx<100
    44.                     mov Selected,5
    45.                 .elseif cx>=100 && cx<120
    46.                     mov Selected,6
    47.                 .elseif cx>=120 && cx<140
    48.                     mov Selected,7
    49.                 .elseif cx>=140 && cx<160
    50.                     mov Selected,8
    51.                 .elseif cx>=160 && cx<180
    52.                     mov Selected,9
    53.                 .elseif cx>=180 && cx<200
    54.                     mov Selected,10
    55.                 .endif
    56.             .else
    57.                     mov Selected,0
    58.             .endif
    59.            
    60.            
    61.             mov Y,0
    62.             xor ebx,ebx
    63.             .REPEAT
    64.             inc ebx
    65.             .if Selected==ebx
    66.                 invoke CreateSolidBrush,055FF55h
    67.             .else
    68.                 invoke CreateSolidBrush,0FF0000h
    69.             .endif
    70.             invoke SelectObject,hdc,eax
    71.             mov eax,Y
    72.             add eax,21
    73.             invoke Rectangle,hdc,0,Y,250,eax
    74.             invoke SetBkMode,hdc,TRANSPARENT
    75.             invoke TextOut,hdc,5,Y,offset Line1,64
    76.             add Y,20
    77.             .UNTIL ebx==10
    78.            
    79.             invoke EndPaint,hWin,addr ps
    80.         .endif
    81.  
    82.     .elseif eax==WM_CLOSE
    83.         invoke EndDialog,hWin,0
    84.     .else
    85.         xor eax,eax
    86.         ret
    87.     .endif
    88.     mov     eax,TRUE
    89.     ret
    90.  
    91. DlgProc endp
    92.  
    93. end start
     
  2. trr

    trr New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2006
    Сообщения:
    52
    Причину понял: по нормальному этот "DRAW:" не должен так часто вызываться, а только при необходимости. Можно ли это исправить не уменьшая колличество его вызовов из WM_MOUSEMOVE? :)
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    trr
    Причина наверное в том, что ты пытаешься создать слишком много кистей, причем ни одну из них потом не освобождаешь. Скорее всего нужно создать в INITDIALOG 2 кисти, одна цвета 055FF55h
    другая 0FF0000h и закрашивать тот фон в области, которого оказалась мышь. Когда диалог закрывается обе кисти следует уничтожить -- иначе никаких ресурсов не хватит :)
     
  4. trr

    trr New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2006
    Сообщения:
    52
    Mikl___
    Да, причина в этом.
    Надо было вставить сразу после "SelectObject" "DeleteObject,eax".
    Но вариант с выносом создание кистей в INITDIALOG мне больше понравился :)
     
  5. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    GetDC() тоже будет проблемой. После его использования надо вызывать ReleaseDC().