ページ 11

コンボボックスのリストをクリックできない

Posted: 2013年10月02日(水) 18:02
by どらごん
Windows7
Win32API
MinGW g++
C++11使用

以下のような手順でコンボボックスを作成したのですが、

combobox = ::CreateWindowEx (
WS_EX_LEFT | WS_EX_ACCEPTFILES,
"COMBOBOX",
"",
WS_CHILD | WS_VISIBLE | CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_HASSTRINGS | CBS_NOINTEGRALHEIGHT,
700,
500,
100,
500,
hWnd,
( HMENU ) g_id++,
g_hInst,
nullptr
) ;
for ( auto &elem : { "qwe", "rty", "uio", "p@" } )
{
::SendMessage ( combobox, CB_ADDSTRING, 0, ( ::LPARAM ) elem.c_str () ) ;
}

※実際はクラスにまとめていますが展開しました。。

クリックでリストをドロップさせることは出来たのですが、リストをクリックしても、選択されずにフリーズしたような状態になってしまいます。WM_COMMANDメッセージも受け取りません。
しかし、付属のエディットボックスに入力することは出来ます。このばあいはWM_COMMANDメッセージを受け取ります。
また、十字キーを用いると問題なく選択できます。
この状態になると、コンボボックスのあるウインドウ全体のマウス関連のイベントがまったく発生しなくなり(メニューも開けない)ますが、タイマーイベントは受け取っています。(完全にフリーズしているわけではない)
ウインドウを非アクティブウインドウにする(ほかのウインドウをクリック)するか、クリックを5回くらい連打すると元に戻りますが選択できていません。
また、CBS_DROPDOWNではなくCBS_SIMPLEを指定すると問題なく選択できます。

ほかのコントロール(BUTTON,STATIC,LISTBOX,EDIT)は正常に動作しています。

どうすればマウスで選択できるようになるのでしょうか。
どなたかご教授よろしくお願いします。

Re: コンボボックスのリストをクリックできない

Posted: 2013年10月02日(水) 22:06
by softya(ソフト屋)
for ( auto &elem : { "qwe", "rty", "uio", "p@" } )
をやめて定数にしたら動くとか無いですか? 生存期間が心配です。
SendMessage()だから大丈夫な気もするんですが自信がありません。
見当違いなら申し訳ないです。

Re: コンボボックスのリストをクリックできない

Posted: 2013年10月02日(水) 22:19
by どらごん
定数にしてもだめでした。それに普通のリストボックスはちゃんと動いていますし。
あとアクセラレーターキーも動いてないことに気づきました。

でかいけどクラスの定義とかも乗せたほうがいいでしょうか?

Re: コンボボックスのリストをクリックできない

Posted: 2013年10月02日(水) 22:26
by softya(ソフト屋)
全部を上げてもらっても再現できる保証もないので(環境を合わせるのも一苦労しそうです)。
別プロジェクトでコンボボックスだけのウィンドウを作っても症状は同じでしょうか?
 → 原因がWindowsAPIなのか、他の影響を受けているのか切り分けられるのでは?と言う提案です。

【追記】
CBS_HASSTRINGS ってオーナー描画用ですが外してはどうでしょうか?

Re: コンボボックスのリストをクリックできない

Posted: 2013年10月03日(木) 17:29
by どらごん
いろいろ試していたら原因がわかりました。

GetMessage の第2引数に ウインドウハンドルを渡していたのが原因だったようです。
nullptrを指定すると正常に動きました。

TranslateAcceleratorを追加するときに誤って一緒に書き換えてしまったようです。
解決にしておきます。お騒がせしました。ありがとうございました。