Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2007, 07:55   #1
steck
/\/\Et@/\|/|$T
Пользователь
 
Аватар для steck
 
Регистрация: 26.03.2007
Сообщений: 89
Вопрос как сделать нестандартную форму

Здраствуйте!!!
у меня такой вопрос: как зделать нестандартную форму например треугольную или чтоб внутри формы была дыра ?
there are no programmers there is no life
steck вне форума Ответить с цитированием
Старый 26.04.2007, 09:04   #2
НЕ_АЙС
Форумчанин
 
Регистрация: 18.04.2007
Сообщений: 135
По умолчанию

У формы меняешь значения:
BorderStyle в bsNone
Color в clFuchsia
TransparentColor в True
TransparentColorValue в clFuchsia
Добавляешь Image1 с рисунком твоей будущей формы.
Всё!!!
НЕ_АЙС вне форума Ответить с цитированием
Старый 26.04.2007, 09:20   #3
steck
/\/\Et@/\|/|$T
Пользователь
 
Аватар для steck
 
Регистрация: 26.03.2007
Сообщений: 89
По умолчанию

а как с параметрами бордер стайл -bsnone можно мышай перемещать форму
there are no programmers there is no life
steck вне форума Ответить с цитированием
Старый 26.04.2007, 09:32   #4
mrandrey
Форумчанин
 
Регистрация: 30.03.2007
Сообщений: 124
По умолчанию

Так будет правильнее, SF_RgnWindow устанавливает форму
например
SF_RgnWindow(sender,SF_RGN_OnlyButt on(sender));
остануться только контрол элементы
розбирайся:
Код:
unit SuperForm;
interface
uses forms,windows;
//const
Function SF_RGN_OnlyButton(sender:tObject):Thandle;//Определить контрольные элементы
Function SF_RGN_Tile(sender:tObject):Thandle; //Определить заголовок
Function SF_RGN_Border(sender:tObject):Thandle; //Определить обрамление
Procedure SF_RgnWindow(Sender:Tobject;Rgn:THandle);//Установить форму
Function SF_RgnToHandle(Rgn:array of tpoint):thandle;//Определить с массива точек (по типу Poligone)
Function SF_CombineRGN(Rgn1,Rgn2:thandle;Mode:byte):thandle;//комбинировать два обрезка
Function SF_RectRGN(x1,y1,x2,y2:integer):thandle;//Определить прямоугольник
           

implementation

Function SF_RGN_OnlyButton;
var
  Rgn: THandle;
  X,Y, I: Integer;
begin
with (sender as tform) do
 begin
 // определяем относительные координаты клиентской части
 X:= (Width - ClientWidth) div 2;
 Y:= Height - ClientHeight -X;
 // создаем регион для всей формы
 result:= CreateRectRgn(0, 0, 0,0);
 // теперь добавляем к FullRgn регионы каждого контрольного элемента
 for I:= 0 to ControlCount -1 do
  with Controls[I] do
   begin
   Rgn:= CreateRectRgn(X+Left,Y+Top,X+Left+Width,Y+Top+Height);
   CombineRgn(result, result, Rgn, rgn_Or);
   end;
 end;
end;
Function SF_RGN_Tile(sender:tObject):Thandle;
var X,Y: Integer;
Begin
with (sender as tform) do
 begin
 X:=(Width - ClientWidth) div 2;
 Y:=Height - ClientHeight - X;
 result:=CreateRectRgn(x, x,Width-x,Height-ClientHeight-x);
 end;
end;
Function SF_RGN_Border(sender:tObject):Thandle;
var X,Y: Integer;
Begin
with (sender as tform) do
 begin
 X:=(Width - ClientWidth) div 2;
 Y:=Height - ClientHeight -X;
 result:=CreateRectRgn(0,0,Width, Height);
 SF_CombineRGN(result,CreateRectRgn(X,x,X+ClientWidth,Y+ClientHeight),4);
 end;
