1.1 winapiを使ってbitmapを表示したい。
1.2 まずコマンドプロンプトでbitmapを表示するプログラムを作成した。
次にコマンドを打つのが面倒なのでvisualstudioを使っておなじことをやろうとした。
ソースは下記の通りです。
//コマンドプロンプト版
resource.rc
コード:
KITTY BITMAP "test.bmp"
main.cpp
コード:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
HDC hdc , hBuffer;
PAINTSTRUCT ps;
static HBITMAP hBitmap;
switch (msg) {
case WM_DESTROY:
DeleteObject(hBitmap);
PostQuitMessage(0);
return 0;
case WM_CREATE:
hBitmap = LoadBitmap(
((LPCREATESTRUCT)lp)->hInstance ,
TEXT("KITTY")
);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd , &ps);
hBuffer = CreateCompatibleDC(hdc);
SelectObject(hBuffer , hBitmap);
BitBlt(hdc , 0 , 0 , 400 , 120 , hBuffer , 70 , 80 , SRCCOPY);
DeleteDC(hBuffer);
EndPaint(hwnd , &ps);
return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateWindow(
TEXT("KITTY") , TEXT("Kitty on your lap") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL ,
hInstance , NULL
);
if (hwnd == NULL) return -1;
while(GetMessage(&msg , NULL , 0 , 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//visualstudio版
コード:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
HDC hdc , hBuffer;
PAINTSTRUCT ps;
static HBITMAP hBitmap;
switch (msg) {
case WM_DESTROY:
DeleteObject(hBitmap);
PostQuitMessage(0);
return 0;
case WM_CREATE:
hBitmap = LoadBitmap(
((LPCREATESTRUCT)lp)->hInstance ,
TEXT("リソースビューでリソースシンボルを見たときに表示されたもの")
);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd , &ps);
hBuffer = CreateCompatibleDC(hdc);
SelectObject(hBuffer , hBitmap);
BitBlt(hdc , 0 , 0 , 400 , 120 , hBuffer , 70 , 80 , SRCCOPY);
DeleteDC(hBuffer);
EndPaint(hwnd , &ps);
return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateWindow(
TEXT("KITTY") , TEXT("Kitty on your lap") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL ,
hInstance , NULL
);
if (hwnd == NULL) return -1;
while(GetMessage(&msg , NULL , 0 , 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
.rcはリソースの追加、.bmpはインポートを使った。
設定は特にいじってない。
上記のコードは
http://wisdom.sakura.ne.jp/system/winap ... in104.html
のコードをそのまま使いました。
1.3 画像が表示されずウィンドウだけになる。
1.4 visualstudioのリソースの使い方が分からない。公式のリファレンス
https://msdn.microsoft.com/ja-jp/library/7zxb70x7.aspx
を読んでもわからなかったので
より簡単な説明が知りたい。
2.1 OS:windows10
2.2 VC++ 2015community