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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2007, 15:00   #1
dimfil
Пользователь
 
Регистрация: 08.11.2007
Сообщений: 25
По умолчанию Как вырезать на форме область определенной формы ("что то вроде ножниц")

Возможность изменения видимой области формы должна быть. На C# это просто: используется Region, даже текст можно нарезать таким образом. А как обстоит дело в Delphi?
dimfil вне форума Ответить с цитированием
Старый 08.11.2007, 15:05   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тоже самое, есть Region.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.11.2007, 15:45   #3
Virtson
Владимир М.
Участник клуба
 
Аватар для Virtson
 
Регистрация: 30.10.2006
Сообщений: 1,289
По умолчанию

тоже TRegion
Берегите друг друга!
Virtson вне форума Ответить с цитированием
Старый 08.11.2007, 18:07   #4
dimfil
Пользователь
 
Регистрация: 08.11.2007
Сообщений: 25
По умолчанию Region

Парни, что то не то вы мне подсказали.
Ни Region ни Tregion Help Delphi ничего путного не выдает.
Помогите кто нибудь, пожалуйста.
dimfil вне форума Ответить с цитированием
Старый 08.11.2007, 20:00   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Примерно вот так:
Код:
var r1,r2,r3,r4,h: THandle;
begin
r1:=CreateEllipticRgn (-1, 0, 11, 12);
r2:=CreateEllipticRgn (789, 0, 800, 12);
r3:=CreateEllipticRgn (-1, 590, 11, 602);
r4:=CreateEllipticRgn (789, 590, 800, 602);
CombineRgn(r1,r1,r2,RGN_OR);
CombineRgn(r1,r1,r3,RGN_OR);
CombineRgn(r1,r1,r4,RGN_OR);
r2:=CreateRectRgn(5,0,793,602);
CombineRgn(r1,r1,r2,RGN_OR);
r2:=CreateRectRgn(-1,6,5,596);
CombineRgn(r1,r1,r2,RGN_OR);
r2:=CreateRectRgn(793,6,799,596);
CombineRgn(r1,r1,r2,RGN_OR);
SetWindowRgn(Handle,r1,True);
...
end;
Тут из формы вырезается клиентская область со скругленными краями.

Последний раз редактировалось mihali4; 08.11.2007 в 20:08.
mihali4 вне форума Ответить с цитированием
Старый 09.11.2007, 15:13   #6
dimfil
Пользователь
 
Регистрация: 08.11.2007
Сообщений: 25
По умолчанию Нужно вырезать строку текста

Смотрел я в хелпе есть только Polygon - то есть по массиву точек происходит вырезание.
В C# есть AddString - это проще.
Но мне надо строку текста на форме вырезать помогите кто чем.
Может каким то образом можно строку загнать в массив точек, а потом использовать CreatePolygonRgn(...).
dimfil вне форума Ответить с цитированием
Старый 09.11.2007, 15:26   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Код:
Создание PolyPolygon с использованием массива точек

Polygon - метод компонента TCanvas получает в качестве параметра динамический массив точек. Функция PolyPolygon() из Windows GDI 
получает указатель на массив точек. 
Пример:
procedure TForm1.Button1Click(Sender: TObject);
var
ptArray : array[0..9] of TPOINT;
PtCounts : array[0..1] of integer;
begin
PtArray[0] := Point(0, 0);
PtArray[1] := Point(0, 100);
PtArray[2] := Point(100, 100);
PtArray[3] := Point(100, 0);
PtArray[4] := Point(0, 0);
PtCounts[0] := 5;
PtArray[5] := Point(25, 25);
PtArray[6] := Point(25, 75);
PtArray[7] := Point(75, 75);
PtArray[8] := Point(75, 25);
PtArray[9] := Point(25, 25);
PtCounts[1] := 5;
PolyPolygon(Form1.Canvas.Handle,PtArray,PtCounts,2);
end;
Среди прочих, и этот пример есть в моей оболочке FAQ-базы, выложенной на сайте форума:
http://www.programmersclub.ru/files/dfaq.rar
mihali4 вне форума Ответить с цитированием
Старый 09.11.2007, 16:24   #8
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Можно создать форму по картинке. Т.е. находишь картинку в форме ножниц и создаёшь по ней форму.
Код


