The MASM Forum Archive 2004 to 2012

General Forums => The Workshop => Topic started by: Eric4ever on April 13, 2006, 05:20:12 AM

Title: Question about a masm default example
Post by: Eric4ever on April 13, 2006, 05:20:12 AM
\masm32\examples\exampl09\tables


Any Explaination would be appreciate.
I get the main point but puzzled by some sentences and usage.


1.
      checkarray MACRO cnt1,cnt2,spc,lft,top:REQ
        LOCAL idnum,hstep,vstep,lspc,stcnt,var
          idnum = 500
          stcnt = 400
          hstep = 0
          vstep = 0
        REPEAT cnt1
          DlgStatic 0,SS_RIGHT,3,top+vstep,15,8,stcnt
          stcnt = stcnt + 1
            REPEAT cnt2
              DlgCheck 0,0,lft + hstep,top + vstep,8,8,idnum
              idnum = idnum + 1
              hstep = hstep + spc
            ENDM
          vstep = vstep + spc
          hstep = 0
        ENDM
      ENDM

2.
mov hInstance, FUNC(GetModuleHandle,NULL) ---- FUNC() ?

3.
main proc ---- What's the habit/usage to create window? Why not use .rc file?

    Dialog "Create Character Table", \      ; caption
           "MS Sans Serif",10, \            ; font,pointsize
            WS_OVERLAPPED or \              ; styles for
            WS_SYSMENU or DS_CENTER, \      ; dialog window
            256 + 16 + 8, \                 ; number of controls
            50,50,203,240, \                ; x y co-ordinates
            32768                           ; memory buffer size

    DlgButton "Numbers",   WS_TABSTOP, 21,185,50,13,100

4.
CallModalDialog hInstance,0,DlgProc,NULL ---- CallModalDialog? Where is the defination?
free pMem

5.
mov str1, ustr$(ccntr) ---- ustr$(ccntr) ?
fn SetWindowText,FUNC(GetDlgItem,hWin,nrange),str1 ---- fn?
mov str1,cat$(str1,"Ascii ",str$(ctrl)," Hex ",right$(hex$(ctrl),2)," Character ",str2)
Title: Re: Question about a masm default example
Post by: hutch-- on April 13, 2006, 05:37:49 AM
Eric,

The example is an in memory template for a dialog and is a standard API for creating a dialog. This example will not run on win98se because it appears to use too many controls for the win98se dialog engine. It was designed on Win2000 and should only be used for win2000 or later.

It uses a variety of macros for different tasks, the dialogs are created using the macros from "dialogs.inc", the others are in the macros.asm file in the macros directory.
Title: Re: Question about a masm default example
Post by: MichaelW on April 13, 2006, 05:44:57 AM
Eric,

