1. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

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

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

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

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

    Yason Гость

    Репутация:
    0
    Так а в чём проблема?
    Берёшь этот самый 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;
     
  3. Yason

    Yason Гость

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

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

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

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

    Yason Гость

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

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

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

    Репутация:
    0
    Yason

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

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

    Свойство 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}); 
    В результате всё стало на свои места, как отображено на второй картинке :)
     
Загрузка...
Похожие Темы - Выравнивание ComboBox
  1. NickProstoNick
    Ответов:
    0
    Просмотров:
    880
  2. FelixMacintosh
    Ответов:
    0
    Просмотров:
    1.215
  3. Didilom
    Ответов:
    0
    Просмотров:
    1.320
  4. chz
    Ответов:
    16
    Просмотров:
    3.514
  5. Arvest
    Ответов:
    0
    Просмотров:
    1.721
Статус темы:
Закрыта.

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