• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:フレームのデフォルトのサイズについて)

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

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

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

  • ベストアンサー
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