Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1

Особенности HRGN

27.06.2014, 08:35. Показов 3032. Ответов 10

Студворк — интернет-сервис помощи студентам
Доброе утро.

регион HRGN создаю функцией CreatePolygonRgn(). Так вот, если функция получает динамический массив точек array of TPoint, то созданный регион является некорректным, т.е. не отрисовывается функцией PaintRgn() и не работает функция PtInRegion(). со статическим константным массивом либо массивом с фиксированной длинной проблем нет. почему так?

здесь код, а в архиве тестовый экзешник
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
 
type
  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    RadioGroup1: TRadioGroup;
    ListBox1: TListBox;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure RadioGroup1Click(Sender: TObject);
  end;
 
  // режим рисования
  TMode = (mFullFigure,mDrawing);
 
const
  // статический массив
  ptsStatic: array[0..2] of TPoint = ((X:10;Y:50),(X:10;Y:300),(X:300;Y:50));
var
  // или так
  // ptsStatic: array[0..2] of TPoint = ((X:10;Y:50),(X:10;Y:300),(X:300;Y:50));
  Form2: TForm2;
  mode: TMode = mFullFigure;
  ptsDynamic: array of TPoint;
  hrgnStatic: HRGN = 0;
  hrgnDynamic: HRGN = 0;
 
implementation
 
{$R *.dfm}
 
// рисование жирной точки (для красоты :)
procedure DrawPoint(X,Y: word);
begin
  with Form2.Canvas do
  begin
    Pen.Width:= 5;
    MoveTo(X,Y);
    LineTo(X,Y);
    Pen.Width:= 1;
  end;
end;
 
procedure TForm2.Button1Click(Sender: TObject);
begin
  // начало рисования
  SetLength(ptsDynamic,0);
  mode:= mDrawing;
  RadioGroup1.Enabled:= false;
  Button1.Enabled:= false;
  Button2.Enabled:= true;
  Invalidate;
end;
 
procedure TForm2.Button2Click(Sender: TObject);
begin
  // конец рисования
  mode:= mFullFigure;
  RadioGroup1.Enabled:= true;
  Button1.Enabled:= true;
  Button2.Enabled:= false;
  // создаю регион из динамического массива точек
  hrgnDynamic:= CreatePolygonRgn(ptsDynamic,Length(ptsDynamic),WINDING);
  ListBox1.Items.Values['хэндл динамического региона']:= IntToStr(hrgnDynamic);
  Invalidate;
end;
 
procedure TForm2.FormCreate(Sender: TObject);
begin
  Canvas.Brush.Color:= clSkyBlue;
  // создаю регион из статического массива точек
  hrgnStatic:= CreatePolygonRgn(ptsStatic,Length(ptsStatic),WINDING);
  ListBox1.Items.Values['хэндл статического региона']:= IntToStr(hrgnStatic);
end;
 
procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  // режим рисования фигуры. добавляю точку в массив
  if mode = mDrawing then
  begin
    SetLength(ptsDynamic,Length(ptsDynamic)+1);
    ptsDynamic[High(ptsDynamic)].X:= X;
    ptsDynamic[High(ptsDynamic)].Y:= Y;
    Invalidate;
  end else
  // или проверяю вхождение точки в регион
  begin
    DrawPoint(X,Y);
    if (ssCtrl in Shift)
      then ShowMessage('Точка принадлежит динамическому региону: ' +
                        BoolToStr(PtInRegion(hrgnDynamic,X,Y),true))
      else ShowMessage('Точка принадлежит статическому региону: ' +
                        BoolToStr(PtInRegion(hrgnStatic,X,Y),true));
  end;
end;
 
procedure TForm2.FormPaint(Sender: TObject);
var
  i: word;
begin
  // рисую статический регион
  PaintRgn(Canvas.Handle,hrgnStatic);
 
  case mode of
    // рисую динамический регион либо полигон
    mFullFigure:
    case RadioGroup1.ItemIndex of
      0: Canvas.Polygon(ptsDynamic);
      1: PaintRgn(Canvas.Handle,hrgnDynamic);
    end;
    // рисую поли-линию
    mDrawing:
    begin
      if Length(ptsDynamic) > 0 then
        for i:= Low(ptsDynamic) to High(ptsDynamic)
        do DrawPoint(ptsDynamic[i].X,ptsDynamic[i].Y);
      Canvas.Polyline(ptsDynamic);
    end;
  end;
end;
 
procedure TForm2.RadioGroup1Click(Sender: TObject);
begin
  // меняю режим рисования фигуры
  Invalidate;
end;
 
end.
Миниатюры
Особенности HRGN  
Вложения
Тип файла: zip Project1.zip (412.7 Кб, 11 просмотров)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.06.2014, 08:35
Ответы с готовыми решениями:

Особенности TreeView
Как в TreeView сделать так, чтобы при разорачивании ветви была одна иконка, а при сворачивании другая?:pardon: Как сделать так, чтобы...

Особенности radioбатона
Как в зависимости от размера и типа шрифта надписи RadioButton менять программно размер RadioButton.Может есть какое-нибудь свойство у...

