• ベストアンサー

DDVによるメッセージの変更

WindowsXP VC++ 6.0 ダイアログのエディットボックスへの入力値チェックにDDVを 使用していますが、チェックに引っかかった時のメッセージを 変更することは出来ないのでしょうか? 例えば、0~99までの数値を入力する場合、 DDV_MinMaxLong(pDX, m_m_lHoge, 0, 99); としており、100を入力すると 「0から99までの整数を入力してください。」 と表示されます。このメッセージを変更したいのです。 以上、よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

自前で実装するしかないでしょうね DDV_MinMaxLongはMFCのソースのDlgData.cppに実装されています このコードを元に自前の DDV_MinMaxLong2などを定義して メッセージマップの DDV_MinMaxLong(pDX, m_m_lHoge, 0, 99); をコメントアウトして //}}AFX_DATA_MAP より後ろで DDV_MinMaxLong2(pDX, m_m_lHoge, 0, 99); と記述します DDV_MinMaxLongは minValとmaxValとValueの関係をチェックして 条件を満たさない場合に _AfxFailMinMaxWithFormat を呼んでいます _AfxFailMinMaxWithFormatは 引数の minVal,maxValをlpszFormatで文字列化して nIDPromptで登録されているリソースにより エラーメッセージを表示しています 最後に pDXのFailメンバーを呼んで ダイアログの終了またはフォーカスの移動をキャンセルするといった動きになります 単純に"Error"と表示するメッセージボックスを出すだけなら void AFXAPI DDV_MinMaxInt2(CDataExchange* pDX, int value, int minVal, int maxVal) {   if( value < minVal || value > maxVal ) {     // このAfxMessageBoxの引数を適当な物に置き換えてください     AfxMessageBox( "Error" );     pDX->Fail();   } } といった具合でしょう ダイアログクラスのヘッダーファイルのクラス定義の外で void AFXAPI DDV_MinMaxInt2(CDataExchange* pDX, int value, int minVal, int maxVal); といったプロトタイプ宣言をしたほうがいいでしょう

happy10429
質問者

補足

