はじめて利用させていただきます。
今、ダイアログ形式のプログラムを作っているのですが、エデェットボックスに
16進入力(特定文字0~9、a~f)だけの許可をしたいのですが、どうしてよいか困っています。
ちなみに、ダイアログはAppWizardを使い,MFCで実現したいのですがどなたかご存知ないでしょうか。
よろしくお願いします。
サブクラス化するのでしょうか。
Bunさん、ありがとうございます。試してみました。
が、多分
m_NEdit.SubclassDlgItem( IDC_EDIT1, this);
のサブクラス化しようとするところでデバッカがDebug Asserttion Failed
と言ってきて実行できませんでした。
お教え頂いた、HPのとおりやったのですが。。。
まささん こんにちは。
ダイアログベースでしょうか?
ダイアログのOnInitDialog()内で SubclassDlgItem()されていますか?
さっとコードをのせてみますか? f(^^;
はい、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);
}
試しにやってみたらうまく動作しましたが・・・
m_NEditの宣言、定義は大丈夫でしょうか?
MFC ClassWizardのメンバ変数で、変数の追加で ID_EDIT1
にタイプCEdit、メンバm_NEditとしたのですが。
実際にやって頂いてうまく行くとすると、自分の環境がまずいのでしょうか。。
ちなみにOSはWin98 S-Editionですけど。
関係ないですよね~。。
>MFC ClassWizardのメンバ変数で、変数の追加で ID_EDIT1
>にタイプCEdit、メンバm_NEditとしたのですが。
こりゃ、あかんですわ~ん。(^^;
ホームページの通りにやってみてくださいませ。
クラスビューからおおもとのクラスを右クリックし、クラスの新規作成で追加します。
基本クラスのコンボでCEditを選択し、クラス名に CNumberEditBoxを打ち込みます。
ダイアログのメンバに追加します。(ヘッダーファイル内で定義ですね)
CNumberEditBox m_NEdit;
こうすればサブクラスできると思いますよ。
#あらかじめ、もとの変数m_NEditは削除しておいてくださいね。^^
ありがとうございます。
出来ました。。
HPの最後の部分の解釈が全然間違っていました。
&サブクラス化の意味が真に理解できていないみたいで。。。
まだまだ、勉強不足でした。
ほんと、助かりました。
もう見ないかもしれませんが。
Ctrl+Vでのペーストなどができないんじゃないんでしたっけ?
OnUpdateを使うって方法もあるかと思います。