モーダレスダイアログの初期化するには?

解決


ココ  2006-06-02 05:14:10  No: 62031

モーダレスダイアログにて、
//変更前  .h

class CWaitMsg : public CDialog
{
        DECLARE_DYNAMIC(CWaitMsg)

public:
        CWaitMsg(CWnd* pParent = NULL);   // 標準コンストラクタ
        virtual ~CWaitMsg();

        BOOL    CWaitMsg::Create();
        CWnd*   m_pParent;      // for modeless.
        int     m_nID;          // for modeless.

// ダイアログ データ
        enum { IDD = IDD_WAITMSG };

protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート

        DECLARE_MESSAGE_MAP()
public:
        afx_msg void OnEnChangeEditMsg();
        CString m_waitmsg;
};

// .cpp

CWaitMsg::CWaitMsg(CWnd* pParent /*=NULL*/)
        : CDialog(CWaitMsg::IDD, pParent)
        , m_waitmsg(_T(""))
{
        char Message[256];
        LoadString(gHINSTANCE, IDS_MSG_500, Message, sizeof(Message));
        m_waitmsg       = _T(Message);
        m_pParent       = pParent;
        m_nID   = CWaitMsg::IDD;
}
の場合はちゃんと表示されます。が
このダイアログ表示位置をデスクトップ画面中央に配置したく

//変更後
//. h

class CWaitMsg : public CDialog
{
        DECLARE_DYNAMIC(CWaitMsg)

public:
        CWaitMsg(CWnd* pParent = NULL);   // 標準コンストラクタ
        virtual ~CWaitMsg();

        BOOL    CWaitMsg::Create();
        CWnd*   m_pParent;      // for modeless.
        int     m_nID;          // for modeless.

// ダイアログ データ
        enum { IDD = IDD_WAITMSG };

protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート
        virtual BOOL OnInitDialog();

        RECT rc;
        DECLARE_MESSAGE_MAP()
public:
        afx_msg void OnEnChangeEditMsg();
        CString m_waitmsg;
};

//.cpp

BOOL CWaitMsg::OnInitDialog ()
{
        //ダイアログデスクトップ画面中央表示
        int wFull = GetSystemMetrics(SM_CXSCREEN);                       // スクリーンの幅を取得
        int hFull = GetSystemMetrics(SM_CYSCREEN);                       // スクリーンの高さを取得
        GetWindowRect(&rc);                                                                 // ダイアログの初期位置とサイズ
        int w = rc.right - rc.left;
        int h = rc.bottom - rc.top;
        MoveWindow((wFull-w)/2, (hFull-h)/2, w, h, FALSE);  // 同じサイズで中心に移動させる

        //待機メッセージの取得&表示
        char Message[256];
        LoadString(gHINSTANCE, IDS_MSG_500, Message, sizeof(Message));
        m_waitmsg       = _T(Message);

        return true;
}

となおすと中央に配置はされるが、メッセージが表示されなくなってしまいます。

おかしな点がありましたら回答よろしくお願いします。


スナナ  2006-06-02 18:46:27  No: 62032

メソッドの呼ばれるタイミングが、コンストラクタ→DoDataExchange()→OnInitDialog()なのでこの現象が起きるのだと思います。
m_waitmsgに代入した後にUpdateData( FALSE )を呼び出してください。


ココ  2006-06-02 19:36:51  No: 62033

スナナさんありがとうございました。

UpdateData( FALSE )を呼び出したら成功しました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加