Координаты области отсечения относятся к родительскому элементу управления, а не к самому себе?

Я работаю над элементом управления графической диаграммой и хочу определить область отсечения для рисования в ней. Я передаю SelectClipRgn() координаты моей области отсечения относительно Left и Top элемента управления. Но похоже, что он выбирает не тот регион. Фактически, регион стал правильным, только если я добавлю положение Left и Top элемента управления внутри его Parent (формы или панели). Что происходит? Нормально ли такое поведение?

 ClipRect:= Rect(MarginLeft, MarginTop, MarginLeft + GraphWidth, MarginTop + GraphHeight);
 NewClipRgn:= CreateRectRgn(Left+ClipRect.Left, Top+ClipRect.Top, Left+ClipRect.Right, Top+ClipRect.Bottom);
 SelectClipRgn(Canvas.Handle, NewClipRgn);
SelectClipRgn(Canvas.Handle - какой Canvas используется?
MBo 08.06.2024 13:13

Холст, который предоставляет метод Paint моего элемента управления...

Marus Gradinaru 08.06.2024 13:18

Я предполагаю, что этот элемент управления не является потомком TWinControl и не имеет собственного окна. В вашем вопросе может использоваться дополнительная информация и код для воспроизведения проблемы.

Dalija Prasnikar 08.06.2024 13:27

Это TGraphicControl потомок.

Marus Gradinaru 08.06.2024 13:30

Я обнаружил, что это происходит только тогда, когда включен DoubleBuffered.

Marus Gradinaru 08.06.2024 15:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
125
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не знаю, что вызвало эту проблему, но я нашел способ заставить мой контроль работать. Я считываю координаты текущего региона отсечения, которые дает мне система, когда я пытаюсь Paint, а затем корректирую их относительно моего контроля. Таким образом, у меня всегда есть правильные координаты.

 OldClipRgn:= CreateRectRgn(0, 0, 0, 0);
 GetClipRgn(Canvas.Handle, OldClipRgn);
 GetRgnBox(OldClipRgn, RgnBox);
 RgnBox.Left:=   RgnBox.Left + MarginLeft;
 RgnBox.Right:=  RgnBox.Left + GraphWidth;
 RgnBox.Top:=    RgnBox.Top + MarginTop;
 RgnBox.Bottom:= RgnBox.Top + GraphHeight;
 NewClipRgn:= CreateRectRgn(RgnBox.Left, RgnBox.Top, RgnBox.Right, RgnBox.Bottom);
 SelectClipRgn(Canvas.Handle, NewClipRgn);

 // do the drawing...

 SelectClipRgn(Canvas.Handle, OldClipRgn);
 DeleteObject(OldClipRgn); DeleteObject(NewClipRgn); 

Другие вопросы по теме