Нужно создать COMBOBOX заранее заданного размера (чтобы закрыть некоторый прямоугольник в окне). Поменять его вертикальный размер у меня получилось, задав размер области редактирования. Можно конечно задать её с учётом границы, но её размер может меняться в разных Виндах. Всё это желательно оформить под XP (это уже не проблема).
Если есть какие идеи (не обязательно быть знатоком) - напишите, пожалуйста.
Для справки: COMBOBOX создаётся всегда фиксированной высоты (при изменении размеров, он заполняет остальную область цветом фона), но в QT для Windows я видел, как он легко менял свой размер.
|
Prisoner |
17-06-2004 00:59 204789 |
А можно осведомиться как вы изменили вертикальный размер
Цитата:
задав размер области редактирования
|
?
|
Если сделать ему стиль OWNERDRAWFIXED, в оконной процедуре у хозяина обработать событие WM_MEASUREITEM, указав размер элемента, то COMBOBOX растянется так, чтобы вместить элемент. Пример есть в хелпе win32.hlp (Borland)
|
Prisoner |
18-06-2004 23:43 204791 |
Весело. Спасибо! Но я начинаю не понимать суть проблемы - вертикальный менять можем, горизонтальный еще более можем :). А что необходимо?
|
Мы меняем вертикальный размер не ComboBox-а, а его области редактирования. Кроме неё у него со всех сторон торчат границы самого Combobox-а. Размер границы нигде документально не зафиксирован, следовательно он может поменяться в версии Windows 5.1.000000001. Выяснить размер границы можно (через задницу), но он может зависить от размера этого контрола (напр. какой-нибудь align).
Таким образом, необходимо решать обратную задачу (что-то вроде численного решения нелинейного уравнения), чем заниматься на хотелось бы. А необходимо вот что:
Как создать ComboBox заранее заданного размера. (а не просто поменять его размер)
|
hasherfrog |
30-06-2004 13:03 204793 |
pva
Хотя я могу попутать с QT, всё же рискну предложить свой вариант. Делаете онко типа Frame в нужном месте, нужного размера. А в этом окне делаете Combobox. Тогда он будет ограничен родительским фреймом, которого не видно. Э?
|
Действительно... правда при этом ComboBox либо будет урезан (т.е. отображается только его часть), либо займёт столько места, сколько ему нужно (винда решает), а остальное - поверхность окна (frame). Второй вариант достигается, если при создании указать больший размер, чем нужно винде. Первый эффективен, но не совсем то, чего хотелось бы.
Похоже, придётся остановиться на угадывании размера рамки ComboBox-а. Спасибо за содействие.
Если у кого ещё появятся идеи (любые) - буду рад.
|
hasherfrog |
02-07-2004 13:35 204795 |
Цитата:
Цитата pva
ComboBox либо будет урезан...
|
Дык, а если ему сразу же пульнуть WM_SIZE (или как там WM_RESIZE?) ?
|
Пробовал он, урод на это никак не реагирует.
|
Короче решил задачу так: - делаю и субласю combobox WS_OWNERDRAWFIXED, ставлю маркер, что я его сделал
- переадрессую сообщения WM_DRAWITEM тому, кто послал, если у него стоит маркер, что я его создал
- на сообщение WM_WINDOWPOSCHANGED посылаю (CB_SETITEMHEIGHT, -1, высота окна - 6), временно запретив субклассовой процедуре отвечать на сообщения.
- на WM_DRAWITEM вручную рисую содержимое combobox' listbox в стиле linux KDE 3
- делаю пару хитростей, чтобы поле combobox' edit было посередине (по вертикали)
выгладит красиво (XP & non-XP), правда мне кажется, что делаю лишние операции.
|
Время: 08:10.
© OSzone.net 2001-