|
Delphi
Xakep, номер #049, стр. 049-084-1 Безбашенные окна Фленов Михаил (smirnandr@mail.ru) http://www.cydsoft.com/vr-online/ Еще в 1995-м году почти все окна были прямоугольными, и всех это устраивало. Но несколько лет назад начался самый настоящий бум на создание окон неправильной формы. Любой продвинутый перец считает своим долгом сделать окно необычной формы, чтобы его софтинка явно выделялась среди всех конкурентов. О том, как создавать круглые и дырявые окна, ты можешь узнать на моем сайте. Там в разделе "Delphi (Практика)" есть статья "Нестандартные окна". Ну, а здесь я покажу, как создавать абсолютно безбашенные окна, абсолютно неправильной формы и абсолютно неповторимой внешности. Руки на старт Создай новый проект. Бросим на форму всего один компонент TImage. В него загружай какую-нибудь картинку, которая будет использоваться в качестве фона окна, по ней мы и будем создавать форму. На рисунке 1 ты видишь мое окно с рисунком в виде кадра из фильма "Матрица". А моя программа будет создавать окно, которое будет иметь форму девушки с компом. Весь фон белого цвета я сделаю прозрачным (цвет фона я буду определять по цвету левой верхней точки изображения). Сделай картинку TImage невидимой (свойство Visible нужно установить в false). Она нужна нам на форме только для хранения картинки, и сам компонент не должен быть виден после запуска. Конечно, можно было загрузить картинку, не используя компонентов, но это - пример, а уж тебе решать, как ты будешь его использовать в будущем. Шкодинг Теперь создаем обработчик события FormCreate и пишем в нем следующий код: procedure TForm1.FormCreate(Sender: TObject); var WindowRgn: HRGN; begin BorderStyle := bsNone; ClientWidth := Image1.Picture.Bitmap.Width; ClientHeight := Image1.Picture.Bitmap.Height; windowRgn := CreateRgnFromBitmap(Image1.Picture.Bitmap); SetWindowRgn(Handle, WindowRgn, True); end; В первой строчке я изменяю стиль окна на bsNone, чтобы окно не имело никаких рамок и заголовков. В следующих двух строчках я устанавливаю размеры клиентской области окна в размеры изображения. Последние две строчки являются самыми сложными в нашей программе. Здесь сначала вызывается функция CreateRgnFromBitmap (эту функцию еще надо написать). Она будет создавать нестандартный вид окна, и потом сохранит его в переменной windowRgn. В последней строке я вызываю API функцию SetWindowRgn, которая связывает созданный регион с нашим окном. Теперь немного о функции CreateRgnFromBitmap. Она довольно большая и описать ее здесь подробно не получится – места не хватит. Я постарался максимально ее упростить, чтобы ты смог сам во всем разобраться. Итак, функцию CreateRgnFromBitmap ты найдешь во врезке. Все это нужно написать раньше кода обработчика события FormCreate. Перетаскивание окна Если ты уже сделал все, что описано выше, то можешь запускать программу и наслаждаться результатом. Но у нас есть одна недоработка - программа не имеет строки заголовка и состоит только из одной клиентской части, а значит, окно нельзя перемещать по экрану. Но эта проблема решается очень просто. Для начала в разделе private объявления формы объявляем три переменные: |