ビットマップファイルを読み込んでメモリに描写し、それをBitBlt関数でウィンドウに表示するプログラムを作成したのですが、画像が読み込まれません。
何が不具合の原因でなのでしょうか。
ソースコードファイル名 : window.cpp
ビットマップファイル名 : brs.bmp
ビットマップファイルとソースコードファイルは同じフォルダに在ります。
OS : Windows Vista Home Premium
コンパイラー : Visual C++ 2008 Express Edition
#include <windows.h>
#define CLASS_NAME TEXT("Class name")
#define WINDOW_NAME TEXT("Window title")
#define FILE_NAME TEXT("brs.bmp")
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
HDC hdc;
PAINTSTRUCT ps;
static HDC hMemDC;
static HBITMAP hBitmap;
static BITMAP bitmap;
switch(uMsg) {
case WM_DESTROY:
DeleteDC(hMemDC);
DeleteObject(hBitmap);
PostQuitMessage(0);
break;
case WM_CREATE:
hdc = GetDC(hWnd);
hMemDC = CreateCompatibleDC(hdc);
ReleaseDC(hWnd, hdc);
hBitmap = (HBITMAP)LoadImage(NULL, FILE_NAME, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
SelectObject(hMemDC, hBitmap);
GetObject(hBitmap, sizeof(BITMAP), &bitmap);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hMemDC, 0, 0, SRCCOPY);
EndPaint(hWnd, &ps);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0; //禁止用語になってしまうため全角で書きます
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = CLASS_NAME;
if(!RegisterClass(&wc)) {
return 0;
}
RECT rect;
rect.left = 0;
rect.top = 0;
rect.right = 504;
rect.bottom = 358;
AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW | WS_CAPTION, FALSE);
if(CreateWindow(CLASS_NAME, WINDOW_NAME, WS_OVERLAPPEDWINDOW | WS_VISIBLE, 200, 200, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, hInstance, NULL) == NULL) {
return 0;
}
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0) {
DispatchMessage(&msg);
}
return msg.wParam;
}