MFCを使ったWindowsアプリケーションの開発を行っております。
環境:Visual Studio2005
言語:Visual C++
既存ソースがあり、そのダイアログやボタンの
座標を変更したいのですが、方法が分かりません。
教えて下さい。
既存ソースでは、CWnd::MoveWindow関数を使用して描画しています。
今回の修正で、座標TOP(Y座標)を40ピクセル下げたいのです。
修正方法としては、MoveWindowの Y座標 パラメータを変更すれば良いだけなのですが、
MoveWindow関数が100箇所程あり、すべてが修正対象となっています。
100箇所を力技で直すのは、よい修正方法と思えません。
そこで、WindowProcでメッセージを拾い、そこでY座標だけ変えることはできないかと
検討しています。
しかし、どのメッセージを拾えばよいのか分からず、困っています。
MoveWindow関数使用時のみに、送られるメッセージはありますでしょうか?
また、そのメッセージがあった場合、Y座標を変えることはできますでしょうか。
もしくは、WindowProcでメッセージを拾い・・・ という方法以外に
よい修正案はありますでしょうか。
ご教授お願いします。
EnumChildWindows にダイアログのハンドル渡して
EnumChildProcで順番にGetWindowRect で座標つかまえて
y += 40 でMoveWindow でどうでしょ?
> 100箇所を力技で直すのは、よい修正方法と思えません。
一概にそうとも言えないのでは?
100箇所程度だったらMoveWindowで検索をかけて全て手動で修正するにしても
1箇所あたり10秒として1000秒、20分もかからないと思います。変に技巧をこ
らした場合、あとでソースを見たとき混乱する可能性があります。
# MoveWindowで0を指定しているのに40の位置に表示している!
# どうして? てな具合。
そもそも何故ソースコードで位置を指定しているのか疑問です。
ダイアログなどのユーザインターフェース部品はリソースで位置を指定して
おいた方が便利です。特に外国語対応を行う場合、ユーザインターフェース
部品をソースコードから分離しておかないと収集がつきません。
ソースコードで座標を指定して描画を行う場合もないわけでは有りませんが
その場合、何かのルールで座標を計算して行うので、MoveWindowに直接数値
で座標を指定せず、計算で得られた座標を変数で渡すことになるでしょう。
その場合は座標を計算するルール(普通は関数化しておく)を変更するので
MoveWindowの数がいくつであろうとも関係ありません。
余談ですが多数のウィンドウ、コントロールの位置を一括変更するには DeferWindowPos を使うとよいです。
基本的にmaruさんに賛成。
わざわざMoveWindow()でコントロールを移動しているのには
何らかの「意味」があるはずだと考えます。
自分でやるなら・・・
1.MoveWindow_Offset_Y40()等、当該機能を当該クラスに実装
2.対象となるMoveWindow()を上記関数にリプレース
WM_EXITSIZEMOVE サイズ変更後に来るみたいですね。
元のソースがわからないのでこれで行けるかどうかはわかりません^^;
仕様で「固定値」のものに対し
仕様変更があった場合に固定値を変更せず、動的に処理する
ほうが、無理に押し通そうとする「力技」だと思う
ScrollWindowはいかがですか。
ツイート | ![]() |