ヌメロン製作講座第4回:ペイントメッセージに対応する
まだまだ暑い日が続きますね。
それではペイントしましょう。
main.h
~前略~ const COLORREF black = RGB( 0, 0, 0 ); const COLORREF white = RGB( 255, 255, 255 ); const COLORREF gray = RGB( 160, 160, 160 ); const COLORREF darkGray = RGB( 128, 128, 128 ); const COLORREF lightGray = RGB( 212, 208, 200 ); const COLORREF darkGray2 = RGB( 64, 64, 64 ); const COLORREF lightGray2 = RGB( 224, 220, 212 ); class Application : public Window { public : static const SHORT wndWidth = 640; static const SHORT wndHeight = 480; static LPCTSTR className; static ACCEL accels[ MAX_ACCEL ]; HACCEL hAccel; HDC hdc; HBRUSH hbrBlack; HBRUSH hbrWhite; HBRUSH hbrDarkGray; HBRUSH hbrLightGray; HBRUSH hbrDarkGray2; HBRUSH hbrLightGray2; HPEN hpenDot; HPEN hpenDarkGray; HPEN hpenWhite; BOOL Init( HINSTANCE hInstance, int nCmdShow ); VOID Run(); VOID Draw( HDC hdc = NULL ); VOID DrawSeparator( int y ); VOID OnDestroy(); VOID OnCommand(); VOID OnPaint(); VOID OnFileNew(); VOID OnFileOpen(); VOID OnFileSave(); VOID OnAppExit(); VOID OnAppAbout(); VOID OnSwitchMode(); VOID OnSwitchAnal(); VOID OnSwitchSecret(); VOID OnClearRecord(); }; ~後略~
main.cpp
~前略~ BOOL Application :: Init( HINSTANCE hInstance, int nCmdShow ) { WNDCLASSEX wcx; HWND hWnd; HMENU hMenu; HMENU hSubMenu; LOGBRUSH logBrush = { BS_SOLID, black, 0 }; DWORD style[] = { 1, 1 }; ~中略~ hAccel = CreateAcceleratorTable( accels, MAX_ACCEL ); hbrBlack = CreateSolidBrush( black ); hbrWhite = CreateSolidBrush( white ); hbrDarkGray = CreateSolidBrush( darkGray ); hbrLightGray = CreateSolidBrush( lightGray ); hbrDarkGray2 = CreateSolidBrush( darkGray2 ); hbrLightGray2 = CreateSolidBrush( lightGray2 ); hpenDot = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_USERSTYLE, 1, & logBrush, 2, style ); hpenDarkGray = CreatePen( PS_SOLID, 1, darkGray ); hpenWhite = CreatePen( PS_SOLID, 1, white ); ShowWindow( hWnd, nCmdShow ); UpdateWindow( hWnd ); return TRUE; } VOID Application :: Run() { MSG msg; while ( GetMessage( & msg, NULL, 0, 0 ) ) { if ( TranslateAccelerator( hwnd, hAccel, & msg ) == 0 ) { TranslateMessage( & msg ); DispatchMessage( & msg ); } } DeleteObject( hpenWhite ); DeleteObject( hpenDarkGray ); DeleteObject( hpenDot ); DeleteObject( hbrLightGray2 ); DeleteObject( hbrDarkGray2 ); DeleteObject( hbrLightGray ); DeleteObject( hbrDarkGray ); DeleteObject( hbrWhite ); DeleteObject( hbrBlack ); DestroyAcceleratorTable( hAccel ); } VOID Application :: Draw( HDC hdc ) { HDC hdc0 = hdc; if( hdc0 == NULL ) { hdc = GetDC( hwnd ); } this->hdc = hdc; DrawSeparator( 0 ); // ここで本体を描画する予定 { RECT rc; GetClientRect( hwnd, & rc ); SetBkMode( hdc, TRANSPARENT ); DrawText( hdc, _T( "工事中です" ), -1, & rc, DT_SINGLELINE | DT_VCENTER | DT_CENTER ); } if ( hdc0 == NULL ) { ReleaseDC( hwnd, hdc ); ValidateRect( hwnd, NULL ); } } VOID Application :: DrawSeparator( int y ) { RECT rc; GetClientRect( hwnd, & rc ); SelectObject( hdc, hpenDarkGray ); MoveToEx( hdc, 0, y, NULL ); LineTo( hdc, rc.right, y ); SelectObject( hdc, hpenWhite ); MoveToEx( hdc, 0, y + 1, NULL ); LineTo( hdc, rc.right, y + 1 ); } VOID Application :: OnPaint() { PAINTSTRUCT ps; hdc = BeginPaint( hwnd, & ps ); Draw( hdc ); EndPaint( hwnd, & ps ); lresult = 0; } ~後略~
OnPaint()で直接描かずにDraw()に渡している理由は、あとで出てくるコントロールを追加した際の画面のちらつきを予防するためです。
今回は以上です。
次回はグリッドクラスを作成します。