Особенности компилятора Delphi по сравнению с C# .Net
Здравствуйте, товарищи! Есть dll (сервер), написанная на C# и Delphi-приложение (клиент), который юзает её через com-объекты. В dll...

10
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
27.06.2014, 14:37  [ТС]
из этой статьи узнал только как сохранять\грузить регионы. но опять-таки, это прокатывает только со "статическим" регионом. что за напасть, блин?!
0
4187 / 1835 / 220
Регистрация: 06.10.2010
Сообщений: 4,123
27.06.2014, 16:37
Лучший ответ Сообщение было отмечено DenNik как решение

Решение

Неправильно передаёшь параметр - так надо
Delphi
1
CreatePolygonRgn(ptsDynamic[0],Length(ptsDynamic),WINDING);
1
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
27.06.2014, 16:58
Добавлю, что один и тотже массив можно использовать для создания нескольких регионов из точек в разных "частях" этого массива:
Delphi
1
2
CreatePolygonRgn(ptsDynamic[0],4,WINDING);
CreatePolygonRgn(ptsDynamic[4],3,WINDING);
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
27.06.2014, 17:30  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
один и тотже массив можно использовать для создания нескольких регионов из точек в разных "частях" этого массива
так ведь для этого служит CreatePolyPolygonRgn

Добавлено через 6 минут
Цитата Сообщение от FIL Посмотреть сообщение
CreatePolygonRgn(ptsDynamic[4],3,WINDING);
просто не встречал в статьях именно такую конструкцию. теперь, после поста murderer'a, понял логику
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
27.06.2014, 17:31
Я немного о другом - при создании региона CreatePolygonRgn ты можешь использовать не все точки массива, и начинать необязательно с первой ([0]).
А CreatePolyPolygonRgn создает один регион, состоящий из нескольких фигур.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
27.06.2014, 17:54  [ТС]
FIL, ага. щас ходил в магазин и во время хождения до меня дошло, в чем разница. даже предугадал, что ты ответишь примерно так
0
0 / 0 / 0
Регистрация: 03.07.2014
Сообщений: 14
17.08.2014, 13:31
Помогите разобраться. Можно ли сделать класс, как указано ниже?
В конструкторе создаём регионы, а в деструкторе их удаляем.
Вопрос собственно по блоку в котором используется функция "CreatePolygonRgn".
Она каждый раз будет создавать новый регион?
Будет ли происходить утечка памяти в данном случае или нет?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class GradientTriangl
{
private:
    HRGN oldRegion, newRegion, tempRegion;
public:
    GradientTriangl(void);
    ~GradientTriangl(void);
    void Rotation(HDC hdc, double dAngle);
    void Move(RECT rect);
    void Move(int x0, int y0, int width, int height);
};
 
GradientTriangl::GradientTriangl()
{
    newRegion = CreateRectRgn(0, 0, 1, 1);
    tempRegion = CreateRectRgn(0, 0, 1, 1);
    oldRegion = CreateRectRgn(0, 0, 1, 1);
}
 
GradientTriangl::~GradientTriangl()
{
    DeleteObject(newRegion);
    DeleteObject(tempRegion);
    DeleteObject(oldRegion);
}
 
 
void GradientTriangl::Rotation(HDC hdc, double dAngle)
{
//Код метода
    newRegion = CreatePolygonRgn(&points[0], 3, WINDING);       
}

С уважением Виктор
0
4187 / 1835 / 220
Регистрация: 06.10.2010
Сообщений: 4,123
18.08.2014, 08:04
maltsevvv
В MSDN пишут
When you no longer need the HRGN object, call the DeleteObject function to delete it.
0
0 / 0 / 0
Регистрация: 03.07.2014
Сообщений: 14
18.08.2014, 16:10
Ну, так я их в деструкторе и удаляю.
0
4187 / 1835 / 220
Регистрация: 06.10.2010
Сообщений: 4,123
18.08.2014, 18:17
А в методе Rotation перед созданием нового региона?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.08.2014, 18:17
Помогаю со студенческими работами здесь

Особенности обеспечения видимости процедур и функций при косвенной рекурсии
Объясните пожалуйста особенности обеспечения видимости процедур и функций при косвенной рекурсии или подскажите, где посмотреть информацию?

Закраска региона HRGN
Допустим выделена проицвольная область(как в пейнте). И есть регион. Как его закрасить другим цветом? функция может есть какая нибудь....

Определить попадание в HRGN
Господа, подскажите, как можно определить, находится ли курсор мыши над определенным HRGN? Клики обрабатываются без проблем, а вот с этим...

FillRgn frmTest.hDC, hrgn, hBrush
frmTest.hDC... .hDC, что это за метод формы? Столкнулся с проблемой. Надо закрасить регион, созданный с помощью CreatePolygonRgn. Все...

HRGN, CombineRgn. Программа работает некоторое время и виснит.
Задача: искать пересечения регионов и подсчитывать их. В итоге: программа компилится, работает, работает...а потом виснит (своеобразно)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru