ホームに戻る
 ビットマップ

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

inserted by FC2 system