MFCの中を追っていって見ていたのですが、単純に値をチェックして Fail()をコールしているだけみたいなので、 void CHoge::DoDataExchange(CDataExchange* pDX) { DDX_Text(pDX,IDC_EDIT_HOGE,m_lHoge); if ((pDX->m_bSaveAndValidate!=0)&&((m_lHoge<0)||(99<m_lHoge))) { AfxMessageBox( _T("入力値エラーです。") ); pDX->Fail(); } //DDV_MinMaxLong(pDX,m_lHoge,1,99); } といった実装は正しいのでしょうか? m_bSaveAndValidateは値の読み取りの方向として入れてあります。 チェック箇所はそう多くないので、redfox63様のDDV_MinMaxInt2() を直に記述した形になると思います。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

if ((pDX->m_bSaveAndValidate!=0)&&((m_lHoge<0)||(99<m_lHoge))) は少し手直しが要るようです (pDX->m_bSaveAndValidate!=0)はDialog->変数の方向だけのチェックに限定となります 本来なら双方向でチェックは利かないといけないかと … Dialogの初期化時とデータ変更時と UpdateData(FALSE); でメンバー変数への設定をコントロールへ渡す場合も考えられますよ 1 to 99の範囲なら (m_lHoge<1)||(99<m_lHoge)だと思います

happy10429
質問者

お礼

ありがとうございます!!! 前回の「//}}AFX_DATA_MAP より後ろで」ってのもミソだったのですね。 後ろに持っていかないと ClassWizard が開きませんでした。 「pDX->m_bSaveAndValidate」についても了解しました。

関連するQ&A

  • VC++のエディットボックスの非表示

    VC++で、ダイアログを作りました。 エディットボックスを置いているのですが、 このエディットボックスは始めは非表示(入力を受け付けない)にするため、 このエディットボックスのプロパティにある "Disable"をtrueにして"Visible"もtrueにしました。 そこまではよかったのですが、 「入力」ボタンを押すと、エディットボックスが白く表示され、入力を受け付けるというようにしたいのですが、 エディットボックスのプロパティを変更する関数というのはあるのでしょうか? いろいろ検索などをしているのですが、方法がわかりません。よろしくお願いします。

  • MFCのドラッグ&ドロップについて

    閲覧して頂きありがとうございます。 現在、WindowsXPでvc++6.0のMFC(ダイアログベース)を利用してダイアログを作り エディットボックスに入力されたファイルパスを利用して指定のファイルを 開く簡単なアプリを作ろうとしています。 そこでダイアログのエディットボックスの部分にファイルをドラッグ&ドロップすると エディットボックスにドロップされたファイルのパスを表示させようとしていますが、中々できません。 状況としては、グループボックスの中にエディットボックスを作成し、 グループボックスを右クリック→プロパティ→ドラッグドロップを許可 をすることによりグループボックスにドロップの許可を与えることはできていますが ドロップのイベントを拾うことができておりません。 ※参考サイトなどをみると「WM_DROPFILES」というハンドラがあるみたいなのですが  どこにも見当たらないです。。。 何か不明な点などあれば補足させて頂きますので、よろしくお願いします。

  • VC++6.0 エディットボックス、スピンコントロールについての質問

    VC++中の下ぐらいの技術者です。 エディットボックスにfloat型のメンバ変数を関連付けて使っています。 しかし、実際に値を打ち込むときに小数点、つまり「.」キーを押すと、 エディットボックス内でカーソルが先頭に戻ってしまいます。 これは直せませんか? また、スピンをエディットボックスのタブオーダーの次に配置し、プロパティのスタイルで 「自動関連付け」と「数値の自動表示」にチェックを入れたら、 そのコントロールが配置されたダイアログを表示するとエラーで表示できません。 これらの原因、解決方法の分かる方ご教授お願いします。

  • ボタンの表示の色、フォントを変更したい

    VC++でプログラミングしています。 MFCのダイアログベースのEXEを造っています。 ダイアログにはボタンとエディットボックスを貼り付けています。 私がやりたいのは以下のことです。 ・ボタンの色を設定したい ・ボタン、エディットボックスに表示する文字の色を設定したい ・ボタン、エディットボックスに表示する文字のフォント(サイズ)を設定したい プロパティでサイズ変更すると全体に反映されてしまうので、個々の コントロールについて制御したいと思っています。 ヘルプで調べて、それらしい関数を見つけるのですが使い方がわかりません。 VCを始めたばかりで、クラスの理解がまだ浅いです。。。 関数の説明は理解できても、「じゃあ、コードはどう書くの?」という状態です。 「○○ は ×× のメンバではありません」と、よく怒られてます。。。 識者の方、ご教授願います。 コードがどうなるのか知りたいので、簡単なサンプルコードがあると助かります。 また、質問ではないのですが、「この関数は○○をする」というのではなく、 「○○をするにはこの関数を使う」という様に調べられる、お勧めの書籍、 Webなどがありましたら教えてください。 今後の勉強に役立てたいと思っています。

  • MFCのウィンドウサイズ変更について

    いつもお世話になっております。 WindowsXP、vc++6.0のMFCを利用してダイアログベースのアプリを作成しています。 作成したアプリのウィンドウにはエディットボックスが貼り付けてありますが エディットボックスの文字列が長くなると全ての文字が見えなくなります。 エディットボックスの横幅を最初から極端に長くするといいかもしれませんが、 できる限りウィンドウサイズはコンパクトに作りたいので、ウィンドウサイズを ユーザーで変更できるようにし、合わせてエディットボックスも引っ張られるようにしたいです。 ※拙い文章だと思うので、下の方にやりたいことのイメージ図を書きました。 解決方法や参考サイトなど知っておられましたら教えて頂けないでしょうか。 よろしくお願いします。 ※イメージ図 アプリ起動時 ┌───────────┐ │Title              │ ├───────────┤ │┌────────┐  │ ││EditBox       │  │ │└────────┘  │ └───────────┘    ↓ 横サイズ変更(EditBoxの横幅もウィンドウサイズに引っ張られて伸びる) ┌────────────────┐ │Title                     │ ├────────────────┤ │┌─────────────┐  │ ││EditBox               │  │ │└─────────────┘  │ └────────────────┘

  • エディットボックス内でキー押されたときのメッセージ

    VC++6.0です。 メインウインドウ内のエディットボックス(一行)で、特定のキー入力を検知したいのですが、どのようにすればよいでしょうか。 mfcは使ってません。 //ウインドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {  switch( message )  {   case WM_CREATE:    //エディットボックスを作成    CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT","",          WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL,          0,0,2000, 20, hWnd, (HMENU)IDC_EDIT, g_hInst, NULL );    break;   case WM_COMMAND:    //エディットボックス内の変更はEN_CHANGEで受け取れるが、    //キーコードは送られてこない    break;  } }

  • SetWindowText関数について

    プログラミング初心者です。 WINAPI32を用いて、プログラミングに励んでいます。 リソース機能を用いて、親ウインドウのメニューバーからダイアログという形で子ウインドウを開けるようなプログラムを作りました。さらにその子ウインドウ上に、エディットボックスのコントロールを作りました。 例えばそのエディットボックスのIDがIDC_EDIT1なのですが、 子ウインドウを開いた時にすでにそのエディットボックスに数値が入力されているようにしたいのです。 そこで、ダイアログが開かれた時に流れる WM_INITDIALOGのメッセージがきたときに、SetWindowText関数を使えばよいのかな?と思ったのですが、このようなとき第一パラメータにはどのような数値をいれたらエディットボックスに文字列を代入できますか?? IDC-EDIT1といれたら、Struct HWNDに変換してくださいというエラーがでました。 どなたかご教授よろしくお願いいたします。

  • VC++のダイアログボックスに絵を描くには?

    VC++初心者なんですが、画像処理関係のプログラムをVC++で作っています。で、子ウィンドウに表示されている画像のRGBそれぞれのヒストグラムをダイアログボックスに表示したいのですが、ダイアログボックスに絵(グラフ)を描く方法がわかりません。どういう手順でやればいいですか?エディットボックスにGDIとかで絵を描くことは可能なんですか?またはピクチャーボックスですか?

  • 親ウィンドウの領域外でも表示されるエディットボックスについて

    親ウィンドウの領域外でも表示されるエディットボックスについて VisualStudio2005でMFCアプリを作っています。 親ウィンドウに指定したコントロールの領域外でも 表示されるようなエディットボックスを作りたいのですが、方法はありますか? イメージとしては、ダイアログ上にボタンがあって、 そのボタンを押すとエディットコントロールが表示され、入力待ちとなるようなものです。 このエディットには改行を入力させるのですが、改行してウィンドウサイズを大きくしていくと、 ダイアログの下の端でエディットボックスが途切れてしまいます。 ダイアログの下より大きくなっても全体が表示されるようにしたいんです。 このエディットの生成は次のような感じで行っています。 DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOHSCROLL | ES_MULTILINE | ES_WANTRETURN; m_edit.Create(dwStyle, rect, this/*ダイアログ*/, -1); よろしくお願いします。

  • フォーカスが移動したタイミングを知りたい

    こんにちは。 VC++6.0にて、ダイアログベースの Windowsアプリケーションを作成しています。 質問なのですが、複数あるエディットボックスの中で 特定したエディットボックスのフォーカスが失われた契機を知るには、どのようにすればよいのでしょうか。 ウィンドウメッセージを待つのでしょうか。 出来ましたら、サンプルコードなど記載頂けると幸いです。 よろしくお願いします。