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

Тема в разделе "Delphi - Компоненты", создана пользователем -, 19 мар 2004.

Статус темы:
Закрыта.
  1. Гость

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

    Yason Гость

    Так а в чём проблема?
    Берёшь этот самый ComboBox с csOwnerDrawFixed - и вперёд!
    Код (Text):
    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;
     
  3. Yason

    Yason Гость

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

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

    [​IMG]

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

    Yason Гость

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

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

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

    Yason

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

    [​IMG]

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

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

    Код (Text):
    Canvas.FillRect(Rect);
    DrawText(Canvas.Handle, PChar(s), Length(s), Rect, DT_SINGLELINE or DT_CENTER {DT_RIGHT});
    В результате всё стало на свои места, как отображено на второй картинке :)
     
Загрузка...
Похожие Темы - Выравнивание ComboBox
  1. NickProstoNick
    Ответов:
    0
    Просмотров:
    771
  2. FelixMacintosh
    Ответов:
    0
    Просмотров:
    1.124
  3. Didilom
    Ответов:
    0
    Просмотров:
    1.241
  4. chz
    Ответов:
    16
    Просмотров:
    3.334
  5. Arvest
    Ответов:
    0
    Просмотров:
    1.667
Статус темы:
Закрыта.

Поделиться этой страницей