小哈龙 沙滩

版权声明:需要转载的请注明出处 https://blog.csdn.net/qq_22642239/article/details/50948602
一.首先是菜单加速键资源文件:

#define ICO_MAIN 4096
#define IDM_MAIN 8192
#define IDM_OPEN 16641
#define IDM_OPTION 16642
#define IDM_EXIT 16643
#define IDM_SETFONT 16897
#define IDM_SETCOLOR 16898
#define IDM_INACT 16899
#define IDM_GRAY 16900
#define IDM_BIG 16901
#define IDM_SMALL 16902
#define IDM_LIST 16903
#define IDM_DETAIL 16904
#define IDM_TOOLBAR 16905
#define IDM_TOOLBARTEXT 16912
#define IDM_INPUTBAR 16913
#define IDM_STATUSBAR 16914
#define IDM_HELP 17153
#define IDM_ABOUT 17154
#define IDA_MAIN 8192


ICO_MAIN ICON DISCARDABLE "Main.ico"


IDM_MAIN MENU
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
    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
  BEGIN
    MENUITEM "帮助主题(&H)\tF1",IDM_HELP
    MENUITEM SEPARATOR
    MENUITEM "关于本程序(&A)...",IDM_ABOUT
  END
END


IDA_MAIN ACCELERATORS
BEGIN
  72,IDM_HELP,VIRTKEY,NOINVERT
  66,IDM_SETCOLOR,VIRTKEY,CONTROL,ALT,NOINVERT
  70,IDM_SETFONT,VIRTKEY,ALT,NOINVERT
END

有了资源文件,使得一个windows窗口更加有特点,更加丰富,刚开始编写资源文件真是废了好大劲,在用编译器的时候更是纠结,RadASM是一个集成的汇编工具,里面虽然自带一个资源编译器,但是我感觉那个资源编辑器真心不好用,但是跟罗云斌老师那本书自定义的资源很配,使用的时候需要自己定义各个资源的命令ID。除此之外还可以使用ResEdit这个资源编辑工具,这个就需要使用到windows的各种头文件了,windows.h等等,再VC++6.0或者VS系列中的include文件都可以找到,没有这些是不行的,他们都是windows大哥定义好的东西,你只需要定义命令ID就可以了,如果想使用自定义字符的话,在代码段开头处自定义等值(equ)定义即可,例如ICO_MAINequ1000h ,注意后面的数值,在WIN32编译器中后面的数值是16位的后面加h,在使用资源编辑器时需要用C语言的语法#define ICO_MAIN 0X1000,其他的细节在代码中需要注意。

下面看一下资源文件的代码

**

这些代码虽然不用自己去敲,可以在资源编辑器中用更加方便的方法实现同样的窗口,然后保存,资源编辑器自然会生成相关的资源脚本文件,你也可以预览资源脚本的代码,话虽如此,如果程序都写好了,资源文件也建好了,程序可以编译连接构建运行了,如果回头看一下资源脚本代码,顿时感觉一头雾水,那就不好了吧,虽然有方便的工具,但是还是需要知道它是怎么一步一步编写出来的(刚开始学习的时候我也在纠结,既然可以方便的编写出来 实现效果,那不就可以了么,但是后来看一下资源脚本的代码,这个真是一点都不会,最终还是纠结不过去,花了些时间简单的看了一下,很快就可以理解了。虽然现在不用自己去编写代码,但是我感觉多知道点东西对自己是没有什么坏处的,知识越多越好啊 。)需要注意一点的是资源脚本都是用的C语言的语法编写的,要对号入位,具体的就看自己用编译器编写的时候的体会了,只有经历过才会理解的更深,没有自己写过,,说什么都是扯淡。**

**
**

二.在窗口中加载使用菜单和加速键

在刚开始的时候,我一直不了解怎么才能将一个已经编写好的资源脚本文件加载应用到一个窗口中,到时候来慢慢的了解了,当用编译器将编译好的资源文件和编译好的ASM文件链接起来的时候,连接器已经将编译过后生成的目标文件(OBJ)链接起来了,当载入资源时,首先获得菜单或者加速键的句柄,然后在创建窗口的时候在参数中指定菜单句柄,在程序中用API函数直接通过相应的的命令ID调用即可,这是自定义的菜单,当使用系统默认的菜单的时候,只需在注册窗口类的时候指定类的默认菜单就可以了。

