#pragma twice

KAB-studio > プログラミング > #pragma twice > 190 Version 10.12 コード全体

#pragma twice 190 Version 10.12 コード全体

前のページへ 表紙・目次へ 次のページへ

 Version 10.12
コード全体

「えーっと、ごめんなさい」
『ごめんなさい?』
「たぶん、前回までで、 Main.cpp はこういう感じのコードになってると思
います」

#include <stdio.h>
#include <Windows.h>
#include "resource.h"


// ウィンドウプロシージャ。
LRESULT CALLBACK WndProc
    ( HWND p_hWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    )
{
    if( p_uiMessage == WM_DESTROY )
    {
        // ×ボタンが押されました。
        PostQuitMessage( 0 );
        return 0;
    }
    else if( p_uiMessage == WM_COMMAND )
    {
        if( LOWORD( p_wParam ) == ID_MENU_TEST )
        {
            // ID_MENU_TEST メニュー。
            OutputDebugString( "ID_MENU_TEST : 終了します。\n" );
            PostQuitMessage( 0 );
            return 0;
        }
    }

    // 標準的な処理をします。
    return DefWindowProc( p_hWnd, p_uiMessage, p_wParam, p_lParam );
}


// メッセージループ。
int MessageLoop( HINSTANCE p_hInstance )
{
    BOOL bRes;
    MSG stMsg;
    int iAclTranslated;

    // アクセラレーターをリソースから読み込みます。
    HACCEL hAccel
        = LoadAccelerators
            ( p_hInstance
            , MAKEINTRESOURCE( IDA_MAIN ) 
            );

    // メッセージループです。
    while( 1 )
    {
        // メッセージをキューから取り出します。
        bRes = GetMessage( &stMsg, NULL, 0, 0 );
        if  ( 
                ( bRes == 0 )
            || 
                ( bRes == -1 )
            )
        {
            // 終了するのでループから抜けます。
            break;
        }

        iAclTranslated
            = TranslateAccelerator( stMsg.hwnd, hAccel, &stMsg );
        if( iAclTranslated != FALSE )
        {
            // 変換したのでメッセージ変換とディスパッチはしません。
            continue;
        }

        // メッセージを変換します。
        TranslateMessage( &stMsg );
        // ウィンドウプロシージャに送ります。
        DispatchMessage( &stMsg );
    }

    return stMsg.wParam;
}


// ウィンドウクラスを登録します。
bool RegistWndClass
    ( const char *const p_pchWndClassName
    , HINSTANCE p_hInstance
    )
{
    // ウィンドウクラス登録用構造体。
    WNDCLASSEX  stWndClassEx;
    stWndClassEx.cbSize = sizeof( stWndClassEx );
    stWndClassEx.style
        = CS_BYTEALIGNWINDOW | CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
    stWndClassEx.lpfnWndProc = WndProc;
    stWndClassEx.cbClsExtra = 0;
    stWndClassEx.cbWndExtra = 0;
    stWndClassEx.hInstance = p_hInstance;
    stWndClassEx.hIcon = LoadIcon( NULL, IDI_EXCLAMATION );
    stWndClassEx.hCursor = LoadCursor( NULL, IDC_ARROW );
    stWndClassEx.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
    stWndClassEx.lpszMenuName = NULL;
    stWndClassEx.lpszClassName = p_pchWndClassName;
    stWndClassEx.hIconSm = LoadIcon( NULL, IDI_EXCLAMATION );

    // ウィンドウクラスを登録します。
    if( RegisterClassEx( &stWndClassEx ) == 0 )
    {
        // 失敗しました。
        return false;
    }

    return true;    
} 


// ウィンドウを作ります。
bool CreateAndShowWnd
    ( const char *const p_pchWndClassName
    , HINSTANCE p_hInstance
    , int p_iCmdShow
    )
{
    // ウィンドウを作ります。
    HWND hWnd = CreateWindow
        ( p_pchWndClassName
        , "テスト"
        , WS_OVERLAPPEDWINDOW
        , CW_USEDEFAULT
        , 0
        , CW_USEDEFAULT
        , 0
        , NULL
        , LoadMenu( p_hInstance, MAKEINTRESOURCE( IDM_MAIN ) )
        , p_hInstance
        , NULL 
        );

    if( hWnd == NULL )
    {
        // ウィンドウの作成に失敗しました。
        return false;
    }

    // ウィンドウを表示します。
    ShowWindow( hWnd, p_iCmdShow );
    UpdateWindow( hWnd );
    return true;
}


// 最初に呼ばれる関数です。
int WINAPI WinMain
    ( HINSTANCE p_hInstance
    , HINSTANCE p_hPrevInstance
    , LPSTR p_pchCmdLine
    , int p_iCmdShow
    )
{
    const char pchWndClassName[] = "SimpleWindowClass";
    
    bool bRes
        = RegistWndClass( pchWndClassName, p_hInstance );
    if( bRes == false )
    {
        return -1;
    }
    
    bRes
        = CreateAndShowWnd
            ( pchWndClassName 
            , p_hInstance
            , p_iCmdShow
            );
    if( bRes == false )
    {
        return -1;
    }
    
    return MessageLoop( p_hInstance );
}

「……以上」
『げ、今回これだけ???』
「全体のコードを一度まとめておこうと思って。それに、これからはあまり
変える部分はないから」
『どういうこと?』
「ウィンドウクラスを作ったり、ウィンドウを作ったり、メッセージループ
でディスパッチしたり、っていう部分は今回のである程度完成形」
『特に何かしない限り、このまま使えるってことね』
「そういうこと。逆に色々変えるのがウィンドウプロシージャ」
『いろんなメッセージに対応しなきゃいけないんだもんね』
「というわけで、次回からはメッセージの処理について見ていきます」

/*
    Preview Next Story!
*/
『確かにまー、メールマガジンだとこーゆーの難しいよね』
「来週からはちゃんと関数単位だから」
『それはそれでよくなくない?』
「うん、その号だけで試すことはできないんだよね」
『やたら長いのもアレだし、難しいよね』
「難しいね……」
『というわけで次回』
< Version 10.13 ポップアップメニューふたたび >
「につづく!」
『でもその〈ポップアップメニュー〉も前の続きなんだし』
「続き物ってことでいいってこと?」
『そう割り切っちゃおうってこと』
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。