end;
Function SF_CombineRgn;
begin
CombineRgn(Rgn1, Rgn1, Rgn2, Mode);
result:= Rgn1;
end;
Procedure SF_RgnWindow(Sender:Tobject;Rgn:THandle);
begin
with (sender as tform) do
SetWindowRgn(Handle, Rgn, True);
end;
Function SF_RgnToHandle(Rgn:array of tpoint):thandle;
begin
result:=CreatePolygonRgn(rgn,length(rgn),1);
end;
Function SF_RectRGN(x1,y1,x2,y2:integer):thandle;
begin
result:=CreateRectRgn(x1,y1,x2,y2);
end;
end.
Тут без 100г не розберешся.....
Спасибо не нужно, а на весы слева кликнуть не помешает!!!
mrandrey вне форума Ответить с цитированием
Старый 26.04.2007, 09:50   #5
НЕ_АЙС
Форумчанин
 
Регистрация: 18.04.2007
Сообщений: 135
По умолчанию

to mrandrey:
Интересно чем же правильней. Результат один и тот же, так зачем писать больше))
to steck:
Форму перетаскивать так:
Ставишь для твоего рисунка, который у тебя повторяет очертания формы обработчик MouseDown такого вида:

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Perform(WM_SysCommand,$F012,0);
end;

И всё...двигай сколько душе угодно.
Обработчик можно поставить не только для рисунка, но например для панельки на форме и таскать форму за панельку)
НЕ_АЙС вне форума Ответить с цитированием
Старый 26.04.2007, 10:45   #6
mrandrey
Форумчанин
 
Регистрация: 30.03.2007
Сообщений: 124
По умолчанию

а правильней тем, что попробуй свой вариант, ну скажем на Win 98 и увидишь что выйдет!! Да и заголовок иногда нужен.
А если форму менять нужно раз 15, что 15 картинок за собой тянуть?
Тут без 100г не розберешся.....
Спасибо не нужно, а на весы слева кликнуть не помешает!!!
mrandrey вне форума Ответить с цитированием
Старый 26.04.2007, 11:31   #7
Shuraken
Форумчанин
 
Аватар для Shuraken
 
Регистрация: 16.04.2007
Сообщений: 298
По умолчанию

procedure TForm1.FormCreate(Sender: TObject);
var
hRgn1, hRgn2: Cardinal;
begin
ClientWidth := ClientHeight;
hRgn1 := CreateEllipticRgn(0, 0, ClientWidth, ClientHeight); //Первый эллипс, все параметры - координаты начала и конца отрисовки
hRgn2 := CreateEllipticRgn(ClientWidth div 2 - 100, ClientHeight div 2 - 100, ClientWidth div 2 + 100, ClientHeight div 2 + 100);
CombineRgn(hRgn1, hRgn2, hRgn1, RGN_XOR); //объединяем два региона, вычитая второй из первого и помещая результат в первый
SetWindowRgn(Handle, hRgn1, true); // выводим результат
end;

В результате получается грамотный бублик
Не надо ничего усложнять. Все достаточно тривиально.

Последний раз редактировалось Shuraken; 26.04.2007 в 11:40.
Shuraken вне форума Ответить с цитированием
Старый 26.04.2007, 12:24   #8
НЕ_АЙС
Форумчанин
 
Регистрация: 18.04.2007
Сообщений: 135
По умолчанию

to mrandrey:
Ну 98, слава богу, сейчас за редким исключением только в страшном сне увидишь, а вот с твоим вариантом попробуй сделать действительно сложную форму. С моим вариантом это дело пяти секунд.
НЕ_АЙС вне форума Ответить с цитированием
Старый 26.04.2007, 13:16   #9
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Есть такая вещь: FormRGN - набор компонентов, облегчающих работу с регионом самой формы и её заголовка. (В архиве набор компонентов, инструкция, хелп, примеры)
Вложения
Тип файла: rar FormRGN.rar (490.9 Кб, 219 просмотров)
zetrix вне форума Ответить с цитированием
Старый 26.04.2007, 18:24   #10
steck
/\/\Et@/\|/|$T
Пользователь
 
Аватар для steck
 
Регистрация: 26.03.2007
Сообщений: 89
По умолчанию

а чё удобная вёщь
there are no programmers there is no life
steck вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать форму невидимой при запуске dns-s Общие вопросы Delphi 3 15.08.2009 08:18
Помогите советом! Как сделать форму сворачиваемой? Bezdar Microsoft Office Excel 3 18.08.2008 13:52
Как сделать форму? HAMMAN Помощь студентам 1 29.01.2008 22:11
Как сделать форму всегда активной? londoner Общие вопросы Delphi 3 04.03.2007 14:44
Как сделать главную форму невидимой londoner Общие вопросы Delphi 10 06.02.2007 17:11