flat assembler
Message board for the users of flat assembler.

flat assembler > Examples and Tutorials > Fasmed menudemo of Example 3 of masm32

Author
Thread Post new topic Reply to topic
ProMiNick



Joined: 24 Mar 2012
Posts: 353
Location: Russian Federation, Sochi
in masm32 version there is a bug with checking states of menuitems:
there are used cmp instead of test as result incorrect displaying of owner draw items.
here it is fixed.
However in program are stayed some rudiments no needed for current realization.
Code:
; Programed by Ewayne Wagner for masm32
; E-MAIL yooper@kalamazoo.net

; Fasmed by ProMiNick

format PE GUI 4.0
entry start

IDR_MENU       = 37
IDR_MENU2      = 700

IDB_CUTBMP     = 701
IDB_CPYBMP     = 702
IDB_PSTBMP     = 703
IDB_DELBMP     = 704
IDB_CU2BMP     = 705
IDB_CP2BMP     = 706
IDB_PS2BMP     = 707
IDB_DL2BMP     = 708

IDM_NEW        = 1001
IDM_OPEN       = 1002
IDM_SAVE       = 1003
IDM_EXIT       = 2001
IDM_CUT        = 1005
IDM_COPY       = 1006
IDM_PASTE      = 1007
IDM_DEL        = 1008
IDM_SET1       = 1101
IDM_SET2       = 1102
IDM_SET3       = 1103
IDM_SET4       = 1104
IDM_SET5       = 1105
IDM_SET6       = 1106
IDM_SET7       = 1107
IDM_SET8       = 1108
IDM_SET9       = 1109
IDM_SET10      = 1110
IDM_SET11      = 1111
sizeof.dword_pushed_before = 4

include 'win32ax.inc'

section '.text' code readable executable

  start

        invoke  GetModuleHandle,0
        mov     hInst, eax
        mov     wc.hInstance, eax
        invoke  LoadIcon,0,IDI_APPLICATION
        mov     wc.hIcon,eax
        invoke  LoadCursor,0,IDC_ARROW
        mov     wc.hCursor,eax
        invoke  RegisterClassEx,wc

        invoke  GetSystemMetrics, SM_CXSCREEN
        sub     eax, 350
        shr     eax, 1
        push    eax
        invoke  GetSystemMetrics, SM_CYSCREEN
        sub     eax, 300
        shr     eax, 1
        pop     ebx

        invoke  CreateWindowEx,WS_EX_CLIENTEDGE,ClassName,AppName,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,ebx,eax,350,300,NULL,NULL,wc.hInstance,NULL
        mov     hWnd, eax
        invoke  ShowWindow, hWnd, SW_SHOWNORMAL
        invoke  UpdateWindow, hWnd
        invoke  GetMenu, hWnd              ; Get handle to main menu
        mov     hMenu, eax
        invoke  GetSubMenu, hMenu, 0       ; Get handle to 1st sub menu
        mov     hSMenu1, eax
        invoke  GetSubMenu, hMenu, 1       ; Get handle to 2nd sub menu
        mov     hSMenu2, eax

  msg_loop
        invoke  GetMessage,msg,NULL,0,0
        cmp     eax,1
        jb      end_loop
        jne     msg_loop
        invoke  TranslateMessage,msg
        invoke  DispatchMessage,msg
        jmp     msg_loop

  end_loop
        invoke  ExitProcess,eax
        invoke  InitCommonControls

