// ■4カラー画像をミックスして格子縞を動かす #include "myWin.h" #include "math.h" static HDC hBuff[5]; //ビットマップ描画用 static HBITMAP hBM[5];//ビットマップ描画用 int Xstart=12, Ystart=12, DX=-1,DY=-1, md=0; void genImage(){ COLORREF C; for(int i=0;i<300;i++)for(int j=0;j<300;j++){ if(i%2){ if(j % 2) C=GetPixel(hBuff[1],i,j); else C=GetPixel(hBuff[2],i,j); } else{ if(j % 2) C=GetPixel(hBuff[3],i,j); else C=GetPixel(hBuff[4],i,j); } SetPixel(hBuff[0],i,j,C); } } void procCreate(HWND hw, WPARAM wp, LPARAM lp){ TCHAR str[32]; MoveWindow(hw, 0,0,360,360,TRUE); HDC hdc=GetDC(hw); hBM[0]=CreateCompatibleBitmap(hdc,300,300); hBuff[0]=CreateCompatibleDC(hdc);SelectObject(hBuff[0],hBM[0]); SelectObject(hBuff[0], GetStockObject(NULL_PEN)); PatBlt(hBuff[0], 0,0,300,300,WHITENESS); for(int i=1;i<5;i++){ wsprintf(str,TEXT("pict%d"),i); hBM[i]=LoadBitmap(hInstance,str); hBuff[i]=CreateCompatibleDC(hdc);SelectObject(hBuff[i],hBM[i]); } ReleaseDC(hw, hdc); SetTimer(hw,1,300,NULL); genImage(); InvalidateRect(hw,NULL,TRUE); } void drawLine(int X1, int Y1, int Y); void procNext(){ md=1-md; if(md){ if(Xstart>14)DX=-1; else if(Xstart<6) DX=1; Xstart+=DX; }else{ if(Ystart>14)DY=-1; else if(Ystart<6) DY=1; Ystart+=DX; } } void procLButtonDown(HWND hw, WPARAM wp, LPARAM lp){ procNext(); InvalidateRect(hw,NULL,TRUE); } void procRButtonDown(HWND hw, WPARAM wp, LPARAM lp){ KillTimer(hw,1); Xstart-=DX; InvalidateRect(hw,NULL,TRUE); } void procTimer(HWND hw, WPARAM wp, LPARAM lp){ procNext(); InvalidateRect(hw,NULL,TRUE); } void procPaint(HWND hw, WPARAM wp, LPARAM lp){//ビットマップを画面に表示 PAINTSTRUCT ps; HDC hdc=BeginPaint(hw, &ps); BitBlt(hdc,10,10,600,300,hBuff[0],0,0,SRCCOPY); HPEN pen=CreatePen(PS_SOLID,1,0x00); SelectObject(hdc,pen); for(int i=0;i<300;i+=2) { MoveToEx(hdc,Xstart+i,Ystart,NULL); LineTo(hdc,Xstart+i,Ystart+300); MoveToEx(hdc,Xstart,Ystart+i,NULL); LineTo(hdc,Xstart+300,Ystart+i); } DeleteObject(pen); EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp, LPARAM lp){ switch(msg){ case WM_DESTROY : for(int i=0;i<5;i++){DeleteDC(hBuff[i]); DeleteObject(hBM[i]);} 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_TIMER : procTimer(hw, wp, lp); return 0; case WM_PAINT : procPaint (hw, wp, lp); return 0; } return DefWindowProc(hw, msg, wp, lp); }