MONと申します。
WinXP sp2 VC++2005 MFC SDIが開発環境です。
CSplitterWndを使って静的にwindowを分割しているのですが、
CreateViewの引数の中のCSizeを整数で固定で指定しているので、
モニターサイズの違うPCでアプリを動かすと、分割バーの位置が
ずれて意図していないサイズに変わってしまいます。
感覚的にはモニターの全体の大きさを取得してからCSizeの引数で、
そのモニターの全体からの比率で各々のViewサイズにしたいのですが、
可能ですか?
皆様、ご教示宜しくお願いいたします。
すみません。教えてgooのハンドルネームを書いてしまいました。
PSPです。orz
GetSystemMetrics
http://msdn.microsoft.com/library/ja/default.asp?
url=/library/ja/jpsysinf/html/_win32_getsystemmetrics.asp
でどうでしょうか?
メインウインドウのサイズで判断した方がいいんじゃないでしょうか。
::AfxGetMainWnd()->GetClientRect(&rect);
但し、ツールバーやステータスバーなどを含んだサイズです。
Blueさん ngsさん ご回答ありがとうございます。
Blueさん
教えて下さったGetSystemMetricsを調べたのですが、すごい数のオプションですね・・。
今回はアプリを必ず最大化した状態での起動にするので、
GetSystemMetrics(SM_CXFULLSCREEN)で良さそうですよね?
それをCMainFrameのOnCreateClient内に記述して実験で返り値を見ようと思ったのですが、
int size = 0;
size = GetSystemMetrics(SM_CXFULLSCREEN);
この状態でデバックをかけたのですが、sizeがデバック出来ないんすけど・・。
使い方間違ってます??
ngsさん
>::AfxGetMainWnd()->GetClientRect(&rect);
ここでいうGetClientRectの部分は分割されたそれぞれのViewになるのでしょうか?
イメージ的には
アプリケーションは起動時は必ず最大化スタートするので、起動時にウィンドウの
最大化した状態の座標を取り、ウィンドウ分割時に
CreateView(0,0,RUNTIME_CLASS(TestView),CSize(この部分をその都度変化させたい),
pContext);
このような感じにしたいです。
ご意見宜しくお願いいたします。
>デバック出来ないんすけど・
デバッグ(Debug)なのでは?
もっとも、
変数の値をデバッガで確認できない
というべきでしょうが。
>SM_CXFULLSCREEN
ではなくて
SM_CXSCREEN
を使ったらどうでしょうか?
モニターが複数台ある場合のことも考えておいてくださひませ
Blueさん tetrapodさん ご回答ありがとうございます。
Blueさん
>変数の値をデバッガで確認できない
>というべきでしょうが。
はい。ブレークポイントを
size = GetSystemMetrics(SM_CXSCREEN);
のあとにおいてsizeの上にカーソルを持っていっても、無反応なんですが・・。
仮にこの関数の正常な返り値が返って来たとしても、そのあとのロジックが
上手くつかめていないんです・・。知恵を貸していただけないでしょうか?
tetrapodさん
>モニターが複数台ある場合のことも考えておいてくださひませ
モニターの大きさを取得するのではなく、アプリケーションの最大値を取得すれば
上記の件は平気ですよね??
そんな簡単な問題ではないのでしょうか?
ご教授宜しくお願いいたします。
とりあえず、CXXApp::InitInstanceで
m_pMainWnd->ShowWindow(SW_MAXIMIZE);
で最大化表示している場合、このとき既に
CMainFrame::OnCreateClient
は処理されている状態なので、
>ウィンドウ分割時に
>CreateView(0,0,RUNTIME_CLASS(TestView),CSize(この部分をその都度変化させたい),
>pContext);
>このような感じにしたいです。
というのは無理でしょう。
常に同じ割合で分割したいということであれば、OnSizeでSetColumnInfo(または
SetRowInfo)でサイズを設定するとか。
そうでなければ、
> m_pMainWnd->ShowWindow(SW_MAXIMIZE);
の直後に分割ウィンドウを再計算するメソッドを呼ぶようなつくりにすればいいです。
参考
http://www1.coralnet.or.jp/mako10/vc/a0018.html
Blueさん ご回答ありがとうございます。
>ウィンドウを再計算するメソッドを呼ぶようなつくりにすればいいです。
ここの部分なのですが、条件分岐をいれてウィンドウを再計算するかどうかと
いう事ですか?
if(最大化した状態のサイズが○○だったら)
{
ウィンドウ再計算
}else{
そのままのサイズ
}
このような感じになるのでしょうか?
現在はいいか悪いかわかりませんが、RECT構造体とGetClientRectを使ってそれっぽく
しているのですが、なんかしっくり来ません。
CRect rect;
GetClientRect(&rect)
CSize size = rect.Size();
size.cx /= 2; //実際は2ではないですが・・。
size.cy /= 2;
このような感じでCreateViewの第3引数に与えてあげてる感じです。
少し、求めていたものと離れてしまうのですが、このような感じでも
いいのかなって思ってきました。
例えば3分割しているとして、View領域が仮にA,B,Cとした場合に
どんだけ画面サイズが変更されようが、B,CのViewサイズは固定でAだけ大きくなったり
小さくなったり変更出来ればいいと思うようになりました。
Blueさん 長くなってしまって申し訳ありません。
宜しくお願いいたします。
まず、どうやって最大化表示にしていますか?
> m_pMainWnd->ShowWindow(SW_MAXIMIZE);
でですか?
これだと、
CMainFrame::OnCreateClient
でサイズを指定できないといっていますが、回答がもらえないとどうしようもないので
すが
Blueさん ご回答ありがとうございます。
>まず、どうやって最大化表示にしていますか?
はい。すみません。おっしゃるとおり、CTestApp::InitInstanceの中に、
この記述をしております。
すみませんでした。
>例えば3分割しているとして、View領域が仮にA,B,Cとした場合に
>どんだけ画面サイズが変更されようが、B,CのViewサイズは固定でAだけ大きくなったり
>小さくなったり変更出来ればいいと思うようになりました。
なんだかよくわからないのですけど。
どのように分割されているのでしょうか?
Aだけサイズをかえれるとは?
Aが変われば、BやCも変わってしまうように思えるのですが?
(全体のウィンドウのサイズが変わる?)
Blueさん ご回答ありがとうございます。
こんな感じに分割です。
----------------------|
| | |
| | B |
|A|-------------------|
| | C |
| |-------------------|
| | D |
| | |
----------------------
正確に記載すると4分割で、上記の分割で説明しますと、
画面(解像度)サイズが変更した場合にいくら小さな画面でもC,Dの領域サイズは固定、
その分Bの領域は大きくなったり、小さくなったりするという事です。
Bの領域だけ可変にするという事になります。
わかりずらくて、すみません。宜しくお願いいたします。
固定ならCSplitterWndを使う利点がないような。。。
とりあえず、Showした後に再計算させるしかないです。
作成時では左上からのサイズの指定になってしまうので、
どうしても最大化したときのBのサイズが取れません。
(Bが右なら何も考えなくてもよさそうなんだけど)
よって
>現在はいいか悪いかわかりませんが、RECT構造体とGetClientRectを使ってそれっぽく
>しているのですが、なんかしっくり来ません。
・・・
>このような感じでCreateViewの第3引数に与えてあげてる感じです。
は最大化する前のRECTを対象にしているのでまちがっているでしょう。
ただngsさんもおっしゃっていますが、GetClientRectはツールバーやステータスバー
を入れてのサイズになるので少しずれちゃうでしょう。
(高さを取れなくはないが、フローティング状態にしたときにどう表示したいのかが
微妙ですし、、、)
すべてのスプリッターウィンドウが固定ならばOnSizeで処理させるのが一番簡単だと思
います。