proc WindowProc uses ebx esi edi, hwnd,wmsg,wparam,lparam
        locals
                ID          dd ?
                Cnt         dd ?
                Disable     dd ?
                dwRob       dd ?
                hMemDC      dd ?
                hBR         dd ?
                rect        RECT
                szBuff      db 25 dup ?
        endl
        mov     eax,wmsg
        cmp     eax,WM_COMMAND
        je      .wmcommand
        cmp     eax,WM_DRAWITEM
        je      .wmdrawitem
        cmp     eax,WM_MEASUREITEM
        je      .wmmeasureitem
        cmp     eax,WM_SIZE
        je      .wmsize
        cmp     eax,WM_NOTIFY
        je      .wmnotify
        cmp     eax,WM_CREATE
        je      .wmcreate
        cmp     eax,WM_CLOSE
        je      .wmclose
        cmp     eax,WM_DESTROY
        je      .wmdestroy
  .defwndproc
        invoke  DefWindowProc,hwnd,wmsg,wparam,lparam
        jmp     .finish
  .wmcommand
        mov     ebx, lparam
        test    ebx,ebx
        jnz     .defwndproc
        mov     eax, wparam
        and     eax,0FFFFh
        cmp     eax, IDM_EXIT
        jnz     @F
        invoke  SendMessage, hwnd, WM_CLOSE, 0, 0
        jmp     .finish

  .settable     dd .wmcmdset1,.wmcmdset2,.wmcmdset3,.wmcmdset4,\
                   .wmcmdset5,.wmcmdset6,.wmcmdset7,.wmcmdset8,\
                   .wmcmdset9,.wmcmdset10,.wmcmdset11
  @@
        mov     ecx,1
        xchg    eax,ecx
        cmp     ecx, IDM_SET11
        ja      .defwndproc
        sub     ecx, IDM_SET1
        jb      .defwndproc

        shl     eax, cl
        test    Set, eax
        jnz     .ret0
        or      Set, eax
        jmp     dword .settable+ecx*4
  .wmcmdset1
        mov     mii.fType, MFT_STRING or MFT_RADIOCHECK
        mov     mii.fState, MFS_CHECKED
        mov     mii.wID, IDM_SAVE
        mov     eax, szSaveIt
        mov     mii.dwTypeData, eax
        invoke  SetMenuItemInfo, hSMenu1, IDM_SAVE, FALSE, mii
        jmp     .ret0
  .wmcmdset2
        mov     mii.fType, MFT_STRING
        mov     mii.fState, 0
        mov     mii.wID, 1019
        mov     eax, szSaveAs
        mov     mii.dwTypeData, eax
        invoke  InsertMenuItem, hSMenu1, 3, TRUE, mii
        jmp     .ret0
  .wmcmdset3
        invoke  CreatePopupMenu
        mov     hSMenu3, eax
        mov     mii.hSubMenu, eax
        mov     mii.fType, MFT_STRING
        mov     eax, szNewMenu1
        mov     mii.dwTypeData, eax
        invoke  InsertMenuItem, hMenu, 2, TRUE, mii
        invoke  DrawMenuBar,hwnd
        jmp     .ret0
  .wmcmdset4
        mov     mii.fType, MFT_STRING
        mov     mii.hSubMenu, 0
        mov     mii.wID, 1020
        mov     eax, szNewSubMenu1
        mov     mii.dwTypeData, eax
        invoke  InsertMenuItem, hSMenu3, 0, TRUE, mii
        invoke  DrawMenuBar,hwnd
        jmp     .ret0
  .wmcmdset5
        invoke  GetMenuItemCount,hSMenu3
        mov     edx,eax
        mov     mii.fType, MFT_SEPARATOR
        mov     mii.dwTypeData, eax
        invoke  InsertMenuItem, hSMenu3, edx, TRUE, mii
        mov     mii.fType, MFT_STRING
        mov     mii.wID, 1021
        mov     mii.hSubMenu, 0
        mov     eax, szNewSubMenu2
        mov     mii.dwTypeData, eax
        invoke  InsertMenuItem, hSMenu3, 99, TRUE, mii
        invoke  DrawMenuBar,hwnd
        jmp     .ret0
  .wmcmdset6
        invoke  SetMenuItemBitmaps,hSMenu2, IDM_CUT, MF_BYCOMMAND, hMBmp1, hMBmp1
        invoke  SetMenuItemBitmaps,hSMenu2, IDM_COPY, MF_BYCOMMAND, hMBmp2, hMBmp2
        invoke  SetMenuItemBitmaps,hSMenu2, IDM_PASTE, MF_BYCOMMAND, hMBmp3, hMBmp3
        invoke  SetMenuItemBitmaps,hSMenu2, IDM_DEL, MF_BYCOMMAND, hMBmp4, hMBmp4
        jmp     .ret0
  .wmcmdset7
        invoke  CreatePopupMenu
        mov     hSMenu4, eax
        mov     mii.hSubMenu, eax
        invoke  GetMenuItemCount,hMenu
        dec     eax
        mov     edx,eax
        mov     mii.fType, MFT_STRING
        mov     mii.fState, MFS_ENABLED
        mov     mii.hbmpChecked, 0
        mov     mii.hbmpUnchecked, 0
        mov     eax, szNewMenu2
        mov     mii.dwTypeData, eax
        invoke  InsertMenuItem, hMenu, edx, TRUE, mii
        mov     mii.fType, MFT_STRING
        mov     eax,hSMenu5
        mov     mii.hSubMenu, eax
        mov     eax, szEdit
        mov     mii.dwTypeData, eax
        invoke  InsertMenuItem, hSMenu4, 0, TRUE, mii
        invoke  DrawMenuBar,hwnd
        jmp     .ret0
  .wmcmdset8
        mov     mii.fType, MFT_STRING
        mov     mii.fState, MFS_ENABLED
        mov     eax, szOwner
        mov     mii.dwTypeData, eax
        invoke  SetMenuItemInfo, hSMenu4, 0, TRUE, mii
        mov     mii.fType, MFT_OWNERDRAW
        mov     mii.fState, MFS_ENABLED
        mov     mii.hSubMenu, 0
        mov     mii.wID, IDM_CUT
        mov     mii.dwItemData, IDM_CUT
        mov     mii.dwTypeData, 0
        invoke  SetMenuItemInfo, hSMenu5, IDM_CUT, FALSE, mii
        mov     mii.wID, IDM_COPY
        mov     mii.dwItemData, IDM_COPY
        invoke  SetMenuItemInfo, hSMenu5, IDM_COPY, FALSE, mii
        mov     mii.wID, IDM_PASTE
        mov     mii.dwItemData, IDM_PASTE
        invoke  SetMenuItemInfo, hSMenu5, IDM_PASTE, FALSE, mii
        mov     mii.wID, IDM_DEL
        mov     mii.dwItemData, IDM_DEL
        invoke  SetMenuItemInfo, hSMenu5, IDM_DEL, FALSE, mii
        invoke  DrawMenuBar,hwnd
        jmp     .ret0
  .wmcmdset9
        invoke  GetMenuItemInfo, hSMenu2, IDM_COPY, FALSE, mii
        xor     mii.fState,MF_GRAYED
        invoke  EnableMenuItem, hMenu, IDM_COPY, mii.fState
        jmp     .ret0
  .wmcmdset10
        push    mii.fMask
        mov     mii.fMask, MIIM_STATE
        invoke  GetMenuItemInfo, hSMenu5, IDM_COPY, FALSE, mii
        xor     mii.fState,MF_GRAYED
        test    Set,1 shl 7
        jz      .no_owndraw
        mov     mii.fType, MFT_OWNERDRAW
  .no_owndraw
        invoke  SetMenuItemInfo, hSMenu5, IDM_COPY, FALSE, mii
        pop     mii.fMask
        jmp     .ret0
  .wmcmdset11
        invoke  DestroyMenu, hMenu
        invoke  LoadMenu, wc.hInstance, IDR_MENU
        mov     hMenu, eax
        invoke  SetMenu, hwnd, hMenu
        invoke  GetSubMenu, hMenu, 0       ; Get handle to 1st sub menu
        mov     hSMenu1, eax
        invoke  GetSubMenu, hMenu, 1       ; Get handle to 2nd sub menu
        mov     hSMenu2, eax
        invoke  LoadMenu, wc.hInstance, IDR_MENU2
        invoke  GetSubMenu, eax, 0
        mov     hSMenu5, eax
        xor     eax,eax
        mov     Set,eax
        jmp     .finish
  .wmdrawitem
        mov     eax,wparam
        test    eax,eax
        jnz     .defwndproc
        mov     esi,lparam
        mov     edi,dis
        mov     ecx, sizeof.DRAWITEMSTRUCT
        rep     movsb
        cmp     dis.itemID,-1
        jz      .skipdraw
        mov     dis.rcItem.left, 17
        mov     dis.rcItem.top, 0
        mov     dis.rcItem.right, 100
        mov     dis.rcItem.bottom, 16

        mov     eax, dis.itemData
        sub     eax, IDM_CUT
        mov     edx, hMBmp5+eax*4
        mov     hMBmp, edx
        shl     eax,4 ; eax = eax*16
        add     dis.rcItem.top, eax
        add     dis.rcItem.bottom, eax
        shr     eax,2
        mov     eax,szs+eax
        invoke  lstrcpy, addr szBuff, eax
        and     Disable,0
        mov     dwRob, SRCCOPY
        mov     eax,dis.itemState
        cmp     dis.itemState,7
        ja      .skip_enabling
        je      .do_enable
        test    dis.itemState,1
        jnz     .skip_enabling
  .do_enable
        inc     Disable
        mov     dwRob, SRCAND
  .skip_enabling
        invoke  CreateCompatibleDC, dis.hDC
        push    eax
        invoke  SelectObject, eax, hMBmp
        invoke  BitBlt, dis.hDC, 0, dis.rcItem.top, 16, 16, dword esp+sizeof.dword_pushed_before*3, 0, 0, dwRob
        invoke  DeleteDC;, hMemDC; from stack

        test    dis.itemState,ODS_GRAYED
        jz      .cont
        invoke  GetSysColor, COLOR_GRAYTEXT
        invoke  SetTextColor, dis.hDC, eax
        invoke  SetBkMode, dis.hDC, TRANSPARENT
        jmp     .end_cases

  .cont
        test    dis.itemState,ODS_SELECTED
        jz     .cont2
        invoke  CreateSolidBrush, 00000000h
        mov     hBR, eax
        invoke  FillRect, dis.hDC, dis.rcItem, eax
        invoke  SetTextColor, dis.hDC, 00ffff00h
        invoke  SetBkColor, dis.hDC, 00000000h
        mov     rect.left, 0
        mov     eax,dis.rcItem.top
        mov     rect.top,eax
        mov     rect.right, 16
        mov     eax,dis.rcItem.bottom
        mov     rect.bottom,eax
        invoke  DrawEdge, dis.hDC, addr rect, BDR_RAISEDINNER, BF_TOPLEFT
        invoke  DrawEdge, dis.hDC, addr rect, BDR_RAISEDOUTER, BF_BOTTOMRIGHT
        jmp     .end_cases
  .cont2
        invoke  GetBkColor, dis.hDC
        invoke  CreateSolidBrush, eax
        mov     hBR, eax
        invoke  FillRect, dis.hDC, dis.rcItem, eax
        invoke  SetTextColor, dis.hDC, 00ff0000h
        invoke  SetBkMode, dis.hDC, TRANSPARENT
  .end_cases
        add     dis.rcItem.left, 4
        invoke  DrawText, dis.hDC, addr szBuff, -1, dis.rcItem, DT_LEFT or DT_VCENTER or DT_SINGLELINE
        invoke  DeleteObject, hBR
  .skipdraw
        mov     dis.itemState, ODS_DEFAULT
        mov     dis.hDC, 0
        jmp     .ret0
  .wmmeasureitem
        cmp     wparam,0
        jnz     .defwndproc
        mov     edx, lparam
        mov     edx+MEASUREITEMSTRUCT.itemWidth, 80
        mov     edx+MEASUREITEMSTRUCT.itemHeight, 16
        jmp     .finish
  .wmsize
  .wmnotify
        jmp     .finish

  .wmcreate
        invoke  LoadMenu, wc.hInstance, IDR_MENU2
        invoke  GetSubMenu, eax, 0
        mov     hSMenu5, eax
        mov     ID,IDB_CUTBMP
        mov     Cnt,8
  @@
        invoke  LoadBitmap, wc.hInstance, ID
        mov     ecx,ID
        sub     ecx,IDB_CUTBMP
        mov     ecx*4+hMBmp1,eax
        inc     ID
        sub     Cnt,1
        jnz     @B
  @@
        mov     mii.cbSize, sizeof.MENUITEMINFO
        mov     mii.fMask, MIIM_DATA or MIIM_ID or MIIM_STATE or MIIM_SUBMENU or MIIM_TYPE or MIIM_CHECKMARKS
        jmp     .finish
  .wmclose
        jmp     .defwndproc
  .ret1
        xor     eax,eax
        inc     eax
        jmp     .finish
  .wmdestroy
        invoke  PostQuitMessage,0
  .ret0
        xor     eax,eax
  .finish
        ret
