Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5]      все
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
DimaBr
Member

Откуда:
Сообщений: 11985
Kazantsev Alexey

Так у него же Paint перекрыт.

А первой строчкой 100% стоит inherited.
24 янв 20, 15:59    [22066101]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5007
DimaBr
А первой строчкой 100% стоит inherited.

Не, он говорит, что затирание происходит до вызова перекрытого Paint.
24 янв 20, 16:01    [22066110]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 319
DimaBr
Kazantsev Alexey

Так у него же Paint перекрыт.

А первой строчкой 100% стоит inherited.

Не стоит. Это первое что тестировал со всех сторон. В может ли perform(WM_SysCommand, $F002+, 0) вызывать событие paint панели игнорируя мой перехват?
24 янв 20, 16:27    [22066143]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 319
Kazantsev Alexey
DimaBr
А первой строчкой 100% стоит inherited.

Не, он говорит, что затирание происходит до вызова перекрытого Paint.

Где-то до, так как на первой строчке Paint - панель уже закрашена.
Kazantsev Alexey

Андрей Игоревич
И если суомпилирвать файл res в 7ке, то и в 10ке всё будет нормально.

Не понял. Если взять .res файл от семёрки и подложить его в проект Delphi 10.3?

Зачем класть, можно сначала скомпилировать программу на 7ке, а потом на 10ке, тогда 10ка подхватит созданный 7кой res (что, наверно, не есть хорошо, но работает прекрасно, пока у нас полностью совпадает содержание). Ну нравится мне интерфейс 7ки с кучей плагинов :). Потому писал на ней, а финально компилировать в 64 бита на 10ке, сейчас вот полностью переезжаю на 10ку, есть у неё некоторые приятные возможности.
24 янв 20, 17:00    [22066183]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5007
Андрей Игоревич
Зачем класть, можно сначала скомпилировать программу на 7ке, а потом на 10ке, тогда 10ка подхватит созданный 7кой res

Похоже, кто-то очень любит нетрадиционный... гхм. Лучше бы уже определиться с версиями окончательно и не искать себе приключений на копчик.
24 янв 20, 17:12    [22066192]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
DimaBr
Member

Откуда:
Сообщений: 11985
type
TMyPanel = class(TPanel)
   procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;
   procedure Paint;override;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TMyPanel.Create(self) do begin
    Parent := self;
    SetBounds(0,0,200,200);
  end;
end;

{ TMyPanel }

procedure TMyPanel.Paint;
begin

end;

procedure TMyPanel.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin

end;


К сообщению приложен файл. Размер - 12Kb
24 янв 20, 23:53    [22066351]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
alekcvp
Member

Откуда:
Сообщений: 2739
.res от десятки включает манифест с 6й версией Common Controls, отсюда и артефакты ИМХО. Что-то там внутри поменялось (те же темы). Можно попробовать в 10ке в свойствах проекта отключить темы вообще (даже родные для винды) и посмотреть что изменится.

Сообщение было отредактировано: 25 янв 20, 00:55
25 янв 20, 00:54    [22066377]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 319
alekcvp
.res от десятки включает манифест с 6й версией Common Controls, отсюда и артефакты ИМХО. Что-то там внутри поменялось (те же темы). Можно попробовать в 10ке в свойствах проекта отключить темы вообще (даже родные для винды) и посмотреть что изменится.

Как включать всякие цветастые стили нашел, как отключать, пока не нашел ).
Kazantsev Alexey
Андрей Игоревич
А вот перехват обработку сообщений я пока до конца не освоил, это через так делать?

Нет, это делать так:
TMyPanel = class
 procedure WMEraseBkgnd(Var AMessage : TMessage); Message WM_ERASEBKGND;
end;
...
procedure TMyPanel.WMEraseBkgnd(Var AMessage : TMessage);
begin
 AMessage.Result := 1;
end;


В общем разобрался как с этим работать, чтоб не мерцало.
1. Надо закрашивать панель в самом начале, при том за пределами границ, иначе на границах будут "артефакты"
Brush.Color:=ClWhite;
Rectangle(-2,-2,width+2,height+2);
2. С перехватом этого сообщения почему-то не работает рисование в буферном БитМапе с последующем присваивании через Canvas.CopyRect. Почему, не понял, ещё подумаю.
27 янв 20, 14:58    [22067209]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5007
Андрей Игоревич,

Советую экспериментировать не на боевом коде, а в новых тестовых проектах. Никакой жути, типа, рисования за пределами контрола не требуется - отрисовка по ClientRect закрашивает всё, без артефактов.
27 янв 20, 15:53    [22067257]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 319
Kazantsev Alexey
Андрей Игоревич,

Советую экспериментировать не на боевом коде, а в новых тестовых проектах. Никакой жути, типа, рисования за пределами контрола не требуется - отрисовка по ClientRect закрашивает всё, без артефактов.

В принципе что хотел, получил, спасибо. Через WMEraseBkgnd(Var AMessage : TMessage); Но неужели нет никаких стандартных компонентов под такие задачи, чтоб не городить огород. Ведь в том же "билдере" всё это есть.
Картинка с другого сайта.
Для тестирования накидал пару тысяч спидбатоннов, чтоб нагрузка на форму был, иначе "мерцания" и не увидеть. И, как раз через изменение размеров посредством отлова координат мыши - при больших нагрузка мерцает, а через perform(WM_SysCommand, $, 0) - нет;
Может я как не неправильно размеры меняю? В принципе если через perform работает - то и ладно, но понять почему мерцает через второй способ - интересно.
+ rкод из MouseMoveV2
  GetCursorPos(CursPos);
    X1:=CursPos.X;
    Y1:=CursPos.Y;

  dX:=X1-X0; dY:=Y1-Y0;
  if ResizeLegend.Move then
        begin
          Top:=Top+dY;     Left:=Left+dX;
        end;

  if ResizeLegend.Right then Width:=Width+dX;
  if ResizeLegend.Top then
     Begin
      Top:=Top+dY;
      Height:=Height-dY;
     End;
  if ResizeLegend.Left then
   Begin
    left:=left+dX;
    Width:=Width-dX;
   end;
  if ResizeLegend.Bottom then  Height:=Height+dY;
  X0:=X1;  Y0:=Y1;

alekcvp
.res от десятки включает манифест с 6й версией Common Controls, отсюда и артефакты ИМХО. Что-то там внутри поменялось (те же темы). Можно попробовать в 10ке в свойствах проекта отключить темы вообще (даже родные для винды) и посмотреть что изменится.

Нашел где отключается манифест, при отключении - и в старом коде ничего не мерцает. Но это не решение... Кстати, а можно как-то вышить "манифест" в код, у нас на рабочих компах все визуальный настройки в ноль выключены и 10ка как 98я выглядит, и программа там выглядит несколько иначе, нежели на компе, где я компилирую (и где ограничений нет).
28 янв 20, 16:27    [22067869]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5]      все
Все форумы / Delphi Ответить