刘卫高的回答:0x开头的表示16位进制数,以此题为例转换成10进制的方法为 8*16^4+0*16^3+0*16^2+0*16^1+0*16^0=8*16^4=2^3+2^16=2^19; 周欣宇的回答:0x开头的表示16位进制数,以此题为例转换成10进制的方法为 8*16^4+0*16^3+0*16^2+0*16^1+0*16^0=8*16^4=2^3+2^16=2^19; 江湖艺人的回答:首先这种写法是让对话框透明时用到的,因为要使窗体拥有透明效果,则窗口必须有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); //实现透明效果 邓鸿的回答:0 这也来问 朝源的回答:0 |