• 締切済み

WM_SIZEを発生させる方法

コントロールを動的に初めて表示させた時にコントロールを ウインドウの大きさに合わせてリサイズさせようと思います。 SendMessageなどを使った2つのパラメータを指定する という方法ではなく、それ以外の方法でWM_SIZEを 発生させる方法を教えてください。 WM_SIZEにリサイズのソースが書いてあるので、ウインドウを 初めて表示させた時にもそれを利用しようとしているところです。

  • A__
  • お礼率59% (194/328)

みんなの回答

  • otu_otu
  • ベストアンサー率31% (17/54)
回答No.4

 このような場合は、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)
回答No.3

コントロールの初期化時に、WM_SIZEのハンドラ(OnSizeかな)を、自前で呼べばいいと思いますが。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

WM_SIZEはご存知のとおり、ウィンドウのサイズを変更した(=リサイズした)ときに発生するメッセージですから、サイズを変更せずに発生させるのは普通にはできそうにありません。 本来とは異なるサイズでウィンドウを作成しておき、最初に本来のサイズにMoveWindowしてみては。 もっとも、いろいろ細工を考えるのは勉強にはなりますが「いちばん良い方法」とは言えません。いちばん良い方法は、WM_SIZEだけでリサイズするのをやめて、ウィンドウ作成時にもWM_SIZEなしでリサイズすることです。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

MoveWindowでウィンドウの大きさを変更すればWM_SIZEは発生します。 SW_SHOW状態でウィンドウの大きさを変更すると、タイミングによってはちらついてしまうと思うので、その場合はSW_HIDEにしてから変更しましょう。

A__
質問者

補足

色々やってみましたが、回答していただいたように 親ウインドウを本当にリサイズする方法しかWM_SIZEを 発生させる方法が分かりませんでした。 本当にリサイズする以外によい方法はないのでしょうか? 本当にリサイズした場合はちらつきが目立ちます。 SW_HIDEもやってみましたが、コントロールがちらついて しまいました。ちらつきに関しては頑張ればできそうですが とても大変そうなので、リサイズせずにWM_SIZEが発生する という方法を探しています。

