CStaticでフォーカスを受け取る方法 – プログラミング – Home

CStaticでフォーカスを受け取る方...
 
通知
すべてクリア

CStaticでフォーカスを受け取る方法


ぴょんきち
 ぴょんきち
(@ぴょんきち)
ゲスト
結合: 16年前
投稿: 1
Topic starter  

初めて書き込みします。お世話になります。

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

もしご存知の方がいらっしゃいましたら、ご教示願えますでしょうか?
以上、よろしくお願いいたします。


引用解決済
トピックタグ
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

> という2点は確認できたのですが、自然にフォーカスを受ける(たとえば
> マウスクリックされた場合にアクティブとする)ことができずにいます。
> WM_LBUTTONDOWNイベントで自身にSetFocus()すれば可能ですが、こういった
> 細工が必要なのでしょうか?

たぶんその通りだと思います。スタティックコントロールは、
本来、表示以外は何もしない事を前提に作成されていると予測できるので、
WM_ACTIVATE等は無視される仕様なのかもしれません。

キーボードフォーカスを取得して何を使用としているのか不明
ですが、派生するだけでなくサブクラス化してメッセージが、
どのように処理されるかトレースしてみれば、良いかもしれません。
サブクラス化すれば、ほしいメッセージを捨てている処理を見つけて、
それを救うこともできます。


返信引用
まえだ
 まえだ
(@まえだ)
ゲスト
結合: 17年前
投稿: 10
 

スタティックコントロールっぽい
エディットコントロールにしては?


返信引用
ねむねむ
 ねむねむ
(@ねむねむ)
ゲスト
結合: 18年前
投稿: 7
 

SS_NOTIFYを利用するならメッセージマップに
ON_STN_CLICKED(1004, &Cxxx::Clickd)   //&Cxxx::Clickdは呼ぶ関数
でメンバ関数呼んでクリックされたときの処理
*mGridKoとmGridMagoはmGridOyaの子なのでBaseClassを変えなきゃです

>グリッド相当の表形式
100個以上配置とかならCStaticからの継承でクラス作って
クリックをオーバーライドして処理すれば汎用的に

アクティブになった際、何をするのかがわからないのと
サンプルのIDが全て同じなのでメッセージは取れないかも。。。


返信引用
徹也
 徹也
(@徹也)
ゲスト
結合: 16年前
投稿: 5
 

つCWnd::OnGetDlgCode (WM_GETDLGCODE)
を調べると幸せになれるかも


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました