|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; EQU等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN equ 1000h ;图标
IDM_MAIN equ 2000h ;菜单
IDA_MAIN equ 2000h ;加速键
IDM_OPEN equ 4101h ;打开
IDM_OPTION equ 4102h ;关闭
IDM_EXIT equ 4103h ;退出
IDM_SETFONT equ 4201h ;设置字体
IDM_SETCOLOR equ 4202h ;设置颜色
IDM_INACT equ 4203h ;禁用菜单
IDM_GRAY equ 4204h ;灰化菜单
IDM_BIG equ 4205h ;大图标
IDM_SMALL equ 4206h ;小图标
IDM_LIST equ 4207h ;列表
IDM_DETAIL equ 4208h ;细节
IDM_TOOLBAR equ 4209h ;工具按钮
IDM_TOOLBARTEXT equ 4210h ;文本标签
IDM_INPUTBAR equ 4211h ;命令栏
IDM_STATUSBAR equ 4212h ;状态栏
IDM_HELP equ 4301h ;帮助
IDM_ABOUT equ 4302h ;关于
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain dd ?
hMenu dd ?
hSubMenu dd ?
.const
szClassName db 'Menu Example',0 ;窗口类名称
szCaptionMain db 'Menu',0 ;主窗口标题
szMenuHelp db '帮助主题(&H)',0
szMenuAbout db '关于本程序(&A)...',0
szCaption db '菜单选择',0
szFormat db '您选择了菜单命令:%08x',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 显示菜单项目
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_DisplayMenuItem proc _dwCommandID ;_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 ;POINT结构体存储鼠标坐标x.y
local @hSysMenu ;准备存储系统菜单句柄
mov eax,uMsg
;********************************************************************
.if eax == WM_CREATE ;处理创建窗口的消息
invoke GetSubMenu,hMenu,1 ;获取子菜单句柄(索引为1的菜单)
mov hSubMenu,eax ;存储起来用来弹出右键菜单
;********************************************************************
; 在系统菜单中添加菜单项
;********************************************************************
invoke GetSystemMenu,hWnd,FALSE ;获取系统菜单句柄
mov @hSysMenu,eax ;存储
invoke AppendMenu,@hSysMenu,\
MF_SEPARATOR,0,0 ;添加一条分隔线
invoke AppendMenu,@hSysMenu,0,\
IDM_HELP,offset szMenuHelp ;在最后的菜单下添加帮助
invoke AppendMenu,@hSysMenu,0,\
IDM_ABOUT,offset szMenuAbout ;在最后的菜单下添加关于
;********************************************************************
; 处理菜单及加速键消息
;********************************************************************
.elseif eax == WM_COMMAND ;处理菜单命令
invoke _DisplayMenuItem,wParam ;调用_DisplayMenuItem子程序并把wParam当参数传入
mov eax,wParam ;将wParam里面的命令值存储
movzx eax,ax ;将菜单和加速键的通知码统一
.if eax == IDM_EXIT
call _Quit ;调用退出子程序
.elseif eax >= IDM_TOOLBAR &&\
eax <= IDM_STATUSBAR ;eax==wParam 消息值大于4209h并且小于4212h为真
mov ebx,eax ;将eax==wParam 的消息值存储值ebx
invoke GetMenuState,hMenu,\ ;该函数取得与指定菜单项相联系的菜单标志
ebx,MF_BYCOMMAND ;获取ebx消息的状态:MF_CHECKED为选取标记
.if eax == MF_CHECKED ;返回值eax是标记或者非标记状态,ebx是消息值.
mov eax,MF_UNCHECKED
.else
mov eax,MF_CHECKED
.endif
invoke CheckMenuItem,\ ;修改菜单项目的状态
hMenu,ebx,eax ;ebx值为要修改的菜单,eax值为需要修改的状态.
.elseif eax >= IDM_BIG &&\
eax <= IDM_DETAIL ;eax==wParam 消息值大于4205h并且小于4208h为真
invoke CheckMenuRadioItem,\ ;设置菜单的互斥状态
hMenu,IDM_BIG,\ ;将消息值4205h到4208h的状态清空
IDM_DETAIL,eax,\ ;并且将eax菜单值设置为标记状态
MF_BYCOMMAND
.endif
;********************************************************************
; 处理系统菜单消息
;********************************************************************
.elseif eax == WM_SYSCOMMAND ;处理系统菜单消息
mov eax,wParam ;存储系统菜单消息至eax寄存器
movzx eax,ax ;将加速键和菜单消息的通知码统一
.if eax == IDM_HELP ||\
eax == IDM_ABOUT ;菜单消息eax如果等于4301h或者4302h则为真
invoke _DisplayMenuItem,wParam ;调用子程序_DisplayMenuItem并带入参数wParam
.else
invoke DefWindowProc,hWnd,\
uMsg,wParam,lParam ;WINDOWS默认处理其它的信息
ret
.endif
;********************************************************************
; 单击鼠标右键时弹出一个POPUP菜单
;********************************************************************
.elseif eax == WM_RBUTTONDOWN ;处理单击右键消息
invoke GetCursorPos,addr @stPos ;获取鼠标坐标并放入结构体@stPos中
invoke TrackPopupMenu,hSubMenu,\ ;指定位置显示快捷菜单,并跟踪菜单项的选择,快捷菜单可出现在任何位置
TPM_LEFTALIGN,@stPos.x,\ ;TPM_LEFTALIGN:函数使快捷菜单的左边界与由参数X指定的坐标对齐
@stPos.y,NULL,hWnd,NULL ;hSubMenu里面存储的是【查看】菜单的句柄
;********************************************************************
.elseif eax == WM_CLOSE ;处理关闭消息
call _Quit
;********************************************************************
.else
invoke DefWindowProc,hWnd,\
uMsg,wParam,lParam ;将剩下的消息交给WINDOWS处理
ret ;直接返回
.endif
;********************************************************************
xor eax,eax ;将EAX寄存器致零。
ret ;直接返回
_ProcWinMain endp ;窗口过程结束
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc ;主模块执行
local @stWndClass:WNDCLASSEX ;申请注册窗口类的结构体@stWndClass
local @stMsg:MSG ;申请消息结构体@stMsg
local @hAccelerator ;申请加速键存储空间
invoke GetModuleHandle,NULL ;获取本程序句柄
mov hInstance,eax ;保存句柄到hInstance变量
invoke LoadMenu,hInstance,IDM_MAIN ;获取菜单资源的句柄
mov hMenu,eax ;保存句柄到hMenu变量
invoke LoadAccelerators,hInstance,IDA_MAIN ;获取菜单加速键的句柄
mov @hAccelerator,eax ;保存句柄到@hAccelerator变量
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass ;将结构体@stWndClass全部清0
;********************************************************************
; 注册窗口类
;********************************************************************
invoke LoadIcon,hInstance,ICO_MAIN ;载入指定的图标资源
mov @stWndClass.hIcon,eax ;填充结构体的图标:应用程序
mov @stWndClass.hIconSm,eax ;填充结构体的图标:程序菜单栏
push hInstance ;将程序的实例句柄压栈
pop @stWndClass.hInstance ;将程序的实例句柄出栈存储到结构体中
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW ;类的风格 CS_HREDRAW当窗口水平方向的宽度变化时重绘整个窗口
; CS_VREDRAW 当窗口垂直方向的宽度变化时重绘整个窗口
mov @stWndClass.lpfnWndProc,offset _ProcWinMain ;窗口回调过程的地址存储到结构体中
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1 ;画刷:颜色是白色..后面规定要+1
mov @stWndClass.lpszClassName,offset szClassName ;给定类名称
invoke RegisterClassEx,addr @stWndClass ;注册窗口类
;********************************************************************
; 建立并显示窗口
;********************************************************************
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,\ ;建立窗口 窗口风格扩展client客户 + edge边缘,后面的是类名称
offset szCaptionMain,\ ;窗口标题
WS_OVERLAPPEDWINDOW,\ ;复合窗口风格
100,100,400,300,\
NULL,hMenu,hInstance,NULL ;添加了菜单句柄和程序句柄
mov hWinMain,eax ;将返回句柄存储到hWinMain
invoke ShowWindow,hWinMain,SW_SHOWNORMAL ;显示窗口 SW_SHOWNORMAL普通状态显示
invoke UpdateWindow,hWinMain ;更新窗口
;********************************************************************
; 消息循环
;********************************************************************
.while TRUE ;TRUE==1
invoke GetMessage,addr @stMsg,NULL,0,0 ;取得本程序所有的消息放入@stMsg
.break .if eax == 0 ;如果EAX返回0(收到退出函数就等于0)则立即中断并退出消息循环
invoke TranslateAccelerator,\
hWinMain,@hAccelerator,addr @stMsg ;转译加速键消息
.if eax == 0
invoke TranslateMessage,addr @stMsg ;转译@stMsg里面的消息到窗口过程
invoke DispatchMessage,addr @stMsg ;派发@stMsg里面的消息到窗口过程
.endif
.endw
ret
_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _WinMain ;调用子程序_WinMain
invoke ExitProcess,NULL ;退出程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start ;程序从start开始执行
RC文件
=======================================================================
#include <resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//宏命令
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define ICO_MAIN 0x1000 //图标
#define IDM_MAIN 0x2000 //菜单
#define IDA_MAIN 0x2000 //加速键
#define IDM_OPEN 0x4101 //打开
#define IDM_OPTION 0x4102 //关闭
#define IDM_EXIT 0x4103 //退出
#define IDM_SETFONT 0x4201 //设置字体
#define IDM_SETCOLOR 0x4202 //设置颜色
#define IDM_INACT 0x4203 //禁用菜单
#define IDM_GRAY 0x4204 //灰化菜单
#define IDM_BIG 0x4205 //大图标
#define IDM_SMALL 0x4206 //小图标
#define IDM_LIST 0x4207 //列表
#define IDM_DETAIL 0x4208 //细节
#define IDM_TOOLBAR 0x4209 //工具按钮
#define IDM_TOOLBARTEXT 0x4210 //文本标签
#define IDM_INPUTBAR 0x4211 //命令栏
#define IDM_STATUSBAR 0x4212 //状态栏
#define IDM_HELP 0x4301 //帮助
#define IDM_ABOUT 0x4302 //关于
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//菜单建立
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ICON "Main.ico"
IDM_MAIN menu discardable
BEGIN
popup "文件(&F)"
BEGIN
menuitem "打开文件(&O)...",IDM_OPEN
menuitem "关闭文件(&C)...",IDM_OPTION
menuitem separator
menuitem "退出(&X)",IDM_EXIT
END
popup "查看(&V)"
BEGIN
menuitem "字体(&F)...\tALT+F",IDM_SETFONT
menuitem "背景色(&B)...\tCtrl+ALT+B",IDM_SETCOLOR
menuitem separator
menuitem "被禁用的菜单项",IDM_INACT,INACTIVE
menuitem "被灰化的菜单项",IDM_GRAY,GRAYED
menuitem separator
menuitem "大图标(&G)",IDM_BIG
menuitem "小图标(&M)",IDM_SMALL
menuitem "列表(&L)",IDM_LIST
menuitem "详细资料(&D)",IDM_DETAIL
menuitem separator
popup "工具栏(&T)"
BEGIN
menuitem "标准按钮(&S)",IDM_TOOLBAR
menuitem "文字标签(&C)",IDM_TOOLBARTEXT
menuitem "命令栏(&I)",IDM_INPUTBAR
END
menuitem "状态栏(&U)",IDM_STATUSBAR
END
popup "帮助(&H)",HELP //HELP选项代表本项和以后的菜单项是右对齐的
BEGIN
menuitem "帮助主题(&H)\tF1",IDM_HELP
menuitem separator
menuitem "关于本程序(&A)...",IDM_ABOUT
END
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//虚拟键
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IDA_MAIN accelerators
BEGIN
VK_F1, IDM_HELP,VIRTKEY
"B", IDM_SETCOLOR,VIRTKEY,CONTROL,ALT
"F", IDM_SETFONT,VIRTKEY,ALT
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|