1. 程式人生 > >WIN32彙編 選單和加速鍵的使用

WIN32彙編 選單和加速鍵的使用

一.首先是選單加速鍵資原始檔:

#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函式呼叫執行緒訊息佇列中得到的訊息內容

返回值:
若函式呼叫成功,則返回非零值;若函式呼叫失敗,則返回值為零。