2013-07-20 5 views
2

Я работаю над заставкой для простой игры Direct3D, и хотя сам экран создан и уничтожен правильно, то BITMAP, предназначенный для проецирования на заставку, не появляется. У меня это до сих пор:BitBlt растровое изображение на заставке

//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); 

Действительно, единственный важный код SplashProc обработки WM_PAINT сообщения. Растровое изображение bm загружается отлично, показывая размеры 900x600 окна (то же, что и splash.bmp). Тем не менее, это окно - это просто черный экран, а не лицо героини, содержащееся в splash.bmp xD

+0

Головки вверх: я испортил выделение кода. wc.lpfnWndProc уже не DefWindowProc ... – Pere5

ответ

1

Это один из тех, где вы почти наверняка устарели от кода, так что вы пропустили очевидное.

Вы создаете hdcMem, а затем сразу BitBlt Вход в заставку. Между тем вы, несомненно, хотите, чтобы SelectObject выбрал ваш растровый рисунок в 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); 
+0

Извините, я до сих пор избегаю GDI ... Какова цель создания 'oldBmp'? Не могу ли я просто использовать splashBMP в SelectObject? – Pere5

+0

Вы должны восстановить DC в «нетронутое» состояние (т. Е. Ни один из ваших «вещей», выбранных в него), прежде чем вы удалите его. Для этого вы сохраняете исходное растровое изображение и выбираете его обратно в DC, прежде чем уничтожать DC. Я не уверен, насколько сильно это имеет значение, но это то, что Microsoft говорит, что вы должны делать. –

Смежные вопросы