画像をダブルクリックすると別の画像に

全く単純なことであるのだが、ダブルクリックすると別の画像が表示されるようにとりあえずできるようになった。難しい動作でないのに、素人には本当に難しい。「猫ゲー」のwipe02.cppを見て必死にやった。
この場合に、SetTimerを使うのは回りくどいような気がするが。

不完全ソースをメモしておく。後から修正を加える。

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	int id, i, j;
	int x, y;
	static int bmpw, bmph;
	static HDC hdc_p1, hdc_p2, hdc_p3, hdc_p4;
	static HDC hdc_p5, hdc_p6, hdc_p7, hdc_p8;
	static HBITMAP hBmp1, hBmp2, hBmp3, hBmp4;
	static HBITMAP hBmp5, hBmp6, hBmp7, hBmp8;
	BITMAP bmp_info;
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rc;
	static BOOL bTimer = FALSE;

	switch (msg) {
		case WM_CREATE:
			hBmp1 = (HBITMAP)LoadImage(NULL,
				"a1.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,
				"a2.bmp",
				IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
			hdc_p2 = CreateCompatibleDC(NULL);
			SelectObject(hdc_p2, hBmp2);

			hBmp3 = (HBITMAP)LoadImage(NULL,
				"a3.bmp",
				IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
			hdc_p3 = CreateCompatibleDC(NULL);
			SelectObject(hdc_p3, hBmp3);
			
			hBmp4 = (HBITMAP)LoadImage(NULL,
				"a4.bmp",
				IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
			hdc_p4 = CreateCompatibleDC(NULL);
			SelectObject(hdc_p4, hBmp4);

			hBmp5 = (HBITMAP)LoadImage(NULL,
				"a5.bmp",
				IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
			hdc_p5 = CreateCompatibleDC(NULL);
			SelectObject(hdc_p5, hBmp5);

			hBmp6 = (HBITMAP)LoadImage(NULL,
				"a6.bmp",
				IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
			hdc_p6 = CreateCompatibleDC(NULL);
			SelectObject(hdc_p6, hBmp6);

			hBmp7 = (HBITMAP)LoadImage(NULL,
				"a7.bmp",
				IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
			hdc_p7 = CreateCompatibleDC(NULL);
			SelectObject(hdc_p7, hBmp7);

			hBmp8 = (HBITMAP)LoadImage(NULL,
				"a8.bmp",
				IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
			hdc_p8 = CreateCompatibleDC(NULL);
			SelectObject(hdc_p8, hBmp8);
			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);
			BitBlt(hdc, 0, bmph, bmpw, bmph, hdc_p3, 0, 0, SRCCOPY);
			BitBlt(hdc, bmpw, bmph, bmpw, bmph, hdc_p4, 0, 0, SRCCOPY);
			EndPaint(hWnd, &ps);
			break;
		case WM_LBUTTONDBLCLK:
			SetTimer(hWnd, ID_MYTIMER, 2, NULL);
			bTimer = TRUE;
                        break;
		case WM_TIMER:
			if (wp != ID_MYTIMER)
				return DefWindowProc(hWnd, msg, wp, lp);
			BitBlt(hdc_p2, 0, 0, bmpw, bmph, hdc_p7, 0, 0, SRCCOPY);
			KillTimer(hWnd, ID_MYTIMER);
			bTimer = FALSE;
			InvalidateRect(hWnd, NULL, FALSE);
			break;