• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Windowsアプリケーションのフォームのフォーカスについて)

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

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

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

  • ベストアンサー
回答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イベントを登録してそこで判定する方法ですが・・・