day06

一、定時器消息
1.定時器
1)在程序中設置定時器,當達到定時器的時間間隔時,窗口過程函數就會收到WM_TIMER消息。
2)定時器的精度可以達到毫秒級,但是精度很低。
2.消息參數
WM_TIMER
wParam - 定時器ID
lParam - 不用


3.使用定時器
1)創建定時器
UINT SetTimer (
HWND hWnd, //窗口句柄
UINT uIDEvent, //定時器ID
UINT uElapse, //時間間隔
TIMERPROC lpTimerProc //定時器處理函數指針 (如果NULL,則由窗口過程函數處理WM_TIMER消息。否則不再產生WM_TIMER消息,直接調用定時器處理函數)
);


成功:返回定時器ID,失敗返回 0。 合理的定時器的ID一定是大於0的。


定時器處理函數原型
void CALLBACK TimerProc (
HWND hWnd, //窗口句柄
UINT uMsg, //消息ID,WM_TIMER(消息只能爲它)
UINT idEvent, //定時器ID
DWORD dwTime //當前系統時間 (是秒數)
);




2)處理WM_TIMER消息 | 定義定時器處理函數
SetTimer (hWnd, 101, 1000, NULL);
case WM_TIMER:
if (wParam == 101) 
處理101事件


else if (wParam == 102)
處理102事件


break;
-----------------------------------------------------


SetTimer (hWnd, 101, 1000, MyTimerProc);
SetTimer (hWnd, 102, 1000, MyTimerProc);


void CALLBACK MyTimerProc (
HWND hWnd,
UINT uMsg,
UINT idEvent,
DWORD dwTime
)
{
if (idEvent == 101) {
處理101事件
}
else 
if (idEvent == 102) {
處理102事件
}
}


3)關閉定時器
BOOL KillTimer (
HWND hWnd, //窗口句柄
UINT nIDEvent //定時器ID
);


成功返回TRUE,失敗返回FALSE


KillTimer (hWnd, 101);
KillTimer (hWnd, 102);


二、菜單的分類
1.頂層菜單:窗口標題欄下方的菜單
2.彈出式菜單:單擊右鍵彈出菜單,下拉菜單
3.系統菜單:單擊窗口左上角圖標打開的菜單
二、菜單句柄和菜單標識
1.菜單對象(也是一種窗口), 通過菜單句柄加以標識 
2.菜單中每一個菜單項通過其唯一標識號 - 菜單ID - 加以區分


頂層菜單:
1.創建菜單
HMENU CreateMenu (void)
成功返回菜單句柄,失敗返回NULL
2.添加菜單項
1)追加菜單項
BOOL AppendMenu {
HMENU hMenu, //菜單句柄
UINT uFlags. //菜單項標誌
UINT uIDNewItem, //菜單項ID
LPCTSTR lpNewItem //菜單項名稱
);
成功返回TRUE,失敗返回FALSE
2)插入菜單項
BOOL InsertMenu (
HMWNU hMenu, //菜單句柄
UINT uPosition, //插入位置(在此菜單項之前插入(ID或位置))
UINT uFlags. //菜單項標誌
UINT uIDNewItem, //菜單項ID
LPCTSTR lpNewItem //菜單項名稱
);
成功返回TRUE,失敗返回FALSE


3)菜單項標誌 (uFlags)
MF_STRING - 點擊後發出WM_COMMAND消息,通過uIDNewItem的值區分具體哪個菜單項被點擊.
WM_POPUP - 可彈出子菜單,uIDNewItem參數爲子菜單的句柄
MF_SEPARATOR - 分割線, uIDNewItem和lpNewItem 參數被忽略
MF_CHECKED - 勾選
MF_UNCHECKED - 撤選
MF_ENABLED - 激活
MF_DISABLED - 禁用
MF_CRAYED - 禁用且置灰
MF_BITMAP - 位圖
MF_OWNERDRAW - 自繪
MF_BYCONMAND - uPosition 參數爲菜單項ID
MF_BYPOSITION - uPosition 參數爲菜單項位置


3.將菜單安裝到窗口上
BOOL SetMenu (
HWND hWnd, //窗口句柄
HMENU hMenu //菜單句柄
);
成功返回TRUE,失敗返回FALSE


4.菜單命令的處理.
WM_COMMAND - 命令消息
wParam - HIWORD (通知碼(控件)/0 (菜單)/1(加速鍵))
 LOWORD 控件/菜單/加速鍵的ID
LPARAM - 句柄(控件)/0(其他)


5.菜單項的狀態
激活/禁用/置灰態、選取/非選取態、


