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);
想知道作用而不是运算后的结果
但其实这种写法是错误的,为什么这样说呢,因为^运算符的含义是按位异或的意思,与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函数疑问
GetWindowLong()和SetWindowLong()的问题