処理 - みる会図書館


検索対象: API散歩道 上
61件見つかりました。

1. API散歩道 上

躬 5 章 MDI の作り方 ■ワタソン「そんな機能が必要なのかい ? 」 る機能がある」 ▽ホラムズ「次は , WM_MDISETMENU だ。フレームウインドウのメニューを差し替え マホラムズ「とくに , 最小化で特殊な処理は必要ないからだろうね」 ■ワタソン「なるほど」 ると , こんな感じかな ? ( リスト 1) 」 マホラムズ「とりあえず , メッセージループの中で , これを呼び出すこと。一例をあげ ■ワタソン「それはなんだい ? 」 ▽ホラムズ「説明しなければならない API がもうひとつある。 TranslateMDISysAcceI だ」 第ワタソン「そうなのか。それなら覚えておくよ」 るということだから , 面倒に見えても , こっちのほうが結果的には楽なんだ」 マホラムズ「渡さなければならないということは , その分だけ処理を肩代わりしてくれ ■ワタソン「なんか面倒くさいな」 WM_SYSCOMMAND を渡してやらないとならない」 INFO, WM MENUCHAR, WM_MOVE, WM SETFOCUS, WM SIZE, MDIChildProc の場合は , WM_CHILDACTIVATE, WM_GETMINMAX ホラムズ「自分の処理のあとで , DefFrameProc を呼び出すようにする。それから , Def ■ワタソン「自分のウインドウ関数でも , それを処理したい場合は ? 」 ないといけない」 を処理しているから , これらのメッセージはちゃんと DefFrameProc に渡さ は , WM_COMMAND, WN MENUCHAR, WM SETFOCUS, WM SIZE ウインドウは , DefMDIChildProc を使う。注意点としては , DefFrameProc DefWindowProc の代わりに DefFrameProc を使わなければならない。 MDI 子 マホラムズ「使い方は , ずばり DefWindowProc と同じだ。フレームウインドウは , ■ワタソン「ふむふむ。 DefWindowProc みたいだね」 DefFrameProc と DefMDIChiIdProc だ」 ホラムズ「ほかに , 数少ない MDI 用の API もあるよ。これを解説しておこう。まずは , ■ワタソン「よし , これで全部だな」 インドウ ] メニューの [ 並べて表示 ] で使うための機能だね」 使い方は WM_MDIICONARRANGE や WM_MDICASCADE と同じだ。 [ ウ マホラムズ「では , 最後は WM_MDITILE0 MDI 子ウインドウを < 並べて表示 > する。 ■ワタソン「あ , 本当だ。全然違うメニューになるぞ」 べてみたまえ」 ューが変わるだろう ? 普通のスプレッドシートのときとグラフのときを比 マホラムズ「 Excel なんかだと , アクテイプな MDI 子ウインドウの種類によって , メニ

2. API散歩道 上

第 4 章 イネープル フォーカス、 アクティフ . マホラムズ「どんなメッセージがきても , ほとんど瞬時に処理が終わらないか ? 」 して , 次のメッセージを取ってくるために GetMessage という API を呼ぶ。 マホラムズ「メッセージの処理が終わると , プログラムはメッセージループに戻る。そ たいていあっという間に終わる処理だな」 ■ワタソン「ダイアログボックスを出したりする処理はすぐには終わらないが , ほかは 第ワタソン「なんだって ! ? 」 同時に , ほかのタスクに切り替える機能もあるんだ」 マホラムズ「 GetMessage は次のメッセージがくるまで待っている API なんだが , それと そうだね ? 」 ちなみに ワタソン「うーん」 GetMessage のほかに , PeekMessage や Yield などの API も , タスクを切り ■ワタソン「ああ , なるほど・・ GetMessage を呼んでいるからさ」 マホラムズ「ダイアログボックスの API の中にもメッセージループがあって , その中で んだ。それでも時計は動いているよ」 ら , それが閉じるまでウインドウ関数からリターンしないように書いてある ■ワタソン「知らなかったよ。うーん , でもおかしいぞ。ダイアログボックスを開いた かのタスクの実行を許していたんだな」 マホラムズ「つまり , 君の作ったプログラムはメッセージをひとつ処理するたびに , ほ のメッセージループの中でタスク切り替えが発生します。 MessageBox も同じです。 API の中にダイアログボックスのためのメッセージループがあります。そのため , こちら 替えてしまう機能をもっています。ほかに , DialogBox などの API を使った場合 , この ほかのプログラムが動かなくなってしまうし , うーん , うーん」 ■ワタソン「あ , そうか。うーん , 難しいなあ。自分がずっと実行権をもっていたら , てくれると思うかい ? 」 ってこないんだよ。そう調子よく , 1 秒ごとになにかしらのメッセージがき マホラムズ「だって , メッセージがこない限り , 君のプログラムには動くチャンスが回 第ワタソン「なぜだい ? 」 ・「残念ながら , 時計はここまでの知識では作れないよ」 ■ワタソン「これで解決だね。今度は時計でも作ってみようかな」 マホラムス マホラムズ「 SetTimer という API を使って , ■ワタソン「タイマメッセージ ? 」 ホラムズ「そういうときは , タイマメッセージを使うのさ」 一定時間ごとにメッセージを送ってくるよ

3. API散歩道 上

第 6 章 バックグラウンドで走れ ■ワタソン「 WM_QUIT ? 」 FALSE になるから , 必要ならそれもチェックする必要があるね」 マホラムズ「ただし , 途中で WM ー QUIT メッセージに出合うと GetMessage の戻り値が ワタソン「こう書けばいいのか」 DispatchMessage( &msg ) ; TranslateMessage( &msg ) ; GetMessage( 中略 ) ; if( b ) { b = PeekMessage( 中略 ) ; BOOL b ; MSG msg ; void MessageGaAttaraYare( void ) には , TransIateMessage がセットだから , こう書く」 マホラムズ「つまり , DispatchMessage API を呼び出すということさ。 DispatchMessage ■ワタソン「メッセージを処理するって , どういうことなんだよ」 マホラムズ「これじゃあ , メッセージを取り出しただけで , それを処理していないよ」 GetMessage( 中略 ) ; if( b ) { b = PeekMessage( 中略 ) ; BOOL b ; MSG msg ; void MessageGaAttaraYa 「 e( void ) ■ワタソン「それじゃあ , こうかな ? 」 値で , メッセージがきているかどうかはすぐにわかるよ」 マホラムズ「メッセージがきていたらそれを処理してやらないと。 PeekMessage の戻り

4. API散歩道 上

の代わり , そのアプリケーションのもっている機能をより深く利用すること ができるわけだ」 ■ワタソン「なるほど。アプリケーションごとに調べないと使えないということは , そ のアプリケーションだけの固有の機能も使えるってことだね ? 」 マホラムズ「そのとおり」 ODDE メッセージのお約束 ・「ここで , DDE のメッセージを交換するときのお約束を説明しよう」 マホラムス 「約束 ? SendMessage を使っちやダメなの ? 」 ■ワタソン マホラムズ「その場合もある。 DDE のメッセージを送るとき , WM_DDE_INITIATE を 送るときは , SendMessage を送らなければならない。しかし , それ以外の DDE メッセージは , P 。 stMessage を利用しなければならない」 新ワタソン「それはまた , どうして ? 」 マホラムズ「 DDE のメッセージを出したとしても , それが即座に処理されるとは限らな いからだよ。もし , DDE のサーバが通信ソフトでクライアントが 3 次元グラ フソフトで , データを更新してグラフを描き換えるのに 1 秒かかるとしよう」 第ワタソン「あ , それはまずいよ。 1 秒も通信ソフトに制御が返ってこなかったら , 文字 が落ちてしまうかもしれない」 マホラムズ「だろう ? だからメッセージは PostMessage を使って相手のキューに入れ ておけば , 送った側はそのまま処理を続けることができる」 ■ワタソン「なるほど」 ▽ホラムズ「もちろん SendMessage を使って , メッセージを送っている最中のアプリケ ーションでも , さらにスタックをネストさせてメッセージを処理することも あるけれど , それではスタックを深く消費してしまうし , キューに入ったま まのメッセージも取り出されない。これは非常にまずいことだからね。だか ら p 。 stMessage を使う決まりになっている」 ■ワタソン「でもさ , もし相手側がメッセージを取り出してくれなかったら ? いや , 取り出しても無視して捨ててしまったら ? いったいどうなるの ? 」 マホラムズ「うん。いい質問だね。 p 。 stMessage を使うとリターン値をもらうことがで きないから , 実際にそのメッセージが処理されたかどうかを確認することが できない。だから , DDE のメッセージを受け取った場合 , 受け取った側は WM_DDE_ACK というメッセージを送り返すことになっている。 ACK とい うのは , AcknowIedge の略だ。 このメッセージで確かにメッセージを受け取 ったこと , そしてそれが正常に処理されたか工ラーになったかをメッセージ 。第 9 章 D D E と通信の話

5. API散歩道 上

' 第 4 章 イネーフル フォーカス . アクティフ . 0 ワタソン「うんうん , そうだった」 マホラムズ「そのとおり。だから UpdateWindow は省略してはいけないというわけだ」 ドウをクリックしてしまうことになるな」 ■ワタソン「それはユーザーがクリックしたかったウインドウじゃなくて , 別のウイン ら ? 」 こに別のウインドウがあることに気づかず , そこをクリックしてしまった ウインドウというのがシステムの中に存在するわけだ。もし , ユーザーがそ マホラムズ「場合によってはね。そのときは , そこに存在するのにまだ描かれていない ■ワタソン「そんなに遅れるのか ? 」 いい。でも , 場合によっては数秒以上遅れて処理されるかもしれない」 マホラムズ「いまみたいに行列が空いていて , 時間のかかる処理が動いていないときは WM_PAINT が送られて , 結局は描かれるんだろう ? 」 ■ワタソン「でも , メッセージの待ち行列にあっても , ちょっと待っていればいつかは れを使うと即座にウインドウを画面上で見ることができる」 UpdateWindow という API は , WM ー PAINT を強制的に処理させるんだ。 ら , できるだけ行列の後ろになるように回されてしまう。しかし ▽ホラムズ「ところが , WM_PAINT はなるべく一度にまとめて描いたほうが有利だか セージだ」 ■ワタソン「ああ , 知っているよ。 WM_PAINT メッセージなら。ウインドウを描くメッ ジを待ち行列に入れる」 Window でウインドウを見える状態にすると , WM—PAINT というメッセー マホラムズ「これは , 処理を待っているメッセージの数とも関係があるんだ。 Show ■ワタソン「なんか同じようにしか見えないんだけど。どこか変わったのかい ? 」 ソースを書き換えて , コンパイルしているようです。 ■ワタソン「やってみようカ すホラムズ「もし , この UpdateWind 。 w がなかったらどうなるだろう」 なにやら , グボックスの項目をグレイにする機能をつけてみるよ」 ■ワタソン「うん。わかったよ。よし , これからワタソンスーパーツールに マホラムズ「今日は , 基礎的でつまらなかったかもしれないが , 結構大事なことだから こいつは注意が必要だな」 ■ワタソン「なるほど , そういうわけか ! ダイアロ

6. API散歩道 上

れ洋第 9 章 D D E と通信の話 マホラムズ をワタソン「うんうん。問題ないじゃないか」 ね。つまり 110 万円だ」 プログラムは君の残高 10 万円を取り出して , それに 100 万円を足すわけだ ホラムズ「ちょっと待ちたまえ。プログラムがファイルに 10 万円を足した 1 10 万円の 残高を書き込む前に , 君が 1 万円を自分の口座に入金したとしよう」 ■ワタソン「 1 万円ね。ときどき公共料金の引き落としの直前にお金が足りなくて , 足し ておいてやることがあるんだよなあ」 マホラムズ「そうすると , 別のマシンの別のプログラムがそれを処理するわけだ。しか し , ファイルにはまだ残高 10 万円と書かれたままだから , 10 万円を取り出 して , 1 万円を足して , 1 1 万円とするわけだ」 ■ワタソン「うん , まあ , そうなるよな」 ホラムズ「その間に , ポーナスのほうが処理されて , ファイルに 1 10 万円が書き込ま ■ワタソン「うんうん , ポーナス入金だ ! うれしい」 マホラムズ「ところが , その直後に君の入金を処理したプログラムが , ファイルに 1 1 万 円を書いてしまうわけだ。つまり残高は 1 1 万円だ」 ■ワタソン「やや。僕のポーナスの 100 万円はどこにいったんだ ? 許せないぞ」 マホラムズ「つまりね , この例でいいたかったことは , 複数のプログラムから参照でき るデータは , 変数でもファイルでも , アクセスが衝突すると危険だってこと れるわけだ」 ■ワタソン「僕のポーナス・・・・・・。消えてしまった」 ホラムズ「だから , 実際にはそういうことはないんだ。レコードロックといってね , 処理中のデータに印をつけて , ほかのプログラムからは参照できないように してしまう仕組みがあるんだ」 ■ワタソン「ほっとしたなあ , もう」 マホラムズ「ところが , そこにも問題があるんだ」 ーワタソン「え ? え ? また消えるの ? 」 マホラムズ「そうじゃない。データをロックしてしまうと , 当然だけどほかのプログラ ムからもアクセスできないわけだ。つまり , 扱いたいデータがロックされて いたら , ロックが外れるまでひたすら待っしかない」 ワタソン「うん。だけど , それが問題なのかい ? 」 「銀行の口座なら , 特定の口座の内容に変更がかかるのはひと月に数回だか ら , ロックしてもそれほど問題ないと思う」 ■ワタソン「そうだよね」 マホラムズ「でもね , もっと頻繁にデータが書き換わるときはどうだろう。例えば , コ

7. API散歩道 上

見落としやすい穴霻 ☆ / ヾステル ☆ / ヾステル マホラムズ ■ワタソン マホラムス ■ワタソン ☆ノヾステ丿レ ☆ / ヾステル 「あー , 本当だ。よく考えてあるんですね」 マホラムズ「 Windows の API は , 難しそうに見えるけれど , そうじゃない。難しい処理 を簡単にできるようにするために こういうスタイルになっているんだ。 API の背景にある考え方が見えてきて , 処理の流れが実感できるようになれば , MS-DOS レベルのプログラミングよりもずっと楽ができるわけだ」 「はい , そうですね。結局 , ウインドウの中を描画するルーチンは , WM ー PAINT に応答するルーチンひとつですみそうだし。結構プログラムの 内容がすっきりしますね」 「そうだね」 「 lnvalidate(h ワタソン , NULL, FALSE) ! 」 「 UpdateWindow(h ワタソン ) ! 」 「もう , 終わったんだけど・・ ■ワタソン「これで , 僕も復活だあ ! 」

8. API散歩道 上

ネットワークの落とし穴・ 3 、 の変数なんて作れるわけがないよね。違うバスにつながった , 違うメモリを マホラムズ「そう。だけど別のパソコン , 別の CPU なら , 両方からアクセスできる共通 利だろうね」 0 ワタソン「ああ , わかったぞ。そういうふうに仕事をしている人たちには , すごく便 ているとしたら」 とそれを公表する書類を作る係が別の人で , しかも別のパソコンで仕事をし みんなで仕事をしているときには便利だと思わないかい ? データの整理係 使っているんだから」 ■ワタソン「確かにそれはそうだ。うん , やつばり通信しないとダメなのか」 ここにもうひとつの話があるんだ。ワタソンのアイデアは , マホラムス マホラムズ「だけど , それ ほど外れてないよ」 ■ワタソン「というと ? 」 ▽ホラムズ「共有変数は作れないけど , LAN の仮想ドライプの機能を使えば , 簡単に共 有できるファイルを作ることができるわけだ」 ■ワタソン「あ , なるほど。それは実現できそうだ」 プリケーションが作られてきたわけだただ無秩序に複数のマシンからア ・「事実その方法を使って LAN 上で複数のコンピュータでデータを共有するア ■ワタソン「教えてくれよ。とんでもないことって , いったいどういうことなんだい」 マホラムズ「そうだよ。とんでもないことになるんだ」 ■ワタソン「おかしくなる ? 」 クセスされるとデータがおかしくなる可能性がある」 / 、・ 0 ネットワークの落とし穴 たときにファイルから残高を取り出して , それに入金された金額を足してフ ホラムズ「例えばね , 銀行の口座を処理するプログラムを考えてみよう。入金があっ ■ワタソン「そんなにもらえるわけないよ」 v ホラムズ「じゃあ , 金額は 100 万円としよう」 ワタソン「な・い・しよ」 マホラムズ「いくらもらったんだい ? 」 ■ワタソン「ポーナスか」 マホラムズ「ところがだよ。ちょうど君の会社からポーナスが振り込まれたとしよう」 第ワタソン「うん。簡単じゃないか。バグがなければ , ァイルに書き戻すというプログラムだ」 そのまま動くんじゃないか ? 」 マホラムズ「まあまあ , 例えばだよ。それで , 口座には 10 万円が入っていたとしよう。

9. API散歩道 上

自由に描画する 2 つの方法・ゞ アプリケーションのほうでは使う必要 ☆ / ヾステル ☆ / ヾステル ☆ / ヾステル ☆ / ヾステル マホラムズ ☆ / ヾステ丿レ ☆ / ヾステル ☆ノヾステル ☆ / ヾステル ☆ / ヾステル ☆ / ヾステル ☆ / ヾステル 「 InvaIidateRect とか ValidateRect は , がないってことですよね」 ホラムズ「いやいや , そんなことはないさ」 「じゃあ , どんなときに使うんですか ? 」 v ホラムズ「君はいま , 動く絵を表示するプログラムを作ろうとしているよね」 「はい , そうです」 マホラムズ「それで , GetDC と BeginPaint の両方を使おうと思っている」 「そうですけど・・ 。いままでの説明だと , そういうことですよね」 「いや , 第 2 の方法があるんだ。それも , もっと楽な方法が」 「どんな方法ですか ? 教えてください」 マホラムズ「君が考えている方法だと , WM_PAINT メッセージがきたときには BeginPaint で hDC を取得して描画し , その場で絵を変えたいときには GetDC で hDC を取得して描画するわけだよね」 「そうです」 マホラムズ「そうすると , 同じような処理をするルーチンを 2 つ組み込む必要があるわけ だ。 GetDC 版と BeginPaint 版と」 「そうなりますね」 マホラムズ「これは無駄だと思わないかい ? 」 「共通部分をサプルーチンにします」 マホラムズ「そこなんだ。サプルーチンだとかそんなことをしなくても , Windows のメ ッセージシステムを知っているともっと楽な方法があるんだよ」 「教えてください ! 」 ホラムズ「 InvalidateRect を使うんだ」 「どう使うんですか ? 」 v ホラムズ「描き換えたい場所を 1nva1idateRect で指定すると , そこが無効化された領域 になる。それによって , 自動的に WM_PAINT がポストされて , 再描画が発 生するわけだ。そうすれば GetDC を使ったルーチンは不要になるね。どちら のケースも BeginPaint を使ったルーチンで処理できる」 「確かにそうですけど , その方法だと再描画されるタイミングが遅くなって しまいます」 ▽ホラムズ「だから , InvalidateRect のすぐあとに UpdateWindow を呼び出すわけさ」 ☆パステル「 UpdateWindow って , その場で WM ー PAINT を処理する API ですよね。そっ か , そうすれば即座にウインドウに描画されますね」 ホラムズ「そのとおり。パステル君は賢いなあ」 ■ワタソン「どうせ , 僕なんか。しくしく」

10. API散歩道 上

まだある注意点朝 0 まだあるラ嶂点 0 ワタソン「ふむふむ」 住ワタソン「ほかに注意点はあるかい ? 」 マホラムズ「それでは , アトランダムに注意点をあげてみよう。まず WM_TIMER メッ セージがある場合だ」 ワタソン「タイマメッセージだね ? 」 マホラムズ「 PM_NOYIELD の指定があっても , 無視されてしまう。タイマメッセー はそれこそ , 時間どおりが命だからしかたがないね」 ■ワタソン「なるほど。まあ , タイマメッセージならしかたがないか」 ン マホラムズ「第 2 引数にウインドウハンドルが指定された場合 , その子ウインドウや孫ウ インドウなども対象に含まれてしまう」 ■ワタソン「なるほど。ウインドウといっても , 子ウインドウを貼りつけて一見ひとつ のウインドウに見えるけど , そうじゃないっていうのもあるからね。いいか もしれない。でも , 子ウインドウじゃなくて , そのウインドウあてのメッセ ージだけを受け取りたいときはどうしたらいいんだろう」 マホラムズ「まず , PM_NOREMOVE の PeekMessage でメッセージを調べる」 。「そして , PeekMessage に引数として渡した MSG 構造体の中の hwnd メンバ ーを調べれば , どのウインドウにあてたものかがすぐにわかる」 ■ワタソン「あ , そんなことができるわけ ? MSG 構造体つてプラックポックスだとば かり思っていたよ」 ▽ホラムズ「中を参照してはいけないという決まりはないよ。で , もし目的のウインド ウあてのメッセージなら , 今度は PM_REMOVE つきの PeekMessage か GetMessage でメッセージを取り出して , これを処理すればいいのさ」 ■ワタソン「なあるほど」 マホラムズ「じゃあ , 次の注意。 PeekMessage を使っていても , WM_PAINT メッセージ は処理されるまではキューから取り除かれない」 「ええ ? それじゃあ PeekMessage ではウインドウの書き直しはできないわ けか ? それは困るなあ」 マホラムズ「そうじゃないよ。処理されるまでは取り除かれないだけさ」 「え ? 違うの ? 」 ホラムズ「 DispatchMessage でウインドウ関数に送って描画してやれば , ちゃんと WM_PAINT はキューからなくなってくれるわけさ。だから , 普通にプログ ラムを書いているときには , 気にしなくて大丈夫だよ」 ■ワタソン ■ワタソン マホラムス