初めて書き込みします。お世話になります。
MFCのスタティックコントロール(CStatic)を使用して、グリッド相当の表形式コントロ
ールを作成しようとしています。表の各セルひとつずつにCStatic派生クラスを動的に生
成・配置し、これをひとつのCWndクラスの子としてまとめるという作りです。
基本的なことかもしれませんが、CStaticコントロールでフォーカスを受け取るにはどう
したらよいのでしょうか?こちらで確認してみたところ、
・Create時に「WS_TABSTOP」を設定すれば、タブ遷移でのフォーカス受け取りはでき
る。
・SetFocus()メソッドを使用すれば強制的にフォーカスを受け取れる。
という2点は確認できたのですが、自然にフォーカスを受ける(たとえばマウスクリック
された場合にアクティブとする)ことができずにいます。WM_LBUTTONDOWNイベントで自身
にSetFocus()すれば可能ですが、こういった細工が必要なのでしょうか?
ちなみに、サンプル用として作成したコードで、Createを行っている箇所は以下のとお
りです。最終的には親→子→孫の順にフォーカスを受け取りたく考えています。※
mGridOya,~Ko,~Magoは、CStaticクラスです。
-------------------
mGridOya.CreateEx( (0),
_T(STATIC),
親,
( SS_CENTER | WS_CHILD | WS_BORDER | SS_NOTIFY | WS_TABSTOP ),
CRect( 100, 100, 300, 300 ),
this,
1004,
NULL );
mGridOya.ShowWindow( SW_SHOW );
mGridKo.CreateEx( (0),
_T(STATIC),
子,
( SS_CENTER | WS_CHILD | WS_BORDER | SS_NOTIFY | WS_TABSTOP ),
CRect( 25, 25, 175, 175 ),
mGridOya,
1004,
NULL );
mGridKo.ShowWindow( SW_SHOW );
mGridMago.CreateEx( (0),
_T(STATIC),
孫,
( SS_CENTER | WS_CHILD | WS_BORDER | SS_NOTIFY | WS_TABSTOP ),
CRect( 25, 25, 125, 125 ),
mGridKo,
1004,
NULL );
mGridMago.ShowWindow( SW_SHOW );
-------------------
もしご存知の方がいらっしゃいましたら、ご教示願えますでしょうか?
以上、よろしくお願いいたします。
> という2点は確認できたのですが、自然にフォーカスを受ける(たとえば
> マウスクリックされた場合にアクティブとする)ことができずにいます。
> WM_LBUTTONDOWNイベントで自身にSetFocus()すれば可能ですが、こういった
> 細工が必要なのでしょうか?
たぶんその通りだと思います。スタティックコントロールは、
本来、表示以外は何もしない事を前提に作成されていると予測できるので、
WM_ACTIVATE等は無視される仕様なのかもしれません。
キーボードフォーカスを取得して何を使用としているのか不明
ですが、派生するだけでなくサブクラス化してメッセージが、
どのように処理されるかトレースしてみれば、良いかもしれません。
サブクラス化すれば、ほしいメッセージを捨てている処理を見つけて、
それを救うこともできます。
スタティックコントロールっぽい
エディットコントロールにしては?
SS_NOTIFYを利用するならメッセージマップに
ON_STN_CLICKED(1004, &Cxxx::Clickd) //&Cxxx::Clickdは呼ぶ関数
でメンバ関数呼んでクリックされたときの処理
*mGridKoとmGridMagoはmGridOyaの子なのでBaseClassを変えなきゃです
>グリッド相当の表形式
100個以上配置とかならCStaticからの継承でクラス作って
クリックをオーバーライドして処理すれば汎用的に
アクティブになった際、何をするのかがわからないのと
サンプルのIDが全て同じなのでメッセージは取れないかも。。。
つCWnd::OnGetDlgCode (WM_GETDLGCODE)
を調べると幸せになれるかも