// ■市松模様を立体に見せる // 太線部分を谷折にして、図形のない部分を裏側に貼り付ける #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); }