ダイアログ等のY座標を一括で変更する方法は?


お茶っぱ  2010-07-28 08:21:21  No: 71848

MFCを使ったWindowsアプリケーションの開発を行っております。

  環境:Visual Studio2005
  言語:Visual C++

既存ソースがあり、そのダイアログやボタンの
座標を変更したいのですが、方法が分かりません。
教えて下さい。

既存ソースでは、CWnd::MoveWindow関数を使用して描画しています。
今回の修正で、座標TOP(Y座標)を40ピクセル下げたいのです。

修正方法としては、MoveWindowの Y座標 パラメータを変更すれば良いだけなのですが、
MoveWindow関数が100箇所程あり、すべてが修正対象となっています。

100箇所を力技で直すのは、よい修正方法と思えません。
そこで、WindowProcでメッセージを拾い、そこでY座標だけ変えることはできないかと
検討しています。
しかし、どのメッセージを拾えばよいのか分からず、困っています。

MoveWindow関数使用時のみに、送られるメッセージはありますでしょうか?
また、そのメッセージがあった場合、Y座標を変えることはできますでしょうか。

もしくは、WindowProcでメッセージを拾い・・・ という方法以外に
よい修正案はありますでしょうか。

ご教授お願いします。


かもねぎ  2010-07-28 16:03:54  No: 71849

EnumChildWindows にダイアログのハンドル渡して
EnumChildProcで順番にGetWindowRect で座標つかまえて
y += 40 でMoveWindow でどうでしょ?


maru  2010-07-28 19:54:39  No: 71850

> 100箇所を力技で直すのは、よい修正方法と思えません。
一概にそうとも言えないのでは?
100箇所程度だったらMoveWindowで検索をかけて全て手動で修正するにしても
1箇所あたり10秒として1000秒、20分もかからないと思います。変に技巧をこ
らした場合、あとでソースを見たとき混乱する可能性があります。
# MoveWindowで0を指定しているのに40の位置に表示している!
# どうして?  てな具合。

そもそも何故ソースコードで位置を指定しているのか疑問です。
ダイアログなどのユーザインターフェース部品はリソースで位置を指定して
おいた方が便利です。特に外国語対応を行う場合、ユーザインターフェース
部品をソースコードから分離しておかないと収集がつきません。

ソースコードで座標を指定して描画を行う場合もないわけでは有りませんが
その場合、何かのルールで座標を計算して行うので、MoveWindowに直接数値
で座標を指定せず、計算で得られた座標を変数で渡すことになるでしょう。
その場合は座標を計算するルール(普通は関数化しておく)を変更するので
MoveWindowの数がいくつであろうとも関係ありません。


aetos  2010-07-28 20:31:35  No: 71851

余談ですが多数のウィンドウ、コントロールの位置を一括変更するには DeferWindowPos を使うとよいです。


仲澤@失業者  2010-07-28 22:42:25  No: 71852

基本的にmaruさんに賛成。
わざわざMoveWindow()でコントロールを移動しているのには
何らかの「意味」があるはずだと考えます。

自分でやるなら・・・
1.MoveWindow_Offset_Y40()等、当該機能を当該クラスに実装
2.対象となるMoveWindow()を上記関数にリプレース


かもねぎ  2010-07-29 00:21:11  No: 71853

WM_EXITSIZEMOVE  サイズ変更後に来るみたいですね。
元のソースがわからないのでこれで行けるかどうかはわかりません^^;


ryo  2010-07-29 04:06:18  No: 71854

仕様で「固定値」のものに対し
仕様変更があった場合に固定値を変更せず、動的に処理する

ほうが、無理に押し通そうとする「力技」だと思う


ロマ  2010-07-29 10:16:35  No: 71855

ScrollWindowはいかがですか。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加