修行中

「猫ゲー」で勉強。
5章まで読んできたが、さらに先に進む前にここらへんでサンプルコードを少し変えたりして理解を深めたい。とりあえず、練習のために作ってみたいものとしては、神経衰弱のようなものか。クリックすると絵が表れるような。さらにタスクを細かくすると、

  • 複数の絵を並べる方法
  • 絵をクリックすると他の絵に変わる方法

が必要になる。これらどうやったらいいのか、5章を読み直して考えたい。

今回は、2つの別の絵を並べてみた。なんとかできた。

以下、ソース。

// pictures.cpp

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);

char szClassName[] = "picutres";
HINSTANCE hInst;


int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
		   LPSTR lpsCmdLine, int nCmdShow)
{
  MSG msg;
  BOOL bRet;
	
  hInst = hCurInst;

  if (!InitApp(hCurInst))
    return FALSE;
  if (!InitInstance(hCurInst, nCmdShow)) 
    return FALSE;
  while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
    if (bRet == -1) {
      break;
    } else {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
  }
  return (int)msg.wParam;
}

ATOM InitApp(HINSTANCE hInst)
{
  WNDCLASSEX wc;
  wc.cbSize = sizeof(WNDCLASSEX);
  wc.style = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc = WndProc;
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hInstance = hInst;
  wc.hIcon = (HICON)LoadImage(NULL,
	MAKEINTRESOURCE(IDI_APPLICATION),
	IMAGE_ICON, 0, 0,
	LR_DEFAULTSIZE | LR_SHARED);
  wc.hCursor = (HCURSOR)LoadImage(NULL,
		MAKEINTRESOURCE(IDC_ARROW),
		IMAGE_CURSOR, 0, 0,
		LR_DEFAULTSIZE | LR_SHARED);
  wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  wc.lpszMenuName = NULL;
  wc.lpszClassName = (LPCSTR)szClassName;
  wc.hIconSm = (HICON)LoadImage(NULL,
		MAKEINTRESOURCE(IDI_APPLICATION),
		IMAGE_ICON, 0, 0,
		LR_DEFAULTSIZE | LR_SHARED);
  return (RegisterClassEx(&wc));
}

BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
  HWND hWnd;

  hWnd = CreateWindow(szClassName,
		"とりあえず複数の図を並べる",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL,
		NULL,
		hInst,
		NULL);
  if (!hWnd)
    return FALSE;
  ShowWindow(hWnd, nCmdShow);
  UpdateWindow(hWnd);
  return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
  int id, i, j;
  static int bmpw, bmph;
  static HDC hdc_p1, hdc_p2;
  static HBITMAP hBmp1, hBmp2;
  BITMAP bmp_info;
  HDC hdc;
  PAINTSTRUCT ps;
  RECT rc;

  switch (msg) {
    case WM_CREATE:
	hBmp1 = (HBITMAP)LoadImage(NULL,
		"Pic1.bmp",
		IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);			
	GetObject(hBmp1, (int)sizeof(bmp_info), &bmp_info);
	bmpw = bmp_info.bmWidth;
	bmph = bmp_info.bmHeight;
	hdc_p1 = CreateCompatibleDC(NULL);
	SelectObject(hdc_p1, hBmp1);

	hBmp2 = (HBITMAP)LoadImage(NULL,
		"Pic2.bmp",
		IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
	hdc_p2 = CreateCompatibleDC(NULL);
	SelectObject(hdc_p2, hBmp2);

	break;
  case WM_PAINT:
	GetClientRect(hWnd, &rc);
	hdc = BeginPaint(hWnd, &ps);
	BitBlt(hdc, 0, 0, bmpw, bmph, hdc_p1, 0, 0, SRCCOPY);
	BitBlt(hdc, bmpw, 0, bmpw, bmph, hdc_p2, 0, 0, SRCCOPY);
	EndPaint(hWnd, &ps);
	break;
  case WM_CLOSE:
	id = MessageBox(hWnd,
	  "終了してもよろしいですか",
	  "確認",
	  MB_YESNO | MB_ICONQUESTION);
	if (id == IDYES)
	  DestroyWindow(hWnd);
	break;
  case WM_DESTROY:
        DeleteObject(hBmp1);
    DeleteObject(hBmp2);
	DeleteDC(hdc_p1);
	DeleteDC(hdc_p2);
	PostQuitMessage(0);
	break;
  default:
	return (DefWindowProc(hWnd, msg, wp, lp));
  }
  return 0;
}