代码:


.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 2000h ;加速键
IDM_OPEN equ 4101h
IDM_OPTION equ4102h
IDM_EXIT equ 4103h
IDM_SETFONT equ4201h
IDM_SETCOLOR equ4202h
IDM_INACT equ 4203h
IDM_GRAY equ 4204h
IDM_BIG equ 4205h
IDM_SMALL equ 4206h
IDM_LIST equ 4207h
IDM_DETAIL equ4208h
IDM_TOOLBAR equ4209h
IDM_TOOLBARTEXT equ4210h
IDM_INPUTBAR equ4211h
IDM_STATUSBAR equ4212h
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
                                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
                                .if     eax == IDM_EXIT
                                        call   _Quit
                                .elseif eax >= IDM_TOOLBAR && eax <= IDM_STATUSBAR
                                        mov ebx,eax
                                        invoke GetMenuState,hMenu,ebx,MF_BYCOMMAND
                                        .if    eax == MF_CHECKED
                                               mov    eax,MF_UNCHECKED
                                        .else  
                                               mov    eax,MF_CHECKED   
                                        .endif
                                        invoke CheckMenuItem,hMenu,ebx,eax
                                .elseif eax >= IDM_BIG && eax <= IDM_DETAIL
                                 invoke CheckMenuRadioItem,hMenu,IDM_BIG,IDM_DETAIL,eax,MF_BYCOMMAND
                                .endif
;**********************************************************
;处理系统菜单消息
;**********************************************************
                        .elseif eax == WM_SYSCOMMAND
                         mov    eax,wParam
                         movzx  eax,ax
                         .if    eax == IDM_HELP || eax == IDM_ABOUT
                                invoke _DisplayMenuItem,wParam
                         .else
                                invoke DefWindowProc,hWnd,uMsg,wParam,lParam
                                ret 
                         .endif
;***********************************************************
;点击鼠标右键时弹出一个POPUP菜单
;***********************************************************
                        .elseif eax == WM_RBUTTONDOWN
                         invoke GetCursorPos,addr @stPos
                         invoke TrackPopupMenu,hSubMenu,TPM_LEFTALIGN,@stPos.x,@stPos.y,NULL,hWnd,NULL
;***********************************************************
                        .elseif eax == WM_CLOSE
                         call   _Quit
;***********************************************************
                        .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,IDM_MAIN
                mov     @hAccelerator,eax
;**********************************************************
;注册窗口类
;**********************************************************
                        invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
                        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
                        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,400,300,\
                        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

在熟悉了windows窗口程序以后,可以发现这些都是在窗口模板上添砖加瓦改造来的,其中令人陌生的还是那些API函数以及一些消息,结构的定义。

**
**

WM_COMMAND
窗口菜单:

LOWORD(wParam): 菜单id

HIWORD(wParam): 0  

lParam:          0

如果这个消息是由子窗口控件产生,如button产生则:

LOWORD(wParam): 控件ID    

HIWORD(wParam): 通知码

lParam:     子窗口句柄。

如果这个消息是由子窗口或者快捷键产生则通知码为1,由菜单产生通知码为0。

通过参数,可以区分这个消息的来源是来自于控件,快捷键还是菜单。

wParam的高位=wNotifyCode          ;通知码

wParam的低位=wID                          ;命令ID

菜单消息的通知码是0  加速键消息的通知码是1

上面代码中movzx  eax,ax执行将16位的ax扩展到32位的eax,就是将eax的高位填零,作用就是当消息是由加速键引起时,将高16位中的1忽略,这样下面的分支语句,就可以同时处理菜单和加速键的消息了,如果去掉这一句,下面的代码中就要使用ax



结构:point


typedef struct tagPOINT {
   LONG x;            ;横坐标
 LONG y;            ;纵坐标
} POINT;

API函数:

GetSubMenu()

功能:该函数取得被指定菜单激活的下拉式菜单或子菜单的句柄。

原型参数:

HMENU GetSubMenu(

                  hMenu      ; 主菜单的句柄

                   npos      ;要获取的菜单项的位置索引

)

返回值:获取的子菜单句柄

调用实例:

