#pragma twice

KAB-studio > プログラミング > #pragma twice > 290 Version 14.23 メッセージの復習

#pragma twice 290 Version 14.23 メッセージの復習

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

 Version 14.23
メッセージの復習

今回は、ウィンドウとスレッドの組み合わせについて考えてみます
お、一番使いそうな例
そう、よく使いそうで、けれども難しい部分です
難しいの?
うん、ウィンドウの仕組みについてわかっていないといけないから。まず
そのために、 Version 10.01 ( No.179 ) の頃の、 MFC を使わないウィン
ドウプログラムを作ってみます
ウィンドウプロシージャとか作って中でメッセージの振り分けするヤツ

そうそれ。まず【ファイル】−【新規作成】で【Win32 Application】
を選んでください。プロジェクト名は好きなもので
そういうの困る……
プロジェクトが完成したら【ファイルの新規作成】で Main.cpp という
ファイルを作ってください
その辺も Version 10.01 ( No.179 ) と同じね
ファイルを作ったら、その中にこう書き込んでください

#include <Windows.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;
    }

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

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

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

        // メッセージを変換します。
        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
        , NULL
        , 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();
}

長!
このプログラム見て、 Version 10.04 ( No.182 ) を思い出して
メッセージキューの話だよね
今回のプログラムはメッセージループやウィンドウプロシージャといった
ウィンドウの一番基本的な部分を押さえてあります
メッセージループが MessageLoop() で、ウィンドウプロシージャが 
WndProc() ね。でも、これってどこがマルチスレッドと関係あるの?
というわけで次回に続く!
早!

/*
    Preview Next Story!
*/
今回はなんか勉強した気がしない……
でも、メッセージまわりって普段やらないから忘れてるとこない?
う”
そういうことなら復習復習
はいはい
特に、次回はメッセージループやウィンドウプロシージャに触れるから
その辺が鍵なんだ
というわけで次回
< Version 14.24 メッセージループとスレッド >
につづく!
その辺復習しておかないと来週きついよ?
スレッドだけでも難しいのにウィンドウも一緒……
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。