-1

我正在制作一个将白色椭圆移动到窗口中心的程序。我正在使用 BeginPaint、EndPaint、Ellipse 程序执行此操作。当没有循环时,它可以正常工作,在底部显示椭圆,但是当我使用循环时,它会将椭圆移动到我需要的位置,然后停止响应(我想程序不会返回控制)。如何解决这个问题?我什至已经开始复制注册值。

WM_油漆:

invoke   BeginPaint, hWnd, addr ps ;  
mov     hdc, eax        ; 
invoke GetClientRect, hWnd, addr rect; invoke DrawInitialElipse

invoke DrawInitialElipse

程序:

DrawInitialElipse proc
LOCAL tempEAL:BYTE
LOCAL tempEAX:DWORD
LOCAL tempEDX:DWORD
LOCAL tempECX:DWORD

mov tempEAL, al
mov tempEAX, eax
mov tempEDX, edx
mov tempECX, ecx

finit
fld initialColorStep
fld currentColorDouble
fadd
fst currentColorDouble
fistp dword ptr currentColorInt

mov al, byte ptr [currentColorInt]
mov tempColor, al

mov esi, currentInitialCirclePositionY
.WHILE (esi != ydiv2)
.if stepNumber1==0
    mov edi, startY
    mov currentInitialCirclePositionY, edi
.else
    dec currentInitialCirclePositionY
.endif

inc stepNumber1

mov edi, currentInitialCirclePositionY
sub edi,cnst_10
mov topLeftY, edi


mov edi, startX
sub edi, cnst_5
mov topLeftX, edi

mov edi, currentInitialCirclePositionY
add edi, cnst_10
mov bottomRightY, edi

mov edi, startX
add edi, cnst_5
mov bottomRightX, edi


invoke CreateBrush, 240,240,240
mov initialBrush, edi
invoke SelectObject, hdc, initialBrush
invoke Ellipse, hdc, topLeftX,topLeftY,bottomRightX,bottomRightY; //рисуем другим перо
invoke Sleep, 10
.ENDW
mov al, tempEAL
mov eax,tempEAX
mov edx,tempEDX
mov ecx,tempECX
ret
DrawInitialElipse endp
4

2 回答 2

4

您的代码停止响应,因为您在绘图过程中循环,检查对ESI寄存器的更改,但您没有ESI在每次循环迭代时使用新值进行更新。你最终陷入了无限循环。

你不应该在你的绘图过程中开始移动椭圆,改变它的颜色,甚至睡觉。您应该绘制椭圆的当前状态。完全摆脱循环,将椭圆的当前属性(位置、颜色等)保存在绘图过程之外的单独变量中。每次WM_PAINT收到时,程序需要使用当前属性值绘制一次椭圆然后退出(退出前不要忘记调用)。EndPaint()WM_PAINT

要实现动画(移动椭圆、变换颜色等),您可以使用计时器(请参阅 参考资料SetTimer())根据需要更新属性值。每次属性值更改时,调用InvalidateRect()以让操作系统知道WM_PAINT椭圆窗口需要一条新消息。让您的窗口的消息循环决定何时将WM_PAINT新消息实际传递给您。达到所需的最终结果时停止计时器。

于 2015-12-22T01:15:39.813 回答
0

你失踪了EndPaint()

我不知道多次选择同一个 gdi 对象的行为,但如果不建议在使用当前对象时恢复原始对象,这是一种很好的做法。

我不会在 asm 中编码,但我认为应该是这样的

invoke SelectObject, hdc, initialBrush
push eax
...
pop eax
invoke SelectObject, hdc, eax
于 2015-12-22T06:51:44.800 回答