怎样创建一个透明的子窗口,使用createwindow和win32.使用createwindow创建了一个大的父窗口,在这个大的窗口上,我又想创建另一个小的子窗口,但想把子窗口设置为透明,这样显示数据的时候就可以利用到父窗口的背景色了。请问这样的窗口有做过的吗?

解决方案 »

  1.   

    重载onpaint,不进行背景清屏,只画数据。
      

  2.   

    改变窗口的透明度。将窗口样式设置为WS_EX_LAYERED,并调用SetLayeredWindowAttributes函数来改变窗口的透明度。WS_EX_LAYERED可能没定义,我们可以直接取值0x80000。
    //加入WS_EX_LAYERED扩展属性
    SetWindowLong(m_hWnd,GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
    BOOL SetLayeredWindowAttributes(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags);
    hwnd是要改变的窗口,当dwFlags为LWA_ALPHA(0x2)时,crKey参数没用,bAlpha为透明度,取值在0~255之间。该函数要从User.dll中载入。
    //更新窗口透明度的代码,其中iTransparent为透明度。
    void CFloatWnd::OnUpdateTransparent(int iTransparent)
    {
      HINSTANCE hInst = LoadLibrary("User32.DLL");
      if(hInst)
      {
        typedef BOOL (WINAPI *SLWA)(HWND,COLORREF,BYTE,DWORD);
        SLWA pFun = NULL;
        //取得SetLayeredWindowAttributes函数指针
        pFun = (SLWA)GetProcAddress(hInst,"SetLayeredWindowAttributes");
        if(pFun)
        {
          pFun(m_hWnd,0,iTransparent,2);
        }
        FreeLibrary(hInst);
      }
    }
    详见:http://www.itwis.com/html/c/ctool/20080815/2168.html
      

  3.   

    The window is a layered window. Note that this cannot be used for child windows. Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC. 
    http://msdn.microsoft.com/en-us/library/ff700543(v=VS.85).aspx
    子窗口不可以用WS_EX_LAYERED,再清楚不过了。