antenn-a
company profile

MFC航海日記 十六日目(ユーザメッセージ)

ここの所、忙しくてまったく手を付けていたかった当ページ・・・本当にすみませんでした。 また、今回から復活しますのでよろしくどうぞ。。。(笑)
と、言ってもただ「遊んでた」分けでは無いのですよ。。。ホントニ。
さて!今まで何をしていたかと言うと・・・・していたかと言うと・・・言うと? まぁ、気にしないで行きましょう!(謎)

前回の最後に次回作品の募集をしましたが、結果は圧倒的に「バックアップツール」でした。皆さんも「いいバックアップツール」が欲しいのですね!残念ながら今の私の実力で「良い」ものができるとは思えませんが、やってみようと思います。お付き合いのほどよろしくお願いします。

まぁ、いつものようにサンプルを作ってみましたが結構面白かったです。ちなみにこのサンプルは動作しませんし、リソースだけと言ってもいいぐらいの出来ですが・・・。


prev

今日のお題はずばり「ユーザメッセージ」です。サンプルのバージョンを重ねていくうちに、「ユーザメッセージ」を用いないとどうしようも無い状況になったので使ってみました。この「ユーザメッセージ」を分かっていらっしゃらない方もいるのでは?と言う事ですね。当たり前ですが、分かってる方はこんなページ「飛ばしてください」。

皆さんもご承知の通り、Windowsは「メッセージ駆動方式」または、「イベント駆動方式」で処理されています。「イベント・ドリブン」なんて言葉を聞いた事がある人も居ると思います。Windowsでは、「メッセージ」と呼ばれるパケットのようなものを投げては受け取り、投げては受け取りやってます。

つまり、メッセージを理解しないと本当に理解したとはいえないのでは無いでしょうか?Windows-ProgrammingをVisual C++から始めた人は分かりづらいかも知れませんが、知らないところでメッセージはビュンビュン飛んでます。 例えば、「マウスが動いた」とか、「ボタンが押された」とかですね。 Windows上で見えている(動いている)場合すべてメッセージが飛ぶ仕組みになってます。

当然、投げたものを受け取る部分も用意されています。

BEGIN_MESSAGE_MAP(CGenerationDlg, CDialog)
  //{{AFX_MSG_MAP(CGenerationDlg)
    // メモ - ClassWizard はこの位置に
    マッピング用のマクロを追加または削除します。
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()
このような部分を見た事が有ると思います。ここがメッセージの受け取り場所です。メッセージを受け取った後、必要な関数に飛びます。

さて、では「ユーザメッセージ」とは何でしょうか?それは、自前で飛ばすメッセージです。CButtonや他のMFCコントロールは内部で処理されていますので、別に気にしなくても良かったのですが、突如必要になる場合が有ります。今回、必要となったのは「ティップス」の部分でした。


prev


動作画面

ボタンの上にカーソルを持っていくと、用意されているスタティックテキストにそのボタンの意味を表示するプログラムを書こうとしたのです。 よく見かける黄色いWindowと同じなのですが、もっと単純です。右に動作画面を載せました。この様なプログラムを書こうと思った場合、皆さんならどうするでしょうか?

やってみれば分かるのですが、ダイアログの「WM_MOUSEMOVE」はコントロールの上まで感知しません。つまり、ダイアログの「WM_MOUSEMOVE」イベントを取得していても、マウスがどのボタンの上に居るか分からないのです。 この問題を回避するためには2段階の処理が必要です。 まず、●自前のボタンのクラスを作る事。●そのクラスの中の「WM_MOUSEMOVE」イベントを取得する事です。
こうすれば、ボタンの上にマウスが有る事が分かります。クラスの作り方は、クラスウィザードで「クラスの追加」ボタンを押して、「新規」を選びます。次に、クラス名を入力して、基本クラスを選びます。今は「EButton」というクラス名にします。余談ですが、これはクラスを作ったのが私(榎本)なので、「EButton」です(笑)今の場合「CButton」を選べば良いでしょう。こうすると、クラスが作成されて、プロジェクトに追加されます。


prev

次に、ダイアログのヘッダファイルの中にある「CButton BtnTest」等の、オブジェクトをすべて「EButton ・・・」に変更します。これで、自分の作ったボタンクラスのオブジェクトになります。こうしておけば、「EButton」の「WM_MOUSEMOVE」でイベントを取得する事ができます。
次に起こる問題は、イベントを取得したときにどうやって親ダイアログに通知するかです。やりたい事は、親のダイアログ上に有るスタティックテキストに表示したいのですから、親のオブジェクトをいじりたいわけです。そこで登場するのが「ユーザメッセージ」です。親のダイアログに向けて「マウスがボタンの上にあるよぅぅぅ」というメッセージを投げてあげればいいわけです。
今回はここまでにして、続きは次回に書きます。次回は実相方法を解説します。


antenn-a

prev next


antenn-a