Я работаю над элементом управления графической диаграммой и хочу определить область отсечения для рисования в ней. Я передаю 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);
Холст, который предоставляет метод Paint моего элемента управления...
Я предполагаю, что этот элемент управления не является потомком TWinControl и не имеет собственного окна. В вашем вопросе может использоваться дополнительная информация и код для воспроизведения проблемы.
Это TGraphicControl потомок.
Я обнаружил, что это происходит только тогда, когда включен DoubleBuffered.





Я не знаю, что вызвало эту проблему, но я нашел способ заставить мой контроль работать. Я считываю координаты текущего региона отсечения, которые дает мне система, когда я пытаюсь 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);
SelectClipRgn(Canvas.Handle- какой Canvas используется?