2010-08-13 14 views
6

Desidero scrivere una funzione che deve impostare l'area di ritaglio su una CC, ma ripristinare una regione di ritaglio esistente sul controller di dominio quando è terminata.uso corretto di GetClipRgn?

Quindi ho trovato GetClipRgn che sembra esattamente quello che voglio ma sembra confusionario. Non sono riuscito a trovare alcun esempio di utilizzo e Petzold non aveva nulla da offrire.

Quello che mi è venuta è stato questo:

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); 
    } 
} 

Sembra proprio strano che ho bisogno di creare una regione al fine di ottenere l'area corrente.

È corretto l'uso?

C'è un modo migliore per ottenere lo stesso effetto?

+0

Avete veramente bisogno di una "piccola" regione (generalmente chiamata "Regione di interesse - ROI) che è una sotto-parte dell'area cliente completa?" GetClientRect() vi darà l'intera area disegnabile. ottenere una parte di quella zona – JustBoo

+5

Sì, è una funzione strana.Il tuo codice sembra ok –

+1

@Hans - grazie Mi sento meglio ora ... Probabilmente la funzione win32 più strana che abbia mai usato ... – markh44

risposta

3

Beh, la cosa più vicina ad una risposta corretta è il commento di Hans Passant:

Sì, si tratta di una funzione di strano. Il tuo codice sembra a posto.

1

int SelectClipRgn(__in HDC hdc, __in HRGN hrgn); fare il lavoro?

La funzione SelectClipRgn consente di selezionare una regione come area di ritaglio corrente per il contesto dispositivo specificato.

Viene utilizzata solo una copia della regione selezionata. La regione stessa può essere selezionata per qualsiasi numero di altri contesti del dispositivo o può essere eliminata.

La funzione SelectClipRgn presuppone che le coordinate per una regione siano specificate nelle unità del dispositivo.

Per rimuovere un'area di ridimensionamento del contesto del dispositivo, specificare un quadratino della regione NULL.

4

uso le SaveDC e RestoreDC funzioni:

La funzione SaveDC salva lo stato corrente del dispositivo contesto specificato (DC) copiando i dati che descrivono gli oggetti selezionati e grafici modi (ad esempio come bitmap, pennello, tavolozza, carattere, penna, regione, disegno della modalità e modalità di mappatura) in una pila di contesti.

Sembra più pulito.