【问题标题】:updatelayeredwindow not working更新分层窗口不起作用
【发布时间】:2012-07-26 20:55:27
【问题描述】:

我一整天都在尝试使用 UpdateLayeredWindow,但它失败了 :(,我将代码放在 OnCreate 中并使用 CImage 加载一个 png 文件(由 photoshop 创建)。

int CMainWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    SetWindowLong(this->m_hWnd, GWL_STYLE, 0);
    SetWindowLong(this->m_hWnd, GWL_EXSTYLE, 0);
    SetWindowLong(this->m_hWnd, GWL_EXSTYLE, GetWindowLong(this->m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
    this->SetMenu(NULL);
    ::SetWindowPos(this->m_hWnd, HWND_TOP, 50, 50, 652, 492, SWP_SHOWWINDOW);

    CBitmap imageBitmap, *oldBitmap;
    CDC *dcWindow, dcMem;
    CRect wRect;
    CPoint wPos;
    CSize wSize;
    HBITMAP hbmp;
    BLENDFUNCTION bFunc;

    m_Image.Load(_T("Img/BG_Blue.png"));
    GetWindowRect(&wRect);
    dcWindow = GetWindowDC();
    imageBitmap.CreateCompatibleBitmap(dcWindow, wRect.Width(), wRect.Height());
    dcMem.CreateCompatibleDC(dcWindow);
    oldBitmap = dcMem.SelectObject(&imageBitmap);
    m_Image.Draw(dcMem.m_hDC, 0, 0, wRect.Width(), wRect.Height(), 0, 0, wRect.Width(), wRect.Height());
    wPos.x = 0; wPos.y = 0;
    wSize.cx = wRect.left; wSize.cy = wRect.bottom;
    bFunc.SourceConstantAlpha = 125;
    bFunc.BlendFlags = 0;
    bFunc.BlendOp = AC_SRC_OVER;
    bFunc.AlphaFormat = AC_SRC_ALPHA;
    UpdateLayeredWindow(dcWindow, &wPos, &wSize, &dcMem, &wPos, 0, &bFunc, ULW_ALPHA);
    //BitBlt(dcWindow->m_hDC, 0, 0, wRect.Width(), wRect.Height(), dcMem.m_hDC, 0, 0, SRCCOPY);
    DWORD error = GetLastError();
    dcMem.SelectObject(oldBitmap);
    return 0;
}

函数返回 1 ,但屏幕上什么也没有出现,只有启动菜单上的一个图标指示程序正在运行。我想知道 png 文件是否有问题...有人可以帮忙吗?

【问题讨论】:

  • 删除前两个SetWindowLong。启用WS_EX_LAYERED 后调用SetLayeredWindowAttributes。查看 MSDN 以了解 SetLayeredWindowAttributes 的使用情况。
  • 感谢您的回复。我知道 SetLayeredWindoAttributes,它在这个程序中运行良好。但在这里我想做一些只能通过使用 UpdateLayeredWindow 来完成的每像素 alpha 操作
  • 不要在 OnCreate() 方法中绘制任何内容。窗口尚不可见。改为在 OnPaint() 中绘制。

标签: c++ png gdi


【解决方案1】:

dcWindow 应该是屏幕的设备上下文而不是窗口。所以像这样初始化它:dcWindow->Attach(::GetDC(NULL)) 而不是 dcWindow = GetWindowDC();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 2017-10-17
    • 2012-03-10
    • 2020-04-14
    相关资源
    最近更新 更多