一、窗口非客户区的鼠标消息
1.WM_NCMOUSEMOVE 鼠标移动
鼠标左键
WM_NCLBUTTONDOWN 按下
WM_NCLBUTTONUP 松开
WM_NCLBUTTONDBLCLK 双击
鼠标右键
WM_NCRBUTTONDOWN 按下
WM_NCRBUTTONUP 松开
WM_NCRBUTTONDBLCLK 双击
鼠标中键
WN_NCMBUTTONDOWN 按下
WM_NCMBUTTONUP 松开
WM_NCMBUTTONDBLCLK 双击
二.WM_NCHITTEST消息
1.是操作系统发给鼠标下面的窗口,以便确定鼠标是在窗口的哪个部分
上面,所有的窗口鼠标消息产生之前都是要先响应该消息,该消息由默认
窗口消息处理程序处理,返回值提示鼠标所在区域
HTCAPTION 在非客户区标题栏上
HTCLIENT 客户区
HTCLOSE 在关闭按钮上
HTHELP 非客户区帮助按钮
HTMAXBUTTON 最大化按钮
HTMINBUTTON 最小化按钮
HTTRANSPARENT 鼠标穿过窗口
...
2.滚轮消息 WM_MOUSEWHEEL
它表示鼠标被滚动的消息,这个消息不限于客户区,也不限于非客户区
WPARAM参数 低16位表示哪个键被按下, 高16位表示滚动的距离
正值表示向前滚动,负值向后滚动.
LPARAM参数 低16客户区X坐标 高16位客户区Y坐标
三.SetWindowPos函数
1.改变窗口的位置,大小和Z-Order.并且可以设置窗口的显示状态
HWND hWnd 要改变位置,大小,或Z-Order的窗口
HWND hWndInsertAfter 窗口句柄 hWnd在Z-Order上将被置于他后面
int x,int y 窗口的位置
int cx,int cy 窗口大小
UINT uFlags操作标准
成功返回TRUE 失败返回FALSE
uFlags参数
SWP_NOSIZE 维持当前窗口大小.就是忽略cx和cy参数
SWP_NOMOVE 维持当前窗口的位置,也就是忽略X和Y参数
SWP_NOZORDER 不改变窗口Z-Order次序
SWP_NOOWNERZORDER 不改变Z序中所有者窗口位置
SWP_NOREDRAW 不重绘窗口
SWP_NOSENDCHANGING 不发送窗口位置改变消息
SWP_FRAMECHANGED 强制窗口标题栏以及边框重绘,即发送WM_NCPAINT消息
SWP_HIDEWINDOW 隐藏窗口
SWP_SHOWWINDOW 显示窗口
SWP_NOACTIVATE 不激活窗口
四.多个窗口同步移动的方法
BeginDeferWindowPos 返回用于存储多窗口位置和大小信息的句柄HWND
DeferWindowPos函数把指定窗口的新位置大小信息存储在句柄HDWP中
EndDeferWindowPos最好调用EndDeferWindowPos来同时更新之前存储好的多窗口位置大小
HDWP BeginDeferWindowPos(
int nNumWindos 村粗几个窗口的位置大小信息
) 返回值为多窗口的位置跟大小信息
DeferWindowPos(
HDWP hWinPosInfo,BeginDeferWindowPos返回的多窗口位置跟大小信息句柄
HWND hWnd, 要改变位置或大小信息的窗口
HWND hWndInsertAfter,
int x,int y, 窗口位置
int cx,int cy,窗口大小
UINT uFlags, //跟SetWindowPos的uFlags参数一样
)
EndDeferWindowPos(
HDWP hWinPosInfo eginDeferWindowPos返回的多窗口位置跟大小信息句柄
)
函数返回TRUE 成功,FALSE失败
五、菜单函数
1.HMENU WINAPI CreateMenu(VOID)
HMENU WINAPI CreatePopupMenu(VOID)
2.这两函数都返回了创建后的菜单的句柄.这两个函数的区别:
CreateMenu是创建水平菜单,通常是放置在顶级窗口中,
同时也是作为顶级菜单的,就行我们经常看到的"文件"
编辑,等菜单
6CreatePopupMenu创建的是一个垂直的弹出菜单,
经常被用来做另一个菜单的子菜单或者右键菜单
3.销毁菜单的函数 BOOL WINAPI DestoryMenu(HMENU hMenu)
4.添加菜单项
BOOL WINAPI AppendMenu(
HMENU hMenu, //要修改的菜单
UINT uFlag, //新菜单选项的状态信息,
MF_STRING 新建一个字符串菜单选项
MF_BITMAP 新建一个位图菜单选项
MF_POPUP 新选项为一个弹出式菜单
MF_CHECKED 新选项为一个已选中的菜单选项,即菜单选项前面有一个打钩
MF_DISABLED 新建一无法选中的菜单项,但外观不变灰
MF_GRAYED 新菜单选项无效,用户无法选中该选项, 且外观变灰
UINT_PTR uIDNewItem, //新菜单选项的命令ID
LPCWSTR lpNewItem //新菜单选项的内容,
如果是MF_BITMAP 则为位图的句柄,否则为显示在菜单项上的内容.
)
5.设置菜单项的前面是否要打钩
DWORD CheckMenuItem(
HMENU hMenu, //要设置的菜单句柄
UINT uIDCheckItem, 要设置的菜单项
要么是菜单的ID,要么是索引值,值类型取决于 uCheck
UINT uCheck
MF_BYCOMMAND 指明使用菜单项的ID
MF_BYPOSITION 指明菜单项使用索引值
MF_CHECKED: 为菜单添加打钩标志
MF_UNCHECKED 去除打钩标志
6.禁用一个菜单项
BOOL EnableMenuItem
参数1 hMenu 菜单句柄
参数2 和上面一样
参数3
MF_BYCOMMAND 指明使用菜单项的ID
MF_BYPOSITION 指明菜单项使用索引值
MF_DISABLED 设置菜单项禁用 但不变灰
MF_ENABLED 设置菜单项启用
MF_GRAYED 设置菜单项禁用,选项变灰
7.在指定位置显示一个弹出菜单
BOOL TrackPopupMenu
参数1 菜单句柄
参数2 uFlags 菜单属性
int x,int y,屏幕坐标系,菜单的左上角坐标
int nReserved,保留着 为0即可
HWND hWnd 此窗口接收菜单的消息
函数返回前,此窗口不接收菜单的WM_COMMAND消息
CONST RECT*prcRect 保留值 NULL即可
uFlag参数属性:
设置菜单的水平方向的定位
TPM_CENTERALIGN: 弹出的菜单中心位置与参数x对齐
TPM_LEFTALIGN: 弹出的菜单左边界位置与参数x对齐
TPM_RIGHTALIGN: 弹出的菜单右边界位置与参数x对齐
设置菜单的垂直方向定位
TPM_BOTTOMALIGN: 弹出的菜单底边界与参数y对齐
TPM_TOPALIGN: 弹出的菜单顶边界位置与参数y对齐
TPM_VCENTERALIGN: 弹出的菜单中心位置与参数y对齐
设置菜单是否向窗口发送消息
TPM_NONOTIFY 用户选择菜单项后 不发送消息给窗口
TPM_RETURNCMD 用户选择菜单后,直接把菜单项的ID返回到返回值里
设置用户要鼠标的哪个键来选择菜单
TPM_LEFTBUTTON 鼠标左键
TPM_RIGHTBUTTON 鼠标右键
六、广播消息
1.SendMessage 只能发送一个消息给一个窗口
如果要给多个窗口发送同一个消息的话,就要用到广播消息
2.把某个消息广播给指定的接收者,接收者可以是一个应用程序
网络驱动器,系统级设备驱动器,应用程序的顶级窗口
也能接收到广播消息,
3.广播消息的消息值 必须是系统中已经注册的消息值
所以是不能使用自定义消息的.
4.向Windows注册消息
UINT RegisterWindowMessage函数
注册一个新的窗口消息.保证该消息的值在体统范围内是唯一的
参数 LPCTSTR lpString 被注册的消息的名字
返回 被注册的消息值
5.广播系统已注册的消息
long BroadcastSystemMessage
(
DWORD flags 选项
BSF_QUERY 每次发送消息给一接收者,只有接收者返回TURE才发送给下一个接受者
BSF_NOHANG 把挂起的应用程序当成超时,有一个接受者超时,就停止广播
BSF_NOTIMEOUTINFOTHUNG 只要接收者没挂起,一直等待消息响应,不会出现超时
BSF_FORCEIFHUNG 继续广播消息,即使超时或者接受者挂起
BSF_POSTMESSAGE 寄送消息,不等待消息响应,直接返回
BSF_IGNORECURRENTTASK 不发送消息给属于当前任务的窗口,这样应用程序就不会接收自己的消息
LPDWORD lpInfo 指向接受者信息的DWORD指针 并可以为下列值组合
BSM_ALLCOMPONENTS 广播到所有的系统组件
BSM_ALLDESKTOPS 广播到所有桌面
BSM_APPLICATIONS 广播到应用程序
UINT Msg 消息ID
WPARAM wParam消息参数
LPARAM 消息参数
)
七、动态的将一个窗口嵌入到一个窗口
1.首先这个窗口样式一开始是Popup,
当你拖动这个窗口到要嵌入的窗口,然后你修改样式为WM_CHILD
2. 设置父窗口
HWND SetPaert(
参数1 hWndChild 指定的窗口新父窗口的子窗口
参数2 hWndNewParent 新父窗口
返回值 hWndChild之前的父窗口