#pragma twice

KAB-studio > プログラミング > #pragma twice > 179 Version 10.01 1からウィンドウを作る!

#pragma twice 179 Version 10.01 1からウィンドウを作る!

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

 Version 10.01
1からウィンドウを作る!

「というわけで、今回から第11章です」
『なんか唐突よね』
「そうでもないと思うよ。これまでのメッセージ関係のまとめの章だから」
『その辺の話が出てくるってわけね』
「で。まずは今回のテスト用にプロジェクトを作ります。今回は MFC を使
わずにウィンドウを作ってみるっていうもの」
『前にやったね、それ』
「そうその Version 8.01 ( No.143 ) と同じようにまずはプロジェクトを
作ります」
『ってことは、まず【ファイル】−【新規作成】で【Win32 Application】
を選んで、プロジェクト名は?』
「 SimpleWindow で」
『前が SimpleDialog だったんだもんね』
「あとは【空のプロジェクト】を選んで」
『そしたらファイルの新規作成?』
「これもあの時と同じ。ファイル名は Main.cpp にして、とりあえず」

#include <Windows.h>

int WINAPI WinMain
    ( HINSTANCE p_hInstance
    , HINSTANCE p_hPrevInstance
    , LPSTR p_pchCmdLine
    , int p_iCmdShow
    )
{
    MessageBox( NULL, "テスト", "WinMain()", MB_OK );
    return 0;
}

『ビルドして実行! うん、ダイアログ出た』
「ここまででまずは第1段階。では次に、これを次のように修正して」

int WINAPI WinMain
    ( HINSTANCE p_hInstance
    , HINSTANCE p_hPrevInstance
    , LPSTR p_pchCmdLine
    , int p_iCmdShow
    )
{
    // ウィンドウを作ります。
    HWND hWnd = CreateWindow
        ( "#32770"
        , "テスト"
        , WS_OVERLAPPEDWINDOW
        , CW_USEDEFAULT
        , 0
        , CW_USEDEFAULT
        , 0
        , NULL
        , NULL
        , p_hInstance
        , NULL 
        );

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

『長い……ってほどじゃないか』
「実はこれに似たのを前にやってます。 Version 5.25 ( No.090 ) を見
て」
『あ、ホントだ。この時はボタンを作ってるんだね』
「あの時はボタンのウィンドウを作りました」
『そうそう、コントロールもウィンドウって話で』
「ここでは同じように、普通のウィンドウを作ってみます。……普通とは違
うか」
『違うの? CreateWindow() ってウィンドウ作る API だよね』
「そうだけど、引数が違うからね」
『引数……第1引数はウィンドウクラス名だったよね。 #32770 ってな
に?』
「これはダイアログのウィンドウクラスなんです」
『あ、そういえば Version 5.24 ( No.089 ) でしたね』
「これを渡してるから、ダイアログが作られる……はずだけど」
『だけど? あ、ビルドして実行。あ、一瞬出てすぐ消えちゃった』
「これは当然で、 Version 8.07 ( No.149 ) で説明したダイアログプロ
シージャがないから」
『あ、そういえば。……でもさ、あのときは DialogBox() に渡したで
しょ、ダイアログプロシージャ。今回は渡しようがないんじゃない?』
「その辺がこれからの課題だね。その話は次回に持ち越しってことで。残り
の2行も見ておくね」

    ShowWindow( hWnd, p_iCmdShow );

「この行はウィンドウを表示状態を変える関数」
『これもさっきのボタン作った回で見たね』
「それと、 p_iCmdShow を使ってるでしょ」
『これは WinMain() の引数だね。あ、 Version 8.05 ( No.147 ) の、
ショートカットから渡された表示状態なんだね』
「これを渡して表示状態を変えてるから、ショートカットの表示状態がちゃ
んと反映されるんです」
『……ちょっとまった! じゃあ、これをしなかったら、ショートカットの
って無視されちゃうってこと?? 自動じゃないの??』
「そういうこと。実は今回の章はそういうのがすごく多いから」
『つまり、今まで自動だと思ってたことが……』
「本当はプログラムでちゃんと書かなきゃいけない、っていうこと。大半は 
MFC が肩代わりしてくれてたからね」
『 MFC なしって結構きついのかも……』
「結構、じゃないから」
『げ』
「で、最後の1行」

    UpdateWindow( hWnd );

「これは表示状態を更新する関数」
『 ShowWindow() だけじゃ表示されないの?』
「そう、 ShowWindow() は表示状態を変えるだけで、実際の表示内容を変え
るわけじゃないから」
『そういうのって分かりにくいよねー』
「そうだね、この辺も今回のキーかも。この関数とこの関数はペアで使う、
とかの仕組みを憶えていかないと」
『複雑ねー』
「さて、今回はここまで。ここからは、次回のための準備です」
『次回って何するの?』
「次回は、ウィンドウクラスを登録します」
『え!? ウィンドウクラスって自分で登録できるの!?』
「そうしないとアプリごとのウィンドウが作れないからね。で、そのウィン
ドウクラスを登録するための関数を用意します」

#include <Windows.h>

// ウィンドウクラスを登録します。
bool RegistWndClass
    ( const char *const p_pchWndClassName
    , HINSTANCE p_hInstance
    )
{
    // 後で中身を追加します。
    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 0;
}

『な、長い……』
「けど、ほとんどさっきと同じ。まずウィンドウを作ってた部分は 
CreateAndShowWnd() の方にまとめました」
『他の関数に追い出しちゃったわけね』
「で、新しく RegistWndClass() を追加しました。この中身については次回
に続く!」

/*
    Preview Next Story!
*/
『なんか、嫌な予感がする』
「な、なに?」
『今回の第10章はかなり大変と見た!』
「確かに今回は簡単楽々とはいかないからね」
『 MFC がないだけで大変なのねー』
「確かに、 MFC があればウィンドウクラスとか気にしなくていいし」
『ウィンドウクラス?』
「というわけで次回」
< Version 10.02 ウィンドウクラスを登録する >
『につづく!』
「ま、気にならないうちが花って気もするけど」
『?』
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。