Windowsアプリケーションのフォームのフォーカスについて

このQ&Aのポイント
  • Windowsアプリケーションのフォームのフォーカスについて解説します。
  • WindowsフォームアプリケーションをC/C++で作成していますが、フォームにフォーカスを持たせることができません。
  • フォームにマウスクリックした時にフォーカスが変わらず、フォーカスアウトした時に入力値の判定ができない問題が発生しています。何か解決方法はあるでしょうか?
回答を見る
  • ベストアンサー

Windowsアプリケーションのフォームのフォーカスについて

Windowsアプリケーションのフォームのフォーカスについて Windowsフォームアプリケーションを、C/C++で作成しています。 開発環境:Visual C++ 2008 Express Edition OS:WindowsXP テキストボックスに入力され、 フォーカスアウトした時に入力値の判定し、 偽だった時はボタンを非アクティブにする処理を実装しています。 しかし、タブ移動でのフォーカスアウトは可能なのですが、 フォームにマウスクリックした時にフォーカスが変わりません。 フォームにフォーカスを持たせることはできないのでしょうか? また、何か良い方法があったら教えていただけると幸いです。 宜しくお願いします。

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

  • ベストアンサー
回答No.2

FormのCanFocusプロパティがfalseを返すので、フォームにフォーカスを持たせることはできないように思います。 代わりにFormにコードを追加して、フォームの表面が左クリックされたら、TextBoxのフォーカスをなくすことはできます。(コードを参照) ただしこのコードでは、フォーム以外のコントロールに対するイベントを取得できません。 たとえば、ラベルのようにフォーカスを受け付けないコントロール上でのクリックに対応するためには、まだ工夫が必要です。 static const Int32 WM_LBUTTONDOWN = 0x0201; virtual void WndProc(Message% m) override {   // TextBoxにフォーカスがあり、   if (this->textBox1->Focused)   {     // TextBox以外のウインドウに対して、     if (this->textBox1->Handle != m.HWnd)     {       // 左ボタン押下であれば、       if (m.Msg == WM_LBUTTONDOWN)       {         // フォームのActiveControlを解除する。(ここで、Leaveイベントが呼ばれる)         this->ActiveControl = nullptr ;       }     }   }   __super::WndProc(m) ; }

victor0927
質問者

お礼

返事が遅くなってすいません。 ありがとうございます! 大変助かりました。 CanvasShoesさんのコードを参考に 以下のように実装しました。 // フォームクリックイベント VOID 画面クラス::フォーム_MouseClick( System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { // テキストボックスにフォーカスが当たっている場合 if( テキストボックス1->Focused || テキストボックス2->Focused || テキストボックス3->Focused ){ // 左ボタンがクリックされた場合 if( e->Button == ::MouseButtons::Left ){ this->ActiveControl = nullptr; } } } 尚、この画面の構成は以下のようになってます。 フォーム テキストボックス×3 ラベル×12 グループボックス×1 ボタン×2 これで、フォームクリック時の問題は解決しました。 ボタンクリック時はクリックイベントで なんとかなるので問題ありません。 問題はラベルとグループボックスですが… 上長と相談して仕様を決めていきたいと思います。 追伸:今回初めてココを利用したのですが、 CanvasShoesさんのようにわかりやすく 教えて下さる方がいて、これからも利用しようと思いました。 まあ、利用する必要がなければ それにこしたことはないのですが(^^;) 自分も他のかたにアドバイスできるように スキルを磨いていきたいと思います! 本当にありがとうございました。

その他の回答 (1)

  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.1

入力値の判定はどこに記述しているのでしょうか? ぱっと思いつくやり方は、テキストボックスにLeaveイベントもしくはLostFocusイベントを登録してそこで判定する方法ですが・・・

関連するQ&A

  • firefox フォームにフォーカス

    ページ内の上の方にフォームが一つ付いているページを10タブ開いているのですが、そのフォームにctrl+cで次々と貼り付けをしたいとおもっています。 アドオンでF3キーで次のタブへいけるようにしてあるのですが、次のタブへ行くとフォーカスがどこかへいってしまい、tabキーを7回押すと ページ内のフォームにフォーカスになります。これをショートカットキーか何かで一発でやりたいのですが、可能でしょうか?

  • Windowsフォームアプリケーションを表示するには?

    Visual C++のコンソールアプリケーションで数字をキーボードから入力するプログラムを作成しました。このプログラムは実行するとコマンドプロンプトが開かれてキーボード値の入力待ち状態になるのですが、ここでコマンドプロンプトではなく、このプログラムとは別に作成したWindowsフォームアプリケーションが開かれキーボード値の入力待ち状態になるというプログラムを作成したいのですが、こういったことは可能でしょうか?また可能ならばどのようなやり方があるか教えていただきたいです。宜しくお願いします。

  • フォームアプリのサンプル

    visual c++ 2008 express editionを学んでいるものですが フォームアプリケーションのサンプルなどを見て勉強しようと思っているのですが あまり見つかりません どこかにサンプルソースのあるwebページか、もしくは参考になる書籍など教えていただけないでしょうか

  • C# windowsフォームアプリケーション

    を作成したいと考えています。 環境は、visual studio2010 expressです。 C#で、Windowsフォームアプリケーションを学習中なのですが、 以下の疑問があります。 ◆行いたい事、 ・ボタンをクリックすると、openfiledialogが開く。 ・選択したファイル(csv)の値を取得 ・データベース(oracle10g)に、取得した値を、1レコードずつ登録 このようなアプケーションを作成したいと考えています。 ------------------------------------------------------------ 現在、フォームに、ツールボックスから、 ・button ・openfiledialog をクリックしましたが、 以降、どうすれば良いのか行き詰っております。 C#の学習を始めたばかりです。 フォームに配置した、ボタンをダブルクリックしたところ、 ソースが表示されたので、そこに、記述するのでしょうか? お教えいただけないでしょうか。 宜しくお願いします。

  • MDIの子フォームでフォーカスアウトを制御したい

    MDIの子フォームでフォーカスアウトを制御したい VB2005で開発を行っています。 ・MDIの子フォームA、Bが存在します。 ・子フォームA、Bともに、表示されています。 ・子フォームAにはテキストコントロールAA、ABの2つが存在します。 ・テキストコントロールAAのLostFocus()に、テキストコントロールAA.Focus()が  記されています。 この状態で、子フォームAのテキストコントロールAAからABへフォーカスが移った時、 コントロールAAのLostFocus()で制御するのはうまくいきます。 が、子フォームAのテキストコントロールAAから子フォームBへフォーカスが移った時、 コントロールAAのLostFocus()が動作しますが、無限ループっぽい動きに陥ったり、 子フォームAにフォーカスが設定されません。 子フォームを最小化させたり、全然関係のないアプリケーションやデスクトップに フォーカスを遷移したあとにフォーカスを戻してみても同じような現象になります。 イメージとしては、フォーカスアウトでエラーになったんだから、フォーカスを移し たくないです。 Private Sub ControlAA_LostFocus(ByVal sender As System.Object, ByVal e As System.EventArgs)  If "".Equals(ControlAA.Text) Then   MessageBox.Show("hoge")   ControlAA.Focus()   Return  End If End Sub フォーカスアウト時に項目チェックなどをやる関係で、どうしてもLostFocus()上で 処理をやらなければならないと思われるのですが、フォーカスアウトされた時のオペ レーションの違いに限らず上手く制御させる方法はありませんでしょうか? 調べてはみましたが、MDIの概念でそもそもそういうことするなというような事らしいですが、 フォーカスアウト時に検索処理が走るというような仕様の為、どうしても解決させたいです。

  • DataGrid 内のセル(あるいは行)にフォーカスを移したい(アクテ

    DataGrid 内のセル(あるいは行)にフォーカスを移したい(アクティブにしたい)のですが、その方法がわかりません。 Microsoft Visual Basic 2008 Express Edition で WPF アプリケーションを作成しています。 DataGrid 内にフォーカスを移そうとしているのですが、.Focus() ですと、DataGrid そのものにフォーカスが移って(DataGrid コントロールのふちが破線で囲まれる)しまいます。 セル(あるいは行)にフォーカスを移す方法があれば教えてください。

  • Express版でOfficeアプリケーション開発は可能?

    「Visual Basic 2005 Express Edition」で「Excel VBA」のようにOfficeアプリケーション開発は可能でしょうか。 可能であるならば、開発方法が学習できるサイトや書籍を紹介して下さい。

  • MFCアプリケーションについて

    MFCアプリケーションを使用してプログラミングをしようと思うのですが、プロジェクト作成欄にMFCアプリケーションがありません。 使用している環境は OS : Windows XP C++ : Microsoft Visual C++ 2005 Express Edition です。 サポートされていないのでしょうか? MFCアプリケーションを使う方法を教えてください。

  • フォーム1はどこへいったのでしょう?

    初心者です。 Microsoft Visual Basic 2008 Express Editionを使用しています。 新しいプロジェクト→windowsフォームアプリケーション →Form1に何個かコントロールを置く→デバッグ開始 →プロジェクトの保存→名前、ソリューソン名、WindowsApplication1→上書き保存→VB2008の終了 をしました。 さて質問ですがForm1を起動されたいのですがどこにあるのでしょう? C:\Users\○○\Documents\Visual Studio 2008\Projectsの中に 「WindowsApplication1」というフォルダがあるのでクリックしてみましたがどれを探せばいいのかわかりません。 そもそも「exe」の拡張子を捜せばいいのですよね?どうも見当たりません。 ご教授よろしくお願いします。

  • Visual C++ Express Editionのランタイムなしで起動する方法

    いま、Visual C++ Express Edition を使って、開発しています。 前回、同じようなことを質問したのですが いまいちわからなかったので、もう一度質問させていただきます。 Visual C++ Express Edition で作ったWin32アプリケーションは、 VCランタイムが必要らしいですが、 VCランタイムをほかのPCにインストールしなくても 起動できるようにはできないのですか?

専門家に質問してみよう