アークピットのホームページに戻る

WinAPIトピックのトップページに戻る

APIトピックの各章に移動する

ダウンロードのページに移動する
ダウンロードができ
ない場合の対処法
 

ページ移動

2-4-5. ApMdisysプログラムの構成

 ApMdisysプログラムは複数のソースコードから構成されます。これらをコンパイル・リンクして実行ファイルを作成します。ここではそれらのファイルの内容とコンパイルの方法を説明します。

ApMdisysのファイル群

 ApMdisysサンプルは、次のファイルから構成されています。これらのファイルは、ここを押せばダウンロードできます。

ファイル名 内 容
ApMdisys.mak コンパイルのためのメイクファイルです。マイクロソフトのNMAKEの仕様になっています。ApMakeユーティリティ対応にもなっています。
ApMdisys.h ApMdisys.cやApMdisys.rcがインクルードするヘッダーファイルです。各種のdefine定義されています。構造体はありません。
ApMdisys.c ApMdisysサンプルのプログラムコードです。WIN32のAPIを直接コールします。
ApMdisys.rc リソースファイルです。メニュー、アクセラレータ、アイコン、ダイアログボックスなどの定義を行ないます。
ApMdisys.ico ApMdisysアプリケーションのアイコンデータです。
ApHello.ico ApHelloのMDI子ウィンドウのアイコンデータです。
ApRedit.ico ApReditのMDI子ウィンドウのアイコンデータです。
ApMdisys.exe ソースコードからコンパイル・リンクして作成した実行ファイルです。

ApMdisys.makファイル

 ApMdisysサンプルは、ApMdisys.makのメイクファイルでコンパイルします。このファイルは、ApMake用に適合されていますが、MS−DOSコマンドプロンプトでも実行できます。

NMAKE [NODEBUG=1] -f ApMdisys.mak

 このメイクファイルは、win32.makをインクルードします。このファイルは、マイクロソフトがWIN32のために提供しているメイク用のファイルです。大部分のマクロは、このファイルで定義されています。
 ApMdisys.makファイルの内容は単純です。ApMdisys.cをコンパイルして、ApMdisys.rcをリソースコンパイルします。そしてobjとresファイルをリンクします。通常のライブラリの他に、リッチテキストコントロールを仕様していますので、Comctl32.libファイルを一緒にリンクします。

 マイクロソフト以外をご使用の方は、ApMdisys.makファイルの内容を組み替える必要があるかも知れません。しかし、それでも内容は簡単なので難しくはないでしょう。

3つのアイコンファイル

 アイコンファイルは、3つあります。アプリケーション用に1つと、MDI子ウィンドウのために2つあります。アイコンは、特殊なビットマップデータで、大きなアイコン用と、小さなアイコン用の2つのデータが入っています。作成はアイコンエディタで行ないます。Visual−Cのデベロッパースタジオで作成する人が多いと思います。フリーソフトやシェアウェアにもアイコンエディタがあります。

リソースのアイコンは番号で指定

 ところで、アイコンの定義は、ApMdisys.rcのICON文で行ないます。他のリソースはすべて名前なのに、アイコンだけは、IDI_XXXの番号になっています。これには理由があります。例えば以下の様に定義します。
ApMdisys  ICON    DISCARDABLE     "ApMdisys.ico"
ApHello   ICON    DISCARDABLE     "ApHello.ico"
ApRedit   ICON    DISCARDABLE     "ApRedit.ico"
 これでコンパイルしexeファイルを作成すると、アイコンはABC順に並んでexeファイルに含まれます。そしてエクスプローラや各種ソフトでエェファイルを見ると、先頭のアイコンを一緒に表示します。つまりこの場合は、ApHelloが辞書順で最初になるので、ApHello.icoを表示してしまいます。よって番号にして、ApMdisys.icoが一番小さい番号にします。これで目的通りの表示をします。

 ちなみに、番号にしたら、プログラムでは、MAKEINTRESOURCE マクロで変換する必要があります。

   wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_MAIN));
   wc.hIcon = LoadIcon(hInstance,"ApMdisys");
 名前の場合は、上記の下段の様に名前をそのまま指定します。リソースの場合は、番号の方がメモリやファイルサイズの効率も良く、検索も必要無いのでスピードも上がります。プログラムコード的には、名前の方が簡単です。これらは、メニューやダイアログボックスなどのすべてのリソースについて言えます。

グローバル変数

 ApMdisys.cには、12個のファイル内のグローバル変数があります。SDIではウィンドウプロシージャは1つでしたので、ローカル化できたのですが、MDIでは子ウィンドウのプロシージャもあり、それからもアクセスしますのでグローバル化しました。

 しかしApMdisysは小さいので、ファイル内のアクセスで済みますが、少し大きなシステムでは複数のファイルを必要とします。その時は、私たちの場合は、構造体化してヘッダファイルで定義します。そしてその構造体を S などの短い実体変数にし、S,hWndMain とアクセスします。

 このApMdisysでは、HINSTANCE 変数をグローバル変数化しませんでした。あちこちで、HINSTANCE を必要としますが、その場合は、以下のコードで得ます。

hInst = (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);

ページ移動