2012-02-14 23 views
6

Bir ComboBox açılır menüsünün (veya içerik menüleri de dahil olmak üzere, bu konuyla ilgili başka bir açılır kapanma) davranışını, odaklanamayan bir şeyde bile başka bir yere tıkladığınızda açılır kapanır kapanmaya çalışıyorum.Bir ComboBox, düşürüldüğünde fareyi nasıl yakalar?

MouseCaptureChanged, LostFocus ve Leave gibi etkinliklere abone olmayı denedim. Bir açılır menü gibi davranan özel bir UserControl var ve sadece kullanıcı başka bir yere tıkladığında kapatmak istiyorum.

Bu, birçok denetimde yapılan bir şey gibi görünüyor, bu yüzden bunu yapmanın basit bir yolu olmasaydı şaşırırdım.

Şimdiye kadar bunu yapmak için gelebilecek aşırı karmaşık yöntemler, pinvoke ve SetCapture() işlevini kullanıyor ya da bir MessageFilter oluşturuyor. Bunlar tek seçenek ise hangisinin daha iyi olduğundan emin değilim.

+2

kontrolü gibi bir DropDown uygulamak için kolay bir yol, bir ToolStripControlHost ve ToolStripDropDown kullanmaktır. Bir ComboBox gibi çalışır. Bkz. [Liste kutularını görüntülerken açılan kutucuklar, formdaki herhangi bir yere fare olaylarını kestirmek nasıl olur?] (Http://stackoverflow.com/a/8611382/719186) – LarsTech

+0

ToolStripControlHost'u deniyorum. Açılır pencerenin üst kısmındaki çirkin bir kenarlıktan veya açılır pencereyi açtığınız zaman ComboBox'ın titremesinden kurtulamam. –

+2

ToolStripContorlHost ve ToolStripDropDown öğesinin dolgularını 0'a ayarladığınızdan emin olun. Kontrolünüzde titremek farklı bir sorundur - özel bir açılır menü ile bir ComboBox kullanmaya mı çalışıyorsunuz? – LarsTech

cevap

1

ComboBox, 2 denetimden üretilmiştir.

  • Taban - görünür olduğunda (Kontrol) aktif
  • DropDownList değil - düzenleme modunda veya liste seçim modu (Pencere veya Form)

normal olarak baz görülebilir sırasında görünür. Kullanıcı ComboBox'a tıkladığında, Temel denetim gizlenir ve DropDownList denetimi görünür. Bu anahtar arka planda yapılır, bu nedenle kullanıcı için kontrol sadece genişletilmiş görünüyor.

Yakalamak istediğiniz olay DropDownList Penceresi üzerinden yapılır. İstemci alanınıza bir yere tıklarsanız, DropDownList Penceresi, WndProc (İleti% m) yöntemi aracılığıyla WM_KILLFOCUS olayını alır. Ardından ana penceresinden (Baz kontrolü) WPARAM ile WM_COMMAND ( OCM_COMMAND) iletiye gönderir = 526318 ( hiword (wParam) = 8) ve Temel kontrolü o DropDownList Pencere gizlemek gerektiğini bilir.

Yapmanız gereken şey ek DropDown Penceresini uygulamak ve WM_KILLFOCUS olayını yakalamaktır.

0

Bahsedilen denetimlerin şablonları, açılır menüde bir açılır pencereyi, yanlış olarak ayarlanmış olan StaysOpen özelliği (kapsayıcı olan sanırım) ile birlikte bir kapsayıcı olarak kullanıyor.

ComboBox template example