パソコン活用研究シリコンバレー(C、C++、の活用研究)

メッセージボックスの表示

Windowsアプリケーション(GUIアプリケーション)もBorland C++ Cmpilerで作成することができます。
まずは、一番簡単なWindowsアプリケーションとして、メッセージボックスを表示するプログラムを
作成してみましょう。

正直言ってWindowsプログラムの作成はMS-DOSプログラムの作成よりかなりやっかいです。
WindowsというOSの仕組みをある程度理解していないと、Windowsプログラムの作成は難しい
でしょう。
もし余力があれば、C++でプログラムを作成しながらWindowsを理解するというアプローチも取り
入れてみたいとは思いますが(おじさん自身素人ですからどこまでできることやら)

とりあえず、どうしても必要な前提の知識としてAPI関数というものだけおさらいして、C++による
Windowsプログラム作成にはいってみましょう。

1 API関数
Windowsアプリケーションの作成にあたり、API関数をたくさん利用することになります。
(Micro SoftのVisual C++などを利用する場合は、Micro Softが提供するMFCを利用してプログラムを
組むこともできますが。)
というわけで、API関数について簡単におさらいしておきます。API関数はApplication Programming
Interfaceの略で、OS(Windows)がアプリケーションに提供する関数のセットのことです。
MS-DOSの時代にはint21割り込みのシステムコールが用意されていましたが、それのWindows版
システムコールと考えていいでしょう。ただし、関数の質、量ともにint21で用意されていたものの比では
ありません。1000以上の関数が用意されています。

API関数は大きく分けると16bit用(Windows3.1など)のWin16と、32bit用のWin32にわかれます。
Windows95以降では当然Win32を使用してアプリケーションを作成することになります。

API関数は数十から数百個がまとめられて、dll(ダイナミックリンクライブラリ)として提供されます。
Windowsが提供する基本的なdllには以下のものがあります。
kernel32.dll  メモリや周辺装置を管理するためのAPI
user32.dll   GUIベースのユーザーインターフェースを提供するためのAPI
gdi32.dll    文字列やグラフィックスを表示するためのAPI

2 メッセージボックスの表示

では、最初のGUIプログラムとして、メッセージボックスを表示するプログラムを作成してみます。
ごく簡単なプログラムですが、一応GUIプログラムです。

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
  LPSTR lpCmdLine,int nCmdShow)
{
MessageBox(NULL,lpCmdLine,"MessageBox",MB_OK);

return 0;
}

MS-DOSプログラムのエントリーポイントはmainでしたが、Windowsプログラムのエントリーポイントは
WinMainです。プログラムが起動するとまずWinMainが呼び出されます。
WinMainを呼び出すのはOS(Windows)ですから、WinMainの4つのパラメーターの値はWindowsから
渡されます。そしてWinMainの戻り値はWindowsに返されます。

それでは次に、Windowsから渡される4つのパラメーターというやつをみてみましょう。
MS-DOSプログラムでも、main (int arqc, char **arcg) としてコマンドライン引数を受け取ることが
ありましたね。WinMainはもう少し複雑で以下のようなパラメーターを受け取ります。

第一パラメーター hInstance
ちなみに変数の型としてHINSTANCEなどといういかめしい名前の型が登場していますが、なんの
ことはないlong型の別名です。HINSTANCEというのはHandle INSTANCE(インスタンスへのハンドル)
ということです。(Windowsプログラムが初めての人にはなんのこっちゃ?という感じかもしれませんが)
この第一パラメーターhInstanceは、この実行プログラムのインスタンスハンドルです。
インスタンスというのがピンとこない用語(英語の本来の意味では”例”なんですけど)ですが、プログ
ラム用語ではメモリー上にロードされたプログラム本体そのものを意味します。
Windowsは複数のプログラムを同時に開いて実行することができる(マルチタスク)ので、開かれた
プログラム(=メモリーにロードされたプログラム)に識別番号をつけて管理します。この識別番号が
ハンドルで、32ビットの整数値をとります。

第二パラメーター hPrevInstance
これは直前に起動された同じプログラムのインスタンスハンドルです。Windowsでは同じプログラムを
複数起動できますが、それらは異なる値のインスタンスハンドルを持ち、異なるものとして識別されます。
ただし、Win32ではhPrevInstanceは使われておらず常にNULLとなります。Win16(Windows3.1など)との
互換性を残すために残されているようです。例えば、同じプログラムを複数起動できないようにしたい
場合など、Win16ではhPrevInstanceの値をチェックして、複数起動を防いでいました。このような使い方
をしていましたが、Win32では同じプログラムが既に起動されているかどうか調べるために CreateMutex
というAPI関数が用意されました。

第三パラメータ lpCmdLine
これは、コマンドラインから起動された際に受け取る、コマンドラインパラメータ(引数)です。
MS-DOSプログラムの、main (int arqc, char **arcg) の**arcgで受け取るコマンドライン引数に相当
します。後ほど実例をあげますので、見て下さい。

第四パラメータ nCmdShow
これはプログラム起動時にウィンドウをどのような状態で表示するかを表します。通常状態、最小化、最大化
などが指定されます。

次にプログラムコード本体をみてみます。
とは言っても、MessageBox関数1つだけですが。このMessageBoxはメッセージボックスを表示するAPI関数
です。MessageBox関数には4つのパラメータがあります。

MessageBOx関数の構文
int MessageBox {
HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType
};

第一パラメータは、そのメッセージボックスの親ウィンドウを指定(ウィンドウハンドルで指定)します。NULL
にすると親ウィンドウを持たないメッセージボックスが作成されます。

第二パラメータは、表示するテキストです。その文字列へのポインタを指定します。ここでは、Winmainで
受け取ったコマンドラインパラメータ(第三パラメータ lpCmdLine)をそのまま指定しています。

第三パラメータは、メッセージボックスのタイトルです。文字列へのポインタを指定します。

第四パラメータは、メッセージボックスの内容と動作を指定します。ここで指定したMB_OK(windows.hに定義
されている)を指定すると、OKボタンだけを表示します

では、このプログラムをコンパイルしてみましょう。
Borland C++コンパイラで、GUI(ウィンドウズプログラム)のプログラムをコンパイルするときには、-W スイッチ
をつけてコンパイルします。使用していないパラメータがあると親切ご丁寧に警告を出してくれていますが、
本当に使わないので、無視します。

D:\bcc55\Bin>bcc32 -W msgbox.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
msgbox.cpp:
警告 W8057 msgbox.cpp 10: パラメータ 'hInstance' は一度も使用されない(関数 __std
call WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
警告 W8057 msgbox.cpp 10: パラメータ 'hPrevInstance' は一度も使用されない(関数 _
_stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
警告 W8057 msgbox.cpp 10: パラメータ 'nCmdShow' は一度も使用されない(関数 __stdc
all WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

では、実行してみましょう。ファイル名のクリックの起動では、コマンドラインパラメータ(引数)の指定が
できないので、以下のようになります。



次に、コマンドプロンプト(DOS窓)から、引数つきで実行してみます。こうすると以下のように、
引数が表示されます。



3 おわりに
GUIプログラムとは言ってもここまでは、CでDOSプログラムを組んでいた時の知識の応用で簡単に
理解できたと思います。
ここから、ウィンドウを持ったプログラムの作成に移行する段階で、少し大きな壁がありますが、今回の
このメッセージボックスの表示がよく理解できていれば、ウィンドウを持ったプログラムの作成の理解も
容易になるでしょう。



TopPage