|
Вопрос # 1 132/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!Можно ли в Delphi сделать нестардантную форму (например как в Winamp )
 |
Вопрос задал: Leonardo (статус: Посетитель)
Вопрос отправлен: 22 ноября 2007, 21:24
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Leonardo!
Наиболее просто - скачать какой-нибуть пакет скинов. например здесь.
Если же вы хотите более специфический дизайн, тогда это делается немного по другому. Вначале в графическом редакторе рисуется фон для формы(TLabel лучше там же нарисовать и разметить места для TEdit и подобных). На форму кладётся TImage и в него загружается изображение. У формы выставляется свойство borderStyle = bsNone, которое скроет заголовок формы. Следующим этапом будет создание красивых кнопок. Это тоже просто - рисуем ещё две картинки с нажатой кнопкой и подсвеченной кнопкой.
В событии OnMouseMove проверяем координаты миши и, если она в позиции над кнопкой - отобразим нужный Image, который там находиться, но скрытый.
проверить, попадают ли координаты курсора в на заданный Image очень просто (лучше проверять координаты Image, так как таким образом не будем привязиваться к координатам)
if (x>im.left) and (x < in.right) and (im.top < y) and (im.bottom > y) then im.show;
нужно только в цикл завернуть.
в событиях OnMouseDown для каждого этого image надо показывать второй Image (который соответствует нажатой кнопке). по onMouseUp - меняем назад картинки и не забываем обработать "клик".
Если хорошо постараться и подобрать фон, то можно создать кнопки произвольной формы.
А почитав ещё и это, вы сможете создавать формы произвольной формы.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 22 ноября 2007, 23:30
Оценка за ответ: 5
|
Ответ #2. Отвечает эксперт: Feniks
Здравствуйте, Leonardo!
Дополнение к Вадим К.
Другой способ - это использовать так называемые Регионы. Для этого есть специальные функции SetWindowRgn, BitmapToRgn, CombineRgn, CreatePolygonRgn. Все они описаны в Хелпе. Путем математических вычислений расчитывается область формы, которую надо отображать, или путем накладывания изображения по маске.
Простой пример:
var
MaskBmp: TBitmap;
begin
MaskBmp := TBitmap.Create;
try
MaskBmp.LoadFromFile('FormShape.bmp');
Height := MaskBmp.Height;
Width := MaskBmp.Width;
// ОС владеет регионом, после вызова SetWindowRgn
SetWindowRgn(Self.Handle, BitmapToRgn(MaskBmp), True);
finally
MaskBmp.Free;
end;
end;
Еще несколько примеров см. в Приложении.
Приложение: Переключить в обычный режим-
-
- {
- Die CreateRoundRectRgn lasst eine Form mit abgerundeten Ecken erscheinen.
-
- The CreateRoundRectRgn function creates a rectangular
- region with rounded corners
- }
-
- procedure TForm1.FormCreate(Sender: TObject);
- var
- rgn: HRGN;
- begin
- Form1.Borderstyle := bsNone;
- rgn := CreateRoundRectRgn(0,// x-coordinate of the region's upper-left corner
- 0, // y-coordinate of the region's upper-left corner
- ClientWidth, // x-coordinate of the region's lower-right corner
- ClientHeight, // y-coordinate of the region's lower-right corner
- 40, // height of ellipse for rounded corners
- 40); // width of ellipse for rounded corners
- SetWindowRgn(Handle, rgn, True);
- end
-
-
- { The CreatePolygonRgn function creates a polygonal region. }
-
-
- procedure TForm1.FormCreate(Sender: TObject);
- const
- C = 20;
- var
- Points: array [0..7] of TPoint;
- h, w: Integer;
- begin
- h := Form1.Height;
- w := Form1.Width;
- Points[0].X := C; Points[0].Y := 0;
- Points[1].X := 0; Points[1].Y := C;
- Points[2].X := 0; Points[2].Y := h - c;
- Points[3].X := C; Points[3].Y := h;
-
- Points[4].X := w - c; Points[4].Y := h;
- Points[5].X := w; Points[5].Y := h - c;
-
- Points[6].X := w; Points[6].Y := C;
- Points[7].X := w - C; Points[7].Y := 0;
-
- SetWindowRgn(Form1.Handle, CreatePolygonRgn(Points, 8, WINDING), True);
- end;
-
-
-
-
- procedure TForm1.FormCreate(Sender: TObject);
- var
- Region: HRGN;
- begin
- Region := CreateEllipticRgn(0, 0, 300, 300);
- SetWindowRgn(Handle, Region, True);
- end;
-
-
-
-
- procedure TForm1.Button4Click(Sender: TObject);
- var
- HRegion1, Hreg2, Hreg3: THandle;
- Col: TColor;
- begin
- ShowMessage ('Ready for a real crash?');
- Col := Color;
- Color := clRed;
- PlaySound ('boom.wav', 0, snd_sync);
- HRegion1 := CreatePolygonRgn (Pts,
- sizeof (Pts) div 8,
- alternate);
- SetWindowRgn (
- Handle, HRegion1, True);
- ShowMessage ('Now, what have you done?');
- Color := Col;
-
- end;
-
-
-
-
- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls,
- Forms, Dialogs, ExtCtrls, Buttons, StdCtrls;
-
- type
- TForm1 = class(TForm)
- Button1: TButton;
- procedure FormCreate(Sender: TObject);
- procedure Button1Click(Sender: TObject);
- private
- { Private-Deklarationen}
- procedure CreateParams(var Params: TCreateParams); override;
- public
- { Public-Deklarationen}
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.DFM}
-
- { TForm1 }
-
- procedure TForm1.CreateParams(var Params: TCreateParams);
- begin
- inherited CreateParams(Params);
-
-
- Params.Style := Params.Style or ws_popup xor ws_dlgframe;
- end;
-
- procedure TForm1.FormCreate(Sender: TObject);
- var
- FormRgn: hRgn;
- begin
- {clear form}
- Form1.Brush.Style := bsSolid; //bsclear;
-
- GetWindowRgn(Form1.Handle, FormRgn);
-
-
- DeleteObject(FormRgn);
-
- Form1.Height := 500;
- Form1.Width := Form1.Height;
-
- FormRgn := CreateRoundRectRgn(1, 1, Form1.Width - 1,
- Form1.height - 1, Form1.width, Form1.height);
-
-
- SetWindowRgn(Form1.Handle, FormRgn, TRUE);
- end;
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- Form1.close;
- end;
-
- end.
 |
Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 23 ноября 2007, 12:03
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|