在源代码中用 invoke GetSubMenu,hMenu,1 取得第二个子菜单(“文件”子菜单为0,“查看”子菜单为1)的句柄,

然后在TrackPopupMenu中使用,这个菜单句柄就是主菜单中“查看”菜单。



GetSystemMenu()

功能:允许应用程序为复制或修改而访问窗口菜单(系统菜单或控制菜单)。

原型:HMENU GetSystemMenu(HWND hWnd,BOOL bRevert);

参数:

hWnd:拥有窗口菜单拷贝的窗口的句柄。

bRevert:指定将执行的操作。如果此参数为FALSE,GetSystemMenu返回当前使用窗口菜单的拷贝的句柄。该拷贝初始时与窗口菜单相同,但可以被修改。

如果此参数为TRUE,GetSystemMenu重置窗口菜单到缺省状态。如果存在先前的窗口菜单,将被销毁。

返回值:

如果参数bRevert为FALSE,返回值是窗口菜单的拷贝的句柄:如果参数bRevert为TRUE,返回值是NULL



AppendMenu()

功能:

该函数在指定的菜单条、下拉式菜单、子菜单或快捷菜单的末尾追加一个新菜单项。此函数可指定菜单项的内容、外观和性能。

函数AppendMenu己被lnsertMenultem取代。但如果不需要lnsertMenultem的扩展特性,仍可使用AppendMenu。
原型:

BOOL AppendMenu(hMenu hMenu,UINT uFlags,UINT uIDNewltem,LPCTSTR lpNewltem);

参数:

hMenu:将被修改的菜单条、下拉式菜单、子菜单、或快捷菜单的句柄

uFlags:控制新菜单项的外观和性能的标志。此参数可以是备注里所列值的组合

UIDNewItem:指定新菜单项的标识符,或者当uFlags设置为MF_POPUP时,表示下拉式菜单或子菜单的句柄。

lpNewItem:指定新菜单项的内容。

返回值:如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。



GetMenuState()

功能:

该函数取得与指定菜单项相联系的菜单标志。如果该菜单项打开了一个子菜单,该函数也返回子菜单里的菜单项数。

原型:

UINT GetMenuState(HMENU hMenu,UINT uld,UINT uFlags)

参数:


hMenu:含有其菜单项的标志将被提取得的菜单的句柄。

uld:其某单标志将被取得的菜单项,此参数含义由参数uFlags决定。

UFlags:用于指定参数uld的含义的值。此参数可取下列值之一:

MF_BYCOMMAND:表示参数uld给出菜单项的标识符。如果MF_BYCOMMAND和MF_BYPOSITION都没被指定,则MF_BYCOMMAND是缺省值。

MF_BYPOSITION:表示参数uld给出菜单项相对于零的位置。

返回值:


下面列出与菜单项相关的菜单标志。

MF_CHECKED:放置选取标记于菜单项旁边(只用于下拉式菜单、子菜单或快捷菜单)。

MF_DISABLED:使菜单项无效。MF_GRAYED:使菜单项无效并交灰。MF_HILITE:加亮菜单项。

MF_MENUBARBREAK:对下拉式菜单、子菜单和快捷菜单,新列和旧列由垂直线隔开,其余功能同MF_MENUBREAK标志。

MF_MENUBREAK:将菜单项放于新行(对菜单条)或无分隔列地放于新列(对下拉式菜单、子菜单或快捷菜单)。

MF_SEPARATOR:创建一个水平分隔线(只用于下拉式菜单、子菜单或快捷菜单)。

返回值:

如果指定的项不存在,返回值是OXFFFFFFFF;如果菜单项打开了一个子菜单,则返回值的低位含有与菜单相联系的菜单标志,高位含有子菜单的项数。

否则,返回值是菜单标志的掩码(布尔OR)



CheckMenuItem()

功能:复选或撤消复选指定的菜单条目

原型:

DWORD CheckMenuItem(HMENU hmenu, UINT uIDCheckItem, UINT uCheck);

参数:


hmenu:

含有其菜单项的标志将被提取得的菜单的句柄。

UIDCheckMenuItem:

此参数可取下列值之一:

MF_BYCOMMAND:表示参数uId给出菜单项的标识符。如果MF_BYCOMMAND和MF_BYPOSITION都没被指定,则MF_BYCOMMAND是缺省值。

