Windows核心编程(4)-创新互联

一、窗口非客户区的鼠标消息

成都创新互联主要从事成都网站设计、成都做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务金凤,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108

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之前的父窗口

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网页标题:Windows核心编程(4)-创新互联
标题网址:http://azwzsj.com/article/dhhssp.html