2015-01-06 3 views
1

У меня есть combobox на winform с dropdownstyle, установленным в DropDownList.winforms combobox, как остановить его от падения при получении фокуса

Когда пользователь нажимает кнопку в выпадающем списке, открывается раскрывающийся список. Если я использую любой другой dropdownstyle (DropDown или Simple), это не тот случай, combobox откроется только тогда, когда пользователь нажмет на стрелку справа.

Что мне нужно - это выпадающее меню, которое имеет dropdownstyle, установленное в DropDownList, но при открытии его раскрывающегося списка открывается только при нажатии на стрелку справа, а не при нажатии в другом месте в выпадающем списке, как это происходит, когда dropdownstyle является DropDown или Просто.

В случае, если вам интересно, почему я хочу это, у меня есть DrawMode, установленный на OwnerDrawFixed, и в DrawItem я рисую combobox, поэтому он выглядит нормально, а не уродливый 3d, который этот dropdownstyle на меня накладывает. Так что у меня на самом деле есть сводная информация только для чтения, но без уродливого 3D-взгляда.

При необходимости я могу опубликовать код из DrawItem, но этот код не влияет на это поведение, потому что без кода drawitem combobox реагирует точно так же.

Надеюсь, этот вопрос достаточно ясен.

+0

это то, что вы можете исправить себя, читая [MSDN ComboBoxDropDown Documentation] (HTTP: // msdn.microsoft.com/en-us/library/system.windows.forms.combobox.dropdownstyle%28v=vs.110%29.aspx) – MethodMan

+0

Я просто посмотрел на этот документ, но не могу найти там ничего, что могло бы мне помочь. Пример для DropDownStyle = DropDown, который не является тем, что я использую. Может быть, вы могли бы указать мне на часть этого документа, которая мне нужна? – GuidoG

+0

Тогда что вы используете по умолчанию DropDownStyle ..? – MethodMan

ответ

1

Мой хороший друг Google пришел к Resque, этот кусок кода, кажется, чтобы исправить мою проблему:

const int WM_LBUTTONDOWN = 0x0201; 
const int WM_LBUTTONDBLCLK = 0x0203; 

protected override void WndProc(ref Message m) 
    { 
     // only open dropdownlist when the user clicks on the arrow on the right, not anywhere else... 
     if (m.Msg == WM_LBUTTONDOWN || m.Msg == WM_LBUTTONDBLCLK) 
     { 
      int x = m.LParam.ToInt32() & 0xFFFF; 
      if (x >= Width - SystemInformation.VerticalScrollBarWidth) 
       base.WndProc(ref m); 
      else 
      { 
       Focus(); 
       Invalidate(); 
      } 
     } 
     else 
      base.WndProc(ref m); 
    } 
+0

Рад, что вы один из немногих новичков, которые знают, как связаться со своим другом 'Google' – MethodMan

+0

Возможно, я новичок в stackoverflow и C#, но не новичок в программировании и поиске решений под давлением сроков ... – GuidoG

Смежные вопросы