MF_BYPOSITION:表示参数uId给出菜单项相对于零的位置。

uCheck:


MF_CHECKED:放置选取标记于菜单项旁边(只用于下拉式菜单、子菜单或快捷菜单)。

MF_DISABLED:使菜单项无效。MF_GRAYED:使菜单项无效并变灰。MF_HILITE:加亮菜单项。

MF_MENUBARBREAK:对下拉式菜单、子菜单和快捷菜单,新列和旧列由垂直线隔开,其余功能同MF_MENUBREAK标志。

MF_MENUBREAK:将菜单项放于新行(对菜单条)或无分隔列地放于新列(对下拉式菜单、子菜单或快捷菜单)。

MF_SEPARATOR:创建一个水平分隔线(只用于下拉式菜单、子菜单或快捷菜单)。

MF_UNCHECKED: 相当于MF_CHECKED 的反作用,取消放置于菜单项旁边的标记。

返回值:

如果指定的项不存在,返回值是OXFFFFFFFF;如果菜单项打开了一个子菜单,则返回值的低位含有与菜单相联系的菜单标志,高位含有子菜单的项数。否则,返回值是莱单标志的掩码(布尔OR)。



CheckMenuRadioItem()

功能:校核一个指定的菜单项并使其成为一个圆按钮项。

原型:

BOOL CheckMenuRadioItem(HMEN hMENU,UINT idFirst,UINT idLast,UINT idCheck,UINT uFlags);

参数:

hMenu:包含一组菜单项的菜单的句柄。

idFirst:菜单组里第一个菜单项的标识符或位置。

idLast:菜单组里最后一个菜单项的标识符或位置。

idCheck:要校核的菜单项的标识符或位置。

uFlag:指定idFirst,idLast,idCheck含义的值。如果此参数为MF_BYCOMMAND,则其他参数指定菜单项标识符。如果此参数为MF_BYPOSITION,则其他参数指定菜单项位置。

返回值:如果函数调用成功,返回值非零。如果函数调用失败,返回值为零



GetCursorPos ()

功能: 该函数检取光标的位置,以屏幕坐标表示

原型:

BOOL GetCursorPos(LPPOINT lpPoint);

参数:

IpPoint:POINT结构指针,该结构接收光标的屏幕坐标。

返回值:

如果成功,返回值非零;如果失败,返回值为零



TrackPopupMenu()

功能:

该函数在指定位置显示快捷菜单,并跟踪菜单项的选择。快捷菜单可出现在屏幕上的任何位置

原型:

BOOL TrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, int nReserved, HWND hWnd, CONST RECT* prcRect);

参数:

hMenu:被显示的快捷菜单的句柄。此句柄可为调用CreatePopupMenu创建的新快捷菜单的句柄,也可以为调用GetSubMenu取得的与一个已存在菜单项相联系的子菜单的句柄。

uFlags:一种指定功能选项的位标志。用下列标志位之一来确定函数如何水平放置快捷菜单:

TPM_CENTERALIGN:若设置此标志,函数将按参数x指定的坐标水平居中放置快捷菜单。

TPM_LEFTALIGN:若设置此标志,函数使快捷菜单的左边界与由参数X指定的坐标对齐。

TPM_RIGHTALIGN:若设置此标志,函数使快捷菜单的右边界与由参数X指定的坐标对齐。

用下列标志位之一来确定函数如何垂直放置快捷菜单:

TPM_BOTTOMALIGN:若设置此标志,函数使快捷菜单的下边界与由参数y指定的坐标对齐。

TPM_TOPALIGN:若设置此标志,函数使快捷菜单的上边界与由参数y指定的坐标对齐。

TPM_VCENTERALIGN;若设置此标志,函数将按参数y指定的坐标垂直居中放置快捷菜单

用下列标志位之一来确定在菜单没有父窗口的情况下用户的选择:

TPM_NONOTIFY:若设置此标志,当用户单击菜单项时函数不发送通知消息。

TPM_RETURNCMD;若设置此标志;函数将用户所选菜单项的标识符返回到返回值里。