procedure Tmain.WMNCHitTest (var M:TWMNCHitTest);
begin
inherited;
if M.Result = htClient then
M.Result := htCaption;
end;


procedure Tmain.FormCreate(Sender: TObject);
var
regn, tmpRegn: integer; // регион окна и временный регион
x, y: integer; // координаты пикселя
nullClr: TColor; // «прозрачный цвет»

begin
nullClr := image1.picture.Bitmap.Canvas.Pixels[0, 0];
// Image1 это картинка по которой создается форма окна
regn := CreateRectRgn(0, 0, image1.picture.Graphic.Width,
image1.picture.Graphic.Height);
for x := 1 to image1.picture.Graphic.Width do
for y := 1 to image1.picture.Graphic.Height do
if image1.picture.Bitmap.Canvas.Pixels[x - 1, y - 1] = nullClr then
begin
tmpRegn := CreateRectRgn(x - 1, y - 1, x, y);
CombineRgn(regn, regn, tmpRegn, RGN_DIFF);
DeleteObject(tmpRegn);
end;
SetWindowRgn(main.handle, regn, true);

end;
FaTaL вне форума Ответить с цитированием
Старый 10.11.2007, 00:01   #9
dimfil
Пользователь
 
Регистрация: 08.11.2007
Сообщений: 25
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Можно создать форму по картинке. Т.е. находишь картинку в форме ножниц и создаёшь по ней форму.
Код


procedure Tmain.WMNCHitTest (var M:TWMNCHitTest);
begin
inherited;
if M.Result = htClient then
M.Result := htCaption;
end;


procedure Tmain.FormCreate(Sender: TObject);
var
regn, tmpRegn: integer; // регион окна и временный регион
x, y: integer; // координаты пикселя
nullClr: TColor; // «прозрачный цвет»

begin
nullClr := image1.picture.Bitmap.Canvas.Pixels[0, 0];
// Image1 это картинка по которой создается форма окна
regn := CreateRectRgn(0, 0, image1.picture.Graphic.Width,
image1.picture.Graphic.Height);
for x := 1 to image1.picture.Graphic.Width do
for y := 1 to image1.picture.Graphic.Height do
if image1.picture.Bitmap.Canvas.Pixels[x - 1, y - 1] = nullClr then
begin
tmpRegn := CreateRectRgn(x - 1, y - 1, x, y);
CombineRgn(regn, regn, tmpRegn, RGN_DIFF);
DeleteObject(tmpRegn);
end;
SetWindowRgn(main.handle, regn, true);

end;
В примере разобрался, большое спасибо! Но:
nullClr := image1.picture.Bitmap.Canvas.Pixels[0, 0];
в этой строке при считываниии цвета картинка пропадает, если эту строку закоментировать то картинка на форме остается. Вывод такой: при обращении к массиву цветов картинка пропадает с формы. Как быть?
В общем то очень хочется чтобы этот отличный алгоритм заработал.
dimfil вне форума Ответить с цитированием
Старый 10.11.2007, 08:51   #10
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Цитата:
Сообщение от dimfil Посмотреть сообщение
В примере разобрался, большое спасибо! Но:
nullClr := image1.picture.Bitmap.Canvas.Pixels[0, 0];
в этой строке при считываниии цвета картинка пропадает, если эту строку закоментировать то картинка на форме остается. Вывод такой: при обращении к массиву цветов картинка пропадает с формы. Как быть?
В общем то очень хочется чтобы этот отличный алгоритм заработал.
Код писал не я, но сам его пробывал всё нормально работает. Подробнее можешь глянуть в книге М.Фленова "Delphi глазами хакера" в разделе 3.8 на странице 101.
FaTaL вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нажатие кнопки "X" на форме strannik Общие вопросы Delphi 6 09.05.2011 02:42
Как сделать так,чтобы на форме отображалось свободное место диска "С"???? Alexij Общие вопросы Delphi 4 11.07.2008 23:21
Проблемма: Программное отключение "защиты формы" влияет на скорость выполнения программного кода... StrikeR33 Microsoft Office Word 0 28.05.2008 20:11
Файл в состоянии "Вырезать". NeiL Общие вопросы Delphi 0 24.04.2008 23:23
Запретить закрытие окошка формы крестиком "Х" Slim Microsoft Office Excel 5 28.03.2007 19:39