endp

section '.data' data readable writeable
    szs            dd  szCut,szCopy,szPaste,szDelete

    ClassName      db  'MenuDemo',0
    AppName        db  'MenuDemo ProMiNick',0
    MenuName       db  'MainMenu',0
    szNull         db  0

    szSaveIt       db  '&Save It',0
    szSaveAs       db  'Save &As',0
    szNewMenu1     db  'New Menu 1',0
    szNewMenu2     db  'New Menu 2',0
    szNewSubMenu1  db  'New SubMenu 1',0
    szNewSubMenu2  db  'New SubMenu 2',0

    szOwner        db  'OwnerDrawn',0
    szCut          db  'Cu&t',0
    szCopy         db  '&Copy',0
    szPaste        db  '&Paste',0
    szDelete       db  '&Delete',0
    szEdit         db  '&Edit',0
    align 4
    wc             WNDCLASSEX sizeof.WNDCLASSEX, 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,IDR_MENU,ClassName,0
    msg            MSG
    mii            MENUITEMINFO
    mis            MEASUREITEMSTRUCT
    dis            DRAWITEMSTRUCT
    hInst          dd  ?
    MainExit       dd  ?
    hWnd           dd  ?
    hMenu          dd  ?
    hSMenu1        dd  ?
    hSMenu2        dd  ?
    hSMenu3        dd  ?
    hSMenu4        dd  ?
    hSMenu5        dd  ?
    MenuCnt        dd  ?
    Set            dd  ?
    hMBmp          dd  ?
    hMBmp1         dd  ?
    hMBmp2         dd  ?
    hMBmp3         dd  ?
    hMBmp4         dd  ?
    hMBmp5         dd  ?
    hMBmp6         dd  ?
    hMBmp7         dd  ?
    hMBmp8         dd  ?

    ItemID         dd  ?

