// ■フラクタルな市松模様 #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); }