利用SetLayeredWindowAttribute()可以使窗口半透明,但是例程用的都是对话框。而我想脱离对话框模板,用纯代码让一个更通用的窗口实现半透明,该怎么做?
    试过直接实例化 CWnd,用了AfxRegisterWndClass()和CWnd::Create(),但是只能显示一个窗口的框架,中间部分是空的,而且框架也没有半透明效果。

解决方案 »

  1.   

    详细代码如下:
      CString szWnd=AfxRegisterWndClass(NULL);
      m_wnd.Create(szWnd,"bingo",WS_VISIBLE|WS_CAPTION|WS_SYSMENU
        |WS_OVERLAPPED,CRect(0,0,100,100),this,10006);
      SetWindowLong(m_wnd.GetSafeHwnd(),GWL_EXSTYLE,
        GetWindowLong(m_wnd.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(m_wnd.GetSafeHwnd(),0,192,2); 
        FreeLibrary(hInst); 
      }
    但是得到的窗口无法实现半透明,而是只有一个不透明的边框。我试过用对话框或者CFrameWnd都显示正常,不知道直接用 CWnd 还少做了什么事情。
      

  2.   

    我觉得还是你的句柄有问题
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;

    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
    TRACE0("Failed to create toolbar\n");
    return -1;      // fail to create
    } if (!m_wndStatusBar.Create(this) ||
    !m_wndStatusBar.SetIndicators(indicators,
      sizeof(indicators)/sizeof(UINT)))
    {
    TRACE0("Failed to create status bar\n");
    return -1;      // fail to create
    } // TODO: Delete these three lines if you don't want the toolbar to
    //  be dockable
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBar); 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,192,2); 
        FreeLibrary(hInst); 
      }
    return 0;
    }我用你的代码测试的  改动了句柄 其它的没有变 测试可以实现