I think you could find the answer to most of your questions in the MASM32 help files, in particular hlhelp.hlp and dialogs.hlp. For help in understanding how the macros work, see the MASM documentation available  here (http://webster.cs.ucr.edu/Page_TechDocs/index.html), MASM Programmer's Guide, Chapter 9: Using Macros.

Title: Re: Question about a masm default example
Post by: Eric4ever on April 13, 2006, 08:08:54 AM
THX  :toothy

I Got it more or less :bdg
Title: Re: Question about a masm default example
Post by: Eric4ever on April 14, 2006, 03:58:33 AM
There is a question about the AutoCheckBox:

the macro define 256 autocheckbox

      checkarray MACRO cnt1,cnt2,spc,lft,top:REQ ; checkarray 16,16,10,22,20
        LOCAL idnum,hstep,vstep,lspc,stcnt,var
          idnum = 500
          stcnt = 400
          hstep = 0
          vstep = 15
        REPEAT cnt1 ; cnt1=16
          DlgStatic 0,SS_RIGHT,3,top+vstep,15,8,stcnt ; static control, ty=top+vstep=20
          stcnt = stcnt + 1
            REPEAT cnt2 ; cnt2=16
              DlgCheck 0,0,lft + hstep,top + vstep,8,8,idnum ; check box, tx=lft+hstep=22
              idnum = idnum + 1
              hstep = hstep + spc ; spc=10
            ENDM
          vstep = vstep + spc
          hstep = 0
        ENDM
      ENDM


I just want to SetTimer when the 1st(any of the 256) autocheckbox checked, the question is How can I use the IsDlgButtonChecked to check it? There is no handle of autocheckbox, and define 256 handle too boring and stupid..
Title: Re: Question about a masm default example
Post by: MichaelW on April 14, 2006, 09:16:54 AM
You can intercept the   BN_CLICKED notification (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/buttons/buttonreference/buttonmessages/bn_clicked.asp) in DlgProc, checking the low-order word of wParam for a control identifier in the range 500-755.

Also, the check box handles are not available within the macro, but the handles are being obtained in a loop in DlgProc.


Title: Re: Question about a masm default example
Post by: Eric4ever on April 20, 2006, 02:10:29 AM
Quote from: MichaelW on April 14, 2006, 09:16:54 AM
You can intercept the   BN_CLICKED notification (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/buttons/buttonreference/buttonmessages/bn_clicked.asp) in DlgProc, checking the low-order word of wParam for a control identifier in the range 500-755.

Also, the check box handles are not available within the macro, but the handles are being obtained in a loop in DlgProc.


Hi MichaelW,

Do I made some mistakes? I'm puzzled by the memory template for a dialog and BN_CLICKED notification.

      Case WM_COMMAND
        Switch wParam
          Case IDOK                       ; clear
            mov nrange, 500
            .while nrange <= 755
              invoke SendMessage,FUNC(GetDlgItem,hWin,nrange),BM_SETCHECK,BST_UNCHECKED,0
              add nrange, 1
            .endw
          Case IDCANCEL
            jmp quit_dialog
          Case BN_CLICKED
            mov eax,wParam
           mov nrange, 500
            .while nrange <= 755
              invoke  IsDlgButtonChecked,FUNC(GetDlgItem,hWin,nrange),nrange
              .if eax == BST_CHECKED
              invoke  SetTimer,hWin,ID_TIMER,5000,NULL
              jz @F
              .endif
              add nrange, 1
            .endw
            @@:
          Default
       
        EndSw


Title: Re: Question about a masm default example
Post by: MichaelW on April 20, 2006, 06:23:55 AM
From the page I linked:
Quote
The low-order word contains the button's control identifier. The high-order word specifies the notification message.

So you could use something like this (without the MessageBox):

mov eax, wParam
shr eax, 16
.IF eax == BN_CLICKED
  mov eax, wParam
  and eax, 0ffffh
  MsgBox 0,ustr$(eax),"ControlID",MB_TOPMOST
.ENDIF

Title: Re: Question about a masm default example
Post by: Eric4ever on April 24, 2006, 11:39:31 AM
Quote from: MichaelW on April 20, 2006, 06:23:55 AM
From the page I linked:
Quote
The low-order word contains the button's control identifier. The high-order word specifies the notification message.

So you could use something like this (without the MessageBox):

mov eax, wParam
shr eax, 16
.IF eax == BN_CLICKED
  mov eax, wParam
  and eax, 0ffffh
  MsgBox 0,ustr$(eax),"ControlID",MB_TOPMOST
.ENDIF



MichaelW,

I get it. But I'm still puzzled by the non-handle autocheckbox. I tried it several times but failed. how can I receive the message and SetTimer when the 1st(any of the 256) autocheckbox checked.
any snipplet would be appreciate.
Thanks in advanced.
Title: Re: Question about a masm default example
Post by: MichaelW on April 24, 2006, 07:07:09 PM
You could get a handle for each of the check boxes and then use IsDlgButtonChecked to determine the state of each one, but doing so would be inefficient. The snippet I posted shows how to get the control ID for any button that the user clicks. Instead of displaying the ID in a message box as I did, you could check the ID to determine if the user clicked a check box (ID >= 500 and <= 755), and if so call SetTimer. I don't know what you are doing with the timer(s), but if you intend to have only one timer then you will need some way for the code that calls SetTimer to determine if the timer is already running.