#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のトップページをご覧ください。