具有禁用Aero的SetLayeredWindowAttributes

时间:2015-01-11 13:30:01

标签: c++ mfc aero

我有一个程序,在桌面上放置一个透明窗口,用户可以使用鼠标进行一些免费的手绘。只要启用了Aero,程序就可以正常工作但是当Aero被禁用时(在Windows 7上)它失败了 - 我无法绘制,鼠标也没有改变为我为窗口设置的鼠标形状。

代码看起来像这样(MFC):

//=============================================================================
//    PreCreateWindow
//-----------------------------------------------------------------------------
//    Public function to create the window based on global properties
//=============================================================================
BOOL CDrawWnd::PreCreateWindow(CREATESTRUCT& cs)
{
   HBRUSH   hBgBrush  = ::CreateSolidBrush(m_crBackgroundColor);
   HCURSOR  hcursor = NULL;
   if (m_uiCursor)
      hcursor = AfxGetApp()->LoadCursor(m_uiCursor);
   else if (m_Cursor)
       hcursor = AfxGetApp()->LoadStandardCursor(m_Cursor); // By default IDC_CROSS

    try
    {
        cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW, hcursor, hBgBrush);
    }
    catch(.../*CResourceException ex*/)
    {
        /*ex.ReportError();*/
      MessageBox(_T("AfxRegisterWndClass failed"));
    }

   return CWnd::PreCreateWindow(cs);
}


//=============================================================================
//    CreateWnd
//-----------------------------------------------------------------------------
//    Public function to create the window based on global properties
//=============================================================================
bool CDrawWnd::CreateWnd()
{
   CreateEx(WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TOOLWINDOW, _T("WsmLayeredWindowClass"), _T("Layered Draw Window"), WS_POPUP, m_StartWndRect, NULL, NULL, NULL);

   if (m_hWnd)
   {
      // Make this window transparent
      if (!SetLayeredWindowAttributes(m_crBackgroundColor, (255 * m_Transparency) / 100, LWA_COLORKEY))
      {
         TRACE(_T("\nSetLayeredWindowAttributes failed: 0x%lX"), GetLastError());
      }

      ShowWindow(SW_SHOW);

      GetWindowRect(&m_rDrawingSurface);

      return true;
  }

  return false;
} 

CDrawWnd派生自CWnd。调用CDrawWnd :: CreateWnd()来创建窗口。在它没有工作的情况下

SetLayeredWindowAttributes(m_crBackgroundColor, (255 * m_Transparency) / 100, LWA_COLORKEY)
即使GetLastError()返回0,

也会失败。

0 个答案:

没有答案