VC 6.0MFCで開発しています.
作ったダイアログをWindows上でサイズ変更(小さく)する際,通常左上が残りますよね?
これを右側が残るようにしたいのですが可能でしょうか?
>これを右側が残るようにしたいのですが可能でしょうか?
操作でという意味ですかそれともプログラムでという意味ですか
プログラムでという意味ならエレガントな方法ではないが
たとえば右上を固定して横方向に100縦方向に200小さくしたかったら
下記例でもできることを確かめました
void CDtestDlg::OnButton1()
{
CRect Rect;
CPoint Point1;
CPoint Point2;
int x1,y1,x2,y2;
GetWindowRect(&Rect);
Point1 = Rect.TopLeft();
Point2 = Rect.BottomRight();
x1 = Point1.x; y1 = Point1.y; x2 = Point2.x; y2 = Point2.y;
Rect.SetRect(x1+100,y1,x2,y2-200); //ここを希望にしたがって変える
WINDOWPLACEMENT wp;
wp.rcNormalPosition = Rect;
SetWindowPlacement(&wp);
}
ウインドウの位置を指定するときの基準位置はどこかとか
そういうところを考えれば、自前でやれば行けそうと言う事はわかりそうですが、
通常のAPIにそういう機能を持っているものがあるかと言う話なら多分ないと思います。
自分でサイズが変わった時に右下が動いていないように見せる為の計算等を
すればいいだけです。右下の位置が動かなかったかのように見せる為に
基準位置を移動すれば良いという話。
どの程度移動すればよいかは自分で図を書いて考えて見てください。
それほど難しい計算ではないはずです。
aharenさん
ご教授ありがとうございます.
ためしてみたのですが,上手くいきません..
例えば,ABCDEFG と書いてあるダイアログがあり,プログラム上でAB(左側)を消し
たい(隠したい)のですが,ABCDEが残ってFG(右側)が消えてしまいます.
右側を固定するとはどの処理で行っているのでしょうか?
PATIOさん
ご教授ありがとうございます.
>自分でサイズが変わった時に右下が動いていないように見せる為の計算等を
>すればいいだけです。右下の位置が動かなかったかのように見せる
上記のところの意味がよくわからないのですが,詳しく教えていただけないでしょうか?
この質問って、もしかしたら、「ダイアログ上に配置されたコントロールを、ダイアログサ
イズの変更が発生した時に、左上のコントロールから見えなくなるようにしたい」というこ
とですか?
だとしたら外側にひとつウィンドウを用意して、その子ウィンドウとしてダイアログを作成
し、外側ウィンドウのリサイズのタイミングで、ダイアログの左下が外側ウィンドウの左下
に来るように移動させてあげればよいと思うのですが。
ミスしました。すみません。
> ダイアログの左下が外側ウィンドウの左下に来る
「ダイアログの右端が外側ウィンドウの右端に来る」
私が示した処理はプログラムを作るということを除けば
四角形の位置や大きさに関する単なる算数にしかすぎないが
youさんの疑問を早合点してしまったかもしれません
>例えば,ABCDEFG と書いてあるダイアログがあり,プログラム上でAB(左
側)を消し
>たい(隠したい)のですが,ABCDEが残ってFG(右側)が消えてしまいます.
youさんがおこなったダイアログのサイズ変更の部分のソースをかいていただければ
youさんの疑問もそれだけわかりやすくなるとおもいますがいかがですか
返信遅くなりまして申し訳ありません.
現在のソースは以下です.
::MoveWindow(pWnd1,100,100, (rect.right - rect.left)/2, rect.bottom -
rect.top,1);
しかし,これは100,100の位置に大きさ1/2のダイアログを表示するという命令であり,
これでは,右半分が消され,左半分の表示になってしまいます.
これを右半分が残るようにしたいのですが,可能でしょうか?
分かりにくかったかもしれませんので,追加します.
右半分というのは,位置の問題ではなく,「表示している右側」ということです.
例えばダイアログの左にピクチャA,右にピクチャBがあるとすると,ピクチャBのダイアログの
大きさで,ピクチャBを表示したいということです.
左側(ピクチャA)だけを表示するのは大きさを変えればできるのですが,
右側だけの表示というのが出来ないので,そこを教えていただきたく質問しました.
えーと、最初の質問からでは言われているような事は多分理解できないと思います。
さておき、
コントロールにしても描画するときにしても基準になる位置と言うのがあります。
この考え方は対象がなんであれ同じ事です。
で、コントロールを配置したり、文字を描画したりする場合にその位置を決める
原点は何処になるでしょうか?
ウインドウにおける原点は、基本的に左上が原点(0,0)になります。
GDIで描画する場合はマッピングやヴューポートの変更で変わってくる事もありますが、
これは意識してやっているはずなので本人が間違う事はないでしょう。
で、原点が左上である以上普通にサイズを変更すれば、原点は動かないので
原点側の物が画面上に表示された状態になります。
言われているように右側のコントロールを表示した状態にしたのであれば、
サイズを変えた時に右下が原点であるかのように見せる為の計算を行い、
コントロールの位置を自前で調整する必要があります。
この辺は、自分で絵を書いてよく確認してください。
コントロールをどのように移動すれば、あたかも右下を原点に
サイズを変更しているかのように見せられるでしょう。
基本的にこれを簡単に実現する便利な関数はないと思います。
自分で移動すべき位置を計算で出してコントロールの位置を制御するしかありません。
多分、Windowsにおける座標系の理解が足りないのだと思います。
自分で色々なパターンを紙の上で書いてみて、サイズ変更前と変更後で
座標がどのようになっているのかを確認しましょう。
PATIOさん
アドバイスありがとうございます.サイズを変えた時に右下が原点であるかのように見せる為の
計算とは具体的にどのように行えばいいのでしょうか?
例えば大きさが300×300のダイアログが左上座標(100,100)にあるとすると,
右下は(400,400).
これを
::MoveWindow(pWnd1,100,100, (rect.right - rect.left)/2, rect.bottom -
rect.top,1);
として大きさを半分にすると,左半分が残り右下の座標は(250,400)となる.
これを(0,0)にするためには,引き算をすればいいんですが,
これをどう用いれば..
MoveWindowの引数は左上の座標と大きさだけだし...
と,考えてもよく分からないのですが...
> ::MoveWindow(pWnd1,100,100, (rect.right - rect.left)/2, rect.bottom -
rect.top,1);
(1)これだとyouさんのいうとおりになると思います
(2)youさんの希望を既成のひとつの関数で実現するのはおそらくできないのでは
ないでしょうか
つまりMoveWindowをいくらいじったってできないと思います
>VC 6.0MFCで開発しています.
>作ったダイアログをWindows上
ということはプロジェクトは
MFC AppWizard でつくったとかんがえてよいですか それとも
Win32 Application でつくったのですか
MFC AppWizard でつくりました.
仮想的に右下を原点にする...どうすればいいのでしょうか(><)?
何をやっているのか判らん。
各コントロールの座標を
ダイアログの右下からの距離が固定になるようにしたいのか。
ならば右下からの距離を求めればいいだけだと思う。
WM_INITDLGで:
ダイアログのクライアント領域の横幅と高さを求める。
これを(dlg.x, dlg,y)とする。
全子ウィンドウの相対座標を求める。
これを(children_pos[i].x, children_pos[i],y)とする。
以下が各子ウィンドウの右下からの距離になる。
children_rb[i].x = dlg.x - children_pos[i].x;
children_rb[i].y = dlg.y - children_pos[i].y;
これを覚えておく。
ダイアログのクライアント領域のサイズが変わったら:
WM_SIZEだっけ?
WM_SIZINGとかも処理する?
MoveWindowじゃなくて複数同時に移動できるやつの方がいいかな。
WM_SIZEやWM_SIZING中にウィンドウ移動ってうまくいくのかな?
ダイアログのクライアント領域の横幅と高さを求める。
これを(dlg.x, dlg,y)とする。
以下が各子ウィンドウの左上からの距離になる。
children_pos[i].x = dlg.x - children_rb[i].x;
children_pos[i].y = dlg.y - children_rb[i].y;
つまりこれが移動すべき座標だ。
以上
動作確認はしていません。
全子ウィンドウを云々は面倒だから
ダイアログの外枠になる親ウィンドウを作る。
ダイアログは子ウィンドウということになる。
外枠親ウィンドウのサイズが変わったら
ダイアログ1つの座標を動かすだけでいい。
でも元ダイアログより大きくした場合を考慮する必要があるか。