问题
I am working on a splash screen for a simple Direct3D game and although the screen itself is created and destroyed properly, the BITMAP
meant to be projected onto the splash screen isn't showing up. I have this so far:
//variable declarations
HWND splashWindow = NULL;
BITMAP bm;
//window procedure
LRESULT WINAPI SplashProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(splashWindow, &ps);
HDC hdcMem = CreateCompatibleDC(hdc);
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
DeleteDC(hdcMem);
EndPaint(splashWindow, &ps);
}
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//initialize splash window settings
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_VREDRAW | CS_HREDRAW;
wc.lpfnWndProc = SplashProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "Splash Window";
wc.hIconSm = NULL;
RegisterClassEx(&wc);
//create and draw the splash window
HBITMAP splashBMP = (HBITMAP)LoadImage(hInstance, "assets\\textures\\splash.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
GetObject(splashBMP, sizeof(bm), &bm);
//^-splashBMP to bm - used here so the window has proper dimensions
splashWindow = CreateWindow("Splash Window", NULL,
WS_POPUPWINDOW | WS_EX_TOPMOST, CW_USEDEFAULT, CW_USEDEFAULT,
bm.bmWidth, bm.bmHeight, NULL, NULL, hInstance, NULL);
if (splashWindow == 0) return 0;
ShowWindow(splashWindow, nCmdShow);
UpdateWindow(splashWindow);
//after the game loads the splash screen is destroyed through DestroyWindow(splashWindow);
//and splashBMP is released by calling DeleteObject(splashBMP);
Really, the only important code is SplashProc
handling the WM_PAINT
message. The bitmap bm
is loading fine shown through the window's 900x600 dimensions (same as splash.bmp). However, that window is just a black screen instead of the herobrine face contained in splash.bmp xD
回答1:
This is one of those where you've almost certainly stared at the code so long you missed the obvious.
You're creating hdcMem
, and then immediately BitBlt
ing to the splash screen. Between those you undoubtedly want a SelectObject
to select your bitmap into hdcMem
.
PAINTSTRUCT ps;
HDC hdc = BeginPaint(splashWindow, &ps);
HDC hdcMem = CreateCompatibleDC(hdc);
// You need to add this
HBITMAP oldBmp = SelectObject(hdcMem, splashBMP);
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
// ...and this
SelectObject(hdcMem, OldBmp);
DeleteDC(hdcMem);
EndPaint(splashWindow, &ps);
来源:https://stackoverflow.com/questions/17762783/bitblt-a-bitmap-onto-a-splash-screen