2010-08-13 9 views
6

Je souhaite écrire une fonction qui doit définir la zone de découpage sur un contrôleur de domaine mais restaurer toute région de découpage existante sur le contrôleur de domaine une fois celle-ci terminée.utilisation correcte de GetClipRgn?

J'ai donc trouvé GetClipRgn qui ressemble exactement à ce que je veux mais qui semble confus. Je n'ai pas trouvé d'exemples d'utilisation et Petzold n'avait rien à offrir.

Ce que je suis venu avec était le suivant:

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

Il semble juste bizarre que je dois créer une région afin d'obtenir la région actuelle.

Est-ce l'usage correct?

Y a-t-il un meilleur moyen d'obtenir le même effet?

+0

Avez-vous vraiment besoin d'une "petite" région (généralement appelée "région d'intérêt - ROI") qui est une sous-partie de la zone client complète? GetClientRect() vous donnera la zone de dessin complet. – JustBoo

+5

Oui, c'est une fonction bizarre ... Votre code a l'air correct –

+1

@Hans - merci je me sens mieux maintenant ... Probablement la fonction win32 la plus étrange que j'aie jamais utilisée ... – markh44

Répondre

3

Eh bien la chose la plus proche à une bonne réponse est le commentaire de Hans Passant:

Ouais, c'est une fonction bizarre. Votre code a l'air correct.

1

Est-ce que le int SelectClipRgn(__in HDC hdc, __in HRGN hrgn); fera le travail?

La fonction SelectClipRgn sélectionne une région en tant que région de découpage actuelle pour le contexte de périphérique spécifié.

Seule une copie de la région sélectionnée est utilisée. La région elle-même peut être sélectionnée pour un nombre quelconque d'autres contextes de périphériques ou elle peut être supprimée.

La fonction SelectClipRgn suppose que les coordonnées d'une région sont spécifiées dans les unités de périphérique.

Pour supprimer la zone de découpage d'un contexte de périphérique, spécifiez un handle de région NULL.

4

j'utiliser le SaveDC et RestoreDC fonctions:

La fonction SaveDC enregistre l'état actuel du dispositif spécifié contexte (DC) en copiant les données décrivant les objets sélectionnés et graphiques modes (par exemple, comme bitmap, pinceau, palette, police, stylo, région, dessin du mode et mode de mappage) vers une pile de contexte.

Il semble plus propre.

Questions connexes