Выравнивание в ComboBox

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

#1
Подскажите, как можно выровнять по ширине (либо по правой стороне) элементы ComboBox-a в стиле csOwnerDrawFixed? Уж куда не обращался, а внятного ответа так и не получил. Перепробовал все подходящие WS_, WS_EX_ параметры из модуля Windows.pas для функции SetWindowsLong, а эффекта никакого :) Может мне здесь помогут?
 
Y

Yason

#2
Так а в чём проблема?
Берёшь этот самый ComboBox с csOwnerDrawFixed - и вперёд!
Код:
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
s: string;
begin
s:=ComboBox1.Items[Index];

with ComboBox1.Canvas.Brush do
begin
Style := bsSolid;
if (odSelected in State) then
 Color := clHighlight
else
 Color := clWindow;
end;
ComboBox1.Canvas.FillRect(Rect);
DrawText(ComboBox1.Canvas.Handle, PChar(s), Length(s),
Rect, DT_SINGLELINE	or DT_CENTER {DT_RIGHT});
end;
 
Y

Yason

#3
А если ты про стандартный виндовый -- ИМХО, тебе поможет subclassing...
 
G

Guest

#4
Yason
А можно ли как-нибудь удалить «точечную» окантовку фокуса ввода комбобокса или хотя бы увеличить ее высоту на 1 пиксель вниз?



Дело в том, что я увеличил размер фокуса ввода элемента списка при помощи процедуры DrawFocusRect() в обработчике OnDrawItem на один 1 пиксель больше, чем свойство ItemHeight компонента, однако высота «точечной» окантовки выбирается по величине ItemHeigh. Можно ли как-то разрешить эту проблему?
 
Y

Yason

#5
Если я правильно понял, нужно чтобы разные элементы списка имели различную высоту (при этом рамка фокуса автоматически будет рисоваться правильно).

Размеры owner-draw элементов можно указывать в обработчике OnMeasureItem. При этом у комбобокса должен быть Style := csOwnerDrawVariable.

Например, к вышеприведённому коду можно добавить что-нибудь такое:
Код:
procedure TForm1.ComboBox1MeasureItem(Control: TWinControl; Index: Integer; var Height: Integer);
begin
 Height := ComboBox1.ItemHeight + 2*Index;
end;
 
G

Guest

#6
Yason

Чутка не то. На картинке ниже приведено сравнение двух вариантов:



Свойство ItemHeight комбинированного списка равно 11 пикселям. Ввиду этого нижняя граница пунктирной окантовки фокуса ввода, как видно на первой картинке, закрывает нижнюю часть символов. Я просто добавил две строчки кода

Код:
InflateRect(Rect, +2, +1);
Сanvas.DrawFocusRect(rect);
перед

Код:
Canvas.FillRect(Rect);
DrawText(Canvas.Handle, PChar(s), Length(s), Rect, DT_SINGLELINE or DT_CENTER {DT_RIGHT});
В результате всё стало на свои места, как отображено на второй картинке :)
 
Статус
Закрыто для дальнейших ответов.