antenn-a
company profile

MFC航海日記 五十五日目(子ダイアログ上でのホイール動作)


大分形になってきた様な錯覚に捕らわれがちな昨今、皆さんいかがお過ごしでしょうか。
今回はスクロールバーです。
はぁ?って方はご容赦を。
何か、このスクロールバー君に蹴躓いて、異様にハマっちゃったんですよ、恥ずかしながら。
何にハマったかって、ホイール君で、制御が最初ワケわかめだったんですわ。

prev


まず、最初に何にハマったって、アレですよ、イベント取れなかったんですよ。
OnMouseWheel()とかいうイベント関数がご丁寧に用意されてるんですが、これがまた、うーん。
何か知らないけど反応しないんですね。
現在の構成は、前にも話しましたが、SDIの上に実装してて、SDIの上にメインのダイアログを貼り付けて、その更に上に小さいダイアログをメニューの下に貼り付けてるんです。
で、どういう挙動かというと、メインのダイアログ上のホイールイベントが全然取れなくて、Viewで取ると、取れたり取れなかったりするわけです。
これがまた、意味不明で、メインのダイアログの上に張ってるダイアログ上でクリクリすると、Viewで反応するんですよ!
でも、メインのダイアログだと駄目なんです。ダイアログでOnMouseWheel()しても駄目だし。
これが悔しくてハマりにハマったワケです。
で、やっと分かったんですよ。原因が。
それは、、、BORDERを「ダイアログ枠」にしてなかったからなんです!
は〜!?
そうなんですよ。こいつを「なし」にすると、イベント取れないんです。
意味わかんねー!
で、しかも、しかもですよ!
「なし」にしていると、スクロールバーの上でクリクリしたのが OnVScroll()イベントに引っかかるんですけども、コレがまた、クリクリするたびに WM_LINEDOWNとかWM_LINEUPなんかが4回呼ばれるんです!
今回はUI的に、2行ずつ上げ下げさせたいのに、強制的に4回来るので回避不能!
設計間違ってるだろがあ!と言いたくなるわけですよ。
なので、皆さん。SDIとかにダイアログを張ってその上でクリクリしたい場合はBORDERを「ダイアログ枠」にして、TITLE BARを「FALSE」に、そしてSTYLEを「子」にしましょう!
じゃ無いと、クリクリでハマリまくります。
はー疲れた。


antenn-a

prev next


antenn-a