エディットボックスに特定の文字だけ入力させたい

[戻る]
まさ [E-Mail] 2001/11/16(金) 16:22:45
はじめて利用させていただきます。
今、ダイアログ形式のプログラムを作っているのですが、エデェットボックスに
16進入力(特定文字0〜9、a〜f)だけの許可をしたいのですが、どうしてよいか困っています。
ちなみに、ダイアログはAppWizardを使い,MFCで実現したいのですがどなたかご存知ないでしょうか。
よろしくお願いします。

Bun 2001/11/16(金) 18:12:14
サブクラス化するのでしょうか。

Bun 2001/11/16(金) 18:24:50
下記のURLにサブクラス化の例が出ています。(^^;

http://homepage1.nifty.com/goldfish/mfc/edit/number.html

まさ 2001/11/16(金) 18:35:03
Bunさん、ありがとうございます。試してみました。
が、多分
    m_NEdit.SubclassDlgItem( IDC_EDIT1, this);
のサブクラス化しようとするところでデバッカが"Debug Asserttion Failed"
と言ってきて実行できませんでした。
お教え頂いた、HPのとおりやったのですが。。。

Bun 2001/11/16(金) 18:42:54
まささん こんにちは。

ダイアログベースでしょうか?

ダイアログのOnInitDialog()内で SubclassDlgItem()されていますか?

さっとコードをのせてみますか? f(^^;

まさ 2001/11/16(金) 18:56:47
はい、HP通り、OnInitDialog内でやっているのですが。
ソースコードはこんな感じです。。
もう、サンプルそのまんまなんですが。。

BOOL CTest1Dlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // "バージョン情報..." メニュー項目をシステム メニューへ追加します。
      ・
      ・
      ・

    SetIcon(m_hIcon, FALSE);        // 小さいアイコンを設定
    
    // TODO: 特別な初期化を行う時はこの場所に追加してください。

    m_NEdit.SubclassDlgItem( IDC_EDIT1, this); ★IDC_EDIT1がEDITBOXのIDです



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

★で、これがVM_CHARハンドラです。

void NumberBox::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
    // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
  if( nChar == VK_BACK    ||
       nChar == VK_DELETE  ||
       nChar == VK_TAB      ) 
           // Backspace、Delete、Tabの場合は、
            // 既存のハンドラ呼び出し。
    {
        CEdit::OnChar(nChar, nRepCnt, nFlags);
        return;
    }

    // 0〜9以外の場合は、何も行わずに終了。
    // 0〜9までは、既存のハンドラ呼び出し。
    if( !(nChar >= '0' && nChar <= '9'))
    {
        return;
    }
    CEdit::OnChar(nChar, nRepCnt, nFlags);
}

Bun 2001/11/16(金) 19:13:50
試しにやってみたらうまく動作しましたが・・・

m_NEditの宣言、定義は大丈夫でしょうか?

まさ 2001/11/16(金) 19:23:04
MFC ClassWizardのメンバ変数で、変数の追加で ID_EDIT1 
にタイプCEdit、メンバm_NEditとしたのですが。
実際にやって頂いてうまく行くとすると、自分の環境がまずいのでしょうか。。
ちなみにOSはWin98 S-Editionですけど。
関係ないですよね〜。。

Bun 2001/11/16(金) 19:42:22
>MFC ClassWizardのメンバ変数で、変数の追加で ID_EDIT1 
>にタイプCEdit、メンバm_NEditとしたのですが。

こりゃ、あかんですわ〜ん。(^^;
ホームページの通りにやってみてくださいませ。

クラスビューからおおもとのクラスを右クリックし、クラスの新規作成で追加します。
基本クラスのコンボでCEditを選択し、クラス名に CNumberEditBoxを打ち込みます。

ダイアログのメンバに追加します。(ヘッダーファイル内で定義ですね)

CNumberEditBox m_NEdit;

こうすればサブクラスできると思いますよ。

#あらかじめ、もとの変数m_NEditは削除しておいてくださいね。^^

まさ 2001/11/16(金) 20:11:32
[[解決]]
ありがとうございます。
出来ました。。

HPの最後の部分の解釈が全然間違っていました。
&サブクラス化の意味が真に理解できていないみたいで。。。
まだまだ、勉強不足でした。

ほんと、助かりました。

CdS 2001/11/17(土) 00:27:55
もう見ないかもしれませんが。

Ctrl+Vでのペーストなどができないんじゃないんでしたっけ?
OnUpdateを使うって方法もあるかと思います。

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