![]() | |
| Главная · Последний выпуск · Архив · Авторы · О журнале · Исходники.RU | |
404 Not Found |
Красивые ...Автор: Der Peti@Часть первая. Красивые окна. Часть вторая. Красивый ListBox. Часть третья. Красивый PopupMenu. Рецензия на статью. ПредисловиеВ этой статье я попробую поделиться своими знаниями с читателями. Это мой первый опыт написания статей, так что надеюсь на благосклонность. О чём же мне написать? Конечно же, о том, в чём я более-менее разбираюсь. В моей программе GEAR ShortCut Master довольно красивый интерфейс, и я расскажу вам, как я этого добился. Так сказать, частично открою исходные коды. Итак, начнём. Сразу скажу, что всё будет на Delphi и С-программистам толку от этой статьи мало. Постараюсь всё объяснять как можно подробнее, потому что, когда сам был чайником, меня сбивали с толку статьи, написанные для продвинутых программистов, в которых я ничего не мог понять. Часть первая. Красивые окна.Многих устраивает стандартный стиль Windows, но раз вы читаете эту статью, то вам он, наверное, как и мне, не нравится. Начнём с простого. В этой статье я покажу вам, как делать красивые окошки. Кто думает: читать или не читать, вот вам прямая ссылка на то, что получится после прочтения статьи. Если понравится, можете читать дальше. 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@! |
| Журнал "Исходники.RU". Copyright (c) 2006 by Исходники.RU. Designed by Mastilior, Made up by ...:::Alex:::.... |