Mesoscopic Programming

タコさんプログラミング専門

ヌメロン製作講座第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()に渡している理由は、あとで出てくるコントロールを追加した際の画面のちらつきを予防するためです。
今回は以上です。

次回はグリッドクラスを作成します。