在网上看到
//加入WS_EX_LAYERED扩展属性
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
HINSTANCE hInst = LoadLibrary("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,128,2);
FreeLibrary(hInst);
}
不过这个只是针对于对话框的。有没有针对于static 、button的呢?我试过将这段代码加入static 、button的重绘类中,都没有达到想要的效果。

解决方案 »

  1.   

    一个是将
    SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE, 
    GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000); 
    这里的句柄改为控件的句柄试试,通过this获取的句柄是对话框的不行
    二是自绘控件在具体的控件中使用上面的代码做主要是控件也是窗体,应该可以的
      

  2.   


    可能是我实现的地方不对吧。static 、button我都试过了。
    第一种方法比较麻烦,因为这个控件我想嵌入到另外一个Button或是static里面使用。通过鼠标移动,位置是可以变化的。
    如果不行,有没有利用pdc绘制半透明区域的方法?
      

  3.   

    我就是把这段代码放到控件类里面。
    无论是create onpain 里面都不行。
      

  4.   

    这种方法对WS_CHILD子窗口是无效的
      

  5.   

    采用控件子类化方法应该可行。具体方法比如Edit,可从CEDIT派生出一个MyEdit类出来,然后在这个类里重载相关函数,或许可行。
      

  6.   

    子控件没有自己的DC,这些Layer的设置对它们是无效的。
    基本上,想实现LZ的要求,只能自己画。
      

  7.   

    大家说得我都已经作过了,可能我说得不太明白,再细致的说一下:在自绘的static 或是button中的某个区域绘制一幅半透明的图像。 
    自绘的工作在提问的时候就已经作完了,但是不知道用什么方法来实现某个区域半透明。
      

  8.   

    GDI+支持alpha
    或者用AlphaBlend这个函数
      

  9.   

    GDI+可以比较简单实现图像的透明
      

  10.   

    不用gdi,有没有其他的函数能够实现半透明。