MFC 下列函数 GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000为啥要和0x80000做运算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC 下列函数 GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000为啥要和0x80000做运算相关的知识,希望对你有一定的参考价值。

SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
想知道作用而不是运算后的结果

首先这种写法是让对话框透明时用到的,因为要使窗体拥有透明效果,则窗口必须有WS_EX_LAYERED扩展属性,而一般情况下窗口是不具有WS_EX_LAYERED属性的,所以要加上这个属性,WS_EX_LAYERED = 0x80000,所以才有了这样的写法。

但其实这种写法是错误的,为什么这样说呢,因为^运算符的含义是按位异或的意思,与0x80000异或就是第19位取反,其他位不变,也就是说当窗口没有WS_EX_LAYERED属性时给窗口加上WS_EX_LAYERED属性,而当窗口具有WS_EX_LAYERED属性时去掉WS_EX_LAYERED属性;显然这不是我们刚才提到的要使窗口透明就必须给窗口加上WS_EX_LAYERED属性的初衷。所以这种写法是错误的。这种写法来源于老的SDK程序,老的SDK中没有定义这个属性,所以使用^0x80000加上了这个属性。

正确的写法应写成:
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,\
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)|0x80000);//直接加上WS_EX_LAYERED属性
或者判断一下,当不具有WS_EX_LAYERED属性时再这样操作:
DWORD dwExStyle=GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE);
if((dwExStyle&0x80000)!=0x80000)
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,dwExStyle^0x80000);

另外如果你在VS2003以上版本的MFC里时可以不用这么麻烦,直接用下面两行代码就可以实现窗口透明的效果了:
ModifyStyleEx(0, WS_EX_LAYERED);//修改窗口属性为WS_EX_LAYERED
SetLayeredWindowAttributes(0, 192, LWA_ALPHA); //实现透明效果
参考技术A 14级的大师说的很清楚了

猎豹MFC--TH_双管道--对管道的操作就想对文件的操作一样

技术分享
使用双管道 给两个进程进行通信,不需要再开辟进程  效率高“反复使用一个进程进行通信
两个管道  四个句柄  ,
两个成员变量 两个局部变量”
修改单管道1的代码“
技术分享
技术分享

粘贴到构造函数中:
技术分享

粘贴到构造函数中后修改变量的名称:
技术分享

修改为如下:
技术分享

技术分享

技术分享

技术分享

上面选中的代码是执行命令时要使用的  粘贴到如下”
技术分享

把字符串szCmd提到全局变量 因为下文还有使用:
技术分享

关闭局部变量:
技术分享

类的成员变量要在析构函数中关闭:‘

技术分享
技术分享

先注释掉未写好的代码“:
技术分享

技术分享

取消注释 读输出管道技术分享

修改代码:”
技术分享
技术分享
技术分享

技术分享

修改Sleep时间:否则 会有读不到的情况出现
技术分享
技术分享

技术分享























































以上是关于MFC 下列函数 GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000为啥要和0x80000做运算的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 窗体函数GetWindowLong-获取指定窗口的信息

VC++ SetWindowLong/GetWindowLong函数疑问

listctrl控件怎么用?

GetWindowLong()和SetWindowLong()的问题

SetWindowLong()和 GetWindowLong() 使用解详

GetWindowLong 丢失字段数据