2012-07-20 3 views
0

이미지를 레이어 윈도우에 그리는 방법에 대한 많은 코드 샘플, 가이드 및 답변을 찾았습니다. 저는 순수한 HBITMAP S와 WIC 라이브러리를 사용하여 그려 보았습니다. 그리고 지금은 그리기 위해 GDI +를 사용하고 있습니다. (훨씬 더 간단하고 겉으로보기 쉽고, 지금까지는 많은 오류가 발생했습니다. WIC 코드가 잘못됨).C++ GDI + 레이어 된 이미지를 그리는 이미지가 작동하지 않습니다.

나는 현재 UpdateLayeredWindow에 머물러 있습니다. 내가 뭘하려고해도 나는 그것을 작동시킬 수 없다. 지금은 87, 또는 ERROR_INVALID_PARAMETER으로 돌아갑니다. 문제는 어느 것이 잘못 되었습니까? 나는 곤두박질 친다! 아래의 코드는 UpdateLayeredWindow이 작업을 거부한다는 사실 외의 해결책입니다.

내가 뭘 잘못하고 있니?

다음은 HDC/비트 맵 정보/그래픽 객체를 설정하는 코드입니다.

// Create DC 
_oGrphInf.canvasHDC = GetDC(_hwndWindow); 

// Create drawing 'canvas' 
_oGrphInf.lpBits = NULL; 
_oGrphInf.bmpCanvas = CreateDIBSection(_oGrphInf.canvasHDC, 
      &_oGrphInf.bmpWinInformation, DIB_RGB_COLORS, 
      &_oGrphInf.lpBits, NULL, 0); 

// Create graphics object 
_oGrphInf.graphics = new Gdiplus::Graphics(_oGrphInf.canvasHDC); 

위 작업은 정상적으로 작동하며 모든 포인터가 작동합니다.

그리고 여기에 PNG를 그립니다.

void Splash::DrawPNG(PNG* lpPNG, int x, int y) 
{ 
    LOGD("Drawing bitmap!"); 

    HDC hdcMem = CreateCompatibleDC(_oGrphInf.canvasHDC); 

    // Select 
    HBITMAP bmpOld = (HBITMAP)SelectObject(hdcMem, _oGrphInf.bmpCanvas); 

    Gdiplus::Color trans(0, 0, 0, 0); 
    _oGrphInf.graphics->Clear(trans); 

    _oGrphInf.graphics->DrawImage(lpPNG->GetImage(), x, y); 

    _oGrphInf.graphics->Flush(); 

    SIZE szSize = {_oGrphInf.bmpWinInformation.bmiHeader.biWidth, 
        _oGrphInf.bmpWinInformation.bmiHeader.biHeight}; 

    // Setup drawing location 
    POINT ptLoc = {0, 0}; 
    POINT ptSrc = {0, 0}; 

    // Set up alpha blending 
    BLENDFUNCTION blend = {0}; 
    blend.BlendOp = AC_SRC_OVER; 
    blend.SourceConstantAlpha = 255; 
    blend.AlphaFormat = AC_SRC_ALPHA; 
    blend.BlendFlags = 0; 

    // Update 
    if(UpdateLayeredWindow(_hwndWindow, _oGrphInf.canvasHDC, &ptLoc, 
           &szSize, hdcMem, &ptSrc, 
           (COLORREF)RGB(0, 0, 0), 
           &blend, ULW_ALPHA) == FALSE) 
     LOGE("Could not update layered window: %u", GetLastError()); 

    // Delete temp objects 
    SelectObject(hdcMem, bmpOld); 
    DeleteObject(hdcMem); 
    DeleteDC(hdcMem); 
} 

내 머리카락을 꺼내십시오. 도움?

EDIT : 잘못된 매개 변수 문제를 해결 한 UpdateLayeredWindow 함수에 대한 호출을 다시 작성하기로 결정했습니다. 여기에 내가 생각해 낸 것이있다. 그러나 여전히 작동하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 알파 정보가 그리기 작업에 보존하려면

UpdateLayeredWindow(_hwndWindow, _oGrphInf.canvasHDC, 
      NULL, NULL, hdcMem, &ptLoc, 
      RGB(0, 0, 0), &blend, ULW_ALPHA) 

답변

1

, 당신은 당신의 그래픽이 메모리 백업 비트 맵 객체가 아닌 HDC를 기반으로 객체 수 있도록해야하고, 물론 당신의 비트 맵은과 형식에 있어야 알파 채널.

당신이 비트 맵 생성자를 사용해야합니다 :

http://msdn.microsoft.com/en-us/library/ms536315%28v=vs.85%29.aspx 그냥주는 그 영의 보폭, 당신의 DIB의 비트와 PixelFormat32bppPARGB에 대한 포인터.

그런 다음 Graphics :: FromImage를 사용하여 Graphics 객체를 만듭니다.

저는 UpdateLayeredWindow를 사용한 적이 없으므로 그 부분이 올바른지 확인할 수 없습니다.

+0

또한 계층화 된 창의 크기가 이미지를 표시 할만큼 커야하므로 이미지를 (0,0)으로 그려야합니다. 또는 훨씬 간단하게, 그래픽 개체를 완전히 건너 뛰고 사용자 입력 버퍼와 함께 Bitmap :: Lock을 사용하여 비트 맵의 ​​비트를 dib 섹션으로 복사하십시오. –

관련 문제