문제가 있습니다 - 두 개의 png 파일을 하나씩 그릴 필요가 있습니다. 내가 보통의 방법으로 할 때, "깜박 거리는"효과가 있습니다 (첫 번째 이미지는 작은 시간 동안 두 번째 이미지를 오버 드로합니다). 나는 GDI + 라이브러리를 사용하여 내 WM_PAINT 처리는 다음과 같습니다오프 스크린 드로잉 GDI +
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, & ps);
displayImage(firstImage, hwnd);
displayImage(secondImage, hwnd);
EndPaint(hwnd, & ps);
break;
}
displayImage 기능 : 변수
void displayImage(HBITMAP mBmp, HWND mHwnd)
{
RECT myRect;
BITMAP bm;
HDC screenDC, memDC;
HBITMAP oldBmp;
BLENDFUNCTION bf;
GetObject(mBmp, sizeof(bm), &bm);
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 0xff;
bf.AlphaFormat = AC_SRC_ALPHA;
screenDC = GetDC(mHwnd);
GetClientRect(mHwnd, &myRect);
if (mBmp == NULL)
FillRect(screenDC, &myRect, WHITE_BRUSH);
else
{
memDC = CreateCompatibleDC(screenDC);
oldBmp = (HBITMAP)SelectObject(memDC, mBmp);
AlphaBlend (screenDC, 0, 0, myRect.right,myRect.bottom, memDC, 0, 0, bm.bmWidth,bm.bmHeight, bf);
SelectObject(memDC, oldBmp);
DeleteDC(memDC);
ReleaseDC(mHwnd, screenDC);
}
}
로드 파일 :
HBITMAP mLoadImg(WCHAR *szFilename)
{
HBITMAP result=NULL;
Gdiplus::Bitmap* bitmap = new Gdiplus::Bitmap(szFilename,false);
bitmap->GetHBITMAP(NULL, &result);
delete bitmap;
return result;
}
firstImage = mLoadImg(L"data\\img\\screen.png");
secondImage = mLoadImg(L"data\\img\\screen2.png");
나는이 작업을 수행해야한다고 들었어요 오프 스크린 드로잉. 어떻게 생겼어?
메모리 dc를 만들고 비트 맵을로드 한 다음 dc 창을 열고 memorydc를 매개 변수로 사용하여 bitblt를 호출하십시오. – jhbh
ReleaseDC는 'else' 절 외부에 있어야합니다. –
@jhbh :이 질문에 대해서는 언급하지 않습니다. 알파 블렌딩 두 개의 이미지를 요구합니다. – IInspectable