プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

ドラッグ図形の描き方

2011年05月29日 08時16分00秒 | グラフィック関連

サンプル

//------------------------------------------------------------------------------
// 第11話 マウス処理で描こう
//==============================================================================
// 新規作成日:2011-05-28 (土) 07:00:00
// 最終更新日:2011-05-28 (土) 07:38:00
//------------------------------------------------------------------------------
#include <tchar.h>
#include <Windows.h>
#include <WindowsX.h>

//------------------------------------------------
// break付きのキーワード
//------------------------------------------------
#define CASE        break;case
#define DEFAULT     break;default

//------------------------------------------------
// このファイルで使用する関数
//------------------------------------------------
#define apiLoadImage(h,id,type,cast)    ((cast)LoadImage(h,MAKEINTRESOURCE(id),type,0,0,(LR_DEFAULTSIZE | LR_SHARED)))
#define apiLoadIcon(h,id)               apiLoadImage(h,id,IMAGE_ICON,HICON)
#define apiLoadCursor(h,id)             apiLoadImage(h,id,IMAGE_CURSOR,HCURSOR)

//------------------------------------------------
// 列挙定数(キャプチャ動作)
//------------------------------------------------
enum eCAPTURE {
    CAPTURE_NULL,               // キャプチャなし
    CAPTURE_START,              // キャプチャ開始
    CAPTURE_STOP,               // キャプチャ終了
};

//------------------------------------------------
// ウインドウ・プロシージャの関数
//------------------------------------------------
extern LRESULT CALLBACK mainWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    static POINT    po[ 2 ];
    static UINT     nCapture;
    
    switch ( uMsg ){
        CASE WM_CREATE:
            
        CASE WM_CLOSE:
            DestroyWindow( hWnd );
        CASE WM_DESTROY:
            PostQuitMessage( 0 );
        CASE WM_PAINT:
        {
            PAINTSTRUCT     ps;
            HDC             hDC;
            
            hDC = BeginPaint( hWnd, &ps );
            SelectObject( hDC, GetStockObject(DC_PEN) );
            SelectObject( hDC, GetStockObject(DC_BRUSH) );
            
            switch ( nCapture ){
                CASE CAPTURE_START:
                    SetDCPenColor(   hDC, RGB(0xFF,0x00,0x00) );
                    SetDCBrushColor( hDC, RGB(0xFF,0x00,0x00) );
                    Ellipse( hDC, (po[0].x - 2), (po[0].y - 2), (po[0].x + 3), (po[0].y + 3) );
                    Ellipse( hDC, (po[1].x - 2), (po[1].y - 2), (po[1].x + 3), (po[1].y + 3) );
                    SelectObject( hDC, GetStockObject(NULL_BRUSH) );
                    Rectangle( hDC, po[0].x, po[0].y, po[1].x, po[1].y );
                    SelectObject( hDC, GetStockObject(DC_BRUSH) );
                CASE CAPTURE_STOP:
                    SetDCPenColor(   hDC, RGB(0x99,0x66,0x00) );
                    SetDCBrushColor( hDC, RGB(0xFF,0x99,0x00) );
                    Rectangle( hDC, po[0].x, po[0].y, po[1].x, po[1].y );
                    nCapture = CAPTURE_NULL;
                DEFAULT:break;
            }
            EndPaint( hWnd, &ps );
        }
        CASE WM_LBUTTONDOWN:
            if ( nCapture == CAPTURE_NULL ){
                nCapture = CAPTURE_START;
                po[ 0 ].x = po[ 1 ].x = GET_X_LPARAM( lParam );
                po[ 0 ].y = po[ 1 ].y = GET_Y_LPARAM( lParam );
                InvalidateRect( hWnd, NULL, TRUE );
                UpdateWindow( hWnd );
                SetCapture( hWnd );
            }
        CASE WM_MOUSEMOVE:
            if ( nCapture == CAPTURE_START ){
                po[ 1 ].x = GET_X_LPARAM( lParam );
                po[ 1 ].y = GET_Y_LPARAM( lParam );
                InvalidateRect( hWnd, NULL, TRUE );
                UpdateWindow( hWnd );
            }
        CASE WM_LBUTTONUP:
            if ( nCapture == CAPTURE_START ){
                nCapture = CAPTURE_STOP;
                po[ 1 ].x = GET_X_LPARAM( lParam );
                po[ 1 ].y = GET_Y_LPARAM( lParam );
                InvalidateRect( hWnd, NULL, TRUE );
                UpdateWindow( hWnd );
                ReleaseCapture();
            }
        DEFAULT:return DefWindowProc( hWnd, uMsg, wParam, lParam );
    }
    return 0;
}

//------------------------------------------------
// ウインドウ・クラスの登録
//------------------------------------------------
static ATOM funcWindowClass( HINSTANCE hInstance, LPCTSTR lpClassName )
{
    WNDCLASSEX wcex = { 0 };
    
    wcex.cbSize         = sizeof(WNDCLASSEX);
    wcex.style          = (CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS);
    wcex.lpfnWndProc    = mainWindowProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = apiLoadIcon( NULL, IDI_APPLICATION );
    wcex.hIconSm        = apiLoadIcon( NULL, IDI_APPLICATION );
    wcex.hCursor        = apiLoadCursor( NULL, IDC_ARROW );
    wcex.hbrBackground  = (HBRUSH)GetStockObject( WHITE_BRUSH );
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = lpClassName;
    return RegisterClassEx( &wcex );
}

//------------------------------------------------
// ウインドウの作成
//------------------------------------------------
static HWND funcCreateWindow( HINSTANCE hInstance, LPCTSTR lpClassName, LPCTSTR lpTitleName, int nCmdShow )
{
    HWND hWnd = CreateWindowEx(
        0,                      // 拡張ウインドウ・スタイル
        lpClassName,            // クラス名
        lpTitleName,            // タイトル名
        WS_OVERLAPPEDWINDOW,    // ウインドウ・スタイル
        CW_USEDEFAULT,          // 横座標
        CW_USEDEFAULT,          // 縦座標
        CW_USEDEFAULT,          // 横幅
        CW_USEDEFAULT,          // 高さ
        NULL,                   // 親ウインドウのハンドル
        NULL,                   // メニューのハンドル
        hInstance,              // インスタンスのハンドル
        NULL );                 // ウインドウ作成のデータ
    
    if ( hWnd != NULL ){
        ShowWindow( hWnd, nCmdShow );
        UpdateWindow( hWnd );
    }
    return hWnd;
}

//------------------------------------------------
// メイン関数
//------------------------------------------------
extern int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow )
{
    LPCTSTR lpClassName = TEXT("PaintSoftWndClass");
    LPCTSTR lpTitleName = TEXT("第11話 お絵かきソフトを作ろう");
    MSG Msg;
    
    if ( funcWindowClass(hInstance,lpClassName) == 0 ){
        return -1;
    }
    if ( funcCreateWindow(hInstance,lpClassName,lpTitleName,nCmdShow) == NULL ){
        return -2;
    }
    while ( GetMessage(&Msg,NULL,0,0) > 0 ){
        TranslateMessage( &Msg );
        DispatchMessage( &Msg );
    }
    UNREFERENCED_PARAMETER( hPrevInstance );
    UNREFERENCED_PARAMETER( lpCmdLine );
    return Msg.wParam;
}

//------------------------------------------------------------------------------
// End of 第11話マウス処理で描こう.cpp
//------------------------------------------------------------------------------

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Beep関数で音階を鳴らそう | トップ | ドラッグ図形の描き方 »
最新の画像もっと見る

コメントを投稿

グラフィック関連」カテゴリの最新記事