1)在添加的菜單項的時候設置初始狀態。
AppendMenu (hmenuWeb, MF_STRING | MF_CHECKED, IDM_WEB_ENABLED, "激活(&E)");
2)動態改變菜單項的狀態
1 改變菜單項的勾選狀態
DWORD Check (
HMENU hMenu, //菜單句柄
UINT uIDCheckItem, //菜單項ID (也可能位置)
UINT uCheck //勾選/撤選 (通過MF_BYCONMAND還是MF_BYPOSITION)
);
成功返回原來的勾選狀態。失敗返回-1
uCheck 取值
MF_CHECKED - 勾選
MF_UNCHECKED - 撤選
MF_BYCONMAND - uIDCheckItem爲菜單項ID
MF_BYPOSITION - uIDCheckItem爲菜單項位置


2 改變菜單項的可用狀態
DWORD EnableMenuItem (
HMENU hMenu, //菜單句柄
UINT uIDEnableItem, //菜單ID或位置
UINT uEnable //可用/禁用/置灰
);
uEnable 取值:
MF_ENABLED - 可用
MF_DISABLED - 禁用
MF_BYCOMMAND - uIDCheckItem參數爲菜單項ID
MF_BYPOSITION - uIDCheckItem參數爲菜單項位置


6.菜單的彈出初始化
WM_INITMENUPOPUP - 彈出式菜單被激活旦還未顯示,窗口過程函數會收到這個消息,在此消息中根據應用邏輯動態的對菜單項的狀態動態調整。
wParam - 彈出菜單的句柄
lParam - LOWORD 彈出菜單那在上層菜單中的索引,HIWORD 是否是窗口菜單。(頂層菜單和系統菜單)


四、系統菜單
1.獲取/恢復系統菜單
HMENU GetSystemMenu (
HWND hWnd, //句柄
BOOL bRevert //TRUE恢復系統菜單爲缺省狀態,FALSE獲取系統菜單
);
如果bRever = TRUE,返回NULL,
如果bRever = FALSE,返回系統菜單句柄
2.修改系統菜單
1)追加/插入菜單項
AppendMenu/InsertMenu
2)刪除菜單項
BOOL DeleteMenu (
HMENU hMenu, //菜單句柄
UINT uPosition //菜單項的ID或位置
UINT uFlags //按照ID刪除還是按位置刪
);
uFlags的取值:
MF_BYCOMMAND - 按菜單項ID刪除
MF_BYPOSITION - 按菜單項位置刪除


3)處理系統菜單
WM_SYSCOMMAND - 點擊系統菜單會觸發此消息。
wParam - 具體命令,如SC_CLOSE
lParam - 當前鼠標位置,LOWORD水平座標,HIWORD垂直座標




五、右鍵菜單(上下文菜單)
1.創建菜單
HMENU CreatePopupMenu (void);
成功返回菜單句柄,失敗返回NULL
2.增刪修改狀態與頂層菜單一樣
AppendMenu/InsertMenu/DeleteMenu/EnableMenuItem/CheckMenuItem
3.顯示菜單
BOOL TrackPopupMenu (
HMENU hMenu, //菜單句柄
UINT uFlags, //顯示方式
int x,
int y, //顯示位置
int nReserved, //保留
HWND hWnd, //處理菜單消息的窗口句柄
const RECT* prcRect //忽略
);
成功返回TRUE,失敗返回FALSE
uFlags取值:
TPM_LEFTALIGN \
TPM_CENTERALIGN  > 菜單顯示在鼠標光標的右,中,左
TPM_RIGHTALIGN /


TPM_TOPALIGN \
TPM_VCENTERALIGN  > 菜單顯示在鼠標光標的下中上
TPM+BOTTOMALIGN /


TPM_RETURNCMD - 函數返回所選菜單項ID或0(取消), 不會觸發菜單消息.


TPM_LEFTBUTTOM - 只能用鼠標左鍵選擇菜單項
TOM_RIGHTBUTTOM - 可以用左右兩個鍵選擇選擇菜單項


4.在收到WM_RBUTTONUP彈出右鍵菜單
WM_RBUTTONUP消息lParam參數中的鼠標位置座標是以窗口左上角爲座標原點,而
TrackPopupMenu函數所需要菜單位置是以屏幕左上角爲原點。


BOOL ClientToScreen (
HWND hWnd, //窗口句柄
LPPOINT lpPoint, //點結構體(輸入輸出)
);
成功返回TRUE,失敗返回FALSE




BOOL ScreenToClient (
HWND hWnd, //窗口句柄
LPPOINT lpPoint, //點結構體(輸入輸出)
);
成功返回TRUE,失敗返回FALSE











































































































































































































































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