// ■フラクタルな市松模様

#include "myWin.h"
#include "math.h"
static HDC hbuf; static HBITMAP hBM;
double PI=3.14159265358979;
double dPI=PI/16;
int CTab1[]={0x000077,0x000000,0x002200, 0x005555, 0x000077, 0x0000FF, 0xFF0000, 0x000000};
int CTab2[]={0xFF77FF,0xFFFFFF,0xFF55FF, 0x77FFFF, 0xFFFF00, 0x77FFFF, 0xFFFFFF, 0x77FFFF};
void initBitMap(HWND hw){// ビットマップ作成とメモリデバイスコンテキスト作成
	HDC hdc=GetDC(hw); hBM=CreateCompatibleBitmap(hdc,1000,1000);
	hbuf=CreateCompatibleDC(hdc);SelectObject(hbuf,hBM);
	SelectObject(hbuf,GetStockObject(NULL_PEN));
	PatBlt(hbuf,0,0,1000,1000,WHITENESS);
	ReleaseDC(hw, hdc);
}
void Draw(int ID, int ST,int X, int Y){
	int XX, YY;
	if(ID==1){
		HPEN p1=CreatePen(PS_SOLID,1,CTab1[ST]); HBRUSH b1 = CreateSolidBrush(CTab1[ST]);
		HPEN p2=CreatePen(PS_SOLID,1,CTab2[ST]); HBRUSH b2 = CreateSolidBrush(CTab2[ST]);
		YY=Y+20;
		for(int i=0;i<4;i++, YY+=4){
			XX=X+30;
			for(int j=0;j<4;j++, XX+=4){
				if((i+j) %2 ){ SelectObject(hbuf,p2); SelectObject(hbuf,b2);}
				else         { SelectObject(hbuf,p1); SelectObject(hbuf,b1);}
				Rectangle(hbuf, XX, YY, XX + 4,YY + 4);
			}
		}
		DeleteObject(p1);DeleteObject(b1);DeleteObject(p2);DeleteObject(b2);
		return;
	}
	int IDD=ID / 2, XD=IDD*16, YD=IDD*16,C;
	YY=Y;
	for(int i=0;i<4;i++,YY+=YD){
		XX=X;
		for(int j=0;j<4;j++,XX+=XD){
			C=0;if( (i+j) % 2) C = IDD;
			Draw(IDD, ST+C,XX,YY);
		}
	}
}
void procCreate(HWND hw, WPARAM wp, LPARAM lp){
	SetWindowText(hw,TEXT("フラクタルな市松模様"));
	MoveWindow(hw,0,0,430,430,true);
	initBitMap(hw);Draw(8, 0, 0,0);
	InvalidateRect(hw,NULL,FALSE);
}
void procPaint(HWND hw, WPARAM wp, LPARAM lp){// ビットマップを画面に表示
	PAINTSTRUCT ps; HDC hdc=BeginPaint(hw, &ps);
	BitBlt(hdc,0,0,1000,1000,hbuf,0,0,SRCCOPY);
	EndPaint(hw,&ps);
}
LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp, LPARAM lp){
	switch(msg){
	case WM_DESTROY : PostQuitMessage(0)    ; return 0;
	case WM_CREATE  : procCreate(hw,wp,lp)  ; return 0;
	case WM_PAINT   : procPaint (hw, wp, lp); return 0;
	}
	return DefWindowProc(hw, msg, wp, lp);
}