goo blog サービス終了のお知らせ 

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

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

メッセージ・プロシージャを作ろう

2011年05月25日 00時59分41秒 | 無料で学べる講座

サンプル

=======
// メッセージ・プロシージャを作ろう
//==============================================================================
#include <tchar.h>
#include <Windows.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)

//------------------------------------------------
// ウインドウ・プロシージャの関数
//------------------------------------------------
extern LRESULT CALLBACK mainWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    switch ( uMsg ){
        CASE WM_CREATE:
            MessageBox( hWnd, TEXT("ウインドウが作成された。"), TEXT("WM_CREATE"), (MB_ICONINFORMATION|MB_OK) );
        CASE WM_CLOSE:
            MessageBox( hWnd, TEXT("ウインドウが閉じる。"), TEXT("WM_CLOSE"), (MB_ICONINFORMATION|MB_OK) );
            DestroyWindow( hWnd );
        CASE WM_DESTROY:
            MessageBox( hWnd, TEXT("ウインドウが破棄された。"), TEXT("WM_DESTROY"), (MB_ICONINFORMATION|MB_OK) );
            PostQuitMessage( 0 );
        CASE WM_LBUTTONDOWN:
            MessageBox( hWnd, TEXT("左クリックの検出。"), TEXT("WM_LBUTTONDOWN"), (MB_ICONWARNING|MB_OK) );
        CASE WM_RBUTTONDOWN:
            MessageBox( hWnd, TEXT("右クリックの検出。"), TEXT("WM_RBUTTONDOWN"), (MB_ICONWARNING|MB_OK) );
        CASE WM_DROPFILES:
            MessageBox( hWnd, TEXT("ドロップ・ファイルの検出。"), TEXT("WM_DROPFILES"), (MB_ICONWARNING|MB_OK) );
        DEFAULT:return DefWindowProc( hWnd, uMsg, wParam, lParam );
    }
    return 0;
}

//------------------------------------------------
// ワークエリア領域の取得
//------------------------------------------------
#define GetMonitorRect(rc)      SystemParametersInfo(SPI_GETWORKAREA,0,rc,0)

//------------------------------------------------
// デスクトップの画面中央に移動
//------------------------------------------------
static BOOL funcCenterWindow( HWND hWnd )
{
    RECT    rc1;        // デスクトップ領域
    RECT    rc2;        // ウインドウ領域
    INT     cx, cy;     // ウインドウ位置
    INT     sx, sy;     // ウインドウサイズ
    
    // サイズの取得
    GetMonitorRect(      &rc1 );                            // デスクトップのサイズ
    GetWindowRect( hWnd, &rc2 );                            // ウインドウのサイズ
    // いろいろと計算
    sx = (rc2.right - rc2.left);                            // ウインドウの横幅
    sy = (rc2.bottom - rc2.top);                            // ウインドウの高さ
    cx = (((rc1.right - rc1.left) - sx) / 2 + rc1.left);    // 横方向の中央座標軸
    cy = (((rc1.bottom - rc1.top) - sy) / 2 + rc1.top);     // 縦方向の中央座標軸
    // 画面中央に移動
    return SetWindowPos( hWnd, NULL, cx, cy, 0, 0, (SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOSIZE) );
}

//------------------------------------------------
// ウインドウ・クラスの登録
//------------------------------------------------
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(
        WS_EX_ACCEPTFILES,      // 拡張ウインドウ・スタイル
        lpClassName,            // クラス名
        lpTitleName,            // タイトル名
        WS_OVERLAPPEDWINDOW,    // ウインドウ・スタイル
        CW_USEDEFAULT,          // 横座標
        CW_USEDEFAULT,          // 縦座標
        640,                    // 横幅
        480,                    // 高さ
        NULL,                   // 親ウインドウのハンドル
        NULL,                   // メニューのハンドル
        hInstance,              // インスタンスのハンドル
        NULL );                 // ウインドウ作成のデータ
    
    if ( hWnd != NULL ){
        funcCenterWindow( hWnd );
        ShowWindow( hWnd, nCmdShow );
        UpdateWindow( hWnd );
    }
    return hWnd;
}

//------------------------------------------------
// メイン関数
//------------------------------------------------
extern int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow )
{
    LPCTSTR lpClassName = TEXT("DefWindowProcWndClass");
    LPCTSTR lpTitleName = TEXT("第1話 メッセージ・プロシージャ関数");
    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;
}

解説




実行結果

●mainWinProc1~mainWinProc7


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« デフォルト・プロシージャで... | トップ | メッセージ・ボックスを出そう »
最新の画像もっと見る

コメントを投稿

無料で学べる講座」カテゴリの最新記事