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 ウィンドウクラスを登録する >
『につづく!』
「ま、気にならないうちが花って気もするけど」
『?』