Entry

本日のネット探訪 - SendMessage() のリファラを見て他人を馬鹿扱いするサイトを見てつらつら

2008年12月09日

ふと見つけてしまったこちらから。

プログラミングの能力のないVB/VBA/C#屋はもとより低能MFC屋の大好きな関数である(笑)。これらのバカにとっての永久不滅の定番キーワードでもある(笑)。

(snip)

ところで、Visual C++/MFCを毎日使っていてもSendMessageやPostMessageはほとんど使うことがない。または使う必要がないことが多い。こういうものを使わなければならない状況は非常に少ないということである。SendMessageはたまに使うことがあるが、PostMessageはほとんど使わない。

SendMessage/PostMessageが使える状況ではそれと同等の動作をする関数がMFC関数として用意されているからである。用意されていない場合(たとえばユーザー定義メッセージなど)にはこれを使わざるをえないという程度である。

SendMessage/PostMessageの使い方(MFC WindowsAPI)

デフォルトのメッセージで足りる仕事してるのか,とか思いつつも,読み物としては(いろいろな意味で)面白かった。あたしゃ,割と設計の上でも自分のコーディングの上でも SendMessage() を使うことが多かったりするもんで,ニヤニヤしながらオレ様の愚痴を読ませてもらいました。便利なんだけどなあ……SendMessage()。つか,元々 SDK で Windows プログラミングを始めた人には,ごく普通のやりとりなんで,SendMessage() 自体とりたててどうとかいった仕組みでもない。

SendMessage() の何がいいのか。今さらわざわざ言うことでもないんですけれど,最近の使い出としては,アプリケーション全体の状態を統一的に管理できるところにあるんじゃないかと思っていたりします。

例えば,ユーザのある操作で一度にたくさんのオブジェクトの状態(アプリケーション全体の状態)を変えたい,とかってことがありますよね。お絵かきソフトの例を挙げると,起動時は何も読み込んでないけれど,「開く」のコマンドをユーザが叩いたら,画像を画面に読み込んで,パレットを準備して,ユーザの設定を復元して……とかいった具合に,いろいろなオブジェクトが「開く」に対応する動作を行います。こゆのって,ひとつのメソッドに,関係する全てのオブジェクト(へのポインタ/参照)を持たせて,プロシージャのように作ってもいいんですけれど,オブジェクトの数が増えると限界が出てきてしまいます。最長不倒関数になってしまう。

こゆとき,SendMessage() の hWnd に HWND_BROADCAST を持たせてあげると非常に便利です。特定のメッセージが来た時に「自分がすべきことだけをする」ように実装できるので,責任分担がはっきりする。「データベースから読み終わったら」とか,「ネットの通信が始まったら」とかいった具合に,状態変化のトリガはいくらでもあるので,個人的にユーザ定義のメッセージは必須です。メッセージを連鎖させて Chain Of Responsibility みたいな構造を作ることもできる。

多くの SDK プログラマにとっては,昔からおなじみの SendMessage() だけれど,周りを見ると意外と使いこなしていない感じはします。ま,あたしも他人のこと言えたもんじゃないんですけど。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN