BitBlt a bitmap onto a splash screen

帅比萌擦擦* 提交于 2021-02-08 03:32:15

问题


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 BitBlting 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!