- 締切済み
WM_SIZEを発生させる方法
コントロールを動的に初めて表示させた時にコントロールを ウインドウの大きさに合わせてリサイズさせようと思います。 SendMessageなどを使った2つのパラメータを指定する という方法ではなく、それ以外の方法でWM_SIZEを 発生させる方法を教えてください。 WM_SIZEにリサイズのソースが書いてあるので、ウインドウを 初めて表示させた時にもそれを利用しようとしているところです。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- otu_otu
- ベストアンサー率31% (17/54)
このような場合は、2ステップに分けてプログラムします。 WM_SIZEのハンドラ関数(OnSize)にコントロール配置変更処理を記述するのではなく、まず、コントロール配置関数(例えば、void LayoutCtrls();)を作成してください。これは、現在OnSize関数に記述されている内容をLayoutCtrls()関数にコピーすればOKでしょう。 このような処理関数を作成したら、プログラム中で、LayoutCtrls()を呼び出せば、自動的にコントロールの再配置が行われるようになりますよね。。また、当然、WM_SIZEメッセージが発生したときにもコントロールの再配置を行う必要がありますから、OnSize関数内からもLayoutCtrls()を呼び出します。 以上の仕組みでOKでしょう。 ちなみに、起動時にコントロールの配置を行いたい場合は、 Viewの場合 : OnInitialUpdate関数の末尾 Dialogの場合 : OnInitDialog関数の末尾 で、LayoutCtrls()を呼び出します。
- rabbit_cat
- ベストアンサー率40% (829/2062)
コントロールの初期化時に、WM_SIZEのハンドラ(OnSizeかな)を、自前で呼べばいいと思いますが。
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
WM_SIZEはご存知のとおり、ウィンドウのサイズを変更した(=リサイズした)ときに発生するメッセージですから、サイズを変更せずに発生させるのは普通にはできそうにありません。 本来とは異なるサイズでウィンドウを作成しておき、最初に本来のサイズにMoveWindowしてみては。 もっとも、いろいろ細工を考えるのは勉強にはなりますが「いちばん良い方法」とは言えません。いちばん良い方法は、WM_SIZEだけでリサイズするのをやめて、ウィンドウ作成時にもWM_SIZEなしでリサイズすることです。
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
MoveWindowでウィンドウの大きさを変更すればWM_SIZEは発生します。 SW_SHOW状態でウィンドウの大きさを変更すると、タイミングによってはちらついてしまうと思うので、その場合はSW_HIDEにしてから変更しましょう。
補足
色々やってみましたが、回答していただいたように 親ウインドウを本当にリサイズする方法しかWM_SIZEを 発生させる方法が分かりませんでした。 本当にリサイズする以外によい方法はないのでしょうか? 本当にリサイズした場合はちらつきが目立ちます。 SW_HIDEもやってみましたが、コントロールがちらついて しまいました。ちらつきに関しては頑張ればできそうですが とても大変そうなので、リサイズせずにWM_SIZEが発生する という方法を探しています。