2010-08-13 26 views
6

Quiero escribir una función que necesite establecer la región de recorte en un DC pero restaurar cualquier región de recorte existente en el DC cuando esté terminado.uso correcto de GetClipRgn?

Encontré GetClipRgn que suena exactamente como lo que quiero, pero me parece confuso. No pude encontrar ningún ejemplo de usarlo y Petzold no tenía nada que ofrecer.

Lo que ocurrió fue esto:

void DrawStuff(HDC hDC) 
{ 
    HRGN restoreRegion = CreateRectRgn(0, 0, 0, 0); 
    if (GetClipRgn(hDC, restoreRegion) != 1) 
    { 
     DeleteObject(restoreRegion); 
     restoreRegion = NULL; 
    } 

    // 
    // Set new region, do drawing 
    // 

    SelectClipRgn(hDC, restoreRegion); 
    if (restoreRegion != NULL) 
    { 
     DeleteObject(restoreRegion); 
    } 
} 

Sólo parece extraño que necesito para crear una región con el fin de obtener la región actual.

¿Es este uso correcto?

¿Hay alguna forma mejor de lograr el mismo efecto?

+0

¿Realmente necesita una región "pequeña" (generalmente denominada "Región de interés - ROI") que es una parte parcial del área de cliente completa? GetClientRect() le dará el área dibujable completa. Las regiones de clip son para obtener una parte de esa área. – JustBoo

+5

Sí, es una función extraña. Tu código se ve bien. –

+1

@ Hans - gracias, ahora me siento mejor. Probablemente la función win32 más extraña que he usado ... – markh44

Respuesta

3

Bien lo más parecido a una respuesta correcta es el comentario de Hans Passant:

Sí, es una función extraña. Tu código se ve bien

1

¿Va a hacer el trabajo int SelectClipRgn(__in HDC hdc, __in HRGN hrgn);?

La función SelectClipRgn selecciona una región como la región de recorte actual para el contexto de dispositivo especificado.

Solo se utiliza una copia de la región seleccionada. La región misma se puede seleccionar para cualquier número de contextos de otros dispositivos o se puede eliminar.

La función SelectClipRgn asume que las coordenadas para una región se especifican en unidades de dispositivo.

Para eliminar una región de recorte del contexto del dispositivo, especifique un identificador de región NULL.

4

uso el SaveDC y RestoreDC funciones:

El función SaveDC guarda el estado actual del contexto especificado dispositivo (DC) copiando los datos que describen los objetos seleccionados y gráficos modos (tal como el mapa de bits, pincel, paleta, fuente, lápiz, región, modo de dibujo y modo de mapeo) a una pila de contexto.

Se siente más limpio.