鱼C论坛

 找回密码
 立即注册
查看: 2626|回复: 5

[技术交流] 【学习笔记】菜单学习

[复制链接]
发表于 2012-7-17 18:24:30 | 显示全部楼层 |阅读模式

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

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

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
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>







想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-17 18:47:30 | 显示全部楼层
你学的是 8086 汇编 还是win32的哦  :o
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-18 14:47:58 | 显示全部楼层
反汇编?然后做解释?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2016-5-21 18:30:14 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-15 19:44:55 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-17 11:52:40 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 11:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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