フレームのデフォルトのサイズについて

このQ&Aのポイント
  • フレーム(親ウィンドウ)のサイズは、MainFrm.cpp内のrectDefaultで定義されています。
  • デフォルトのサイズのウィンドウが生成されるときは、サイズの変更を行わないようにします。
  • フレームのデフォルトのサイズは、CMainFrame::PreCreateWindow関数内でCREATESTRUCT csを修正することで設定することができます。
回答を見る
  • ベストアンサー

フレームのデフォルトのサイズについて

また気になることが出てきましたので、よろしくお願いします。 VC++6.0 MFC MDIにて フレーム(親ウィンドウ)のサイズは、MainFrm.cpp内の以下にて変更することができますが、変更しないときは、デフォルトのサイズのウィンドウが生成されます。 そのデフォルトのサイズは、rectDefaultで定義されてるらしいということまでは調べたのですが、具体的にはどこでどのように定義されているのでしょうか? ご存知の方、よろしくお願いします。 ************************** BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CMDIFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: この位置で CREATESTRUCT cs を修正して、Window クラスやスタイルを // 修正してください。 return TRUE; }

  • mk1234
  • お礼率94% (1832/1940)

質問者が選んだベストアンサー

  • ベストアンサー
noname#30727
noname#30727
回答No.2

>上のコードは、結局なにをどのようにしようとしているのでしょう? class C { public: const int nDefault = 1; void Create(int n = nDefault) {...} }; これは問題ないですよね? あとは、int を CRect に置き換えるだけです。 CRectのコンストラクタは引数が4つのものがあるので、 const CRect rectDefault(CW_USEDEFAULT, CW_USEDEFAULT, 0, 0); としているだけです。

mk1234
質問者

お礼

inthefloiさん 何度もありがとうございます。 本件は、かなり前から理解したくて、自分でいろいろ調べてみたけれど分からないので、とうとう質問をしたものです。 回答頂いても、多分すぐには理解できないだろうと思っていましたが、案の定分かりません。 これからまた調べてみますが、C++をさらっとしか理解していないので、まったく自分の知らない構文なのかな? 理解できません。 <以下現在の理解度> class C { public: const int nDefault = 1; void Create(int n = nDefault) {...} }; >これは問題ないですよね? あまり自信ありません。 ”Createの引数を1とする(??)”としか分かりません const CRect rectDefault(CW_USEDEFAULT, CW_USEDEFAULT, 0, 0); >としているだけです。 Crect・・・これクラス?? rectDefault・・・これ関数??? CRect rectDefault・・・理解不能 (CW_USEDEFAULT, CW_USEDEFAULT, 0, 0)・・・多分引数だろう

mk1234
質問者

補足

上記回答ほぼ理解できました。 (基本的なことの勉強不足でした。申し訳ありません) いよいよ元々知りたかった核心に迫ることができます。 引数(CW_USEDEFAULT, CW_USEDEFAULT, 0, 0)は、(left、top、right、bottom )を示すと思うのですが、 それでは、right=0,bottom=0になってしまいサイズがない(ゼロ)のでおかしい、と思うのですが、どこか別のところで定義されているのでしょうか? ************************* とりあえず、これまでの理解でも今回は十分です。 inthefloiさんのご指導のお陰で、なんとなく釈然としない状態から抜け出せました。 どこまで深く理解すれば良いかは、人それぞれだと思うのですが、今回の私の場合は、これで十分納得出来ました。 また少しずつ理解を深めていきたいと思います。 ありがとうございました。

その他の回答 (4)

noname#30727
noname#30727
回答No.5

>どうしてそうなるのか知りたいところですが、これはそういうものとして受け入れても良いかなと思います。 どうしてそうなるのかというより、便利になるように設計されているだけの事なので、使う使わないは自由です。 最近では、アプリの終了時にウィンドウの位置とサイズを保存して、次の起動時に位置とサイズを復元する事が多いので、最初の起動時以外は使っていない事になります。 C/C++ のポインタで、0 (NULL) を特別な値としているのにも似ています。 >この「デフォルト」をWindowsはどのように決めているんでしょう? 定義されてはいないと思いますが、自分で作った簡単なアプリを、終了させずに10回くらい起動させてみると、すごく単純であるのがわかります。所詮は、適当な位置に適当なサイズで出れば良いといったところでしょう。

mk1234
質問者

お礼

どうも色々とありがとうございました。 これで解決にします。 今回の件で色々と勉強になりました。

noname#30727
noname#30727
回答No.4

>ありゃりゃ本当だ-符号がない。 数学的にはもちろん -0x80000000 なのですが、横幅などは負の値が必要ないので、符号無し32bit値で扱う事が多いのです。 それで、0x00000000-0x00000001==0xffffffff になる事が理解できると、0x00000000-0x80000000==0x80000000 になる事がわかると思います。 >でもですよ、-符号が付かないことが理解できたとして、実際に作られるウインドウのさいずは以下になってないと思うのですが、 CW_USEDEFAULT == 0x80000000 ですよね? この値は特殊な値で、この値の時だけ 0x80000000 を座標や大きさとはせずに、Windows が座標や大きさを「任意」に決めるのです。 この任意に決める状態を「デフォルト」と呼んでいます。

