• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エディットの入力チェック)

エディットの入力チェック方法と条件

このQ&Aのポイント
  • エディットボックスをサブクラス化して数値のみ入力できるようにする方法と、10から96までの数値のみ入力できる条件を実装したいです。
  • 既に条件1の数値のみ入力可は実装が完了していますが、WM_KILLFOCUSでの処理を行う場合、次のフォーカスのポインタが利用不可であるため、他の方法を検討しています。
  • 入力後すぐに入力チェックを行う方法を知りたいです。環境はMFCとVC++6.0です。

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

  • ベストアンサー
  • A__
  • ベストアンサー率47% (22/46)
回答No.1

強制終了の原因はSetWindowText() によるエディットの文字列の変更の 無限ループだと思います。 case WM_COMMAND:  if(HIWORD(wParam) == EN_UPDATE){ //エディットが変更される直前。   //SetWindowText() による変更を無視させるために GetFocus() も使う。   if(GetFocus() == hEdit && (HWND)lParam == hEdit){

rewind
質問者

お礼

回答ありがとうございます。 CString csBuf; GetWindowText(csBuf); とコーディングすることで、文字列を取得できました。 エディットボックスの入力チェックは これで無事完了です。 原因は、無限ループの様でした。 よく考えると、サブクラス化したのに、 GetDlgItem(IDCxxx)->GetWindowText(csBuf); だと、無限ループしちゃいますね。 どうも、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • MFCのエディットボックスの値をスピンボタン

    エディットボックスの値をスピンボタンの初期値にしたく、 下記コーディングにしたのですが CString Item; m_Spin->SetPos(((CEdit*)GetDlgItem(IDC_EDIT1))->GetWindowText(Item)); SetPos' : 1 番目の引数を 'void' から 'int' に変換できません。 とのエラーになります。 どのように変更したらよいかお教えください。

  • エディットボックスでテキストの最後に入力したい?

    エディットボックスで最後の位置に ( が入力されたときに閉じ括弧の ) を出力して () としたいのです が、下のコードだと ( が入ったときに )( となってしまいます。いろいろ試していますが () と出力 できないので、わかる方よろしくお願いします。 int nStartChar, nEndChar; CEdit *edit1 = (CEdit *) GetDlgItem(IDC_EDIT1); if(pMsg->message == WM_CHAR) if(pMsg->wParam == '(') { edit1->GetSel(nStartChar, nEndChar); edit1->SetSel(nStartChar, nEndChar); edit1->ReplaceSel(")"); }

  • エディットコントロール入力時の背景色変更について

    Win32 APIについて質問です。(前回質問させてもらった続きです) Microsoft Visual Studio .NET 2002、XP、API 2つのエディットコントロール(hEdit_DatDelay、hEdit_DatDelay2) のことなんですが、2つのエディットコントロールは、「0」を入力し フォーカスを外すと、メッセージを表示し、背景色を赤色表示する。 その後「0」以外の値を入力しフォーカスを外すと、背景色が元の 白色に戻る仕様を予定しています。 次のコードのように作成すると、両方のエディットコントロールで、 「0」を入力しフォーカスを外すとメッセージは表示しますが、 背景色は白色のままとなります。 (3)、(4)の行をコメントアウトすると「hEdit_DatDelay」のみ赤色と なります。 (1)~(4)のあたりが何か問題があるのではと思っているのですが、 お手上げ状態です。 ご存じの方すいませんがご教授の程よろしくお願いします。 //・・・ switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); switch (wmId) { //・・・ case IDC_DAT_DELAY: //一つ目のエディットコントロール switch (wmEvent) { case EN_KILLFOCUS: GetWindowText(hEdit_DatDelay , DatDelay , 4); DatDelay_int = atoi(DatDelay); if(DatDelay_int == 0) { Bck_Red = 1; MessageBox(hWnd, (PCTSTR)Text, _T("ftp"), MB_OK); SetFocus(hEdit_DatDelay); break; }else{ Bck_Red = 3; //(1) InvalidateRect(hEdit_DatDelay, NULL, TRUE); //(2) break; } break ; } break; case IDC_DAT_DELAY2://二つ目のエディットコントロール switch (wmEvent) { case EN_KILLFOCUS: GetWindowText(hEdit_DatDelay2 , DatDelay2 , 4); DatDelay_int2 = atoi(DatDelay2); if(DatDelay_int2 == 0) { Bck_Red = 2; MessageBox(hWnd, (PCTSTR)Text, _T("ftp"), MB_OK); SetFocus(hEdit_DatDelay2); break; }else{ Bck_Red = 4; //(3) InvalidateRect(hEdit_DatDelay2, NULL, TRUE); //(4) break; } break ; } break; //・・・ case WM_INITDIALOG: //ブラシの作成 RedBrush = CreateSolidBrush(RGB(255,0,0));// 赤ブラシ ClearBrush = (HBRUSH)GetStockObject( NULL_BRUSH );//透明 break; case WM_CTLCOLOREDIT: { switch(Bck_Red) { case 1: if ((HWND)lParam == GetDlgItem(hWnd, IDC_DAT_DELAY)) { SetBkColor((HDC)wParam, RGB(255,0,0)); //背景を赤色 return (LRESULT)RedBrush; } break; case 2: if ((HWND)lParam == GetDlgItem(hWnd, IDC_DAT_DELAY2)) { SetBkColor((HDC)wParam, RGB(255,0,0)); //背景を赤色 return (LRESULT)RedBrush; } break; case 3: SetBkColor( (HDC)wParam, GetSysColor( COLOR_WINDOW ) ); return (LRESULT)ClearBrush; break; case 4: SetBkColor( (HDC)wParam, GetSysColor( COLOR_WINDOW ) ); return (LRESULT)ClearBrush; break; default: break; } } break;

  • GetWindowTextの使い方

    PocketPC2003を使ってアプリを使っているのですが エディットボックスに入力された文字列を 取得する方法が分からず困っております。 エディットボックスに対して、classwizardで CEdit型のm_zip変数を作成しました。 そこで、 CString buf; m_zip.GetWindowText(cs_buf); という所までは分かったのですが、これを char型の文字列にコピーしたいのですがどうすれば よいのでしょうか?。 開発環境は、 eMbedded Visual C++ 4.0です。

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

    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;  } }

  • ウィンドウアプリが思うように動かない(GetWindowTextの使い方?)

    プログラミング初心者です。Windows XP, Visual Studio 2005 PE 使用。MFCは使わない(というより使い方がわからない…)。 簡単なウィンドウプログラムを作っています。エディットボックス1つとボタン1つを含むもので、ボタンを押すとエディットボックスの文字列を取得して、もしそれが close であればプログラムを終了するようにしたいんです。 自分で書いたコードの一部(プロシージャのみ)を以下に載せます。WM_CREATE、WM_DESTROYメッセージは省略。edit1はエディットボックスのハンドル、case式の2はボタンの子ウィンドウIDです。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ char lpString[6]; switch(msg){ case WM_COMMAND: switch(LOWORD(wParam)) { case 2: GetWindowText(edit1,lpString,6); if(lpString == "close") SendMessage(hWnd, WM_CLOSE, 0, 0); else SendMessage(edit1, WM_CLEAR, 0, 0); return 0; } return 0; default : return DefWindowProc(hWnd,msg,wParam,lParam); } return 0; } Visual Studioではちゃんとビルドしてくれるんですが、いざ実行してcloseと入力した上でボタンを押してもうんともすんとも言いません。原因は何でしょうか?素人ながらlpStringをそのまま取り出して使用してるのがまずいのではと思いますが、関数の使い方がわからず対処に困っています。教授いただければ幸いです。

  • LineTo,MoveToについて

    MFCのダイアログベースで 変化を表すグラフを作成したのですが 線を描くときに原点復帰してしまいます。 左上のエディットに数値をいれ 実行を押すと座標(200,200)から横にエディットで入力した数値分線を引いていくというものです。 Timerを使い1秒ごとに書かせています。 void CsinDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: ここにメッセージ ハンドラー コードを追加するか、既定の処理を呼び出します。 static int count=0; static double i,x=0; char buf[100]; CString str; /*------描写設定----*/ CWnd* h = GetDlgItem(IDC_BB); CDC* pDC=h->GetDC(); //-----------------------------------// CEdit *edit = (CEdit*)GetDlgItem(IDC_EDIT1); edit->GetWindowText(str); i = atof((const char*)str); x=x+i; sprintf(buf,"%lf",x); siki_edit.SetWindowText(buf); /*---------------------------------------*/ if(count==0) pDC->MoveTo(200,200); // 座標(200,200) に移動 pDC->LineTo(200+x,200); // 座標(200+x,200) まで線を引く count++; h->ReleaseDC(pDC); CDialogEx::OnTimer(nIDEvent); } 実行結果は添付した画像のようになります。 イメージではcountが0の時だけMoveToで動かし、それ以降は座標(200,200)から横に線を引いていきたいのですが。 どのように直せばよいのでしょうか? LineToからLineToの指令ができないということでしょうか?

  • エディットの複数行化が反映されない

    VC++2008 MFCで開発を行っています。 ダイアログに、マルチラインでなくかつ改行を受け付けないエディットを配置しています。 このエディットのエディットスタイルを条件に合わせてマルチライン、改行受付にしたいのですが、 反映されません。実現方法のご教示をお願い致します。 現状の私は以下のコードを、OnInitDialog()内に書いています。 SetWindowLong(GetDlgItem(IDC_EDIT1)->GetSafeHwnd(), GWL_STYLE, WS_CHILD | WS_VISIBLE | ES_WANTRETURN | ES_MULTILINE); ちなみにWS_VISIBLEやWS_CHILD の有り無しは反映されます。 反映されないというのは、入力中にエンターキーを押した直後にダイアログが閉じられることから判断しています。

  • エディットボックスの数値を他の変数に代入するには??

    プログラム初心者です。 質問させてください! リソース機能を用いて、親ウインドウのメニューバーからダイアログという形で子ウインドウを開けるようなプログラムを作りました。さらにその子ウインドウ上に、エディットボックスのコントロールを作りました。  そのエディットボックスのIDがIDC_EDIT1なのですが、 SetDlgItemInt関数を使って SetDlgItemInt(hWnd,IDC_EDIT1,A,FALSE);とし、 子ウインドウが開かれた時に流れる WM_INITDIALOGメッセージが流れた時に、その子ウインドウのエディットボックスにAという数値をすでに入力されているようにしました。 実際にこのプログラムを実行した時に、エディットボックスAの値をキーボード操作で任意に変えられると思うのですが、 このとき任意に変えた数値をさらにAに代入するにはどのような関数を用いればいいのでしょうか?? つまり、親ウインドウから子ウインドウへ送信させたAという数値を、子ウインドウ上のエディットボックスでキーボード操作より値を変化させ、その値をさらにもとのAに更新させて親ウインドウで使いたいのです。 MFCの機能は使っておりません。 どなたかご教授よろしくお願いいたします。

  • 入力チェックのプログラム

    すみません、教えてください。 『キーボードから入力された数値の範囲をチェックする。 範囲は0~10000とし、入力の際に文字(A~Z,a~z,特殊文字)、空白を含む入力、リターンのみの入力はERRORを表示する。再度、入力を要求し、正常データが入力された時点でOK(入力数値)と表示し、終了する』 という問題なのですが、whileを使って、配列に格納した文字を条件があうまで判定すればいいのではないかとは思うのですが、範囲のチェックをどのようにしたらよいのかよくわかりません。 どのようにしたらよいか教えていただけませんでしょうか。 よろしくお願いします。