一、定时器消息
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
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