MSOS/ 2 PM のプログラ ミングについて
行 方 常 幸
目 次
1.は じめに
2.PMプログラ ミング
3.「フルスクリー ン用 プログラムの始動」 (STARTFUL.EXE)について 4.おわりに
参考文献
付録 (ソースファイル)
1.は じめに
パ ー ソナル コ ンピュー タの OSで あ るMS‑DOSの世界で は,今,操作 の 統一,絵 を利用 して視覚 に訴 え ることによる使 いやす さ,を 目指 した GU I
(グラフィカル ユーザ イ ンターフェース)の話で持 ち切 りである。今年 は じめのMS‑Windows(Ver.3)発表以来,巷で はMS‑Windows一色 の感 が あ るが, ここで は シングルユ ーザマルチタス クOSの MSOS/ 2の GUI で あ るPM (プ レゼ ンテー シ ョンマネー ジャ)の プログラ ミング方 法 を具体 例 を通 して述べ る。取 り上 げた具体例 は「フル スク リー ン用 プ ログラムの始動」
(STARTFUL.EXE)で あ る。 この具体例 を取 り上 げた理 由を以下 に述べ る。 PM用のアプ リケー シ ョンは手元 にほとん どないため ,私がOS/ 2を利 用す るの はPM の プ ログラ ミング学習で あ るが ,その際利用す るエデ ィタ ,
コ ンパ イ ラ ,リンカ ,デバ ッガ等 はPM用 のアプ リケ ー シ ョンで はな くフル ス ク リー ン用のアプ リケー シ ョンであ る。す なわちPMをアプ リケー シ ョン
〔81〕
間の移動 中継場所 と して利用 してい るわけであ る。PM の画面で 目的の フル スクリー ン用アプ リケーシ ョンに移動す る場合,一番簡単 な方法 は目的のアイ コンをダブル ク リックす る (マウスボタ ンをすばや く2回押 し離す) ことであ る。その際,アプ リケーシ ョン毎 にアイコンが異な っていない と話 にな らない わけであるが,残念なが ら通常の方法で フルスクリー ン用アプ リケーシ ョンを 始動 させ ると,皆同 じアイコンになって しま う。 しか し幸いな ことに 「ソフ ト
ウェア開発支援 ツール」には 「アイコンエディタ」が添付 されてお り, 自分の 好 きなよ うにアイ コンを作成で きる.あ とはアプ リケーシ ョンとアイ コンを対 応 させればよいのだが, 日本語MSOS/ 2に添付 されてい るアプ リケーシ ョ
ン始動 プログラム 「プログラムの始動」では対応 させ ることがで きない。そ こ で この 「プログラムの始動」の部分機能を持 ちアイコンを対応 させ る 「フルス
ク リー ン用 プログラムの始動」(STARTFUL.E支E)を作成 した。
2 .PMプログラミング
PM (プ レゼ ンテーシ ョンマネー ジャ)用のプログラムを作成す るには次の ものが必要である。
(1) Cコンパイラ
(2) ソフ トウェア開発支援 ツール
(2) にはプログラ ミングの際にイ ンクルー ドす るヘ ッダファイル, リンクす るときに必要 なイ ンポー トライブラ リOS2.LIB, リソースコンパ イラRC.
EXE,アイコンを作 るときに利用す るICONEDIT.EXE等が含 まれている。
エディタ等を利用 して作成 しなければな らないファイルは,通常, プログラ ムソースファイル (拡張子.Cを付けてお く),モ ジュ⊥ル定義 ファイル (拡張 千.DEFを付 けてお く),リソース定義 ファイル (拡張子.RCを付 けてお く),
メイクファイル (拡張子 な し),ヘ ッダファイル (拡張子.Hを付 けてお く), 等である。
今回作成 したファイル (STARTFUL.*)を基 にその内容を以下 に簡単 に 説明す る (付録を参照)0
MS OS/2PMのプ ログラ ミングにつ いて 83 [モ ジュール定義 ファイル (STARTFULDEF)]
このファイルは リンク時に利用 され る。 NAME文で このプログラムがダイ ナ ミック リンクライブラ リで はな く普通 のアプ リケー シ ョンで あることを示 し,名前 (STARTFUL)を定義 し,WINDOWAPIでPM用アブ リーケ‑
シ ョンで あ ることを宣言す る0DESCRIPTION文で文字列 をEXEフ ァイ ルに埋 め込み,PROTMODE文でプロテク トモー ド用アプ リケーションであ ることを宣言す る。HEAPSIZE,STACKSIZE文で ヒープ,スタ ックの大 きさを宣言す る。 スタ ックサイズはPM用 アプ リケ‑ シ ョンの場合8キ ロバ イ トにす ることが勧 め られている。
[ヘ ッダファイル (STARTFUL.H)]
プログラムを読 みやす くす るための定数 を定義 している。すなわち,STA RTFUL.RC,STARTFUL.Cで利用 されているメニ ュー,アイコ ン,ダイ アログボ ックス等を区別す る識別子が定義 されている。
[メイ クファイル (STARTFUL)]
コマ ン ドライ ンで
A :>MAKESTARTFUL<CR>
とす ることによ り日付をチ ェック して コンパ イル, リンクな どを実行 させ る ファイルである。 コンパイラオプシ ョン, リンカオプシ ョンの意味は次の通 り である。
/Zp:構造体をなるべ く詰 めて格納 させ る /ASw :スモールモデル,Ds!‑SSを指示 /C :コンパイルのみで, リンクは行わない
/G2S:80286用の コー ドを生成 し,関数呼出の際にスタ ックチ ェックを 行わない
/W3:最 も厳 しい警告を生成 させ る
/align:16:セグメン トを16バイ ト境界 に並べ る
[リソース定義 ファイル (STARTFUL.RC)] 次節で述べ る。
[プログラムソースファイル (STARTFUL.C)]
次節で述べ るが,その骨格 (SKELETON.C図.1)につ いて ここで述べ る。関数 の うちDev,Dos,Winで始 まるものはあ らか じめ用意 されてい る MSOS/ 2の システム関数であ る。SKELETON.CをSTARTFUL.DEF
と同様のモ ジュール定義 ファイル と共にコンパイル, リンクし,実行 ファイル SKELETON.EXEを作 り実行 させ ると,中が塵だ らけの ウィン ドウがPM
#define INCL̲YIN
♯include くos2.h>
航ESULTCALLBACKClientVndProc(HWNI),USIORT,池PARAM,姫PARA淑),I intmain(void)
i
staticCHAli szClientClass ="クラス名";
staticI)LONG flFrameFlags‑FCF TITLEBAR IFCF SYS≠ENU 1
FCF=sIZEBORDER IFi泉̲』INM I FCF̲SHELLPOSITION IFCF̲TASKLIST;
HAB hab;
HMQ hTnq;
珊ND hwndFrame,hwndClient;
QWSG qmsg;
hab=Winlnitialize(0);
hmq=WinCreate姓sgQueue(hah,0);
WinRegisterClass(hah,szClientClass,C1ientWndProc,OL,0),I
hwndFrame‑WinCreateStdYindow(HWNI)̲I)ESKTOP,WS̲VISIBLE,&flFrameFlags,
szClientClass,NULL,OL,NULL,0,&hwndClient);
YinSendXsg(hwndFrame,VW̲SETICON,
YinQuerySysPointer(HVND̲I)ESKTOP,SPTRpAl'PICON,FALSE),NIJLL);
while(WinGetXsg(hab,&qmsg,NULL,0,0)) WinDispatchXsg(hab,&qmsg);
WinDestroyYindow(hwndFrame);
Win工)estroy誠sgQueue(hnq);
WinTerminate(hab);
return0;
‡
WRESULTCALLBACKClientYndProc(HWNI)hwnd,USHORTmsg,肝ARAHnpl,MPARA≠mp2) f
retum WinDefWindowProc(hwnd,msg,mpl,mp2);
)
図.1 プ ログ ラム ソー スフ ァイル (SK ELETON.C)
MS OS/2PMのプログラ ミングについて 85 画面 に作成 され る (図.2参照)。SKELETON.Cは2つ の関数 か ら構成 さ れてい る。main関数で は最低限次の ことを行 う。 ウィン ドウ作成 の下準備 (Winlnitialize,WinCreateMsgQueue,WinRegisterClass), ウ ィ ン ドウ の作成(WinCreateStdWindow),メ ッセ ー ジループ (while文 の ところ), ウィ ン ドウ破棄 の後始末 (WinDestroyWindow,WinDestroyMsgQueue, WinTerminate)で あ る。 この SKELETON.Cで は以 上 の処 理 に加 え て メ ッセ ー ジル ープに入 る前 に, アイ コ ンを システムか ら借 りて きて い る。
もう1つ の関数 ClientWndProc(ウィ ン ドウプ ロシー ジャと呼ばれ る)が 実 際上 の プ ログラムの本体 で あ る。 この ウィ ン ドウプ ロシー ジャに ウィ ン ドウの動作 を記述す る。次節で述べ るSTARTFUL.Cで は この C1ientWnd Procに後 で述べ るよ うな動 作 を記述 して い る。 SKELETON.Cで は何 も せず にただデ フォル トの ウィ ン ドウプ ロシー ジャWinDerWindowProcに 全 てを任 してい るため,図.2の よ うにただ ウィ ン ドウ枠 を表示 しただけで 仕事 は何 もしない, ウィ ン ドウ枠 内の塵で さえ消去 しない。
図.2 SKELETON.EXEを実行 した と ころ
図.2を もう少 し詳 しく見 ると,ウィ ン ドウの上部 に「SKELETON.EXE」
とタイ トルが あ り,その左 に システムメニ ューボ ックス と呼ばれ る真 申に 横棒の入 った箱が あ り,右端 には下 向き矢 印 (最小化 ボ ックス),上 向 き矢 印 (最大化ボ ックス)がある。更に,タスクマネージャのウィン ドウを見 ると
「SKE工」ETON.EXE」が リス トに載 っている。 これ らを実現 させ るのはSK ELETON.Cのmain関数内で ウィン ドウ作成時に呼び出す WinCreateStd Window の3番 目の引数 flFrameFlagsの FCF̲TITLEBAR,FCF SYSMENU,FCF̲MINMAX,FCF̲TASKLISTである。更 に,最初 のウィン ドウの位置 と大 きさを システムに適当に決めて もらい, ウィン ドウの サイズを変更で きるようにす るために,FCFーSHELLPOSITION,FCF SIZEBORDERとしてい る。 次節で述べ るSTARTFUL Cはmain関数 の 少 しの修正 と,C1ientWndProcでの仕事の記述が大部分である。
3.フル スク リー ン用プ ログラムの始動 (STARTFUL.EXE)について
「は じめに」の所で も述べたがSTARTFUL.EXEの 目的はフルスク リー ン用アプ リケーションをアイコンと対応 させて始動 させ ることであるが, これ は案外簡単で,始動 させたいファイル名,必要な らそれへの引数,タイヽル名, アイコンファイル名等を指定 して システム関数DosStartSessionを呼び出せ ば良い。あとはこれをウィン ドウ内で操作の しやすいようにプログラムするだ けである。 まず MSOS/ 2に添付 している 「プログラムの始動」を参考 に し てみる (図.3参照)。タイ トルの下にメニュー(「プログラム (P)」,「グルー プ (G)」,「ヘルプ」)があ り,その下 にグループ名,その下 に, リス トボ ッ クスがある。 この リス トボ ックス内で,例えば,マウスでダブルクリックす る と,その時選択 されていた項 目のプログラムを始動 させ る。従 って,「フルス ク リー ン用 プログラムの始動」 (STARTFUL.EXE)の外観を同 じよ うに す る (図.4参照)。 図.4のウィン ドウで枠をフレームウィン ドウとい う。 フ レームウィン ドウの中にシステムメニ ューボ ックス,タイ トルバー,最小化最 大化ボ ックスがあ り,その下にメニューがあ り,その下の部分が クライア ン ト
MS OS/2PMの プログラ ミングについて β7
図.3 PMに添付 され て いる 「プ ログラム の始動 」
図.4 「フル ス ク リー ン用 プ ログラム の始動」 を実行 した ところ
ウィン ドウである。 図.4ではクライア ン トウィ ン ドウい っぱいに リス トボ ッ クスが表示 されてい る。 また,STARTFUL.EXEの機能 は次のよ うな必要 最小限の ものを持たせ ることにす る。 「設定」メニ ューか ら 「プログラムの追 加,変更,削除」を選ぶ ことによ り,始動すべ きプログラムを リス トボ ックス へ追加,変更,削除す る(図.5‑ 8参照)。具体的には,STARTFUL.E支E 始動時に図.4のよ うな リス トボ ックスを作成 し, リス トに載せ るプログラム
をOS2.INIか ら転記す る。図.4の リス トボ ックスにはすでに4個 プログラム が入 っているが, 1番最初の始動時にはOS2.INIにはプログラム リス トはな いので,上の3つ はな く初期設定のCMD.EXEだけである。その後 はユーザ か らの入力を待つ。 「CVP (コー ドビュー)」 の所 にあるカーソルを矢印キー やマウスで移動 し,始動 したいプログラムをマウスでダブル ク リックす るか, リター ンキーを押す ことによ り選択す ると, リス トボ ックスか らWM̲CON TROLメ ッセー ジが送 られ るので,選択 されたプログラムを調べ,それを始 動 させ る。図.4で リス トボ ックスの1番下の項 目を選 び,「設定」メニ ューを
図.5 「設定」メニューを選んだところ
MS OS/2PMのプログラ ミングについて 89
図.6 「プ ログラムの追加」 を選 んだ ところ
ta p
; プログラム帽章防 変更してぐだきいo
プログラムのタイ トル 巨 ルスクリJ/コマンド プロン二
フ7イルのフルパス名 巨os2¥CMD.EKE プログラムへの'l○ラメータ E
作業ディレクトリ‥= l¥soURCE
アイコンファイルのフ仙○ス名‥. ¥os2¥ⅠC ON粁 ULL.ⅠC O
変更(Y) 取消(C)
図.7 「プ ログラムの変更」 を選んだ ところ
図.8 「プログラムの削除」を選んだところ
選択 したのが図.5で あ る。図.5で は 「プ ログラムの追加,変更,削除, プ ロフィール,終了」が選択で きる. これ ら5つのメニ ュー項 目が選択 され ると
WM̲COMMANDメ ッセージが送 られ るので,ダイアログボ ックス等 を表 示 してその項 目に必要 な情報をユーザか ら獲得す る。「プロフィール (B)」を 選択す ると,図.9のよ うな簡単 なプログラムの説明を したダイアログボ ック スを表示 させ る。「終了 (Ⅹ)」を選択す ると,図.10のよ うなメ ッセー ジボ ッ クスで動作の確認 をす る。「プ ログラムの追加 (A)」を選択す ると,図.6の よ うなダイア ログボ ックスを表示す る。 1行 目のタイ トルは図.4の リス トに 表示 され るもので,2行 目以下 はシステム関数DosStartSessionの引数 に刺 用 され る情報である。「プログラムの変更 (R)」を選択す ると,図.7のよ う なダイアログボ ックスを表示す る。「プログラムの削除 (D)」を選択す ると, 図.8のようなメ ッセージボ ックスで確認す る.図.4の リス トボ ックスにある
4つのプログラムを始動後,PMの画面へ戻 り自分 も最小化 したのが図.11で ある。画面下方の左か ら4個 目か ら 7個 目までのアイコンがアイ コンエディタ
MSOS/2PMの プログラ ミングにつ いて 91
図.9 「プ ロフ ィール」 を選 ん だ ところ
図.10 「終 了」 を選 ん だ と ころ
図.11 アイ コ ンを表示 させ た と ころ
(ICONEDIT.EXE)で作成 して,プ ログラムの追加 の項 目 「アイ コンフ ァ イルの フルパ ス名」で指定 した もので ある。 左か ら3個 目のアイ コ ンは 「プ ログラムの始動」で フルスクリー ン用アプ リケーシ ョンを始動 した時に現れ る ものである。
以上 の機能 を実現す るための主 な部分がプ ログラムソースフ ァイル (STA RTFUL.C), リソース定義 ファイル (STARTFUL.RC)である。
STARTFUL.RCではアイ コン,メニ ュー,ダイアログボ ックス等の画面 上のスタイル等を定義 し,識別子を利用 してSTARTFUL.Cで参照可能なよ うに している。 まず POINTER文を利用 してSTARTFUL.EXEのアイ コ ン (図.11の左か ら8個 目のアイコ ン)をID̲RESOURCEで参照で きるよ うに定義 して い る。 ここで startful.icoはICONEDIT.EXEで作 成 した フ ァイルであ る。次 に,MENU文 でメニ ューを定義 しID̲RESOURCE で参照で きるよ うに している。 これで,図.4,図.5のよ うなメニ ューが出来 上が る。 例えば,「プログラムの追加 (A)」を選択す ると,そのメニ ュー項 目
MS OS/2PMのプログラ ミングについて 93 を定義 しているMENUITEM文 に書かれてい るIDM̲ADD̲PROGがW M̲COMMANDメ ッセー ジの一部 と して ウィ ン ドウプ ロシー ジャ C1ient WndProcへ送 られ る。 このメ ッセー ジを受 け取 った ときに必要 な処理 を行 う わけであ る。最後のACCELTABLE文 で短縮キー入力を定義 しID̲RESO URCEで参照で きるよ うに して いる。例 えば,CTRL+A (〈A)とキー入 力すればメニ ュー項 目 「プ ログラムの追加 (A)」を選択 したの と同 じ効果 (I DM̲ADD̲PROGを含 む メ ッセー ジの送付)が得 られ る。 これ らアイ コ
ン, メニ ュー, ア クセ ラ レータテー ブル はすべて同 じ識別子 ID̲RESOUR CEで参照 されてい る。残 りの Dl.GTEMPLATE文 で IDD̲ABOUT,I DD̲ADD̲PROG,IDD̲REV̲PROG,IDD̲INPUT̲PARAMの
4個 のダイアログボ ックスの形を定義 している。 DIALOG文で枠 の フ レーム ウィ ン ドウを定義 し, その 中にさ らにい くつかの ウィ ン ドウを定義 してい る (CTEXT,LTEXT,ENTRYFIELD)。例 えば,ENTRYFIELDはキ ー入 力が可能 な ウィ ン ドウを定義 し,「IDD̲...」は この ウィ ン ドウの識別子で, その後 の数字 はこの ウィ ン ドウの位置 と大 きさを表 している。 ここで は, 日本 語 の入力 を可能 にす るためにはフ レーム ウィ ン ドウを定義 したDIALOG文 の所 に FCF̲DBE̲APPSTATと指 定 してお くだ けで良 い ことに注意 す る。 さて, リソース定義 フ ァイル STARTFUL.RCで メニ ュー構 造,各 メ ニ ュー項 目の識別子,またダイア ログボ ックスの構造,ボタ ンな どのダイアロ グボ ックスに含 まれ るウィン ドウの識別子等 を定義 したが, これを使 って 目的 とす る処理 をプログラム しているのがSTARTFUL.Cであ る。
STARTFUL.Cのmain関数 はSKELETON.Cのmain関数 とほとん ど 変わ らない。データの前処理,必要 な らプロフィルデータの削除, さ らに,終 了 時の確認 (図.10)を してい る。図.10のよ うな メ ッセー ジボ ックス は文字 列, アイ コ ン, ボタ ンを引数で指定 してWinMessageBoxを呼び出すだ けで よい。SKELETON.Cと大 き く違 う所 はClientWndProcの内容 と, この他 に3つの ウィ ン ドウプ ロシー ジャ (AddRevProgDlgProcは図.6,7の ダ イア ログボ ックスの動作 を記述 して い る,AboutDlgProcは図.9の ダイア
ログボ ックスに対応)があることである。その他の関数 は上記の4つのウィン ドウプロシー ジャか ら呼び出され る関数である。次 に,プログラムの主要 な部 分を少 し詳 しく説 明す る。
STARTFUL.Cのmain関数内のWinCreateStdWindowで図.4の ウィ ン ドウを作成 している。SKELETON.Cと異な り第2引数でWS‑VISIBLE を指定 していない。第 3引数でFCF̲SHELLPOSITIONの代わ りにFCF MENU,FCF̲ICON,FCF̲ACCELTABLEを指定 して い る。第 8 引数でID̲RESOURCEと指定 している。第2引数でWS̲VISIBLEを指 定す るとウィン ドウが画面 に表示 され る。 ここではウィン ドウ作成中に少 し細 工 したいので,作成時には非表示 とし後 (ウィン ドウプロシー ジャC1ientWnd Procの中)で表示 させ るよ うにす る。第 3引数でFCF̲SHELLPOSITION を指定 しない代わ りに後 (ウィン ドウプロシー ジャ中)で ウィン ドウの位置 と 大 きさを指定す る。STARTFUL.RCで メニ ュー, アイ コン,ア クセラ レー
タテーブルを定義 したが, これ らを実際に組み込むには,第 3引数 にFCF MENU,FCF̲ICON,FCF̲ACCELTABLEを指定 し, さ らに第 8引 数で これ らの識別子ID̲RESOURCEを指定す るだけでよい。
ウィン ドウの動作を記述す るウィン ドウプロシージャは,switch‑caseの 構文で他か ら送付 されたメ ッセー ジを処理す る。 これが メ ッセージ駆動型のプ ログラム と呼ばれ る由縁で,送付元 はシステムであ った り, 自分 自身であった りす る。また,メ ッセージの処理 中にメ ッセージの送付 も行 う場合 もある。図.
4のメニ ュー 「設定」の下の部分 (クライア ン トウィン ドウ)の動作を記述す る ウィン ドウプロシー ジャClientWndProcはWM‑CREATE,WM̲SIZE, WM‑CONTROL,WM̲COMMAND,WM̲DESTROYの5つの メ ッ セージを処理 している。
[WM̲CREATE]
WM̲CREATEはウィン ドウが作成 され る時 に1度 だ け送付 され るメ ッ セージで, ウィン ドウの初期化の処理を行 う。 ここではタイ トルを 日本語で付 ける,タスクマネージャの リス トに日本語で載せ る, リス トボ ックスを作成す
MS OSノ2PMの プ ログラ ミングにつ いて 95 る, フ レームウィン ドウの位置 と大 きさを決め,可視状態にす る, リス トボ ッ クスにイ ンプ ッ トフ ォーカスを設定す る,OS2.INIか らリス トボ ックスに載 せ るプログラム リス トを読み込み (GetProfileData)セ ッ ト (SetProgram List)す る,である。以下で もう少 し詳 しく説明す る。main関数で ウィン ド
ウを WinCreateStdWindowで 作成す るとき,FCF̲TITLEBAR,FCF TASKLISTを指定す るとタイ トルが付 け られ タスクマネー ジャの リス トに プ ログラム名が載 るが,通常で は, これ らは 「STARTFUL.EXE」とな っ て しま う。 そ こで これ らを 「フルスク リー ン用プログラムの始動」にす るため に少 し工夫す る。FCF̲TASKLISTを指定せず にウィン ドウを作成す る。 その後 フ レームウィ ン ドウに日本語のタイ トルを設定す る (WinSetWindow Text)。 タスクマネー ジャの リス トに載せ るために,必要なパ ラメータを設定
して,WinAddSwitchEntry関数 を呼ぶ。WinCreateWindow関数 で リス トボ ックスを作成 し,以下識別子 IDL̲MYLISTで参照す るよ うに してい る。 この時点で は リス トボ ックスの位置 と大 きさは設定 されていない。後の WM̲SIZEの所で設定す る。main関数で フレームウィン ドウを作成 したが, その時にはまだ位置 と大 きさを決めていなか った し,不可視状態であった。そ こで フレームウィン ドウの左下が画面の左下か ら1/ 4づっの位置にきて, 冒 本語のタイ トルが丁度入 るように大 きさを設定 し (WinSetwindowPos),可 視状態 にす る (WinShowWindow)。矢 印キーで カーソルが プログラム間を 移動で きるように,イ ンプ ッ トフォーカスを リス トボ ックスに設定す る (Win SetFocus)0
[WM̲SIZE]
WM̲SIZEはウィン ドウの大 きさが変 わ った時 に送付 され るメ ッセー ジ で, ここで はすでに作成済みの リス トボ ックスの大 きさを修正 している (Win SetWindowPos)。工夫 した注意点 は リス トボ ックスの枠を表示 させないため 枠の巾の分だけ位置をず らし大 きさも大 きくした ことである。
[WM̲CONTROL]
このメ ッセー ジの送付元が リス トボ ックス (IDL̲MYLIST)で,カーソ
ル位置 のプ ログラムが選択 された場合 (LN̲ENTER), そのプ ログラムを 始動 させ る (StartSession)。
[WM̲COMMAND]
このメ ッセージが メニ ュー項 目の選択 によ り送付 された場合 (IDM̲ADD PROG,IDM̲REV̲PROG,IDM̲DEL̲PROG,IDM̲ABOUT の場合),ダイアログボ ックス等を作成 して必要な処理を行 う。 例えば,「プロ
グラムの変更 (IDM̲REV̲PROG)」に対 して はダイアログボ ックス作成 時 (WinDlgBox)にそのウィン ドウプロシー ジャをAddRevProgDlgProc
(第 3引数),その構造 を STARTFUL.RCで識別子 IDD̲REV̲FROG で参照可能 に した ものに して (第 5引数),処理 をダイアログボ ックスのウィ
ン ドウプロシー ジャに任せている。
[WM̲DESTROY]
このメ ッセー ジはウィン ドウが破棄 され る時に送付 され るもので, ウィン ド ウの後始末を行 う。ここで は処理途 中に獲得 したメモ リを返却 し(MemFree), タスクマネージャへの登録を破棄す る (WinRemoveSwitchEntry)0
ダイアログボ ックスの動作 を記述 しているウィ ン ドウプ ロシー ジャの うち AddRevProgDlgProcを説 明す る。 この ウィ ン ドウプ ロシー ジャは図.6,
7の2つのダイアログボ ックスの処理を行 っている。AddRevProgDlgProc は3つのメ ッセー ジWM̲INITDLG,WM̲CLOSE,WMーCOMMAND を処理 している。
[WM̲INITDLG]
この メ ッセー ジは通常 のウィン ドウプロシー ジャのWM̲CREATEと同 様 にダイアログボ ックスが作成 され る時に 1度だけ送付 され るメ ッセージであ
る。 ここでは,まず ダイアログボ ックス内のキー入力を受 け付 けるENTRY‑
FIEI.Dの長 さを設定 し,さ らに「プログラムの変更(R)」のダイア ログボ ック スの場合 は現在のプログラムの情報をENTRYFIELDに設定 している。
[WM‑CLOSE]
システムメニ ューボ ックスの 「クローズ (C)」を選択 した ときに送付 され
MS OS/2PMの プログラ ミングにつ いて 97 るメ ッセージである。 ここではWinDismissDlg関数を呼び出 してダイアロ グボ ックスを破棄 している。
[WM̲COMMAND]
ここではこのメ ッセー ジの送付元がダイア ログボ ックスの一番下の行 にあ る
「追加 (変更)」,「取消」の場合だけ処理を している。「追加 (変更)」の場合, プログラムのデータをバ ッフ ァにコピー して,追加 (Insertf'rogram), ま たは変更 (ReviseProgram )の処理 を行 う。「取消」の場合 はダイア ログボ ッ
クスを破棄す る。
詳 しくは述べないが,「プログラムの追加,変更,削除」の際には EXE ファイ ル,および ICOファイルが指定 したデ ィレク トリにあるか確認 し,ない場合 にはその由を伝え訂正 させ る。追加,変更,削除の度にプログラム リス トをタ イ トルの 1文字 目で ソー トし,その結果を OS2.INI‑書 き込む。 等の処理を
している。
4.おわ りに
PM用のエ レガ ン トで はないが,少 しは実際の役 に立っプログラムを作成 したのでその概要の説明を行 った。利用 したPMの部品は リス トボ ックス と ダイアログボ ックスである。 ウィン ドウプロシージャで処理 しているメッセー ジはまだはんの少 しである。 このプログラムの拡張 として,ヘルプ機能を付 け る,MSOS/ 2の本領であるマルチス レッ ド化を行 う,等が考え られ る。冗 長 と思われ るが,付録 としてソースプログラムを添付 した。
参 考 文 献
[1] PETZOLD,C."PROGRAMMING THEOS/2 PRESENTATION MANAGER",
MicrosoftPRESS,1989
[2] NEC版 「日本語MSOS/ 2ソフ トウェア開発支援 ツール」マニ ュアル
付 録
t辛目 暮春手相 H 幸手幸幸****ささ幸手‡**幸手幸柏手*幸手綿柏孝幸ii柑 *孝幸ヰ幸手i春*‡書春*幸‡幸1*幸‡孝幸‡辛卓**卓
卓
iH手相柑 相手柏 手相 的手車HH‡書手幸+書‡*幸手‡**ii*手書****H i*t*i**H iH i*i柏 iiiH ***綿 i*ii*
*モ ジ ュ ー ル 定義フ ァ イ ル (STARTFUL.DPJF)+
*+**iH H H *****ii的 ***相 対 iiH iH H H
NAMESTARTFULWlNDOWAPI
DESCfHPTl0N'SlartProgramForFullScreenMode(C)TsuneyukiNanekata.1991'
PROTMODE
HEAPSIZE 1024 STACKSlZl三 8192
粥 粥 書手手書ヰ純 絹 手書+書幸手柏 *H H H 手相 +H H 相 手H H H H 幸手‡H 相 を書+iH ‡+辛+手書手書I書手書手手相 柑 柏 相 手書手幸H 書+書手春日 +幸*書手*H 相 手手相 手書++相 手
*H は 幸手書手書手相 手手相 H I書手手相 相 手書目 相 手手書的 H H H H H H H 手書H I糾 書手H I相 手寺‡手相 書手H H iH tH H H H H f幸糾 幸H H 手書H H H 柏 手IH t 粥 H i*H liH H i+H H *+H H 約
手ヘ ッダフ ァイル(STARTFUL.H)辛 車手書柑 ‡書手手相 柑 柏 +H H ‡幸手tH H
#defineV^uD O /書 変 更 不 可 */
#derinctNVALID̲PROGR∧札̲FILE
#define川VALID」和RKDTR Gdefinc川V^LID̲1COJV̲FILE̲
#defincMEN̲ERROR
/書Jr掛事の変更不可 事/ /I連続 していること !/
#defincADD̲DLG̲JITLE ‑プログラムの追加廿
#defineREV̲DLGJ ITLE "プログラムの変更"
#defineTNPUT̲PARAM̲TITLE "パラメータの指定汁
#derinePRG̲NUMBElL̲MAX 32
#dcfineuiNGTt1 256
#derincPRG̲JITLE.̲』^X 60
#derinelDL̲MyuST I
lnUGGOOOnhじRRDn措vp一L。肺SDPじnHUnHU
DREl⁝[;lSlMAleeeee∩∩∩E;e■lrlー■Tl■TleeecLed.Cf也d.du且廿≠井川H一廿丑叩‖# 13
/I(‑256*/
#defineIDD̲ADD̲PROG 20 /*ll鳳 事 の 変 更 不 可 幸/
紬erinelDD̲REV̲PROG 21 /事 連 続 して い る こ と ヰ/
#defineIDD̲ABOUT 22
#defineIDD̲INPUT̲PARAM 23
#definefDD⊥PRGJ ETLE 30
#defiTlelDD̲PRG̲PATHNAME 31
#defineIDI)̲PARAMETER 32 gdefineIDD̲WORKDIR 33
#defineIDD̲FCON̲PAT州AME 34
H H 幸手fI‡書手+柏 手事書手++書手柑 +手書H IH 書手++書手ヰHH 書手‡糾 書‡iH H II相 手書手書手手相 ++i手相 相 手事手書H H H H H H H 書H H H H H H H H 相 *書書手 書手手書手書寺I+IH H 幸手‡手相 柑 ‡幸‡+書‡***H H H 手相 射手*幸‡+*書手HH 書相手書相 柏 書*辛**i+幸手+柑H HH HHHiHH**H iH lH i手書H H 書+手書手相
*H I**H i*+**H H H H iftH
+メイクフ ァ イ ル (STARTFUL)辛 H fH*iH iH **iH *H H H H
sLartful.obj :startfuL c startfuL h cl /Zp /ASw /C /C2S /W3 startrul.c
st,artFul.res : starlful.rc startruI.ico startruI.h rc ‑r startruI
startruJ.c汀e : startruJ.Obj startruLder link startful, /align:16. Nut, os2, SLartful rc ‑cp 932 slartrul.res
startrul.exe : startrul.res rc ‑cp 932 starLrul.res
手書手書ii幸手H I日 章iH H fiH H Hii**相 手書手書幸書手‡書HHH H 手相 手書*+幸HHH H H H H H 手書書手手書相 手書手寺川 柑 *書+手書書相 手H幸手*事H H H幸+書手書 +幸書手幸手幸幸手書手手書H H H H H H ‡ヰ++i卓‡書+手相 柑 相 手‡幸手+書柏 手H H HIHHHH+書HIH H H H iH ++HH H ++手書*柏 手HH H‡書H IHHH H 1H H f*+H IH H H H +村 村 *iH H H +i+
+リ ソ ー ス 定義フ ァ イ ル (STARTFUL RC)I H H +*H H IH H ++相 対 iiH 絹 ++杓 *Il*
#define fNCL̲NLS
#include (os2.h)
#'InClude "startful.h"
POINTER ID̲RESOURCE startfu1.ico