Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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
10-1112846482
Demn
2005-04-07 08:01
2006.01.29
Plugin под IE


1-1135272387
GEN++
2005-12-22 20:26
2006.01.29
Точка останова в DLL


2-1137268307
JEK2
2006-01-14 22:51
2006.01.29
Как прально копировать текст в буфер


3-1133342549
Slaga
2005-11-30 12:22
2006.01.29
Что "лучше" использовать при выгрузке/загрузке данных из/в DBF


15-1136446521
Gydvin
2006-01-05 10:35
2006.01.29
У кого установлен 8, 9 Corel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский