// ■市松模様を立体に見せる
//   太線部分を谷折にして、図形のない部分を裏側に貼り付ける

#include "myWin.h"
#include "math.h"
#define MAXC 6
static HDC hbuf; static HBITMAP hBM;
int startX=0;
void clearBitmap(){
	SelectObject(hbuf,GetStockObject(NULL_PEN));
	PatBlt(hbuf,0,0,1000,1000,WHITENESS);
}
void initBitMap(HWND hw){// ビットマップ作成とメモリデバイスコンテキスト作成
	HDC hdc=GetDC(hw); hBM=CreateCompatibleBitmap(hdc,1000,1000);
	hbuf=CreateCompatibleDC(hdc);SelectObject(hbuf,hBM);
	clearBitmap();
	ReleaseDC(hw, hdc);
}
void drawIchimatsu(int ifl, int DX, int DY, int X[MAXC+1][MAXC+1], int Y[MAXC+1][MAXC+1],
	int C1, int C2){
	HPEN pen[2]; HBRUSH brush[2];
	pen[0] = CreatePen(PS_SOLID,1,0x777777); brush[0] = CreateSolidBrush(C2);
	pen[1] = CreatePen(PS_SOLID,1,0x777777); brush[1] = CreateSolidBrush(C1);		
	int XST=210,YST=200; POINT P[4];
	for(int k1=0;k1<MAXC;k1++){
		ifl=1-ifl; 
		if(k1 %2) XST=XST+startX;
		for(int k2=0;k2<MAXC;k2++){
			ifl=1-ifl;
			SelectObject(hbuf,pen[ifl]); SelectObject(hbuf,brush[ifl]);
			P[0].x=XST+DX*X[k1  ][k2  ]; P[0].y=YST+DY*Y[k1  ][k2  ];
			P[1].x=XST+DX*X[k1+1][k2  ]; P[1].y=YST+DY*Y[k1+1][k2  ];
			P[2].x=XST+DX*X[k1+1][k2+1]; P[2].y=YST+DY*Y[k1+1][k2+1];
			P[3].x=XST+DX*X[k1  ][k2+1]; P[3].y=YST+DY*Y[k1  ][k2+1];
			Polygon(hbuf,P,4);
		}
	}
	DeleteObject(pen[0]);DeleteObject(brush[0]);
    DeleteObject(pen[1]);DeleteObject(brush[1]);
}
void drawLine(int X1, int Y1, int X2, int Y2){
	HPEN pen= CreatePen(PS_SOLID,2,0); SelectObject(hbuf,pen);
	MoveToEx(hbuf,X1,Y1,NULL);LineTo(hbuf, X2,Y2);
}
void Draw(){
	int X[MAXC+1][MAXC+1],Y[MAXC+1][MAXC+1], DD=30;
	for(int j=0;j<=MAXC;j++,DD--){
		X[j][0]=0; Y[0][j]=0;
		for(int i=1;i<=MAXC;i++){
			X[j][i]=X[j][i-1]+DD;
			Y[i][j]=Y[i-1][j]+DD;
		}
	}
	clearBitmap();
	drawIchimatsu(1, 1, 1,   X,Y,0xFF0000, 0x77FFFF);
	drawIchimatsu(0, -1, 1,  X,Y,0x0000FF, 0xFFFFEE);
	drawIchimatsu(1, -1, -1, X,Y,0x005500, 0xFFCCFF);
	drawLine(0,200,440,200);
	drawLine(210,0,210,400);
}
void procLButtonDown(HWND hw, WPARAM wp, LPARAM lp){
	startX--;Draw();
	InvalidateRect(hw,NULL,FALSE);
}
void procRButtonDown(HWND hw, WPARAM wp, LPARAM lp){
	startX++;Draw();
	InvalidateRect(hw,NULL,FALSE);
}
void procCreate(HWND hw, WPARAM wp, LPARAM lp){
	SetWindowText(hw,TEXT("立方体に見せる市松模様"));
	MoveWindow(hw,0,0,440,440,true);
	initBitMap(hw);Draw();
	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_LBUTTONDOWN  : procLButtonDown(hw,wp,lp); return 0;
	case WM_RBUTTONDOWN  : procRButtonDown(hw,wp,lp); return 0;
	case WM_PAINT        : procPaint (hw, wp, lp)   ; return 0;
	}
	return DefWindowProc(hw, msg, wp, lp);
}