WinForms

Такая ситуация у меня возникла, пишу значит я приложение своё, оконное, через проект Windows Forms, и захотелось мне, что бы у этого приложения был свой уникальный дизайн. Обычные формы мне надоели своим видом уже) Подскажите, пожалуйста, или хотя бы дайте толчок для старта, как можно полностью переработать дизайн формы и её элементов, чтобы у меня например кнопка, была в тёмных тонах(ну это то легко ещё) и у неё был собственный цвет границы, анимация и т.д. Ну я думаю понятно своё извращение выразил :sweat_smile: На данном этапе форма выглядит приблизительно так:

Таблицы скорее всего не будет (чем нибудь заменю, не очень удобно с ней в данной ситуации, но вам это уже не важно и не интересно)

Берёте OpenGL или какую то более подходящую для 2D граф. библиотеку, пишете свой собственный модуль для дизайна. Хотя наверное среди всего мусора в интернете можно найти и готовый настраиваемый модуль. Перевести на паскаль и подправить несколько строчек под себя.

По моему мнению Windows Forms это только побаловаться, если и использовать стандартные элементы управления - писать их надо всё равно от руки.

Ни чего не мешает написать всё ручками. К примеру:

 uses
  GraphABC;

const
  Fone = RGB(0,65,100);
  
type
  tButton = class
    L, U, W, H : Integer;
    Msg : String;
    Prc : procedure;
    Visible : Boolean := False;

    constructor (L, U, W, H : Integer; Msg : String; Prc : procedure);
    begin
      Self.L := L; Self.U := U; Self.W := W; Self.H := H;
      Self.Msg := Msg; Self.Prc := Prc;
    end;
    
    procedure onShow;
    begin
      Visible := True;
      Pen.Color := RGB(192,192,192);
      Brush.Color := RGB(128,128,128);
      RoundRect(L, U, L + W, U + H, 8, 8);
      Font.Color := RGB(192,192,0);
      Font.Name  := 'Times New Roman';
      Font.Size  := 14;
      DrawTextCentered(L + 1, U + 1, L + W - 1, U + H - 1, Msg);
      Redraw;
    end;
    
    procedure offShow;
    begin
      Visible := False;
      Pen.Color := Fone;
      Brush.Color := Fone;
      Rectangle(L, U, L + W, U + H);
      Redraw;
    end;
    
    function Contains(X, Y : Integer) : Boolean := (X > L) and (X < L + W) and (Y > U) and (Y < U + H);
    
  end; // tButton 

procedure DrawPix;
begin
  var(x,y,clr):=(Random(Window.Width),Random(Window.Height),rgb(Random(128,255),Random(128,255),Random(128,255)));
  loop 1000 do
    begin
      PutPixel(x,y,clr);
      x+=Random(-1,+1);y+=Random(-1,+1);
    end;
  Redraw;
end;
  
procedure prcExit := Window.Close;
procedure prcDraw := DrawPix;

var
  btnDraw, btnClose : tButton;

procedure MouseMove(X, Y, Btn : Integer);
begin
  if btnClose.Contains(X, Y) then
Window.Caption := 'True'
  else
    Window.Caption := 'False';
end;

procedure MouseDown(X, Y, Btn : Integer);
begin
  if btnClose.Contains(X, Y) then btnClose.Prc;
  if btnDraw.Contains(X, Y) then btnDraw.Prc;
end;

begin
  Randomize;
  Window.Init(0, 0, 1000, 700, Fone);
  LockDrawing;
  
  btnDraw := New tButton(10, 10, 100, 30, 'Рисовать', prcDraw);
  btnDraw.onShow;

  btnClose := New tButton(Window.Width-110, Window.Height-40, 100, 30, 'Выход', prcExit);
  btnClose.onShow;
  
  OnMouseMove := MouseMove;
  OnMouseDown := MouseDown;
end.

Ну да я примерно про то же, вот только GraphABC это тоже примитивно очень уж. Производительность маленькая.

99% приложений, работающих с пользователем, тратят 99% своего времени в ожидании реакции пользователя. Так что, зачем тратить время на изучение OpenGL или ещё какой-то либотеки, когда всё уже „под рукой“…

P.S. Функционал приведённого примера можно перенести во внешний модуль и легко увеличивать по мере необходимости.

Всё же разница в реакции программы 2 сек и 50 миллисекунд хорошо заметна. Это не влияет на результат, но всё же не удобно. Я знаю потому что уже делал интерфейс на ABCObejcts ;).

Про ABCObjects не могу сказать ни чего плохого. Для своих целей он вполне себе. Но для подобных задач он не годится, т.к. сильно перегружен разными „а может быть так…“. За универсальность нужно платить. А плата — это время. Уменьшение времени на разработку — увеличение времени работы.

Нет ну ABCObjects как раз нормально оптимизирован, его тормозит только GraphABC… А его в свою очередь System.Drawing.Bimap. Я не знаю что с ним такого но больше 20 fps рисуя им никак не получить, просто потому что ~40 миллисекунд тратит замена графических буферов(основная часть перерисовки при LockDrawing).

Огромное спасибо за пример и советы))) Попробую самостоятельно. Я так понимаю, можно помещать объекты GraphABC на форму?