News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

WM_PAINT Selectivity

Started by allynm, January 08, 2010, 12:22:20 AM

Previous topic - Next topic

allynm

Hi everyone-

I have a beginner question on WM_PAINT.  It is a sort of general question.  I could send code if this would help clarify the matter, but let me try first just raising the question in a sort of "canonical" fashioin.

Let us suppose I have a desire to paint repeatedly, but paint different stuff (various TextOuts, bitmaps, what-have-you).  The program calculates various items and paints differently depending upon what gets computed.

My novice solution to this is to use something like the following code:

  .if uMsg == WM_PAINT && BOOLVAR1 == TRUE
      INVOKE BeginPaint, etc.

.ELSEIF
     uMsg == WM_PAINT && BOOLVAR2 == TRUE
       INVOKE BeginPaint, etc.

My question for you folks is whether this is the appropriate way to handle the problem or just the crummy, clumsy invention of a novice.  I'd like to code using best practices.

Thanks much,
Mark Allyn


jj2007

Mark,
Assembly is flexible, choose what suits you. Keep it simple and clear. For example, you might choose

.if uMsg == WM_PAINT
      invoke MyPaintProc, BoolVar
.elseif uMsg == ...

....

MyPaintProc MyChoice
      INVOKE BeginPaint, ...
      Switch MyChoice
      Case 1
      call PaintARect
      Case 2
      call PaintACircle
      Endsw
      INVOKE EndPaint, ...
      ret
MyPaintProc endp

allynm

Hello JJ-

Your code is very elegant.  I will adopt this general form. 

Thank you,
Mark

Slugsnack

oh btw :

.IF eax != 0 is equal to .IF eax

similarly, .IF eax == 0 is same as .IF !eax

jj2007

Quote from: Slugsnack on January 08, 2010, 03:37:15 AM
.IF eax != 0 is equal to .IF eax

Yes, in general simpler code is also easier to read and maintain. Indentation is important:
MyPaintProc MyChoice
      invoke BeginPaint, ...
      Switch MyChoice
      Case 1
         call PaintARect
      Case 2
         call PaintACircle
      Endsw
      invoke EndPaint, ...
      ret
MyPaintProc endp

What I see often and find horrible is this:
sub                                 esp,1Ch
push                                esi
mov                                 esi,0FFFFFFFFh

Compare to
sub esp, 1Ch
push esi
mov esi, 0FFFFFFFFh

Much friendlier to the human eye :8)
In the upper case, the eye reads sub push mov then esp,1Ch esi esi,0FFFFFFFFh (the latter being -1 btw, but the author probably wanted to demonstrate that brains of Real MenTM work in HEX).

I also try to avoid UPPERCASE, IT JUST MEANS SHOUTING, AND WE KNOW ANYWAY WHAT INVOKE IS, RIGHT?

And, of course, colour...
Quote   sub esp, 28   ; 7*4 is easier to read than 1Ch
   push esi      ; push and pop marked red
   mov esi, -1
   mov byte ptr [esi], 0
   if MyDebug   ; conditional assembly marked blue
      movaps xmm0, xmmword ptr [ecx]
      movaps xmm1, xmm0
   else
      movaps xmm0, xmmword ptr [ecx]
      movaps xmm1, xmm0
   endif
   mulps xmm1, xmm0
   movaps xmmword ptr [esp+10h], xmm1   ; how much time to you need to decipher 10h as 16=4*4?
   fld dword ptr [esp+16]
   fadd dword ptr [esp+24]
   pop esi
   fadd dword ptr [esp+16]
   fstp dword ptr [esp+12]
All that is very subjective, and if everybody applied a strongly idiosyncratic style, communication might even be worse. Nonetheless, a bit of good taste and some rules would not hurt :bg

Ghandi

Quote
.if eax != 0 is equal to .if eax

similarly, .if eax == 0 is same as .if !eax

Yes and no, without being too pedantic. They will have the same effect on the flow of code testing for a zero condition.

For instance:
.if eax

Results in:

test eax,eax
jz @foo

;code to execute if zero flag isn't set

@foo:


Which can be encoded: 85 C0 75 XX


Whereas:
.if eax != 0

Results in:

cmp eax,0
jz @foo

;code to execute if eax isn't 0

@foo:

Which can be encoded: 83 F8 00 75 XX

Of course, this is being too general, because there can be different ways to encode the same instructions and a long jump will be encoded differently than a short jump, etc. Once again, im not trying to be anal about this. :)

HR,
Ghandi