ウインドウの巨大化が解決しました。

問題が解決しました。
問題のコードは、ここでした。
void CXXXDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
    // 初期サイズ以上は小さくならないようにする
    lpMMI->ptMinTrackSize = CPoint(m_rctWndInitial.Width(),
        m_rctWndInitial.Height());
    CDialog::OnGetMinMaxInfo(lpMMI);
}

これは、OnInitDialog()内で、初期化された
CRect m_rctWndInitial;
によって、最小サイズを計算するものだったのですが、これが、OnInitDialog()よりも前に呼び出されてしまうのが原因でした。

デバッグビルドの場合、データの境目とかが分かり易いように
確保されたメモリ領域には、意味のない(でも固定の)値が
勝手に書き込まれます。
("フフフフフフフフフフフ" とか良く目にしますよね。)
これのおかげで、Width()やHeight()が±0となっていましたが、
リリースビルドでは、確保した後に、特定の値で勝手に初期化されません。
必要ならば、プログラマが、初期化コードを書く必要があります。
書いていませんでした。。。(T_T)

そのため、初期値のカスデータによって、幅、高さの最小値がとんでもなく大きい値になってしまったため、OnCreate()後の内部処理で、ウインドウが巨大化してしまったのです。

「クラスの場合は、コンストラクタで勝手に初期化される」
「、、、んだったかな?」
というのが、混乱の原因の一つです。
クラスによっては、コンストラクタで有無を言わせず、
メンバを初期化するものもありますが、
速度の面からも、混乱を防ぐ面からも初期化しないのが親切です。

初期化は、ダイアログクラスのコンストラクタで。
CXXXDlg::CXXXDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CFindMoveDlg::IDD, pParent)
    , m_rctWndInitial(0, 0, 0, 0) // こんな感じ
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

初期化はプログラマの仕事です。
気を付けましょう。

でも、デバッガが、もっとランダムチックな値で初期化してくれていれば、
こんなところを今頃になって悩まずに済んだのにぃ~~~

3時間近く悩んでしまった。。。
でも解決できて、良かった。ほっ。
[PR]
by isoq | 2005-05-23 17:17 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< 豪雨 GetProfileInt()... >>