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

解决方案 »

  1.   

    用下面的代码设置窗口透明度:
      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); 
    }
      

  2.   

    首先这种写法是让对话框透明时用到的,因为要使窗体拥有透明效果,则窗口必须有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); //实现透明效果 
      

  3.   

    非常感谢两位的拔刀相助,
    特别地感谢l_xiangxi的回答,你的武艺果然有效!!