(补充:当TrackPopupMenu的返回值大于0,就说明用户从弹出菜单中选择了一个菜单。以返回的ID号为参数wParam的值,程序给自己发送了一个WM_SYSCOMMAND消息)

用下列标志位之一来确定在快捷菜单跟踪哪一个鼠标键:

TPM_LEFTBUTTON:若设置此标志,用户只能用鼠标左键选择菜单项。

TPM_RIGHTBUTTON:若设置此标志,用户能用鼠标左、右键选择菜单项。

X:在屏幕坐标下,快捷菜单的水平位置。

Y:在屏幕坐标下,快捷菜单的垂直位置。

NReserved:保留值,必须为零。

HWnd:拥有快捷菜单的窗口的句柄。此窗口接收来自菜单的所有消息。函数返回前,此窗口不接受来自菜单的WM_COMMAND消息。

返回值:
如果在参数uFlags里指定了TPM_NONOTIFY值,此函数不向hWnd标识的窗口发消息。 但必须给hWnd里传一个窗口句柄,可以是应用程序里的任一个窗口句柄

 

返回值:



LoadMenu()

功能:该函数从与应用程序实例相联系的可执行文件(.EXE)中加载指定的菜单资源

原型::HMENU LoadMenu(HINSTANCE hlnstance,LPCTSTR lpMenuName);

参数:

hlnstance:含有被加载菜单资源的实例模块的句柄。若此参数为NULL,则从当前实例中加载菜单。

LpMenuName:指向含有菜单资源名的以空结束的字符串的指针。同时,此参数可由低位字上的资源标识符和高位字上的零组成。要创建此值,用MAKEINTRESOURCE宏。注意,菜单ID(所有资源ID类同)也可以直接由字符串构造,如ID值为"IDM_MYMENU"(ID值含引号)

返回值:

如果函数调用成功,返回值是菜单资源句柄;如果函数调用失败,返回值是NULL。若想获得更多的错误信息,请调用GetLastError函数。



LoadAccelerators()

功能:调入加速键表。该函数调入指定的加速键表。

原型:HACCEL LoadAccelerators(HINSTANCE hlnstance,LPCTSTR lpTableName)

参数:

hlnstance:模块的一个实例的句柄,该模块的可执行文件中包含将要调入的加速键表。

IpTableName:指向一个以空结尾的字符串的指针,该字符串包含了即将调入的加速键表的名字。另一种可选的方案是,该参数可以在加速键表资源的低位字中指定资源标识符,而高位字中全零。MADEINTRESOURCE宏可被用于创建该值。

返回值:若函数调用成功,则返回非零值。若函数调用失败,则返回值为零



LoadIcon()

功能:装入lpIconName指定的图标资源

原型:HICON LoadIcon(HINSTANCE hInstance,LPCTSTR lpIconName);

该函数已被LoadImage替代

参数:

lpIconName是指向NULL字符结尾的字符串的指针,它包含图标名.如果要使用windows预定义的图标,这时hInstance必须设置成NULL,lpIconName则可以是下列值:

IDI_APPLICATION:32512 IDI_QUESTION:332514

IDI_HAND:32513 IDI_EXCLAMATION:32515

IDI_ASTERISK :32516 IDI_WINLOGO:32517

IDI_UAC :32518(仅Vista、Win7)



TranSlateAccelerator()

功能:

翻译加速键表。该函数处理菜单命令中的加速键。该函数将一个WM_KEYDOWN或WM_SYSKEYDOWN消息

翻译成一个WM_COMMAND或WM_SYSCOMMAND消息(如果在给定的加速键表中有该键的入口),

然后将WM_COMMAND或WM_SYSCOMMAND消息直接送到相应的窗口处理过程

原型:

int TranslateAccelerator(HWND hWnd,HACCEL hAccTable,LPMSG IpMsg);

参数:

hWnd:窗口句柄,该窗口的消息将被翻译。

hAccTable:加速键表句柄。加速键表必须由LoadAccelerators函数调用装入或由CreateAccd_eratorTable函数调用创建。

LpMsg:MSG结构指针,MSG结构中包含了从使用GetMessage或PeekMessage函数调用线程消息队列中得到的消息内容

返回值:
若函数调用成功,则返回非零值;若函数调用失败,则返回值为零。

**
**

**
**

**
**

**
**

**
**

**

**