Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Как сделать дырку в форме


Автор: Scotch 24.9.2007, 21:26
Всем привет

скачал свежую DRKB (спасибо создателм), попробовал сделать пример, столкнулся с ошибкой

[Error] Unit1.pas(43): Undeclared identifier: 'Pts'

действительно непонятно что это за фрукт, плюс на эту команду "CreatePolygonRgn" не могу вызвать справку в Delphie.  Можете объяснить как это должно работать?



Код

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;
ShowMessage ('Вам лучше купить новый монитор');
end;


Озадачен такой проблемкой - хочу сделать форму нестандартного вида, как бы намертво склеенную из 2-х прямоугольных форм (например, одинаковых), но одна чуть выше и правее другой (наложены одна на другую). Не проблема написать обработчик перемещения формы и, соответсвенно, привязать координаты другой к этим перемещениям, но есть проблема - форма которая левее не должна становиться активной и перекрывать собой форму правее.  Т.е. правая форма всегда должна оставаться активной, даже если курсор мыши перемещает левую форму...

Помогите разобраться, можно ли и как это обойти?

Автор: aktuba 24.9.2007, 22:42
Перехватывай OnActive... А почему нельзя сделать просто форму нестандартной формы, обрезанную по какому-то региону?

Автор: Vetos 25.9.2007, 08:33
Так у тебя хотя бы где нибудь описывается var Pts, а так конечно будет выдавать ету ошибку, прочти внимательней пример smile  

Автор: Rodman 25.9.2007, 08:35
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  HRegion1, Hreg2, Hreg3: THandle;
  Col: TColor;
  Pts:array  [0..2] of TPoint;
begin
  ShowMessage ('Ready for a real crash?');
  Col := Color;
  Color := clRed;
//  PlaySound ('boom.wav', 0, snd_sync);
  Pts[0] := Point(135-140, 40);
  Pts[1] := Point(135+140, 40);
  Pts[2] := Point(135, 140);
  HRegion1 := CreatePolygonRgn (Pts,  sizeof (Pts) div 8, alternate);
  SetWindowRgn (Handle, HRegion1, True);
  ShowMessage ('Now, what have you done?');
  Color := Col;
  ShowMessage ('Âàì ëó÷øå êóïèòü íîâûé ìîíèòîð');
end;


Автор: Alexeis 25.9.2007, 09:44
Цитата(Scotch @  24.9.2007,  21:26 Найти цитируемый пост)
действительно непонятно что это за фрукт, плюс на эту команду "CreatePolygonRgn" не могу вызвать справку в Delphie.

  Ее нужно смотреть в справке по API (p.s. в Delphi 2005 и выше все справки объединены. Оч. удобно)

Автор: Snowy 25.9.2007, 10:38
Лучше воспользуйся регионами и вырежи нужную фигуру.

Автор: Scotch 25.9.2007, 16:12
Цитата(Vetos @ 25.9.2007,  08:33)
Так у тебя хотя бы где нибудь описывается var Pts, а так конечно будет выдавать ету ошибку, прочти внимательней пример smile

Дык и я о том же, товарисч!

Думаю в  справке правильнее помещать рабочие примеры, чтобы на их работе разбираться дальше.

Автор: Scotch 25.9.2007, 17:07
Спасибо товарищу Rodman у, сработало, хоть и несколько не так как ожидалось...

Хотелось реальную дырку в форме, чтобы сквозь нее были видны изображения, расположенные за формой. 

Автор: Alix 25.9.2007, 17:51
Например это может быть нужно, если хочется чтобы одна форма была не прозрачной, а у другой полупрозрачной.
Делай примерно так:
Код
 // В объвлении TForm1:
  private
    procedure WMMoving(var M: TWMMoving); message WM_MOVING;

...

// реализация. Форма2 будет на 10 пикселей правее формы 1 и на той же высоте.
procedure TForm1.WMMoving(var M: TWMMoving);
begin
  form2.Left := m.dragrect.Right + 10;
  form2.Top  := m.dragrect.Top;
end;

Автор: Scotch 25.9.2007, 19:00
Цитата(Snowy @ 25.9.2007,  10:38)
Лучше воспользуйся регионами и вырежи нужную фигуру.

В общем то, я так и хотел сделать (но не знаю как), думал с двумя формами будет проще. 
Подскажите пожалуйста, как пользоваться регионами и вырезать формы?

Автор: Alix 25.9.2007, 20:14
Вот код, вырежет дырку.
Код
procedure TForm1.Button1Click(Sender: TObject);
var
  formRGN,
  holeRGN : HRGN;

