鱼C论坛

 找回密码
 立即注册
查看: 1736|回复: 0

[技术交流] win32汇编窗口菜单程序,菜单乱码

[复制链接]
发表于 2013-11-18 12:45:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
                .386
                .model flat,stdcall
                option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ        等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN        equ                1000h        ;图标
IDM_MAIN        equ                2000h        ;菜单
IDA_MAIN        equ                3000h        ;加速键
IDM_NEW                equ                2001h
IDM_OPEN        equ                2002h
IDM_SAVE        equ                2003h
IDM_SAVEAS        equ                2004h
IDM_PRINT        equ                2005h
IDM_EXIT        equ                2006h
IDM_HELP        equ                2007h
IDM_ABOUT        equ                2008h

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .data?
hInstance        dd                ?
hWinMain        dd                ?
hMenu                dd                ?
hSubMenu        dd                ?
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .const
szClassName                db        'Menu Example',0
szCaptionMain        db        'Assmbly',0
szMenuHelp                db        '帮助主题(&H)...',0
szMenuAbout                db        '关于本程序(&A)...',0
szCaption                db        '窗口',0
szFormat                db        '你选择的菜单命令:%08x',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .code
_DisplayMenuItem        proc        _dwCommandID
                local        @szBuffer[256]:byte
                pushad
                invoke        wsprintf,addr @szBuffer,addr szFormat,_dwCommandID
                invoke        MessageBox,hWinMain,addr @szBuffer,offset        szCaption,MB_OK
                popad
                ret
_DisplayMenuItem        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Quit        proc
                invoke        DestroyWindow,hWinMain
                invoke        PostQuitMessage,NULL
                ret
_Quit        endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain        proc        uses ebx edi esi hWnd,uMsg,wParam,lParam
                local        @stPos:POINT
                local        @hSysMenu
               

                mov        eax,uMsg
;********************************************************************
                .if        eax ==        WM_CREATE
                        invoke        GetSubMenu,hMenu,1
                        mov hSubMenu,eax
                        ;在系统菜单中添加菜单项
                        invoke        GetSystemMenu,hWnd,FALSE
                        mov        @hSysMenu,eax
                        invoke        AppendMenu,@hSysMenu,MF_SEPARATOR,0,NULL
                        invoke        AppendMenu,@hSysMenu,0,IDM_HELP,offset szMenuHelp
                        invoke        AppendMenu,@hSysMenu,0,IDM_ABOUT,offset        szMenuAbout
                        ;处理菜单和加速键消息
                .elseif        eax        ==        WM_COMMAND
                        invoke        _DisplayMenuItem,wParam
                        mov eax,wParam
                        movzx        eax,ax
                .elseif        eax        ==        IDM_EXIT
                                call        _Quit
                       
                       
;********************************************************************
                .elseif        eax ==        WM_CLOSE
                        invoke        DestroyWindow,hWinMain
                        invoke        PostQuitMessage,NULL
;********************************************************************
                .else
                        invoke        DefWindowProc,hWnd,uMsg,wParam,lParam
                        ret
                .endif
               
;********************************************************************
                xor        eax,eax
                ret

_ProcWinMain        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain        proc
                local        @stWndClass:WNDCLASSEX
                local        @stMsg:MSG
                local        @hAccelerator

                invoke        GetModuleHandle,NULL
                mov        hInstance,eax
                invoke        LoadMenu,hInstance,IDM_MAIN
                mov hMenu,eax
                invoke        LoadAccelerators,hInstance,IDA_MAIN
                mov        @hAccelerator,eax
;********************************************************************
; 注册窗口类
;********************************************************************
                invoke        RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
                invoke        LoadIcon,hInstance,ICO_MAIN
                mov        @stWndClass.hIcon,eax
                mov @stWndClass.hIconSm,eax
                invoke        LoadCursor,0,IDC_ARROW
                mov @stWndClass.hCursor,eax
                push hInstance
               
                pop        @stWndClass.hInstance
                mov        @stWndClass.cbSize,sizeof WNDCLASSEX
                mov        @stWndClass.style,CS_HREDRAW or CS_VREDRAW
                mov        @stWndClass.lpfnWndProc,offset _ProcWinMain
                mov        @stWndClass.hbrBackground,COLOR_WINDOW + 1
                mov        @stWndClass.lpszClassName,offset szClassName
                invoke        RegisterClassEx,addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************
                invoke        CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\
                        WS_OVERLAPPEDWINDOW,\
                        100,100,600,400,\
                        NULL,hMenu,hInstance,NULL
                mov        hWinMain,eax
                invoke        ShowWindow,hWinMain,SW_SHOWNORMAL
                invoke        UpdateWindow,hWinMain
;********************************************************************
; 消息循环
;********************************************************************
                .while        TRUE
                        invoke        GetMessage,addr @stMsg,NULL,0,0
                        .break        .if eax        == 0
                        invoke        TranslateAccelerator,hWinMain,@hAccelerator,addr        @stMsg
                       
                        .if        eax        ==        0
                                invoke        TranslateMessage,addr @stMsg
                                invoke        DispatchMessage,addr @stMsg
                        .endif
                .endw
                ret

_WinMain        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
                call        _WinMain
                invoke        ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                end        start
;这是代码,下面是资源文件

#include        <resource.h>
//定义资源
#define        ICO_MAIN        0x1000        //图标
#define        IDM_MAIN        0x2000        //菜单
#define        IDA_MAIN        0x3000        //加速键

//定义子子菜单项
#define        IDM_NEW                0x2001
#define        IDM_OPEN        0x2002
#define        IDM_SAVE        0x2003
#define        IDM_SAVEAS        0x2004
#define        IDM_PRINT        0x2005
#define        IDM_EXIT        0x2006
#define        IDM_HELP        0x2007
#define        IDM_ABOUT        0x2008

ICO_MAIN        ICON        "main.ico"

IDM_MAIN        menu        discardable
BEGIN       
        popup        "文件(&F)"
        BEGIN
                menuitem        "新建(&N)\tCtrl+N",                IDM_NEW
                menuitem        "打开(&O)...\tCtrl+O"        IDM_OPEN       
                menuitem        "保存(&S)...\tCtrl+S"        IDM_SAVE
                menuitem        "另存为(&A)..."                        IDM_SAVEAS
                menuitem        separator
                menuitem        "打印(&P)...\tCtrl+P"        IDM_PRINT
                menuitem        separator
                menuitem        "退出(&X)"                                IDM_EXIT
        END
        popup        "帮助(&H)",        HELP
        BEGIN       
                menuitem        "帮助主题(&H)\tF1"        IDM_HELP
                menuitem        separator
                menuitem        "关于(&A)...",        IDM_ABOUT
        END
END
       
IDA_MAIN        accelerators
BEGIN       
        "^N",                IDM_NEW               
        "^O",                IDM_OPEN
        "^S",                IDM_SAVE
        "^P",                IDM_PRINT       
        VK_F1,                IDM_HELP,        VIRTKEY
END       




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 12:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表