mk1234
質問者

お礼

回答楽しみにしておりました。ありがとうございます。 >0x00000000-0x80000000==0x80000000 今ひとつ納得行かないのですが、一応ある見方をした理屈上では理解できました。 (2の補数等の考え方にて) >この値は特殊な値で、この値の時だけ 0x80000000 を座標や大きさとはせずに、Windows が座標や大きさを「任意」に決めるのです。 どうしてそうなるのか知りたいところですが、これはそういうものとして受け入れても良いかなと思います。 >この任意に決める状態を「デフォルト」と呼んでいます。 この「デフォルト」をWindowsはどのように決めているんでしょう? 気になるところですが、これも深入りすると泥沼にはまりそうだから、そう言うものだという理解に留めていたほうが良いのかな。

noname#30727
noname#30727
回答No.3

>引数(CW_USEDEFAULT, CW_USEDEFAULT, 0, 0)は、(left、top、right、bottom ) >を示すと思うのですが、 その通りです。 >それでは、right=0,bottom=0になってしまいサイズがない(ゼロ)のでおかしい、 >と思うのですが、どこか別のところで定義されているのでしょうか? あるCRectの横幅は、right-leftですよね? CW_USEDEFAULT は 0x80000000 と定義されているので、leftがCW_USEDEFAULTでrightが0のとき、横幅はCW_USEDEFAULTになります。(0x80000000 = 0 - 0x80000000) おそらく Windows の内部処理では right と bottom は横幅(width)と高さ(heigth)を計算するだけにしか使用されていなくて、結果、left, top, width, height が全てCW_USEDEFAULTになることで、位置も大きさもデフォルトになるのではないかと思います。

mk1234
質問者

お礼

inthefloiさん またまたありがとうございます。 0x80000000 = 0 - 0x80000000????? ↓こうじゃないの -0x80000000 = 0 - 0x80000000 電卓を叩いてみよっと、 ありゃりゃ本当だ-符号がない。 また、理由を調べてみます。 ************************** でもですよ、-符号が付かないことが理解できたとして、実際に作られるウインドウのさいずは以下になってないと思うのですが、 left=0x80000000、top=0x80000000 横幅=0x80000000、縦幅=0x80000000 実際のイメージ left=10、top=10 横幅=100、縦幅=50 (単位は任意、ウインドウの位置とサイズのみをイメージで表現した)

noname#30727
noname#30727
回答No.1

VC++.NET2002のatlmfc\src\winfrm.cppを見ましたが、 >CW_USEDEFAULT, CW_USEDEFAULT, >0 /* 2*CW_USEDEFAULT */, 0 /* 2*CW_USEDEFAULT */ となっています。どのバージョンのMFCでも同じ値ではないかと思います。 CW_USEDEFAULT は「OS にお任せ」の意味なので、このあたりはブラックボックスと考えた方が吉です。

mk1234
質問者

お礼

回答ありがとうございます。 const AFX_DATADEF CRect CFrameWnd::rectDefault( CW_USEDEFAULT, CW_USEDEFAULT, 0 /* 2*CW_USEDEFAULT */, 0 /* 2*CW_USEDEFAULT */); これですよね。実はこれの意味が良くわかりません。 上のコードは、結局なにをどのようにしようとしているのでしょう? 残念ながら、調べても良くわかりません。 教えていただける方が見えましたら、ぜひお願いします。 <CFrameWnd> Windows がウィンドウのサイズや位置の初期値を選択できるように、CFrameWnd オブジェクトを作成するときに、引数にこの静的な CRect を渡します。 ????????意味が分かりません。

mk1234
質問者

補足

お礼の欄の以下は誤記です。 <CFrameWnd> ・・・誤記 <rectDefault> ・・・正解 Windows がウィンドウのサイズや位置の初期値を選択できるように、CFrameWnd オブジェクトを作成するときに、引数にこの静的な CRect を渡します。

