ホームに戻る
ビットマップ
// bitmap.rc
MYBMP BITMAP DISCARDABLE "a.bmp"
以上を書いた bitmap.rc とビットマップファイル a.bmp を用意しておく。
/*
* ビットマップファイルをリソースとして読み込むサンプル
*/
#include <windows.h>
// ウィンドウプロシージャの宣言(ウィンドウの動作を規定)
LRESULT CALLBACK WndProc(
HWND hwnd, //ウィンドウハンドル(void型ポインタ)
UINT message, //メッセージ識別番号(unsigned int)
WPARAM wParam, //(32ビットlong)
LPARAM lParam); //(32ビットlong)
//BITMAP構造体
//typedef struct BITMAP { // ビットマップ用構造体
// LONG bmType;
// LONG bmWidth;
// LONG bmHeight;
// LONG bmWidthBytes;
// WORD bmPlanes;
// WORD bmBitsPixel;
// LPVOID bmBits;
//}BITMAP;
//ビットマップ表示
void ShowBMP(HWND hwnd, HDC hdc);
//メイン関数
int APIENTRY WinMain(
HINSTANCE hInstance, //インスタンスのハンドル
HINSTANCE hPreInstance, //以前のインスタンスハンドル
LPSTR cmdLine, //コマンド行の文字列
int cmdShow) //ウィンドウの表示状態
{
//ウィンドウクラスの宣言
WNDCLASS wd;
//ウィンドウクラス名
char *wdName = "window00";
//ウィンドウ登録のためのループ
if (!hPreInstance) {
//ウィンドウスタイル
wd.style = CS_HREDRAW | CS_VREDRAW; //幅、高さの変化に対し再描画する
//ウィンドウプロシージャ
wd.lpfnWndProc = (WNDPROC)WndProc;
//クラスの予備のメモリ領域
wd.cbClsExtra = 0;
//ウィンドウの予備のメモリ領域
wd.cbWndExtra = 0;
//プログラムのインスタンスハンドル
wd.hInstance = hInstance;
//アイコンのハンドル
wd.hIcon = NULL;
//カーソルのハンドル
wd.hCursor = LoadCursor(NULL, IDC_ARROW);
//バックグラウンドのブラシのハンドル
wd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
//メニュー名
wd.lpszMenuName = NULL;
//クラス名
wd.lpszClassName = wdName;
//ウィンドウの登録(成功 非0、失敗 0)
if (!RegisterClass(&wd))
return FALSE;
}
//ウィンドウの生成(ハンドルを form00 とする)
HWND form00 = CreateWindowEx(
NULL, //拡張スタイル(なし)
wdName, //ウィンドウクラス名
"window", //ウィンドウの名前
WS_OVERLAPPEDWINDOW, //ウィンドウスタイル(オーバーラップ型)
CW_USEDEFAULT, //ウィンドウのX座標(ディフォルト)
CW_USEDEFAULT, //ウィンドウのY座標(ディフォルト)
80, //ウィンドウの幅(80に設定)
50, //ウィンドウの高さ(50に設定)
NULL, //親ウィンドウ(この場合自身が親)
NULL, //メニュー(なし)
hInstance, //プログラムのハンドル
NULL); //予備パラメータ
//ウィンドウの表示
ShowWindow(form00, cmdShow);
//ウィンドウの更新
UpdateWindow(form00);
//イベントのループ
MSG msg;
while (GetMessage(&msg, NULL, NULL, NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
// ウィンドウプロシージャ(ウィンドウの動作を規定)
LRESULT CALLBACK WndProc(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch (message) {
//ウィンドウを描画するとき処理
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
//ビットマップの表示
ShowBMP(hwnd, hdc);
EndPaint(hwnd, &ps);
}
break;
//ウィンドウを破壊する時の処理
case WM_DESTROY:
//メイン関数のループを終了
PostQuitMessage(0);
break;
//デフォルトの処理に対してデフォルトの処理を返す
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return NULL;
}
//ビットマップの表示
void ShowBMP(HWND hwnd, HDC hdc)
{
HDC hmdc;
HBITMAP hBitmap;
BITMAP bmp;
HINSTANCE hInst;
int BMP_Width, BMP_Height;
//ウィンドウのインスタンスを得る
hInst = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);
//ビットマップの読み込み
hBitmap = LoadBitmap(hInst, //インスタンス
"MYBMP"); //リソース中のビットマップ名
//オブジェクトをビットマップ構造体に入れる
GetObject(hBitmap,
sizeof(BITMAP),
&bmp);
//ビットマップの横、縦幅を各変数に入れる
BMP_Width = (int)bmp.bmWidth;
BMP_Height = (int)bmp.bmHeight;
//メモリデバイスのハンドル取得
hmdc = CreateCompatibleDC(hdc);
//オブジェクトの準備
SelectObject(hmdc, hBitmap);
//ビットマップの表示
BitBlt(hdc, //転送先のデバイスコンテキストハンドル
0, //転送先X座標
0, //転送先Y座標
BMP_Width, //転送先の幅
BMP_Height, //転送先の高さ
hmdc, //転送元のデバイスコンテキストハンドル
0, //転送元X座標
0, //転送元Y座標
SRCCOPY); //ラスターオペレーション
/*ストレッチビットマップの表示
BitBlt(hdc, //転送先のデバイスコンテキストハンドル
0, //転送先X座標
0, //転送先Y座標
BMP_Width, //転送先の幅
BMP_Height, //転送先の高さ
hmdc, //転送元のデバイスコンテキストハンドル
0, //転送元X座標
0, //転送元Y座標
BMP_Width, //転送元ビットマップの幅
BMP_Height, //転送元ビットマップの高さ
SRCCOPY); //ラスターオペレーション
*/
//背景の扱いを決定
//TRANSPARENT 背景は塗らない OPAQUE 背景色で塗る
SetBkMode(hdc, //デバイスコンテキストハンドル
TRANSPARENT); //背景の扱い(int型)
char *s = "bitmap";
TextOut(hdc, 0, 0, s, strlen(s));
DeleteDC(hmdc);
DeleteObject(hBitmap);
return;
}