2013-11-11 2 views
4

Каков правильный способ исключить круглый прямоугольник из отсечения gregion с помощью Delphi/GDI?Исключить круглый прямоугольник из области отсечения?

Существует ExcludeClipRect, чтобы исключить прямоугольную область и есть CreateRoundRectRgn вместе с SelectClipRgn, чтобы установить область отсечения на круглый прямоугольник.

Но как я могу исключить круглый прямоугольник из области отсечения (что-то вроде ExcludeClipRoundRect или ExcludeClipRgn)? Я экспериментировал с CombineRgn, но не работал.

+4

Вы пытались использовать ['RGN_XOR'] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd183465%28v=vs.85%29.aspx#RGN_XOR) режим комбинирования? Btw. довольно хороший учебник [', например. here'] (http://www.codeproject.com/Articles/1944/Guide-to-WIN32-Regions). – TLama

+1

@TLama - Чтобы * исключить * регион, вы хотите 'RGN_DIFF'. Но здесь это не имеет значения, так как исключенный регион полностью внутри. –

ответ

6

Благодаря замечанием @TLama я был в состоянии решить, как это:

Region := CreateRectRgn (0, 0, ClientWidth, ClientHeight); 
ExcludedRegion := CreateRoundRectRgn (1, 1, ClientWidth - 1, ClientHeight - 1, 3, 3); 
CombineRgn (Region, Region, ExcludedRegion, RGN_XOR); 
SelectClipRgn (Canvas.Handle, Region); 

Проблема в том, что прежде, чем область передается в качестве первого параметра CombineRgn не была создана. Одно предложение из связанного учебника при условии, что ключ:

Еще одна вещь, чтобы указать на то, что область назначения в CombineRgn может быть один из исходных областей.

вместе с этой информацией из MSDN:

hrgnDest [в]: Ручка к новой области с размерами, определенных путем объединения двух других регионов. (. Этот регион должен существовать до CombineRgn называется)

2

В качестве альтернативы уже given answer, что позволит определить один меньше регион, является использование ExtSelectClipRgn:

ExcludedRegion := CreateRoundRectRgn (1, 1, ClientWidth - 1, ClientHeight - 1, 3, 3); 
ExtSelectClipRgn(Canvas.Handle, ExcludedRegion, RGN_DIFF); 


Если вы» не уверен в том, что область отсечения была неизмененной, или нет, и хочет сбросить область, вы можете позвонить

SelectClipRgn(Canvas.Handle, 0); 

перед вызовом ExtSelectClipRgn.

Смежные вопросы