Форум: "Компоненты";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
ВнизВыпадающий список 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.044 c