#include #include"Kinji_mitei.h" LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE,int); char szClassName[]="kinji_mitei"; int WINAPI WinMain(HINSTANCE hCurInst,HINSTANCE hPrevInst, LPSTR lpsCmdLine,int nCmdShow) { MSG msg; BOOL bRet; if(!InitApp(hCurInst)) return FALSE; if(!InitInstance(hCurInst,nCmdShow)) return FALSE; while((bRet=GetMessage(&msg,NULL,0,0))!=0){ if(bRet==-1){ MessageBox(NULL,"GetMessageエラー","Error",MB_OK); break; }else{ TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam; } ATOM InitApp(HINSTANCE hInst) { WNDCLASSEX wc; wc.cbSize=sizeof(WNDCLASSEX); wc.style=CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc=WndProc; wc.cbClsExtra=0; wc.cbWndExtra=0; wc.hInstance=hInst; wc.hIcon=(HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_SHARED); wc.hCursor=(HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE|LR_SHARED); wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName=NULL; wc.lpszClassName=(LPCTSTR)szClassName; wc.hIconSm=(HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_SHARED); return RegisterClassEx(&wc); } BOOL InitInstance(HINSTANCE hInst,int nCmdShow) { HWND hWnd; hWnd=CreateWindow(szClassName, "未定係数法による離散的データの最小2乗近似", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL); if(!hWnd) return FALSE; ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); return TRUE; } LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) { HDC hdc; PAINTSTRUCT ps; static kinji_m kin; int i,j,x,y; static int t[MAX],f[MAX],n,width,high; static BOOL paint[JISU+1],caution,info; static RECT rc; HPEN hPen,hOldPen; char nokori[64],control[32],text[16]; char *chui="座標が追加されました(再描画して下さい)"; char *setsumei="左クリック:座標追加\n右クリック:(再)描画 & 次数選択\nSPACE:クリア" "\n\n座標を設定してから次数を選択して描画して下さい" "\n次数は複数選択が可能です" "\n同じ次数を選択する度に設定が切り替わります" "\n\n近似式の次数:2乗誤差の総和" "\n\nウィンドウサイズ変更に対応しています"; switch(msg){ case WM_PAINT: hdc=BeginPaint(hWnd,&ps); SetTextColor(hdc,RGB(246,173,205)); wsprintf(nokori,"あと最大 %d 個の座標を追加できます",MAX-n); TextOut(hdc,0,0,nokori,(int)strlen(nokori)); if(info){ DrawText(hdc,(LPCTSTR)setsumei,-1,&rc,DT_RIGHT | DT_WORDBREAK); strcpy(control,"CONTROL:説明非表示"); }else strcpy(control,"CONTROL:説明表示"); TextOut(hdc,0,20,control,(int)strlen(control)); if(caution) DrawText(hdc,(LPCTSTR)chui,-1,&rc,DT_RIGHT | DT_BOTTOM | DT_SINGLELINE); for(j=0;j<=JISU;j++){ hPen=CreatePen(PS_SOLID,1,RGB(0,255,0)); hOldPen=(HPEN)SelectObject(hdc,hPen); Rectangle(hdc,10,high-10-30*(JISU-j)-20,10+20,high-10-30*(JISU-j)); DeleteObject(hPen); SelectObject(hdc,hOldPen); if(paint[j]) wsprintf(text,"%d次:%d",j,(int)kin.gosa(j)); else wsprintf(text,"%d次:UNDRAW",j); TextOut(hdc,35,high-10-30*(JISU-j)-20,text,(int)strlen(text)); } for(i=0;i=10 && x<=10+20 && y>=high-10-30*(JISU-j)-20 && y<=high-10-30*(JISU-j)) paint[j]=!paint[j]; caution=FALSE; InvalidateRect(hWnd,NULL,TRUE); break; case WM_KEYDOWN: switch(wp){ case VK_SPACE: n=0; for(j=0;j<=JISU;j++) paint[j]=FALSE; caution=FALSE; InvalidateRect(hWnd,NULL,TRUE); break; case VK_CONTROL: info=!info; InvalidateRect(hWnd,NULL,TRUE); break; } break; case WM_SIZE: width=LOWORD(lp); high=HIWORD(lp); rc.left=0; rc.top=0; rc.right=width; rc.bottom=high; break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd,msg,wp,lp); } return 0; }