The MASM Forum

General => The Campus => Topic started by: Don57 on October 20, 2012, 06:05:10 AM

Title: Redrawing Text
Post by: Don57 on October 20, 2012, 06:05:10 AM
I am trying to display an update user message in the main window using WM_PAINT


   WndProc proc hWnd:HWND, uMsg:UINT, wParam, lParam

      LOCAL hdc:HDC                                                           ; handle to device context
      LOCAL hMemDC:HDC                                                        ; handle to memory draw buffer
      LOCAL ps:PAINTSTRUCT                                                    ; pointer to paint structure

      .IF uMsg==WM_CREATE

          CALL Check_Admin                                                       ; check if program is being run as administrator

          invoke CreateWindowEx,NULL, ADDR sz_Button,ADDR sz_ButtonText,\        ; create button
                                WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
                                130,110,140,25,hWnd,BUTTON_ID,hInstance,NULL
       mov  hwndButton,eax                                                    ; save button handle

      .ELSEIF uMsg==WM_PAINT

       invoke BeginPaint,hWnd, ADDR ps
          mov    hdc,eax

          .IF dw_Text_Flag ==0

             invoke lstrlen, ADDR sz_WarningText                                  ; length of string returned in eax
             invoke TextOut, hdc, TEXT_LEFT, TEXT_TOP, ADDR sz_WarningText, eax   ; output text to window
             mov dw_Text_Flag, 1

          .ELSE

             invoke lstrlen, ADDR sz_ProgressText                                  ; length of string returned in eax
             invoke TextOut, hdc, TEXT_LEFT, TEXT_TOP, ADDR sz_ProgressText, eax   ; output text to window

          .ENDIF
         

          invoke EndPaint,hWnd, ADDR ps

      .ELSEIF uMsg==WM_COMMAND

          mov eax,wParam

          .IF eax==BUTTON_ID                                                  ; was the button pressed     

              .IF dw_Admin_Flaq==1

                  mov eax,hWnd                                                ; save handle in eax
                  mov hGlobal_Wnd,eax                                         ; need for Create_Progress_Bar
             

                  CALL Get_ELog_List                                          ; creates Event Log text file and dumps to buffer

                  CALL Count_ELogs                                            ; count the number of log files and calcs progress increment

;--------------------------------------------------------------

                  invoke SendMessage,hWnd, WM_PAINT,0,0     ; text update

;--------------------------------------------------------------

                  CALL Create_Progress_Bar

                  CALL Clear_ELogs                                            ; get file names and clears logs
                 
   
                  invoke MessageBox, NULL,addr sz_MsgBoxDoneText, addr sz_MsgDoneCaption, MB_OK

                  invoke PostMessage,hWnd,WM_SYSCOMMAND,SC_CLOSE,NULL                                  ; termination message for OS

                  xor eax,eax                                                                          ; return 0  termination code

              .ELSE
Title: Re: Redrawing Text
Post by: dedndave on October 20, 2012, 06:39:02 AM
that code looks like it ought to work
however - there is probably no need to use lstrlen if the strings are fixed
you can use the SIZEOF operator, and because they are null-terminated...
        INVOKE  TextOut, hdc, TEXT_LEFT, TEXT_TOP, ADDR sz_WarningText, sizeof sz_WarningText-1
or you can drop the null terminator and the "-1" and probably the "z" in the names   :P

what you are probably missing is some code, triggered by some event, that causes a WM_PAINT message to be sent
you can see if that's the case by minimizing, then restoring the window
it will cause a WM_PAINT message to be sent to the window

you can cause it to redraw a few different ways
InvalidateRect, then UpdateWindow
or with RedrawWindow
Title: Re: Redrawing Text
Post by: Don57 on October 20, 2012, 07:12:10 AM
There seems to be something seriously wrong, in the structure of my code. If I try to drag or minimize the window I get a not responding error, howere the deletion of the logs continue. The code will still reach the exit albeit alot slower.
Title: Re: Redrawing Text
Post by: MichaelW on October 20, 2012, 07:26:14 AM
Your attachment is not a valid zip file, what is it?
Title: Re: Redrawing Text
Post by: jj2007 on October 20, 2012, 07:38:21 AM
Michael,
His files open with 7-Zip. Here is the source as "ordinary" zip.

Don,
You should check if ecx is non-zero:
      mov ecx, dw_Log_Count                                      ; get the count
      jecxz @F
      div ecx                                                                 ; file count in ecx
@@:
      mov dw_Progress_Increment, eax                      ; save it
Title: Re: Redrawing Text
Post by: Don57 on October 20, 2012, 12:23:43 PM
I assume you mean for a standard error check. I usually add those after I get a program working.

Log_Count 1E3 - 483d

I get valid number all through the Create_Progress_Bar routine

The program does clear all event log files, but is not very OS friendly. If you just press the button and leave it alone it runs fine. However if you try to minimize the window or drag the window, you get a program not responding error. However the program will still clear all event logs and exit properly. The problem appears to be in the Clear_One_Log proc. It calls CreateProcess 483 times, once for each log.
I have tried lowering the priority of the process, but that  doesn't work. It is like the event handler is not working while the program executes that proc.

Thanks for the help. :t
Title: Re: Redrawing Text
Post by: jj2007 on October 20, 2012, 04:43:54 PM
Quote from: Don57 on October 20, 2012, 12:23:43 PM
I assume you mean for a standard error check. I usually add those after I get a program working.

In my case, the log count ecx is zero and therefore div ecx produces an exception.
Title: Re: Redrawing Text
Post by: sinsi on October 20, 2012, 05:03:47 PM
WM_PAINT is a pretty low priority message, maybe your processing the logs from WndProc stalls it?

Can you do the bulk of the work in a thread? I usually have the main WndProc purely to update GUI stuff and
do the work in a thread, this gives the GUI time for feedback and not 'freeze'.
Title: Re: Redrawing Text
Post by: japheth on October 20, 2012, 05:08:45 PM


                  invoke SendMessage,hWnd, WM_PAINT,0,0     ; text update


WM_PAINT should not be sent directly. If you want to achieve a synchronous update of the screen, use InvalidateRect() followed by UpdateWindow().