section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',\
          user32,'USER32.DLL',\
          comctl32,'COMCTL32.DLL',\
          gdi32,'GDI32.DLL'

  include 'api\kernel32.inc'
  include 'api\user32.inc'
  include 'api\comctl32.inc'
  include 'api\gdi32.inc'

section '.rsrc' resource data readable discardable

  directory RT_MENU,menus,\
            RT_BITMAP,bitmaps

  resource menus,\
           IDR_MENU,LANG_ENGLISH+SUBLANG_DEFAULT,main_menu,\
           IDR_MENU2,LANG_ENGLISH+SUBLANG_DEFAULT,scnd_menu

  resource bitmaps,\
           IDB_CUTBMP,LANG_NEUTRAL,cut_bitmap,\
           IDB_CPYBMP,LANG_NEUTRAL,cpy_bitmap,\
           IDB_PSTBMP,LANG_NEUTRAL,pst_bitmap,\
           IDB_DELBMP,LANG_NEUTRAL,del_bitmap,\
           IDB_CU2BMP,LANG_NEUTRAL,cu2_bitmap,\
           IDB_CP2BMP,LANG_NEUTRAL,cp2_bitmap,\
           IDB_PS2BMP,LANG_NEUTRAL,ps2_bitmap,\
           IDB_DL2BMP,LANG_NEUTRAL,dl2_bitmap

  menu main_menu
       menuitem '&File',0,MFR_POPUP
                menuitem '&New',IDM_NEW
                menuitem '&Open',IDM_OPEN
                menuitem '&Save',IDM_SAVE
                menuseparator
                menuitem 'E&xit',IDM_EXIT,MFR_END
       menuitem '&Edit',0,MFR_POPUP
                menuitem 'Cu&t',IDM_CUT
                menuitem '&Copy',IDM_COPY;,,MF_GRAYED
                menuitem '&Paste',IDM_PASTE
                menuitem '&Delete',IDM_DEL,MFR_END
       menuitem '&Menu Functions',0,MFR_POPUP + MFR_END
                menuitem 'Change the name of &Save in the &File Menu',IDM_SET1
                menuitem 'Insert a Save As Menu Item in the &File Menu',IDM_SET2
                menuseparator
                menuitem 'Insert a &New Menu in the Menu bar',IDM_SET3
                menuitem 'Insert a Menu Item in the &New Menu',IDM_SET4
                menuitem 'Insert a Sep and Menu Item in the &New Menu',IDM_SET5
                menuseparator
                menuitem 'Add Bitmaps to the &Edit Menu  Ugly',IDM_SET6
                menuseparator
                menuitem 'Insert a &New Menu and Submenu in the Menu bar',IDM_SET7
                menuitem 'Change the new Submenu to OwnerDrawn  Nice',IDM_SET8
                menuseparator
                menuitem 'Gray or Enable &Copy in the &Edit Menu',IDM_SET9
                menuitem 'Gray or Enable &Copy in the OwnerDrawn &Edit Menu',IDM_SET10
                menuseparator
                menuitem 'Restore the Menu bar',IDM_SET11,MFR_END

  menu scnd_menu
       menuitem '&Edit',0,MFR_POPUP + MFR_END
                menuitem 'Cu&t',IDM_CUT
                menuitem '&Copy',IDM_COPY
                menuitem '&Paste',IDM_PASTE
                menuitem '&Delete',IDM_DEL,MFR_END

  bitmap cut_bitmap,'resource\B05_Cut.bmp'
  bitmap cpy_bitmap,'resource\B06_Copy.bmp'
  bitmap pst_bitmap,'resource\B07_Paste.bmp'
  bitmap del_bitmap,'resource\B08_Delete.bmp'
  bitmap cu2_bitmap,'resource\B05_Cut4.bmp'
  bitmap cp2_bitmap,'resource\B06_Copy4.bmp'
  bitmap ps2_bitmap,'resource\B07_Paste4.bmp'
  bitmap dl2_bitmap,'resource\B08_Delete4.bmp'    


Out of topic: is anyone know how to code item additional data to menuitem in resource not in code.
MS says it is impossible.
For menu ver0 it is realy impossible: I checked every combination of (16 bit) flags.
In ver1 therefore 16-bit flags separated into 4 32-bit flags with exclusive low parts, but in higher parts... it is not good documented - what is there...

_________________
I don`t like to refer by "you" to one person.
My soul requires acronim "thou" instead.
Post 07 Aug 2017, 10:02
View user's profile Send private message Send e-mail Reply with quote
Display posts from previous:
Post new topic Reply to topic

Jump to:  


< Last Thread | Next Thread >
Forum Rules:
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Copyright © 1999-2019, Tomasz Grysztar.

Powered by rwasa.