// ■カラー画像をミックスして干渉縞を動かす #include "myWin.h" #include "math.h" static HDC hBuff[3]; //static HBITMAP hBM;//ビットマップ描画用 static HBITMAP hBM[3];//ビットマップ描画用 //static HBITMAP hBM2;//ビットマップ描画用 int Xstart=310, DX=-1; void genImage(){ COLORREF C; for(int i=0;i<300;i++)for(int j=0;j<300;j++){ if(i % 2) C=GetPixel(hBuff[1],i,j); else C=GetPixel(hBuff[2],i,j); SetPixel(hBuff[0],i,j,C); } } void procCreate(HWND hw, WPARAM wp, LPARAM lp){ MoveWindow(hw, 0,0,360,360,TRUE); HDC hdc=GetDC(hw); hBM[0]=CreateCompatibleBitmap(hdc,300,300); hBM[1]=LoadBitmap(hInstance,TEXT("pict1")); hBM[2]=LoadBitmap(hInstance,TEXT("pict2")); for(int i=0;i<3;i++){ hBuff[i]=CreateCompatibleDC(hdc);SelectObject(hBuff[i],hBM[i]); } SelectObject(hBuff[0], GetStockObject(NULL_PEN)); PatBlt(hBuff[0], 0,0,300,300,WHITENESS); ReleaseDC(hw, hdc); SetTimer(hw,1,300,NULL); genImage(); InvalidateRect(hw,NULL,TRUE); } void drawLine(int X1, int Y1, int Y); void procLButtonDown(HWND hw, WPARAM wp, LPARAM lp){ Xstart+=DX; 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){ if(Xstart>310)DX=-1; else if(Xstart<0) DX=1; Xstart+=DX; 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,10,NULL); LineTo(hdc,Xstart+i,310); } DeleteObject(pen); //DeleteDC(hbuf); EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp, LPARAM lp){ switch(msg){ case WM_DESTROY : for(int i=0;i<3;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); }