begin
  formRGN :=  CreateRectRgn(0, 0, width, height);
  holeRGN := CreateRectRgn(100, 100, 200, 200);

  CombineRgn(formRGN, formRGN, holeRGN, RGN_DIFF);

  SetWindowRgn(form1.Handle, formRGN, true);
end;

Автор: Scotch 25.9.2007, 21:31
Спасибо, Alix, это то что было нужно!

 smile 

Автор: aktuba 25.9.2007, 21:33
Цитата

Подскажите пожалуйста, как пользоваться регионами и вырезать формы?


Посмотри в http://drkb.ru/ или в http://delphiworld.narod.ru...

Автор: Guedda 26.9.2007, 10:09
http://delphiworld.narod.ru/base/create_region_by_mask.html, http://delphiworld.narod.ru/base/ring_win.html, http://delphiworld.narod.ru/base/form_by_image.html, http://delphiworld.narod.ru/base/create_controls_with_any_shape.html и http://delphiworld.narod.ru/base/skins.html.

Выбирай  smile 

Автор: Scotch 26.9.2007, 13:52
Спасибо, спасибо, спасибо, спасибо и спасибо  smile 

буду ваять и разбираться 

Автор: Alexeis 26.9.2007, 17:57


В нашем FAQe не хуже написано 


http://forum.vingrad.ru/index.php?show_type=faq&showtopic=155942
http://forum.vingrad.ru/index.php?show_type=faq&showtopic=155945
http://forum.vingrad.ru/index.php?show_type=faq&showtopic=155948
http://forum.vingrad.ru/index.php?show_type=faq&showtopic=155954
http://forum.vingrad.ru/index.php?show_type=faq&showtopic=156058

Автор: Guedda 26.9.2007, 18:25

И правда, на нашем FAQ все лучше расписано!

Автор: Scotch 26.9.2007, 19:09
Расписано может быть и хорошо, но по моей проблемке ничего не нашел
Мне нужно вырезать в форме 2 прямоугольника, если делать это через SetWindowRgn то захожу в тупик - вырезается только 1, как ни крути

Автор: Alexeis 26.9.2007, 19:11
Цитата(Scotch @  26.9.2007,  19:01 Найти цитируемый пост)
Снова проблемка - а если мне нужно сделать 2 дырки? Или больше

  Все это делается последовательными вызовами CombineRgn. Эта функция служит для объединения и ее можно вызывать много раз для изменения региона.

Модератор: темы объединил.

Автор: Scotch 26.9.2007, 20:47
Понятно, оказывается все просто  smile 

Автор: BaD_SeCt0R 26.9.2007, 23:24
А вот у меня, так, ради интереса, появилась пара вопросов.

1. При "обрезке" формы регионом она теряет ХР-шный вид. Как с этим бороться?
2. Если то же самое делать с кнопой, то края у нее обрезаются довольно нелицеприятно. Регион просто ограничивает область видимости контрола. Мне бы, например, хотелось бы увидеть ту же кнопку, но с "правильными" краями. Это возможно без долгих извращений?

Автор: Alexeis 26.9.2007, 23:37
  Сам все сказал.
Цитата(BaD_SeCt0R @  26.9.2007,  23:24 Найти цитируемый пост)
Регион просто ограничивает область видимости контрола.

 
  Добавлю только что не только область рисования, но ограничивает и область при попадании в которую курсора мыши винда отсылает сообщения о перемещении, кликах, передаче фокуса ввода и т.д.

Автор: BaD_SeCt0R 26.9.2007, 23:59
Цитата(Alexeis @  26.9.2007,  23:37 Найти цитируемый пост)
Добавлю только что не только область рисования, но ограничивает и область при попадании в которую курсора мыши винда отсылает сообщения о перемещении, кликах, передаче фокуса ввода и т.д.


Alexeis, это все так. Может быть я не слишкм конкретно вопрос ставлю?.. На пальцах. У кнопы, если есть манифест, вокруг синенькая рамочка. Прямоугольная. А как мне сделать круглый батон с такой же рамочкой? Да и вообще батон любой формы? Да тоже и формы касается. Есть ли вариант ей по границе региона бордер налепить?

И еще про форму. После установки ей региона, у нее пропадает стиль ХР. Сразу после первой перерисовки.

Автор: BaD_SeCt0R 27.9.2007, 00:31
М-да... Из того, что смог найти, делаю вывод, что без извращений не обойтись...

Автор: lukas 29.9.2007, 16:44
А что дырку то делать... TransparentColor в true, TransparentColorValue = clRed (например), и рисуем себе дырку красного цвета...  *для формы)

Автор: Alexeis 29.9.2007, 19:58
  Так дырка тоже регионами делается, только вычитанием их. TransparentColor - для формы работает только, для компонентов не годиться.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)