第1章 画像表示 【リスト1-1】 このファイルに「myWin.h」というファイル名を付けて保存します。 #include LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp); HINSTANCE hInstance;WNDCLASS wndClass; BOOL initApp(HINSTANCE hCurI){ hInstance= hCurI; wndClass.style = CS_HREDRAW | CS_VREDRAW|CS_DBLCLKS; wndClass.lpfnWndProc = WndProc; wndClass.cbClsExtra = wndClass.cbWndExtra=0; wndClass.hInstance = hCurI; wndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION); wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndClass.lpszMenuName = NULL; wndClass.lpszClassName = TEXT("ClassName"); return RegisterClass(&wndClass); } HWND initInst(HINSTANCE hCurI){ HWND hw; hw=CreateWindow(TEXT("ClassName"),TEXT("Caption"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hCurI,NULL); return hw; } int WINAPI WinMain(HINSTANCE hCurI, HINSTANCE hPreI, PSTR lp, int cmd){ MSG msg; if(!initApp(hCurI)) return 0; if(initInst(hCurI)==NULL) return 0; while(GetMessage(&msg,NULL,0,0)){ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } 【リスト1-2】 最も簡単な図形表示プログラム #include "myWin.h" void procPaint(HWND hw, WPARAM wp,LPARAM lp){ PAINTSTRUCT ps; HDC hdc=BeginPaint(hw, &ps); MoveToEx(hdc, 10,10,NULL); // X=10,Y=10にペンを動かす LineTo(hdc,100,100); // X=100,Y=100まで線を引く EndPaint(hw,&ps); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ SetWindowText(hw,TEXT("簡単な描画その1"));//ウィンドウタイトル MoveWindow(hw,0,0,300,200,TRUE); //Windowを動かす } 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_PAINT : procPaint(hw,wp,lp) ; return 0; } return DefWindowProc(hw,msg,wp,lp); } 【リスト1-3】 ビットマップに描画して,再描画ではビットマップを表示 #include "myWin.h" static HDC hBuff; static HBITMAP hBM; void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){   SelectObject(hBuff,GetStockObject(NULL_PEN));//Bitmapクリア   PatBlt(hBuff,0,0,250,250,WHITENESS);   //標準のペンやブラシは定義されていないので指定する必要がある。   HPEN hpen=CreatePen(PS_SOLID,1,0xFF); SelectObject(hBuff, hpen);   MoveToEx(hBuff,10, 10, NULL); LineTo (hBuff,200,200);   DeleteObject(hpen);   InvalidateRect(hw,NULL,TRUE);//これを行うことでWM_PAINT発行 } void procPaint(HWND hw, WPARAM wp,LPARAM lp){   PAINTSTRUCT ps; HDC hdc=BeginPaint(hw, &ps);//ビットマップ表示   BitBlt(hdc,0,0,250,250,hBuff,0,0,SRCCOPY);   EndPaint(hw,&ps); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){   SetWindowText(hw,TEXT("簡単な描画その2"));//ビットマップ生成   MoveWindow(hw,0,0,250,250,TRUE);   HDC hdc=GetDC(hw); hBM=CreateCompatibleBitmap(hdc,250,250);   hBuff=CreateCompatibleDC(hdc);SelectObject(hBuff,hBM);   ReleaseDC(hw, hdc); } 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); } 【リスト1-4】 ビットマップの表示 #include "myWin.h" static HBITMAP hB; void procCreate(HWND hw, WPARAM wp,LPARAM lp){ hB=LoadBitmap(((LPCREATESTRUCT)lp)->hInstance, TEXT("suzume")); } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ PAINTSTRUCT ps; HDC hdc = BeginPaint(hw,&ps); HDC hBuff= CreateCompatibleDC(hdc); SelectObject(hBuff,hB); BitBlt(hdc,10,10,1000,600,hBuff,0,0,SRCCOPY); DeleteDC(hBuff); 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_PAINT : procPaint (hw,wp,lp); return 0; } return DefWindowProc(hw,msg,wp,lp); } 【リスト1-5】 点描画による直線の描画 void procPaint(HWND hw, WPARAM wp,LPARAM lp){ PAINTSTRUCT ps; HDC hdc=BeginPaint(hw, &ps); for(int i=0;i<100;i++) SetPixel(hdc,10+i,10,0xFF0000); 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_PAINT : procPaint (hw,wp,lp); return 0; } return DefWindowProc(hw,msg,wp,lp); } 【リスト1-5】 #include "myWin.h" #define XST 420 #define YST 10 static HBITMAP hBM[2];static HDC hBuff[2]; static BITMAP bM[2]; void clearBitmap(int i){ SelectObject(hBuff[i], GetStockObject(NULL_PEN)); PatBlt(hBuff[i], 0,0,400,400,BLACKNESS); } void createBitmap(HWND hw){ HDC hdc=GetDC(hw); for(int i=0;i<2;i++){ hBM[i]=CreateCompatibleBitmap(hdc,400,400); hBuff[i]=CreateCompatibleDC(hdc);SelectObject(hBuff[i], hBM[i]); } } void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ for(int i=0;i<400; i++) for(int j=0;j<400; j++){ int C=GetPixel(hBuff[1], i,j);SetPixel(hBuff[0], i,j, C); }//BitBltを使うべきだがGetPixelの例題としてあえてこう記述している。 InvalidateRect(hw,NULL,TRUE); } void procRButtonDown(HWND hw, WPARAM wp,LPARAM lp){ clearBitmap(0); InvalidateRect(hw,NULL,TRUE); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ createBitmap(hw);MoveWindow(hw,0,0,850,460,TRUE); hBM[1]=LoadBitmap(hInstance, TEXT("suzume")); GetObject(hBM[1],sizeof(BITMAP), &bM[1]); InvalidateRect(hw,NULL,TRUE); } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ PAINTSTRUCT ps; HDC hdc = BeginPaint(hw,&ps); SelectObject(hBuff[0],hBM[0]);SelectObject(hBuff[1],hBM[1]); BitBlt(hdc,10,YST,bM[1].bmWidth, bM[1].bmHeight, hBuff[0], 0,0,SRCCOPY); BitBlt(hdc,XST,YST,bM[1].bmWidth, bM[1].bmHeight, hBuff[1],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); }