#include "myWin.h" #define BITX 500 #define BITY 500 static HDC hbuf; static HBITMAP hBM; void initBitMap(HWND hw){ HDC hdc=GetDC(hw); hBM=CreateCompatibleBitmap(hdc,BITX,BITY); hbuf=CreateCompatibleDC(hdc);SelectObject(hbuf,hBM); SelectObject(hbuf,GetStockObject(NULL_PEN)); ReleaseDC(hw, hdc); } void clearBitmap(){ PatBlt(hbuf,0,0,BITX,BITY,BLACKNESS); } double a, b, XS, YS; void initData(){a=1.5; b=0.25;XS=1; YS=1;} //全体表示用 double SCX=100, SCY=200, X0=220, Y0=200; //5倍表示用 //double SCX=500, SCY=1000, X0=-200, Y0=200; //10倍表示用 //double SCX=1000, SCY=2000, X0=-800, Y0=200; //40倍表示用 //double SCX=4000, SCY=8000, X0=-4400, Y0=300; int intX(double X) {return (int)(X * SCX +X0);} int intY(double X) {return (int)(Y0 - X * SCY);} void cmpIter(){ clearBitmap(); double X= XS,Y=YS, XN, YN,IX,IY ; for(int i=0;i<100000;i++){ XN=1-a*X*X+Y;YN=b*X; IX=intX(XN); IY=intY(YN); SetPixel(hbuf, intX(XN), intY(YN), 0xFFFFFF); X=XN; Y=YN; } } void procLButtonDown(HWND hw, WPARAM wp, LPARAM lp){ cmpIter(); InvalidateRect(hw,NULL,FALSE); } void procCreate(HWND hw, WPARAM wp, LPARAM lp){ MoveWindow(hw,0,0,BITX,BITY,NULL); SetWindowText(hw,TEXT("Henon Map")); initBitMap(hw); initData(); procLButtonDown(hw,wp,lp); } void procPaint(HWND hw, WPARAM wp, LPARAM lp){ PAINTSTRUCT ps; HDC hdc=BeginPaint(hw, &ps); BitBlt(hdc,0,0,BITX,BITY,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_PAINT : procPaint (hw, wp, lp); return 0; } return DefWindowProc(hw, msg, wp, lp); }