Конференция "Компоненты" » BevelKind в TWinControl [D7, Win2k, WinXP]
 
  • Vladix © (16.11.06 14:12) [0]
    День добрый! Может, кто уже погружался в недра VCL и API, и знает, как функционирует BevelKind у TWinControl. По умолчанию он далее у наследников не используется. Попытавшись его использовать в наследнике, я получил ряд интересных глюков, которые хотелось бы прояснить (например, отсутствие перерисовки скроллбаров в DBGrid'е, или несмещение области вывода курсора при установленной рамке, т.е. текст выводится практически по рамке). Кто-то пытался с этим бороться? С чем это связано?
  • thevalery © (16.11.06 16:17) [1]
    Вин-контролы могут иметь бордюры (к примеру у TEdit - впуклая рамка, у формы - стандартный бордюр, делающий окно рельефным), причем бордюрная область не входит в клиентскую часть. Отрисовывается эта область отдельно по событию WM_NCPAINT, где BevelKind и анализируется. Дальше - см. TWinControl.WMNCPaint.
  • clickmaker © (16.11.06 17:04) [2]
    Кроме того, вин-контролы могут иметь стили. WS_EX_CLIENTEDGE или WS_THICKFRAME. Это уже обрабатывает оконная процедура данного окна, в недрах WinAPI
  • Vladix © (23.11.06 17:08) [3]
    Спасибо за ответы! Но... я в них так и не нашел того, что меня интересовало, видимо, плохо спросил :)) Вот пример кода, в котором я хочу, чтобы у TEdit'а отрисовывалась не стандартная грубая рамка (стиль WS_EX_CLIENTEDGE по умолчанию), а моя, с моими цветами отрисовки рамки. Ну для простоты примера - хотя бы стандартная WinControl-овская. Вот немножко кода:


    type
     TMyEdit = class(TCustomEdit);
     protected
       procedure CreateParams(var Params: TCreateParams); override;
     public
       constructor Create(AOwner: TComponent); override;
     published
       property BevelKind;
       property BevelInner;
       property BevelOuter;
     end;
    ...
    constructor Create(AOwner: TComponent);
    begin
     inherited Create(AOwner);
     inherited BevelKind := bkFlat;
    end;

    procedure CreateParams(var Params: TCreateParams);
    begin
     inherited CreateParams(Params);
     // Убираем стандартную рамку
     Params.ExStyle := Params.ExStyle and not WS_EX_CLIENTEDGE;
    end;



    Вроде бы ничего особенного, должна бы вывестись стандартная плоская рамка, и она выводится, но позиция курсора не пересчитывается, т.е. курсор мигает практически на рамке. Что сделать, чтобы его положение рассчитывалось в зависимости от толщины и типа рамки?
  • GrayFace © (25.11.06 17:35) [4]
    Я это вовсю использую, проблему не наблюдал. D7.
  • zldo (21.01.07 16:19) [5]
    косяк в темах XP при wm_ncpaint глючит однозначно, без их использования всё норм.
 
Конференция "Компоненты" » BevelKind в TWinControl [D7, Win2k, WinXP]
Есть новые Нет новых   [119228   +48][b:0][p:0.001]