day07

5.在收到WM_CONTEXTMENU消息時彈出右鍵菜單
wParam - 被點擊的窗口句柄
lParam - LOWORD (鼠標水平位置) HIWORD (鼠標垂直位置),都是屏幕座標,無需做ClientToScreen的轉換.


一、菜單資源
1.添加菜單資源
2.通過窗口類加載菜單資源
3.通過CreateWIndow/CreateWindowEx函數加載菜單資源
LoadMenu (hInstance, MAKEINTRESOURCE (IDR_MENU_MAIN))
4.動態切換菜單資源


二、圖標資源
1.添加圖標資源
2.加載圖標資源
1)註冊窗口類式加載
typedef struct{
...
HICON hIcon; //大圖標句柄
HICON hIconSm; //小圖標句柄
...
}WNDCLASSEX;
HICON LoadIcon (
HINSTANCE hInstance, //應用程序實例句柄
LPCTSTR lpIconName //圖標資源名
)
成功返回圖標資源句柄,失敗返回NULL


2)動態設置窗口圖標
WM_SETICON - 向窗口發送此消息以設置圖標
wParam - 圖標類型ICON_BIG/ICON_SMALL
lParam - 圖標句柄


3.繪製圖標
BOOL DrawIcon (
HDC hDC, //設備上下文
int xLeft, //左上角
int yTop, //圖標位置 右下角位置
HICON hIcon, //圖標句柄
);
成功返回TURE,失敗返回FALSE


BOOL DrawIconEx (
HDC hDC, //設備上下文
int xLeft, //左上角
int yTop, //圖標位置 右下角位置
HICON hIcon, //圖標句柄
int cxWidth,
int cyHeight, //圖標寬度和高度
UINT istepIfAniCur, //不支持動畫,置爲0
HBRUSH hbrFlickerFreeDraw, //由系統直接繪製圖標,置爲NULL
UINT diFlags //繪製標誌
//DI_NORMAL/DI_IMAGE/DI_MASK
// 正常/圖像/掩碼
);


 0X00bbggrr


白:255,255,255 - 0X00FFFFFF
黑:0,0,0, - 0X00000000
藍:0,255,0 - 0X00FF0000
黃:255,255,0 - 0X0000FFFF
1 & x = X --> w & c = c
1 | x = 1 --> w | c = w
0 & x = 0 --> b & c = b
0 | x = x --> b | c = c


先 & 後 |


DI_MASK &
DI_IMAGE |
ROP概念:
光山操作:






三、光標資源
1.添加光標資源
光標的默認大小32*32像素,每一個光標都有一個熱點(HotSpot),即鼠標的位置點
2.加載光標資源
HCURSOR LoadCursor (
HINSTNACE hInstance, //應用程序實例句柄
LPCTSTR pszCursorName //光標資源名
);
成功返回光標句柄,失敗返回NULL.


typedef struct {
...
HCURSOR hCursor; //光標句柄
...
}WNDCLASSEX;
根據此窗口類創建的所有窗口都使用了此光標
3.動態設置窗口光標
WM_SETCURSOR - 設置光標(有鼠標動作且未被捕獲時發送此消息)
在該消息的處理過程中通過SetCursor 函數設置光標


HCURSOR SetCursor (
HCURSOR hCursor //光標句柄
);
返回原光標,無原光標則返回NULL.
wParam - 當前光標句柄
lParam - LOWORD 當前區域代碼,可以據此判斷鼠標是在客戶區中在標題欄中,或其他區域
HIWORD當前鼠標消息ID




4.從文件中加載光標
HCURSOR LoadCursorFromFile (
LPCTSTR lpFileName //光標文件路徑
);
成功返回光標句柄,失敗返回NULL.
對於動畫光標只能通過文件加載
C:\WINDOWS\Cursors\dinosaur.ani
如果在程序中加入路徑要不就使用 \\ 或者 /


如果是.ani結尾的光標是動態光標
如果是.cur結尾的光標是靜態光標


5.字符串資源
1.添加資源
添加字符串表資源,在表中添加字符串.
2.加載字符串資源
int LoadString (
HINSTNACE hInstance, //應用程序實例句柄
UINt uID //字符串ID
LPTSTR lpBuffer //字符串緩衝區
int cchBufferMax //緩衝區大小
);
成功返回實際載入lpBuffer緩衝區中的字符個數(不包含結尾空字符)
失敗返回0
五、加速鍵
1.添加加速鍵表資源
添加加速鍵表資源,添加與命令ID相對應的加速鍵
2.加載加速鍵資源
HACCEL LoadAccelerators (
HINSTANCE hInstance, //應用程序的實例句柄
LPCTSTR lpTableName //加速鍵表資源名
);
成功返回加速鍵表句柄,失敗返回NULL
3.翻譯加速鍵消息
int TranslateAccelerator (
HWND hWnd, //窗口句柄
HACCEL hAcctable, //加速鍵表的資源句柄
LPMSG lpMsg //消息結構體
);
成功(翻譯了)返回非零,失敗(未翻譯)返回0


int TranslateAccelerator (
HWND hWnd,
HACCEL hAcctable,
LPMSG lpMsg
)
{
if (lpMsg->Message == WM_KEYDOWN || lpMsg->Message == WM_SYSKEYDOWN)
{
從lpMsg中提取按鍵信息;
if(hAccTable加速鍵表中存在與所按下鍵對應的命令ID)
{
PostMessage (hWnd, WM_COMMAND, MAKELONG(命令ID, 1), 0);
return 1;
}
}
return 0;
}
MAKELONG 將兩個16位組成一個32位


消息循環 
MSG msg = {0};
while (GetMessage (&msg, NULL, 0, 0)) {
if (TranslateAccelereator (msg.hWnd, hAccTable, &msg) {
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}


4.獨立於菜單的加速鍵消息
WM_COMMAND - 命令消息
wParam - HIWORD菜單0/加速鍵1/控件通知碼
 LOWORD菜單ID/加速鍵ID/控件ID
lParam  若發自控件則爲其句柄,否則爲NULL


六、版本資源





































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章