一个窗口透明相关的问题.

善古 2010-09-02 05:30:10
VC6.0 基于对话框程序:
因为我想模仿QQ调色板的透明滑动块,滑动时改变所有打开的窗口透明度.
所以我创建了一个滑动块,添加了NM_RELEASDCAPTURE消息处理函数...
接下来我该怎么做呢..


...全文
56 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
善古 2010-09-02
  • 打赏
  • 举报
回复
非常感谢两位的拔刀相助,
特别地感谢l_xiangxi的回答,你的武艺果然有效!!
l_xiangxi 2010-09-02
  • 打赏
  • 举报
回复
首先这种写法是让对话框透明时用到的,因为要使窗体拥有透明效果,则窗口必须有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); //实现透明效果

[Quote=引用 1 楼 jankyhu 的回复:]
用下面的代码设置窗口透明度:
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);

HINSTANCE hInst = LoadLibrary(_T("User32.DLL"));
if(hInst)
{
……
[/Quote]
善古 2010-09-02
  • 打赏
  • 举报
回复
试了,这个网上都是这么说的,切实可以对单个窗口设置透明度,
但是同时对多个窗口同时设置透明度我是这样做的:
向所有处于打开状态的窗口发送一个自定义消息,每个窗口响应后就是你这段代码..
但是出现:滑动一下滑块,显示透明,再滑动一下,就正常画面,再滑动一下又透明,如此循环,
我的百分比都是设置正确的..不知道是什么原因..不知道网上这段代码对刷新有没有什么影响...[Quote=引用 1 楼 jankyhu 的回复:]
用下面的代码设置窗口透明度:
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);

HINSTANCE hInst = LoadLibrary(_T("User32.DLL"));
if(hInst)
{
……
[/Quote]
WebIllusory 2010-09-02
  • 打赏
  • 举报
回复
用下面的代码设置窗口透明度:
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);

HINSTANCE hInst = LoadLibrary(_T("User32.DLL"));
if(hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
//取得SetLayeredWindowAttributes函数指针
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if(fun)fun(this->GetSafeHwnd(),0,(255*98)/100,2); //透明度
FreeLibrary(hInst);
}

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