이미지를 레이어 윈도우에 그리는 방법에 대한 많은 코드 샘플, 가이드 및 답변을 찾았습니다. 저는 순수한 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)
또한 계층화 된 창의 크기가 이미지를 표시 할만큼 커야하므로 이미지를 (0,0)으로 그려야합니다. 또는 훨씬 간단하게, 그래픽 개체를 완전히 건너 뛰고 사용자 입력 버퍼와 함께 Bitmap :: Lock을 사용하여 비트 맵의 비트를 dib 섹션으로 복사하십시오. –