関連するQ&A

  • WndProc( ) の UINT に msg を送る

    WM_KILLFOCUS とか WM_SIZE を送るにはどうしたらいいんですか? 例えば、リサイズしたら case WM_SIZE: のソースを実行できるけど リサイズしていないのに case WM_SIZE: のソースを実行させたい 場合はどうしたらいいのかを知りたいです。

  • SendMessage(hW,WM_CREATE,0,0);を

    SendMessage(hW,WM_CREATE,0,0); を実行するとシステムがWM_DOWNやWM_CHARを発行しなくなるみたいです というのはそれ以降キー入力を無視するようになるのです いったんアプリをアイコン化してウィンドウ化するとWM_DOWNやWM_CHARを発行するようになります WM_CREATEを送ってもWM_DOWNやWM_CHARを発行しなくなるのを阻止するために何か方法はないでしょうか?

  • リンク先のウィンドウサイズを指定し、リサイズできないようにする方法

    JavaScript初心者です。 教えていただきたいことは・・・・ イメージで作成したボタンにリンクを張って 指定のHTMLが開くようにしてあります。 このとき、リンク先のHTMLのウィンドウサイズを指定し なおかつリサイズできないようにしたいのです。 このようなコントロールが可能であれば 書き方を教えていただけませんか。 よろしくお願いします。

  • WinAPIにてWM_SIZE以外の方法で最大化を検出したい

    環境:WinXP, VS2005 WinAPIでウィンドウプロシージャのWM_SIZEメッセージを使えば 最大化状態などウィンドウの状態を調べることができますが、 プロシージャを直接使わないでするような方法はあるのでしょうか?

  • SC_SIZEがわからない

    理由がわかりません。 教えてください。 SendMessage(hWnd,WM_SYSCOMMAND,SC_SIZE+1,0); としたらウィンドウサイズを左向きを伸ばし、変更が出来るみたいです。 SC_SIZE+2で右、 SC_SIZE+3で上、 SC_SIZE+4で下・・・、ではなくなぜ左上にサイズ変更になるのでしょうか? あと、この1から4の数字がdefine定義されているのならばそれも教えてください。

  • VC++でCtrl+Vを操作させたい

    VC++のプログラミングで、他のアプリケーションを操作するものを作っているのですが、そこでテキストスペースにCtrl+Vでの張り付けを操作させたいのですが、うまくいきません。 SendMessage(hWndSysLV, WM_KEYDOWN, VK_CONTROL, 0); SendMessage(hWndSysLV, WM_KEYDOWN, 0x56, 0); SendMessage(hWndSysLV, WM_KEYUP, VK_CONTROL, 0); SendMessage(hWndSysLV, WM_KEYUP, 0x56, 0); では不可能なようなのですが、何か方法がありましたらアドバイスいただけるとありがたいです。

  • WM_NCLBUTTONUPについて

    タイトルバー上でのマウスボタンのアップを検出したいので、 WM_NCLBUTTONUPメッセージを拾うために、単純に以下のようなコードを書きました。 が、このコードではうまくWM_NCLBUTTONUPメッセージを拾えません。 ウィンドウを最大化しているときは問題なくメッセージを拾えるのですが、 それ以外の時(縮小表示)はメッセージを拾えません。 ただ、WM_NCLBUTTONDOWNは正しく拾うことができました。 ウィンドウが縮小表示になっている時にWM_NCLBUTTONUPを取得する場合には何か特殊な処理が必要なんでしょうか? ご存知の方がいらっしゃったら、よろしくお願いします。 // ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_NCLBUTTONUP: MessageBox(hWnd, "UP", "LBUTTON", MB_OK); return 0; case WM_DESTROY: // ウインドウが破棄されたときの処理 PostQuitMessage(0); return 0; default: // デフォルトの処理 return DefWindowProc(hWnd, message, wParam, lParam); } }

  • WM_KEYDOWN が拾えない(EditBox関連)

    メインとなるウィンドウ(親)のクライアント領域に子ウィンドウを貼り付けそこにデータを表示させています。内容的にはエクセルのような表形式になっていてセルを選択でき、方向キーで選択を移動できます。 移動は子ウィンドウでWM_KEYDOWNが拾えなかったので親ウィンドウでWM_KEYDONWを子ウィンドウにSendMessageして子ウィンドウで処理させています。このやり方に少々疑問も感じますがとりあえずここまでは期待通りに動いてくれています。 ここからが問題なのですが、データを修正する時に子ウィンドウにEditBox(孫)を作成し直接入力できるようにしましたが、入力が終わりエディットボックスを破棄した後、以前のように方向キーでの移動が出来なくなってしまいました。親ウィンドウでWM_KEYDOWNを拾えていないようです。でも、最小化などにより一度親ウィンドウがフォーカスを失うと再び正常に戻ります。 EditBoxはサブクラス化してリターンキーで閉じるようになってます。 良い解決方法がありましたらお願いします。 環境:VC++6.0(SDK) WindowsMe

  • ウィンドウサイズの固定(変更できなくする)

    ウィンドウサイズの指定(resize to)は出来るのですが、リサイズしたウィンドウサイズを固定して変えられない様にするにはどうしたらいいのでしょうか? すみませんが解る方お願い致します。

  • 画面のサイズ変更について(VC6.0)

    VC6.0を使用して画面サイズ15インチ(最大サイズ)で作成した画面が あります。 今度この画面サイズが17インチ(最大サイズ)に変更になります。 コントロールのサイズはそのまま(15インチで使用していた時のサイズ)という 指定がある事から、リサイズするしかないのかな。と考えています。 moveWindowを使用するとコントロールのサイズも変更になりますよね? やはり、リサイズ&コントロールの再配置を行うしか手段はないのでしょうか? ご存知の方、ご教示頂けると助かります。 それでは宜しくお願いします。

専門家に質問してみよう