CSplitterWnd 画面サイズの違い

[戻る]
PSP 2007/07/20(金) 11:33:14
MONと申します。

WinXP sp2 VC++2005 MFC SDIが開発環境です。

CSplitterWndを使って静的にwindowを分割しているのですが、
CreateViewの引数の中のCSizeを整数で固定で指定しているので、
モニターサイズの違うPCでアプリを動かすと、分割バーの位置が
ずれて意図していないサイズに変わってしまいます。


感覚的にはモニターの全体の大きさを取得してからCSizeの引数で、
そのモニターの全体からの比率で各々のViewサイズにしたいのですが、
可能ですか?

皆様、ご教示宜しくお願いいたします。

PSP 2007/07/20(金) 11:36:32
すみません。教えてgooのハンドルネームを書いてしまいました。

PSPです。orz

Blue 2007/07/20(金) 11:53:32
GetSystemMetrics
http://msdn.microsoft.com/library/ja/default.asp?
url=/library/ja/jpsysinf/html/_win32_getsystemmetrics.asp
でどうでしょうか?

ngs 2007/07/20(金) 11:58:24
メインウインドウのサイズで判断した方がいいんじゃないでしょうか。

::AfxGetMainWnd()->GetClientRect(&rect);
但し、ツールバーやステータスバーなどを含んだサイズです。

PSP 2007/07/20(金) 13:48:56
 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);

このような感じにしたいです。

ご意見宜しくお願いいたします。

Blue 2007/07/20(金) 13:52:54
>デバック出来ないんすけど・
デバッグ(Debug)なのでは?
もっとも、

変数の値をデバッガで確認できない

というべきでしょうが。

>SM_CXFULLSCREEN
ではなくて
SM_CXSCREEN
を使ったらどうでしょうか?

tetrapod 2007/07/20(金) 13:54:25
モニターが複数台ある場合のことも考えておいてくださひませ

PSP 2007/07/20(金) 14:08:34
Blueさん tetrapodさん ご回答ありがとうございます。

Blueさん

>変数の値をデバッガで確認できない
>というべきでしょうが。

はい。ブレークポイントを
size = GetSystemMetrics(SM_CXSCREEN);
のあとにおいてsizeの上にカーソルを持っていっても、無反応なんですが・・。
仮にこの関数の正常な返り値が返って来たとしても、そのあとのロジックが
上手くつかめていないんです・・。知恵を貸していただけないでしょうか?

tetrapodさん

>モニターが複数台ある場合のことも考えておいてくださひませ

モニターの大きさを取得するのではなく、アプリケーションの最大値を取得すれば
上記の件は平気ですよね??
そんな簡単な問題ではないのでしょうか?

ご教授宜しくお願いいたします。

Blue 2007/07/20(金) 16:10:17
とりあえず、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

PSP 2007/07/20(金) 16:41:05
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さん 長くなってしまって申し訳ありません。
宜しくお願いいたします。

Blue 2007/07/20(金) 16:58:57
まず、どうやって最大化表示にしていますか?
> m_pMainWnd->ShowWindow(SW_MAXIMIZE);
でですか?

これだと、
CMainFrame::OnCreateClient
でサイズを指定できないといっていますが、回答がもらえないとどうしようもないので
すが

PSP 2007/07/20(金) 17:13:26
Blueさん ご回答ありがとうございます。

>まず、どうやって最大化表示にしていますか?

はい。すみません。おっしゃるとおり、CTestApp::InitInstanceの中に、
この記述をしております。

すみませんでした。

Blue 2007/07/20(金) 17:18:06
>例えば3分割しているとして、View領域が仮にA,B,Cとした場合に
>どんだけ画面サイズが変更されようが、B,CのViewサイズは固定でAだけ大きくなったり
>小さくなったり変更出来ればいいと思うようになりました。
なんだかよくわからないのですけど。

どのように分割されているのでしょうか?
Aだけサイズをかえれるとは?
Aが変われば、BやCも変わってしまうように思えるのですが?
(全体のウィンドウのサイズが変わる?)

PSP 2007/07/20(金) 17:58:55
Blueさん ご回答ありがとうございます。

こんな感じに分割です。

----------------------|
| |                   |
| |          B        |
|A|-------------------|
| |         C         |
| |-------------------|
| |         D         |
| |                   |
----------------------

正確に記載すると4分割で、上記の分割で説明しますと、

画面(解像度)サイズが変更した場合にいくら小さな画面でもC,Dの領域サイズは固定、
その分Bの領域は大きくなったり、小さくなったりするという事です。
Bの領域だけ可変にするという事になります。

わかりずらくて、すみません。宜しくお願いいたします。

Blue 2007/07/20(金) 19:00:57
固定ならCSplitterWndを使う利点がないような。。。

とりあえず、Showした後に再計算させるしかないです。
作成時では左上からのサイズの指定になってしまうので、
どうしても最大化したときのBのサイズが取れません。
(Bが右なら何も考えなくてもよさそうなんだけど)

よって
>現在はいいか悪いかわかりませんが、RECT構造体とGetClientRectを使ってそれっぽく
>しているのですが、なんかしっくり来ません。
・・・
>このような感じでCreateViewの第3引数に与えてあげてる感じです。
は最大化する前のRECTを対象にしているのでまちがっているでしょう。


ただngsさんもおっしゃっていますが、GetClientRectはツールバーやステータスバー
を入れてのサイズになるので少しずれちゃうでしょう。
(高さを取れなくはないが、フローティング状態にしたときにどう表示したいのかが
微妙ですし、、、)

すべてのスプリッターウィンドウが固定ならばOnSizeで処理させるのが一番簡単だと思
います。

Blue 2007/07/20(金) 19:03:00
訂正
>(Bが右なら何も考えなくてもよさそうなんだけど)
(Bが右下なら何も考えなくてもよさそうなんだけど)


ちなみに分割ウィンドウの幅を固定にするには
http://athomejp.com/goldfish/mfc/cobject/nomove.asp
を参考にするとよいでしょう。

古いスレッドには追加発言できません。