antenn-a
company profile

MFC航海日記 六十二日目(Staticでクリックしたかの様な挙動の実装)


題名見て「ぷっ」って笑っちゃう人も居るかも知れない。
そんなの Click Event を作れば良いだけでしょ?ってちょっと違うのです。
ダイアログ等に Static を貼り付けた時に、Click Event で取得するタイミングと、その他のコントロールでは挙動が違うんです。
何が違うかって、Static の場合は ボタンの押下で反応し、その他のコントロールは ボタンを離した時に反応するんです。
かつ、離された時の挙動も少し有って、例えばボタンが三つ横に並んでいるときに左のボタンで押してドラッグして、右のボタンでリリースすると、当然押されなかった事になりますよね?
こういうのを実装してみようかなと。
今作っているPicture Albumの場合は写真を表示している所が Static なので、ここに実装しようと思います。

prev


まずは、CStaticを継承した新しいクラスを作ります。
VC7の場合は 「プロジェクト」 - 「クラスの追加」- 「MFCクラス」で、親クラスをCStaticにして作成します。
例として仮に EStatic とします。
リソースエディタでStatic コントロールを作成し、NotifyをTRUEにしましょう。
この EStatic に WM_LBUTTONDOWN, WM_LBUTTONUP のイベントを作ります。
やりたい事を実装する為には、親にコントロールして貰うのが簡単なんだろうか。
自身のコントロールからマウスポインタが居なくなった、というイベントが取れれば一番楽なのだが。
随分前に紹介したユーザメッセージのやりとり方法で実装するとイベント関数内で
GetParent()->SendMessage( MSG_LBTNDOWN_ON_STATIC, m_ControlNumber );
等で、親に押下された事や開放された事を伝えることが出来る。
尚、第一引数は
#define MSG_LBTNDOWN_ON_STATIC WM_USER + 1
等と、宣言しておく必要が有る。
また、第二引数も同様に int m_ControlNumber という感じで宣言しておく必要が有る。
何に使うかというと、押されたコントロールと、話されたコントロールが同じかどうかを見るためで、親側でハンドリングを行う。
親側では DefWindowProc()をオーバーライドし、message 変数をチェックしながら MSG_LBTNDOWN_ON_STATIC を監視すれば良い。
押されたメッセージが来たら、押された番号を記憶して置き、離されたメッセージが来たら同じかどうかをチェックする。
また、他のコントロールから押されたメッセージや離されたメッセージが来たら無視すれば良い。

prev


今回のサンプルはここからダウンロード出来る。
ま、ちょっとしたTIPSみたいな物ですね。


antenn-a

prev next


antenn-a