Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Тяжёлый вопрос про COMBOBOX (WinApi) (http://forum.oszone.net/showthread.php?t=29590)

pva 16-06-2004 13:35 204788

Нужно создать COMBOBOX заранее заданного размера (чтобы закрыть некоторый прямоугольник в окне). Поменять его вертикальный размер у меня получилось, задав размер области редактирования. Можно конечно задать её с учётом границы, но её размер может меняться в разных Виндах. Всё это желательно оформить под XP (это уже не проблема).
Если есть какие идеи (не обязательно быть знатоком) - напишите, пожалуйста.
Для справки: COMBOBOX создаётся всегда фиксированной высоты (при изменении размеров, он заполняет остальную область цветом фона), но в QT для Windows я видел, как он легко менял свой размер.

Prisoner 17-06-2004 00:59 204789

А можно осведомиться как вы изменили вертикальный размер
Цитата:

задав размер области редактирования
?

pva 17-06-2004 11:16 204790

Если сделать ему стиль OWNERDRAWFIXED, в оконной процедуре у хозяина обработать событие WM_MEASUREITEM, указав размер элемента, то COMBOBOX растянется так, чтобы вместить элемент. Пример есть в хелпе win32.hlp (Borland)

Prisoner 18-06-2004 23:43 204791

Весело. Спасибо! Но я начинаю не понимать суть проблемы - вертикальный менять можем, горизонтальный еще более можем :). А что необходимо?

pva 30-06-2004 12:23 204792

Мы меняем вертикальный размер не ComboBox-а, а его области редактирования. Кроме неё у него со всех сторон торчат границы самого Combobox-а. Размер границы нигде документально не зафиксирован, следовательно он может поменяться в версии Windows 5.1.000000001. Выяснить размер границы можно (через задницу), но он может зависить от размера этого контрола (напр. какой-нибудь align).
Таким образом, необходимо решать обратную задачу (что-то вроде численного решения нелинейного уравнения), чем заниматься на хотелось бы. А необходимо вот что:

Как создать ComboBox заранее заданного размера. (а не просто поменять его размер)

hasherfrog 30-06-2004 13:03 204793

pva
Хотя я могу попутать с QT, всё же рискну предложить свой вариант. Делаете онко типа Frame в нужном месте, нужного размера. А в этом окне делаете Combobox. Тогда он будет ограничен родительским фреймом, которого не видно. Э?

pva 02-07-2004 13:03 204794

Действительно... правда при этом ComboBox либо будет урезан (т.е. отображается только его часть), либо займёт столько места, сколько ему нужно (винда решает), а остальное - поверхность окна (frame). Второй вариант достигается, если при создании указать больший размер, чем нужно винде. Первый эффективен, но не совсем то, чего хотелось бы.
Похоже, придётся остановиться на угадывании размера рамки ComboBox-а. Спасибо за содействие.
Если у кого ещё появятся идеи (любые) - буду рад.

hasherfrog 02-07-2004 13:35 204795

Цитата:

Цитата pva
ComboBox либо будет урезан...

Дык, а если ему сразу же пульнуть WM_SIZE (или как там WM_RESIZE?) ?

pva 02-07-2004 14:00 204796

Пробовал он, урод на это никак не реагирует.

pva 16-07-2004 15:24 204797

Короче решил задачу так:
  • делаю и субласю 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.

Время: 08:10.
© OSzone.net 2001-