アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

Windowsフォームアプリケーションを、C/C++で作成しています。

開発環境:Visual C++ 2008 Express Edition
OS:WindowsXP

テキストボックスに入力され、
フォーカスアウトした時に入力値の判定し、
偽だった時はボタンを非アクティブにする処理を実装しています。

しかし、タブ移動でのフォーカスアウトは可能なのですが、
フォームにマウスクリックした時にフォーカスが変わりません。

フォームにフォーカスを持たせることはできないのでしょうか?
また、何か良い方法があったら教えていただけると幸いです。
宜しくお願いします。

A 回答 (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) ;
}
    • good
    • 0
この回答へのお礼

返事が遅くなってすいません。
ありがとうございます!
大変助かりました。
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さんのようにわかりやすく
教えて下さる方がいて、これからも利用しようと思いました。
まあ、利用する必要がなければ
それにこしたことはないのですが(^^;)

自分も他のかたにアドバイスできるように
スキルを磨いていきたいと思います!
本当にありがとうございました。

お礼日時:2010/06/24 17:38

入力値の判定はどこに記述しているのでしょうか?



ぱっと思いつくやり方は、テキストボックスにLeaveイベントもしくはLostFocusイベントを登録してそこで判定する方法ですが・・・
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!