関連するQ&A

  • ウインドウサイズについて

    起動時のウインドウサイズは以下で指定することが出来ますが、タイマーなどを使って、例えば起動後1分後にサイズを変えることは出来ますか? <VC++6.0 MFCにて> BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: この位置で CREATESTRUCT cs を修正して、Window クラスやスタイルを // 修正してください。 // ウィンドウの左上が X軸200,Y軸100の場所に指定 cs.x = 200; cs.y = 100; // ウィンドウのサイズを、幅500,高さ300に指定 cs.cx = 500; cs.cy = 300; return TRUE; }

  • タスクバーに非表示

    SDKではCreateWindowEXを使えば WS_EX_TOOLWINDOWを指定することでタスクバー上に非表示にすることができましたが、 MFCで BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)で cs.dwExStyle |= WS_EX_TOOLWINDOWとしたところ、 最大化、最小化ボタンが消えてしまいます。 最大化最小化ボタンをつけて、かつタスクバーに表示させたくないのですが どうすれば良いでしょうか?

  • 秀丸のデフォルトウインドウサイズや表示位置を変更する

    秀丸のデフォルトウインドウサイズや表示位置を変更する ことはできないのでしょうか。 意味不明でしたら加筆修正しますのでよろしくお願いします。

  • デフォルトのウインドウサイズについて

    WINDOWSの”ウインドウを並べて表示する”を選択するとその時開いていたウインドウ が並んで表示されます。そして,その時起動していたアプリケーションで開くウインドウ は次回開いたときも”並べて表示する”を使用したときと同じ変形したウインドウサイズ になってしまいます。これをデフォルトのウインドウサイズで開くように変更するには どうすればいいのでしょうか?

  • VC++で作成したアプリ起動時のウィンドウサイズについて

    VC++初心者の者です。初投稿です。宜しくお願いします。 ※何を言っているのか解らない、情報が足りないって場合は聞いてください。超初心者ですので宜しくお願いします。。。 VC++で作成したMDIアプリを起動させた時、 又は新しくウィンドウを開いた時の デフォルトウィンドウサイズを指定する方法を どなたか教えていただけませんでしょうか? また、開いたウィンドウをリサイズできないように するにはどうしたら良いでしょうか? (ViewクラスはCFormViewを基底としています。) 宜しくお願い致します。

  • Illustrator CS3のアートボードのデフォルトサイズ変更

    Illustrator CS3のアートボードのデフォルトサイズ変更 MAC OS ? 10.4.11で、Adobe Illustrator CS3 13.0.3を使用して作業しているのですが、 『ファイル』>『開く』 とやって、画像ファイルを選んで開いた際のアートボードのサイズが100px×100pxと大変小さく、いちいち変更するのが面倒なのでデフォルトのアートボードサイズを変えたいのですが、何をどのように変更すればデフォルトのアートボードサイズが変更できますか?どなたか教えて頂けないでしょうか。よろしくお願い致します。

  • VC++ 6.0 でのCMainFrameクラスの作り方を教えてくださ

    VC++ 6.0 でのCMainFrameクラスの作り方を教えてください OSはWindows XPです。 MainFrame.cpp MainFraem.h ファイルはどちらもない状態です。 新規作成方法を教えてください。

  • MDI frame_windowのsize変更後にMSGが届かない

    C++のカテゴリでWindowsプログラミングの質問もおかしいと思いましたが、他に質問するカテゴリが無かったので申し訳ありませんが、よろしくお願いします。 久しぶりに時間が空いたため、windows apiを使って自作でクラスライブラリを作成に挑戦し、WINDOWSプログラミングを行っています。 MDIウィンドウのアプリケーションについて質問です。 アプリケーション起動時に、MDIのフレームウィンドウとクライアントウィンドウを生成し、クライアントウィンドウをダブルクリックした時に、MDI子ウィンドウを生成するようにプログラムを作成しました。 アプリケーション起動後、フレームウィンドウのサイズを変更せずにクライアントウィンドウ領域でダブルクリックするとダブルクリックした回数分、MDI子ウィンドウが生成されました。 しかし、一度でもフレームウィンドウのサイズを変更してしまった場合に、ダブルクリックしてもMDI子ウィンドウが生成されなくなってしまいました。 (※「WM_LBUTTONDBLCLK」メッセージ自体が来なくなった。) 何故、ダブルクリックのメッセージが来なくなるのか心当たりが無く困っています。 以下のホームページにクライアントウィンドウのリサイズした時の処理について記載されていますが、内容を追加しても解決しませんでした。 http://www.arcpit.co.jp/winapi/api_02/ap020407.htm 申し訳ありませんが、ダブルクリックのメッセージが来なくなる理由についてお心当たりがあれば、お教えお願い致します。 ※環境 OS:Windows Vista Home Basic 開発環境:Visual C++ Express Edition

  • CMainFrameクラスの使い方

    すみませんが教えてください。 これまで左クリックで画面に文字を表示するときには、何も考えずCxxxViewクラスにWM_LBUTTONDOWNをかいていました。ところがCMainFrameクラスにもちゃんとWN_LBUTTONDOWNが用意されているではないですか。 先ほど教えていただいたばかりの左クリックにてウインドウサイズ変更ができると思い以下のようにしましたが、何も起きませんでした。 どうすれば実現できるのでしょうか? CMainFrameクラスのWN_LBUTTONDOWNはどのような時に使うのですか? void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください AfxGetMainWnd()->SetWindowPos(NULL,100,200,300,400,SWP_SHOWWINDOW); CFrameWnd::OnLButtonDown(nFlags, point); }

  • VC# 境界線のないウィンドウフレームのサイズ変更

    VC#を勉強しています。 質問内容ですが、ウィンドウフレームのプロパティの FormBorderStyle がありますよね。 これを、[none]に設定するとウィンドウフレームが消えます。 このフレームのサイズ変更をマウスを使って行いたいのですが、どうもやり方がわかりません。 境界線がないので、ステータスバーをウィンドウ下部へつけて、ステータスバーの右下のサイズ変更用の部分にマウスカーソルを当ててドラッグしてみても、サイズが変更されません。 何かいい方法があれば、教えて頂きたいです。 どうかよろしくお願いいたします。

専門家に質問してみよう