Если назначить обработчик на событие Click, то он благополучно запускается с первого раза. Но список при этом не выпадает.
Получилось узнать что происходит в этот момент за кадром.
Действующие лица.
Основная форма (Browser), которая открывает другую форму настроек (ConfigForm). Т.е. Browser родитель для ConfigFom'ы
ConfigForm.comboBoxFont_DrawItem(object sender, DrawItemEventArgs e)
является обработчиком DrawItem у комбобокса(comboboxFont), который (естественно) находится на ConfigForm.
protected override void WndProc(ref System.Windows.Forms.Message message);
переопределен в Browser'e (родителе ConfigForm). WndProc обрабатывает системный события, получается(?), ну или сообщения.
Вот сообщения, которые появляются в определенном порядке (порядок ниже) в WndProc.
номер | описание |
0x210 | WM_PARENTNOTIFY Sent to a window when a significant action occurs on a descendant window. This message is now extended to include the WM_POINTERDOWN event. When the child window is being created, the system sends WM_PARENTNOTIFY just before the CreateWindow or CreateWindowEx function that creates the window returns. When the child window is being destroyed, the system sends the message before any processing to destroy the window takes place. |
0x1c | WM_ACTIVATEAPP Sent when a window belonging to a different application than the active window is about to be activated. The message is sent to the application whose window is being activated and to the application whose window is being deactivated |
0x46 | WM_WINDOWPOSCHANGING Sent to a window whose size, position, or place in the Z order is about to change as a result of a call to the SetWindowPos function or another window-management function. |
0x47 | WM_WINDOWPOSCHANGED Sent to a window whose size, position, or place in the Z order has changed as a result of a call to the SetWindowPos function or another window-management function. |
С первым щелчком по combobox'у начинается цикл. Цифрами будут обозначены события захода в WndProc с соответствующим кодом сообщения, а заход в comboBoxFont_DrawItem буду обозначать как "Draw"
Занавес.
Начинается вот такой цикл (в скобках зацикливание).
Draw Draw* 1c Draw 201 Draw (46 47 1c Draw 1c Draw Draw)
Со временем он оканчивается, конечно, а выпадающего списка я не дожидаюсь.
Может еще полезным будет знать:
* после отработки функции подсвечивается кнопка, по которой открывается комбобокс (становится как бы нажатой).
В переходе между функциями 1с и drawItem стирается отображаемое значение в поле edit комбобокса.
Кому интересно, может помочь разобраться
Код WndProc
protected override void WndProc(ref System.Windows.Forms.Message message)
{
if (message.Msg == WM_OPENIETRWND) //WM_OPENIETRWND - пользовательское сообщение
{
// сюда не заходит вообще никогда :)
}
base.WndProc(ref message);
}
Добавлено через 1 день, 19 часов, 3 минуты и 49 секунд:Получается, что после первого щелчка по комбобоксу теряется фокус у окна, при втором щелчке фокус возвращается, и далее уже можно работать с комбобоксом.
Добавлено через 4 дня, 32 минуты и 46 секунд:Оказалось все это из-за того, что я в Draw менял DropDownWidth. Т.е. постоянно вызывалась перерисовка.