-1

私は一日中 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ファイルに何か問題があるのではないかと思っています...誰か助けてくれますか?

4

1 に答える 1

0

dcWindowウィンドウではなく、画面のデバイス コンテキストにする必要があります。したがって、次のように初期化します。dcWindow->Attach(::GetDC(NULL))代わりにdcWindow = GetWindowDC();

于 2012-09-22T13:43:59.760 に答える