Программа рисует в окне несколько прямоугольков, при наведении на них мышкой они меняют цвет - получилось своеобразное "menu". Но если поводить по этой менюшке секунд 15, то рисовать начинает не в окне программы, а поверх всего в левом верхнем углу. В чем может быть проблема и как это исправить? Код (Text): .386 .model flat, stdcall option casemap :none include test.inc .code start: invoke GetModuleHandle,NULL mov hInstance,eax invoke InitCommonControls invoke DialogBoxParam,hInstance,101,NULL,addr DlgProc,NULL invoke ExitProcess,0 DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM mov eax,uMsg .if eax==WM_INITDIALOG invoke GetDC,hWin mov hdc,eax .elseif eax==WM_MOUSEMOVE mov eax,lParam mov MousePos,eax jmp DRAW .elseif eax==WM_PAINT DRAW: invoke BeginPaint,hWin,offset ps .if eax!=0 mov ax,word ptr [MousePos] mov cx,word ptr [MousePos+2] .if ax>=0 &&ax<= 250 .if cx>0 && cx<20 mov Selected,1 .elseif cx>=20 && cx<40 mov Selected,2 .elseif cx>=40 && cx<60 mov Selected,3 .elseif cx>=60 && cx<80 mov Selected,4 .elseif cx>=80 && cx<100 mov Selected,5 .elseif cx>=100 && cx<120 mov Selected,6 .elseif cx>=120 && cx<140 mov Selected,7 .elseif cx>=140 && cx<160 mov Selected,8 .elseif cx>=160 && cx<180 mov Selected,9 .elseif cx>=180 && cx<200 mov Selected,10 .endif .else mov Selected,0 .endif mov Y,0 xor ebx,ebx .REPEAT inc ebx .if Selected==ebx invoke CreateSolidBrush,055FF55h .else invoke CreateSolidBrush,0FF0000h .endif invoke SelectObject,hdc,eax mov eax,Y add eax,21 invoke Rectangle,hdc,0,Y,250,eax invoke SetBkMode,hdc,TRANSPARENT invoke TextOut,hdc,5,Y,offset Line1,64 add Y,20 .UNTIL ebx==10 invoke EndPaint,hWin,addr ps .endif .elseif eax==WM_CLOSE invoke EndDialog,hWin,0 .else xor eax,eax ret .endif mov eax,TRUE ret DlgProc endp end start
Причину понял: по нормальному этот "DRAW:" не должен так часто вызываться, а только при необходимости. Можно ли это исправить не уменьшая колличество его вызовов из WM_MOUSEMOVE?
trr Причина наверное в том, что ты пытаешься создать слишком много кистей, причем ни одну из них потом не освобождаешь. Скорее всего нужно создать в INITDIALOG 2 кисти, одна цвета 055FF55h другая 0FF0000h и закрашивать тот фон в области, которого оказалась мышь. Когда диалог закрывается обе кисти следует уничтожить -- иначе никаких ресурсов не хватит
Mikl___ Да, причина в этом. Надо было вставить сразу после "SelectObject" "DeleteObject,eax". Но вариант с выносом создание кистей в INITDIALOG мне больше понравился