Sources.RU Magazine Поиск по журналу
 

TopList

Часть первая. Красивые окна

Автор: Der Peti@

Часть первая. Красивые окна.
Часть вторая. Красивый ListBox.
Часть третья. Красивый PopupMenu.

Рецензия на статью.

Предисловие

В этой статье я попробую поделиться своими знаниями с читателями. Это мой первый опыт написания статей, так что надеюсь на благосклонность. О чём же мне написать? Конечно же, о том, в чём я более-менее разбираюсь. В моей программе GEAR ShortCut Master довольно красивый интерфейс, и я расскажу вам, как я этого добился. Так сказать, частично открою исходные коды. Итак, начнём. Сразу скажу, что всё будет на Delphi и С-программистам толку от этой статьи мало. Постараюсь всё объяснять как можно подробнее, потому что, когда сам был чайником, меня сбивали с толку статьи, написанные для продвинутых программистов, в которых я ничего не мог понять.

Часть первая. Красивые окна.

Многих устраивает стандартный стиль Windows, но раз вы читаете эту статью, то вам он, наверное, как и мне, не нравится. Начнём с простого. В этой статье я покажу вам, как делать красивые окошки. Кто думает: читать или не читать, вот вам прямая ссылка на то, что получится после прочтения статьи. Если понравится, можете читать дальше.
Итак, создайте пустой проект в Delphi. Так как кнопочки закрытия и сворачивания окна у нас будут свои, то BorderStyle задаём bsNone. Так же я в своём примере сделаю форму белой (Color = clWhite). Запускайте программу.
Сразу бросаются в глаза три проблемы: окно появляется в верхнем левом углу экрана, плохо видны границы окна, если у вас светлый wallpaper на рабочем столе, и, самое главное, окно нельзя "таскать". Первые две проблемы решаются довольно легко, а последнюю оставим "на сладенькое". Чтоб окно создавалось, допустим, в центре экрана, задайте свойству Position значение poScreenCenter. Чтобы границы окна было хорошо видно, можно сделать TImage на всю форму и загрузить в него картинку, которая будет чем-то вроде фонового рисунка формы. Но если вам надо что-то простенькое и не хочется раздувать размеры exe-шника (а в Delphi они и так большие ?), то можно сделать вот что. В обработчике OnPaint будем по краям формы рисовать границы, пользуясь методом TCanvas FrameRect.

procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.FrameRect (Rect(0, 0 , Width, Height));
end

Этот способ ещё хорош и тем, что при изменении размеров окна, границы всё равно будут рисоваться по его краям. Но если сейчас запустить программу, то границ мы не увидим, так как не задали цвет, которым будем их рисовать.

procedure TForm1.FormCreate(Sender: TObject);
begin
  Canvas.Brush.Color := clBlack; // у меня границы будут чёрными
end; 

Запускаем. Ну вот, уже лучше, осталось только научить форму "таскаться". Заведите в unit-те с формой глобальные переменные CursorPos, FormPos: TPoint; и Drag: boolean;. По умолчанию в Delphi булевские переменные принимают значение False. Это нам и надо. Переменная Drag будет отвечать, за то, в каком режиме находится форма: в режиме перетаскивания или в нормальном. Вверху формы разместите какой-нибудь TImage - это будет "активная" область, за которую и будет "таскаться" окно. Теперь давайте поймем, как работает обычный Windows-механизм "таскания" окон. Мы нажимаем мышку в пределах "активной" области, окно переходит в режим перетаскивания и будет таскаться за курсором, пока мы не отпустим мышку и тем самым не выведем окно из режима перетаскивания. Мы сделаем то же самое. Напишем обработчик нажатия мышки в пределах "активной" области.

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then // чтоб не "таскалось" по нажатию правой кнопки мыши
  begin
    Drag := True;
    // Запоминаем положение окна в момент начала перетаскивания
    FormPos.X := Left;
    FormPos.Y := Top;
    // Запоминаем положение курсора в момент начала перетаскивания
    GetCursorPos(CursorPos);
  end;
end; 

И обработчик отпускания кнопки мышки

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then Drag := False;
end; 

Теперь надо сделать самое главное: чтоб окно в режиме перетаскивания двигалось вместе с курсором. В Delphi у Application есть такой параметр – OnIdle, ему присваивается процедура, которая в зависимости от возвращаемого переменной Done значения вызывается, как только в системе наблюдается бездействие (Done = True).

procedure TForm1.OnIdle(Sender: TObject; var Done: boolean);
var Point: TPoint;
begin
  if Drag then // Проверяем находится ли форма в режиме перетаскивания
    GetCursorPos(Point); // Узнаём новые координаты курсора
    // Двигаем окошко
    Left := FormPos.X + Point.X - CursorPos.X;
    Top := FormPos.Y + Point.Y - CursorPos.Y;
  end;
end; 

Осталось только назначить параметру OnIdle нашу процедуру:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Canvas.Brush.Color := clBlack; // у меня границы будут чёрными
  Application.OnIdle := OnIdle;
end; 

Ну и напоследок. Нужен "крестик", чтоб закрывать окошко. Киньте ещё один TImage на форму. Загрузите в него картинку какого-нибудь крестика и напишите следующее:

procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Image2.Left := Image2.Left + 1;
  Image2.Top := Image2.Top + 1;
end;

procedure TForm1.Image2MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Image2.Left := Image2.Left - 1;
  Image2.Top := Image2.Top - 1;
end;

procedure TForm1.Image2Click(Sender: TObject);
begin
  Close;
end;

Для сворачивания окна в обработчике клика напишите:

Application.Minimize;

Кстати, вот вам полезный совет. Если у вас будет много кнопок-картинок, то заводить для каждой кнопки отдельную процедуру OnMouseDown и OnMouseUp не надо. Можно написать одну общую для всех.

procedure TForm1.ImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  (Sender as TImage).Left := (Sender as TImage).Left + 1;
  (Sender as TImage).Top := (Sender as TImage).Top + 1;
end;

Ну и по аналогии для отпускания мыши.



Скачать исходник: lesson1.rar (40 кб)

С уважением, Der Peti@!



 Design by Шишкин Алексей (Лёха)  ©2004-2008 by sources.ru