コンボボックスのドロップダウンとドロップダウンリストについて質問させてくださ
い。
現在eMbedded Visual C++ 4.0で開発を行っております。
キー処理を独自で行う為に、ディスパッチ前メッセージPreTranslateMessage()にて
GetFocus()を行い、
コントロールIDテーブルのどのコントロールにフォーカスが当たっているかを判定し
ています。
処理は以下のようにしています。
// 現在のフォーカスインデックスを取得(内部テーブル)
int CKeyEventChange::GetFocusIndx(CWnd* pWnd, LONG* tblCtrlID)
{
for(int nIndx = 0; ;nIndx++){
// 最後まで該当しない場合は検索終了
if(tblCtrlID[nIndx] == EOF) return 0;
(※)if(pWnd->GetFocus() == pWnd->GetDlgItem(tblCtrlID[nIndx])){
// 現在フォーカスのコントロールIDインデックス
break;
}
}
return nIndx;
}
注)抜粋なので間違っている箇所があるかもしれません
そこで質問なのですが、コンボボックスのスタイルがドロップダウンの場合は(※)箇所
の条件でヒットするのですが、ドロップダウンリストの場合はヒットしません。
ドロップダウンではなく、ドロップダウンリストを使用する必要があります。
何が原因か分かる方いらっしゃいませんでしょうか?
よろしくお願い致します。
マルチポストはマナー違反です。
MFCのオブジェクトではなく生のHWNDで比較した場合はどうなりますか。
if( ::GetFocus() == ::GetDlgItem( hWndDlg, tblCtrlID[ nIndx])){
}
うーーん、
30分も経っていないのにこちらに質問を掲示するのはまずいですね。
せめて一週間ぐらいたって意見がもらえないときに向こうに一言断りを入れてから
他のところ(たとえばここ)に掲示したほうがいいですね。
仲澤さんのご意られなくて見もごもっともですが、まず、最初の解答者のご意見を先
に見ていますか?
サブクラス化もいい方法だと思いますし、もちろん仲澤さんのHWNDを使ってSDK
で記述する方法もいいと思います。
ぼくは、MFCでうまくいかないときは大抵SDKに直します。
#SDKにして原因が分かるときも多いですね。
すみません。コンプライアンスの関係で
あっちには発言できないもんで・・・m(__)m。
まず、ヒットしない理由が分かっていますか。
そこが分からないと前に進まないのでは?
要は、GetDlgItem()でとれるのはコントロールのメインウィンドウ
であり、フォーカスをもつのはコントロールのメインウィンドウとは
限らないと言うことです。
複数のコントロールが集まって一つのコントロールを作ってる場合があるのでは?
だとすると,フォーカスは誰が持っているのか?
ダトスルト,一つのコントロールの中の複数のコントロールにもそれぞれIDがあるので
は?
datosuruto,押さえてあるIDは誰のIDなのか?
オヤオヤ?どうでしょう?
そんなとこでしょうかねぇ
> すみません。コンプライアンスの関係で
> あっちには発言できないもんで・・・m(__)m。
いえいえ、
こちらに質問してきたのですから、ここで解答するのは間違いでないと思います。
わざわざOKWAVEのほうに解答しなくてもいいと思います。
コントロールID基準で動きたいなら、
if(pWnd->GetDlgCtrlID() == tblCtrlID[nIndx])
を利用するのも一つの手。
今回の場合、このコードでも引っかからないはずですが、
少なくともウィンドウハンドルうんうん、
CWndオブジェクトうんぬんの話には惑わされないで、
デバッグ作業ができるはずです。
うーーん、
hekeheke03のハンドル名で検索するとすごい量のマルチポストですね。
多分返事来ないですね。
OKWaveの提携サイトがいろいろ検索に引っかかっている…なんてことないですかね?
# こういうときに不便…ですな。
# 私は別の名前で教えてgooで見てますが。
まぁ、いずれにしろ、現状で放置されていることに変わりはないのですが。
# WindowsCE系でコントロールの親子関係まで確認していないので…本題には回答できず。
あれ?名前がヘンになってる??