数字しか入力できないEditについて

[戻る]
kokoro 2005/02/25(金) 00:45:58
初心者です。

http://www.athomejp.com/goldfish/mfc/edit/number.asp
を見て現在数字しか入力できないEditを作成中です。

しかし、どうしても
「m_NEdit.SubclassDlgItem(IDC_EDIT1, this);」のところで、
"Debug Asserttion Failed"って出てしまいます。

HPに書かれている様にしましたが、最後の
「サブクラス化する際に、ダイアログクラスのヘッダーに、CNumberEditBoxクラスのヘ
ッダーのインクルードと、データメンバに「m_NEdit」を追加してください。」
のところで色々悩んでいます。

ここは、
・クラスウィザードからメンバ変数タブをクリック。
・ダイアログのクラスを選ぶ。
・コントロールIDのIDC_EDIT1を選択する。
・変数の追加ボタン押下する。
・メンバ変数に「m_NEdit」記入
・カテゴリは「コントロール」を選択。
・変数のタイプは「CNumberEditBox」としました。

現在sourceとheaderは、
BOOL CAaaDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // このダイアログ用のアイコンを設定します。フレームワークはアプリケー
ションのメイン
    // ウィンドウがダイアログでない時は自動的に設定しません。
    SetIcon(m_hIcon, TRUE);            // 大きいアイコンを設定
    SetIcon(m_hIcon, FALSE);        // 小さいアイコンを設定
    
    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    m_NEdit.SubclassDlgItem(IDC_EDIT1, this);

    return TRUE;  // TRUE を返すとコントロールに設定したフォーカスは失われ
ません。
}




/////////////////////////////////////////////////////////////////////////////
// CAaaDlg ダイアログ

class CAaaDlg : public CDialog
{
// 構築
public:
    CAaaDlg(CWnd* pParent = NULL);    // 標準のコンストラクタ

// ダイアログ データ
    //{{AFX_DATA(CAaaDlg)
    enum { IDD = IDD_AAA_DIALOG };
    CNumberEditBox    m_NEdit;
    //}}AFX_DATA

    // ClassWizard は仮想関数のオーバーライドを生成します。
    //{{AFX_VIRTUAL(CAaaDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV のサ
ポート
    //}}AFX_VIRTUAL

// インプリメンテーション
protected:
    HICON m_hIcon;

    // 生成されたメッセージ マップ関数
    //{{AFX_MSG(CAaaDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

となっています。

※ちなみに
m_NEdit.SubclassDlgItem(IDC_EDIT1, this);
をコメントアウトしたらうまくできました。
(なんででしょうか…?)

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200111/01110064.txt
も見ましたが分かりません。
どなたかアドバイスを下さい。

開発環境は、
XP、VC6(SP6)です。

よろしくお願い致します。

Blue 2005/02/25(金) 01:43:02
たぶんClassWizardで作成すると、m_NEdit.SubclassDlgItem(IDC_EDIT1, this);のよう
な処理は CAaaDlg::DoDataExchangeメソッドのなかで同等な処理が行われているからで
す。(DDX_Control(pDX, IDC_EDIT1, m_NEdit);のとこね)

だから、そこをコメントアウトするか、m_NEdit.SubclassDlgItem(IDC_EDIT1, this);
をコメントアウトするかすれば無事動きます。

>「サブクラス化する際に、ダイアログクラスのヘッダーに、CNumberEditBoxクラスのヘ
>ッダーのインクルードと、データメンバに「m_NEdit」を追加してください。」
そのWebページはClassWizardで追加しないで、手動で追加するのを前提に書かれてい
るものだと思われます。

kokoro 2005/02/25(金) 06:27:39
[[解決]]
おお!なるほど〜。
DDX_Controlってなんだろうって疑問はありますが、
本当にその通りでした。
ありがとうございます<(_ _)>
なんかすっきりしました。

Blueさん、素早い回答本当にありがとうございました。

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