Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 132

Раздел: Delphi » Прочее
/ вопрос открыт /

Здравствуйте, уважаемые эксперты!Можно ли в Delphi сделать нестардантную форму (например как в Winamp )

Leonardo Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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;
Еще несколько примеров см. в Приложении.

Приложение:
  1.  
  2.  
  3. {
  4. Die CreateRoundRectRgn lasst eine Form mit abgerundeten Ecken erscheinen.
  5.  
  6. The CreateRoundRectRgn function creates a rectangular
  7. region with rounded corners
  8. }
  9.  
  10. procedure TForm1.FormCreate(Sender: TObject);
  11. var
  12. rgn: HRGN;
  13. begin
  14. Form1.Borderstyle := bsNone;
  15. rgn := CreateRoundRectRgn(0,// x-coordinate of the region's upper-left corner
  16. 0, // y-coordinate of the region's upper-left corner
  17. ClientWidth, // x-coordinate of the region's lower-right corner
  18. ClientHeight, // y-coordinate of the region's lower-right corner
  19. 40, // height of ellipse for rounded corners
  20. 40); // width of ellipse for rounded corners
  21. SetWindowRgn(Handle, rgn, True);
  22. end
  23.  
  24.  
  25. { The CreatePolygonRgn function creates a polygonal region. }
  26.  
  27.  
  28. procedure TForm1.FormCreate(Sender: TObject);
  29. const
  30. C = 20;
  31. var
  32. Points: array [0..7] of TPoint;
  33. h, w: Integer;
  34. begin
  35. h := Form1.Height;
  36. w := Form1.Width;
  37. Points[0].X := C; Points[0].Y := 0;
  38. Points[1].X := 0; Points[1].Y := C;
  39. Points[2].X := 0; Points[2].Y := h - c;
  40. Points[3].X := C; Points[3].Y := h;
  41.  
  42. Points[4].X := w - c; Points[4].Y := h;
  43. Points[5].X := w; Points[5].Y := h - c;
  44.  
  45. Points[6].X := w; Points[6].Y := C;
  46. Points[7].X := w - C; Points[7].Y := 0;
  47.  
  48. SetWindowRgn(Form1.Handle, CreatePolygonRgn(Points, 8, WINDING), True);
  49. end;
  50.  
  51.  
  52.  
  53.  
  54. procedure TForm1.FormCreate(Sender: TObject);
  55. var
  56. Region: HRGN;
  57. begin
  58. Region := CreateEllipticRgn(0, 0, 300, 300);
  59. SetWindowRgn(Handle, Region, True);
  60. end;
  61.  
  62.  
  63.  
  64.  
  65. procedure TForm1.Button4Click(Sender: TObject);
  66. var
  67. HRegion1, Hreg2, Hreg3: THandle;
  68. Col: TColor;
  69. begin
  70. ShowMessage ('Ready for a real crash?');
  71. Col := Color;
  72. Color := clRed;
  73. PlaySound ('boom.wav', 0, snd_sync);
  74. HRegion1 := CreatePolygonRgn (Pts,
  75. sizeof (Pts) div 8,
  76. alternate);
  77. SetWindowRgn (
  78. Handle, HRegion1, True);
  79. ShowMessage ('Now, what have you done?');
  80. Color := Col;
  81.  
  82. end;
  83.  
  84.  
  85.  
  86.  
  87. unit Unit1;
  88.  
  89. interface
  90.  
  91. uses
  92. Windows, Messages, SysUtils, Classes, Graphics, Controls,
  93. Forms, Dialogs, ExtCtrls, Buttons, StdCtrls;
  94.  
  95. type
  96. TForm1 = class(TForm)
  97. Button1: TButton;
  98. procedure FormCreate(Sender: TObject);
  99. procedure Button1Click(Sender: TObject);
  100. private
  101. { Private-Deklarationen}
  102. procedure CreateParams(var Params: TCreateParams); override;
  103. public
  104. { Public-Deklarationen}
  105. end;
  106.  
  107. var
  108. Form1: TForm1;
  109.  
  110. implementation
  111.  
  112. {$R *.DFM}
  113.  
  114. { TForm1 }
  115.  
  116. procedure TForm1.CreateParams(var Params: TCreateParams);
  117. begin
  118. inherited CreateParams(Params);
  119.  
  120.  
  121. Params.Style := Params.Style or ws_popup xor ws_dlgframe;
  122. end;
  123.  
  124. procedure TForm1.FormCreate(Sender: TObject);
  125. var
  126. FormRgn: hRgn;
  127. begin
  128. {clear form}
  129. Form1.Brush.Style := bsSolid; //bsclear;
  130.  
  131. GetWindowRgn(Form1.Handle, FormRgn);
  132.  
  133.  
  134. DeleteObject(FormRgn);
  135.  
  136. Form1.Height := 500;
  137. Form1.Width := Form1.Height;
  138.  
  139. FormRgn := CreateRoundRectRgn(1, 1, Form1.Width - 1,
  140. Form1.height - 1, Form1.width, Form1.height);
  141.  
  142.  
  143. SetWindowRgn(Form1.Handle, FormRgn, TRUE);
  144. end;
  145.  
  146. procedure TForm1.Button1Click(Sender: TObject);
  147. begin
  148. Form1.close;
  149. end;
  150.  
  151. end.


Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 23 ноября 2007, 12:03


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:59
Выполнено за 0.03 сек.