我使用SetLayeredWindowAttributes函数把窗口设置为半透明时,能看到效果,但是当我拖动窗口或在标题栏上单击左键后,窗口变为不透明,这是何故?我处理WM_NCLBUTTONUP消息时重新调用SetLayeredWindowAttributes也不见效果,我该怎么办?(编程环境:WinXP SP2/VC.net 2003/ATL 7.1/WTL 7.1)

解决方案 »

  1.   

    你把SetLayeredWindowAttributes函数,写在OnPaint函数里面试试。
      

  2.   

    SetLayeredWindowAttributes设置一次就可以了
      

  3.   

    我用WTL程序向导生成一个SDI EXE,添加代码如下
    atlSetLayeredWindowAttributes(m_hWnd, 0, 128, 2);inline BOOL atlSetLayeredWindowAttributes(
    HWND hwnd,           // handle to the layered window
    COLORREF crKey,      // specifies the color key
    BYTE bAlpha,         // value for the blend function
    DWORD dwFlags        // action
    )
    {
    if( AtlIsOldWindows() )
    return FALSE; BOOL bRes = FALSE;
    DWORD dwErrCode = 0; HINSTANCE hInst = LoadLibrary(_T("user32.dll"));
    if(hInst!=NULL)
    {
       // Get Layered Window functions
       typedef BOOL (WINAPI *SETLAYEREDWINDOWATTRIBUTES)(HWND, COLORREF, BYTE, DWORD);
    SETLAYEREDWINDOWATTRIBUTES pSetLayeredWindowAttributes = 
    (SETLAYEREDWINDOWATTRIBUTES)::GetProcAddress( hInst, "SetLayeredWindowAttributes");
    if( pSetLayeredWindowAttributes!=NULL )
    {
    // Set Extended Window Style WS_EX_LAYERED
    LONG nExStyle = ::GetWindowLong(hwnd, GWL_EXSTYLE);
    nExStyle |= WS_EX_LAYERED;
    ::SetWindowLong(hwnd, GWL_EXSTYLE, nExStyle); bRes = pSetLayeredWindowAttributes(hwnd, crKey, bAlpha, dwFlags);
    }
    if(!bRes)
    dwErrCode = ::GetLastError();
    FreeLibrary(hInst);
    }
    if(dwErrCode)
    ::SetLastError(dwErrCode);
    return bRes;
    }
      

  4.   

    to oyljerry:
    关键是当时有效果,但是当我拖动窗口或在标题栏上单击左键后,窗口变为不透明,这是何故?