Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.29;
Скачать: CL | DM;

Вниз

Выпадающий список ComboBox   Найти похожие ветки 

 
capkoh   (2005-07-21 20:36) [0]

Разбираюсь в компоненте ComboBox и не могу понять каким образом рисуется выпадающий список. Точнее, на чем? И что есть этот выпадающий список по сути? И еще, этому компоненту посылается сообщение, например, CB_LIMITTEXT. Однако, явно это сообщение не обрабатывается. Так как же оно обрабатывается? Может я ничего не понимаю...


 
Юрий Зотов ©   (2005-07-21 21:26) [1]

ComboBox - это стандартный системный контрол. Таких довольно много, их код сидит они в user32.dll (у более современных - в comctl32.dll), а код VCL является лишь ООП-оболочкой для этих контролов. Соответственно, если код VCL не обрабатывает какое-то сообщение явно, то это означает, что его обрабатывает стандартная (дефолтная) оконная функция данного контрола из соответствующей системной библиотеки. Она же его и рисует, обрабатывая WM_PAINT и некоторые другие сообщения.

Фактически, ComboBox состоит из двух окошек - окна редактора и окна списка (причем последнее имеет стиль POPUP). Код VCL получает у системы хэндлы этих окошек (FEditHandle и FListHandle), определяет адреса их стандартных оконных функций (FDefEditProc и FDefListProc), а потом назначает им свои оконнные функции (EditWndProc и ListWndProc). После этого назначенные функции начинают получать все сообщения этих окон, часть из них они обрабатывают сами, а для обработки остальных вызывают стандартные - вот они-то и выполняют основную работу.


 
capkoh   (2005-07-22 15:04) [2]

Видимо win "узнает", что это системный контрол при вызове этой функции (функция TCustomComboBox.CreateParams):

CreateSubClass(Params, "COMBOBOX");

т.е. эта функция создает и Edit и Popup сама?
А здесь мы перекрываем defwndproc у Edit"а :

SetWindowLong(FEditHandle, GWL_WNDPROC, Longint(FEditInstance));

Верно?

Только вот рисует его VCL (по крайней мере компонент сам обрабатывает WM_PAINT > TCustomComboBox.WMPaint). Тут обнаружил такие строки:

if DroppedDown then
 DrawFrameControl(C.Handle, R, DFC_SCROLL, DFCS_FLAT or DFCS_SCROLLCOMBOBOX)
else
 DrawFrameControl(C.Handle, R, DFC_SCROLL, DFCS_FLAT or DFCS_SCROLLCOMBOBOX);

Так и должно быть?


 
miek ©   (2005-07-25 11:12) [3]

Это действительно так, в VCL все контролы (кроме кнопок, может быть) рисуются борландовским кодом. Это имеет ряд преимуществ...


 
tesseract ©   (2005-08-04 11:10) [4]

Большинство кнопок в Delphi тоже через VCL рисуется.

Есть такой классный TLookupDbCombobox он рисуется как раз своим кодом. Можно прошерстить Rxlibrary там мого интересных примеров


 
Игорь Шевченко ©   (2005-08-09 14:15) [5]

miek ©   (25.07.05 11:12) [3]


> Это действительно так, в VCL все контролы (кроме кнопок,
> может быть) рисуются борландовским кодом


Эта...так больше говори никогда, засмеют.


 
capkoh ©   (2005-08-11 20:28) [6]

Суть даже не в том, что как рисуется - это-то как раз понятно. А в том как это все работает внутри. Впрочем, я почти разобрался с этим, но, все же, не очень нравится, что компоненты написаны как-то наполовину. Часть сообщений сам компонент обрабатывает, а часть - отправляет винде. Лучше бы все сделали сами. Это и как хороший пример прошло. Вот мне, например, интересно, какая совокупность стилей образует окошко выпадающего списка? Возможно это меню?


 
Наиль ©   (2005-08-11 23:19) [7]

У каждого WinControl"a есть метод CreateParams в котором расписана совокупность стилей. Смотри. Разбирайся.


 
Наиль ©   (2005-08-11 23:23) [8]

Сам выпадающий список точно к меню не относится, это самый обычный список.



Страницы: 1 вся ветка

Текущий архив: 2006.01.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.061 c
15-1136064590
Игорь Шевченко
2006-01-01 00:29
2006.01.29
Наталия, с днем рождения!


15-1135972937
версия для печати
2005-12-30 23:02
2006.01.29
События года


6-1129884918
Максим
2005-10-21 12:55
2006.01.29
Отправка электронной почты


15-1136460512
V-A-V
2006-01-05 14:28
2006.01.29
Просмотр графических файлов


15-1134847610
lookin
2005-12-17 22:26
2006.01.29
Очепятки в серьезных изданиях...