windows程式設計讀書筆記--------資源
windows使用資源的一個好處是能夠統一的進行管理,把所有的資源都繫結到程式的.EXE檔案中。如果沒有資源的概念的話,資源不得不單獨的作為一個檔案來儲存,並在使用的時候將其讀入記憶體。windows程式設計中,主要有如下一些資源:圖示,滑鼠指標,字串,自定義資源,選單,鍵盤加速鍵,對話方塊,點陣圖。
在VC中在程式中引入資源的一種便捷方法是:(1)設定一個工程已開啟,如下:File->New,在彈出的New對話方塊中,選擇files中的resource script,填寫相關檔名稱及工程。(2)Insert->resource,在彈出的對話方塊中,選擇要建立的資源型別,在根據實際情況就OK了。
圖示
程式中運用圖示,可分為系統定義的圖示和程式設計師定義的圖示。
對於系統定義的圖示使用:
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
對於系統定義的圖示運用LoadIcon來載入時,第一個引數必須為NULL,表示該圖示有系統內定,第二個引數表示系統內定的圖示的ID號,系統定義的圖示主要有:
IDI_APPLICATION:32512 IDI_QUESTION:332514
IDI_HAND:32513 IDI_EXCLAMATION:32515
IDI_ASTERISK :32516 IDI_WINLOGO:32517
IDI_UAC :32518(僅Vista、Win7)
自己定義的圖示:
wndclass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON));
其中第一個引數表示資源圖示的實力來自的例項控制代碼,第二個引數實際是一個字串指標。
#define MAKEINTRESOURCE(i) DOWORD((WORD)(i))
這樣也就是說其也可以這樣使用或者定義:
wndclass.hIcon=LoadIcon(hInstance,szAppName);//其中szAppNmae為一個字串,其代表如表文件
在.RC檔案中資源指令碼ICON語句形式如下eg:
IDI_ICON ICON DISCARDABLE "icondemo.icon"
其中IDI_ICON為圖示ID識別符號。ICON代表資源指令碼的型別。IDSCARDABLE表示windows在需要是可以自動將圖示從記憶體中移除,在需要是自動載入到記憶體中,無需程式設計師操作。
如果需在程式中動態改變圖示時,可以使用SetClassLong函式:
SetClassLong(hwnd,GCL_HICON,LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ALTICON));
也就是說程式中使用圖示有兩種方法:一種是在定義視窗類時,使用LoadIcon函式初始化hIcon項。一種是在程式中使用SetClassLong函式。
滑鼠指標
使用方法:第一種在建立視窗類時,使用LoadCursor函式初始化hCursor項,第二種時呼叫SetClassLong函式動態改變。第三種是使用SetCursor(hCursot)函式。
字串資源
在使用時,應該使用LoadString來複制字串到緩衝區中,便以在程式中使用:
LoadString(hIstance,id,szBuffer,iMaxLength);
ID:字串資源的ID Caption:字串自定義資源
方法:Insert->Resorce,在對話方塊中選擇Custom按鈕。
在初始化時可以使用LoadResource函式來獲得控制代碼:
hResource=LoadResource(hInstance,
FindResource(hInstance,MAKEINTRESOURCE(IDR_BINTU),TEXT("BTNTU"));
其中的hResource為HGLOBAL型別,既其指向記憶體塊的控制代碼。
如果需要訪問文字時,應呼叫LockResource函式和FreeResource函式:
pdata=LockResource(hResource);//pdata為指向文字的指標
FreeResource(hResource);//釋放資源
-------------------------------------------------------------------------------------------------------------
選單
選單的建立的方法和上面的各種資源建立方法類似。
建立時會彈出一個對話方塊:
方法一:wndclass.lpszMenuName=szAppName;
方法二:先用LoadMenu函式載入到記憶體並獲得控制代碼,在呼叫CreateWindow函式時指定相應選單項
hMenu=LoadMenu(hInstance,MAKEINTRESOURCE(ID_MENU));
hwnd=CreateWindow("myclass","dfds",WS_OVERLAPPEDWINDOW,
CW_USEDFAULT,CW_USEDEFAULT,CW_USEDEAULT,
CW_USEDEFAULT,NULL,hMenu,hInstance,NULL):
方法三:SetMenu(hwnd,hMenu)函式在建立視窗後指定選單。
與選單相關的一些訊息:
1)WM_INITMENU訊息
wParam: 主選單控制代碼
lParam: 0
產生:當一個選單即將變為活動時,傳送此訊息
2)WM_MENUSELECT訊息
LOWORD(wParam): 所選的選單項:選單的ID或彈出選單的索引
HIWORD(wParam): 選擇標記
lParam: 包含所選項的選單控制代碼
產生:當滑鼠或者游標在各選單項移動時,會產生許多該訊息
選擇標記:
MF_DISABLED:使選單項無效,使該項不能被選擇,但不使選單項變灰。
MF_GRAYED:使萊單項無效並變灰,使其不能被選擇。
MF_CHECKED:在選單項旁邊放置一個選取標記。
MF_BITMAP:含有點陣圖控制代碼
MF_POPUP:指定選單開啟一個下拉式選單或子選單
MF_HELP:幫助
MF_SYSMENU:顯示系統彈出選單
MF_MOUSESELECT
3)WM_INITMENUPOPUP訊息
wParam: 彈出選單控制代碼
LOWORD(lParam) : 彈出選單的索引
HIWORD(lParam) :1代表系統選單,0代表其他選單
產生::Windows要顯示彈出選單時,會向視窗過程傳送此訊息。
4)WM_COMMAND訊息
LOWORD(wParam): 選單的ID
HIWORD(wParam): 0
lParam: 0
產生:當一個選單被選中時產生
5)WM_MENUCHAR訊息
LOWORD(wParam):字元碼
HIWORD(wParam): 選擇碼
lParam: 選單控制代碼
產生:如果使用者按下了Alt和一個不對於任何選單項的字元鍵;或者,當淡出選單顯示時,
按下了一個不對應於任何彈出選單項的字元鍵。
選擇碼:0 沒有彈出選單顯示
MF_POPUP 彈出選單被顯示
MF_SYSYMENU 系統彈出選單被顯示
使用CreateMenu()和AppendMenu函式來建立選單
-------------------------------------------------------------------------------------------------------------------
加速鍵
使用LoadAccelerators函式將鍵盤加速鍵表載入到記憶體中:
HANDLE hAccel;
hAccel=LoadAccelerators(hInstance,TEXT("MyAccelerators"));
在獲得訊息是可使用TranslateAccelerators(hwnd,hAccel,&msg)來對獲得訊息進行翻譯,如果其與鍵盤加速鍵表中的值匹配,就將該訊息傳給擁有選單的視窗過程,則返回TRUE,否則返回FALSE。
因此可以這樣處理:
while(GetMessage(&msg,NULL,0,0))
{
if(!TranslateAcdelerator(hwnd,hAcdel,&msg))
{
TranslateMessage(&msg);
DispathMessage(&msg);
}
}
WM_COMMAND訊息
LOWORD(wParam): 加速鍵ID
HIWORD(wParam): 1
lParam: 0
ID:快捷鍵對應的選單的ID
Key:虛擬件碼或者AXCII碼
Modifiers:選擇和虛擬件碼組合的鍵
Type:Key中是虛擬件碼還是ASCII碼
----------------------------------------------------------------------------------------------------------------------
一些陌生的函式:
1):CheckMenuItem(hmenu, id, uCheck);
函式功能:該函式取得與指定選單項相聯絡的選單標誌。如果該選單項打開了一個子選單,該函式也返回子選單裡的選單項數。
uCheck引數:MF_CHECKED,MF_UNCHECKED,MF_BYCOMMAND,MF_BYPOSITION,
MF_DISABLED,MF_ARAYED,MF_HILITE,MF_MENUBARBREAK,MF_SEPARATOR
2):DWORD SetClassLong(HWND hWnd,int nlndex,LONG dwNewLong);
函式功能:該函式替換在額外類儲存空間的指定偏移地址的32位長整型值,或替換指定視窗所屬類的WNDCLASSEX結構。
nIndex引數:GCL_CBCLSEXTRA ,GCL_CBWNDEXTRA, GCL_HBRBACKGROUND,
GCL_HCURSOR,GCL_HMODULE , GCL_MENUNAME,GCL_WNDPROC
dsNewLong引數:用於替換的值
3)DWORD GetClassLong(HWND hWnd,int nlndex)
函式功能:該函式返回與指定視窗相關的WNDCLASSEX結構的指定32位值
nIndex引數:GCL_CBCLSEXTRA ,GCL_CBWNDEXTRA, GCL_HBRBACKGROUND,
GCL_HCURSOR,GCL_HMODULE , GCL_MENUNAME,GCL_WNDPROC
4)BOOL EnableMenuItem(HMENU hMenu,UINT uIDEnableItem, UINT uEnable);
函式功能:允許或禁止指定的選單條目
uEnable引數::MF_BYCOMMAND,MF_BYPOSITION,MF_ENABLED,
MF_DISABLED,MF_GRAYED
5)CreateMenu()
函式功能:建立選單
返回值:指向建立的選單記憶體塊的控制代碼
6)BOOL AppendMenu(hMenu hMenu,UINT uFlags,UINT uIDNewltem,LPCTSTR lpNewltem);
函式功能:函式在指定的選單條、下拉式選單、子選單或快捷選單的末尾追加一個新選單項。此函式可指定選單項的內容、外觀和效能
unFlags引數:MF_BITMAP,MF_CHECKED,MF_DISABLED,MF_ENABLED,MF_GRAYED,
MF_MENUBARBREAK, MF_MENUBREAK,MF_POPUP, MF_SEPARATOR,
MF_STRING,MF_UNCHECKED ,MF_OWNERDRAW
7)BOOL TrackPopupMenu(HMENU hMenu,UINT uFlags,int x,int y,int nReserved,HWND hWnd,CONST RECT* prcRect);
函式功能:該函式在指定位置顯示快捷選單,並跟蹤選單項的選擇。快捷選單可出現在螢幕上的任何位置。
uFlags引數:TPM_CENTERALIGN,TPM_LEFTALIGN,TPM_RIGHTALIGN,TPM_BOTTOMALIGN
TPM_TOPALIGN,TPM_VCENTERALIGN,TPM_NONOTIFY,TPM_RETURNCMD,
TPM_LEFTBUTTON,TPM_RIGHTBUTTON
NReserved:保留值,必須為零。
PrcRect:未用。
8)GetSystemMenu(hwnd,True);//獲取系統選單控制代碼
9)iCount=GetMenuItemCount(hMenu);//計運算元選單的項數
10) GetSubMenu(hMenu,iPosition);//獲取子選單的控制代碼
11)id=GetMenuItemID(hMenuPopup,iPosition);//獲取ID
12)DarwMenuBar(hwnd);//強制重繪
13)iFlags=GetMenuState(hMenu,id,iFlag);//獲取當前選單項的狀態
14)iCharCount=GetMenuString(hMenu,id,pString,iMaxCount,iFlag);//獲取選單項上的字串
15)SetMenu(hwnd,hMenuMain);
16)BOOL InsertMenu(HMENU hMenu,UINt uPosition,UINT uFlags,UINT uIDNewltem,LPCTSTR lpNewltem);
函式功能:函式插入一個新選單項到選單裡,並使選單裡其他項下移。
iPosition引數:指定新選單項將被插入其前面的選單項,其含義由引數uFlagS決定
uFlags引數:MF_BYCOMMAND,MF_BYPOSITION, MF_BITMAP,MF_CHECKED ,
MF_DISABLED,MF_ENABLED,MF_GRAYED,MF_MENUBARBREAK,
MF_MENUBREAK,MF_OWNERDRAW,MF_POPUP,MF_SEPARATOR,
MF_STRING,MF_UNCHECKED
uIDNewltem引數:指定新選單項的識別符號,或者當引數uFlags設定為MF_POPUP時,指定下拉式選單或子選單的控制代碼。
LpNewltem引數:指定新選單項的內容。其含義依賴於引數UFlags是否包含標誌MF_BITMAP,MF_OWNERDRAW或MF_STRING。
17)BOOL ModifyMenu(HMENU hMnu,UINT uPosition,UINT uFlags,UINT uIDNewltem,LPCTSTR IpNewltem);
函式功能:該引數修改已存在的選單項,並指定選單項的內容、外觀和效能。
18)BOOL RemoveMenu(HMENU hMenu,UINT uPosition,UINT uFlgs);
函式功能:該函式從指定選單刪除一個選單項或分離一個子選單。如果選單項開啟一個下拉式選單或子選單,RemoveMenu不消毀該選單或其控制代碼,允許選單被重用。
在呼叫此函式前,函式GetSubMenu應當取得下拉式選單或子選單的控制代碼。