GdipIsVisibleClipEmpty()



Syntaxe
Resultat.i = GdipIsVisibleClipEmpty(*graphics, @result.i)
Paramètres
*graphics

[in] Pointeur sur un objet Graphics existant.

result.i

[out] Variable qui recevra le résultat du test.

Description

Cette fonction permet de déterminer si la zone de découpage visible du graphique est vide ou non.
Si la zone de découpage est vide, result vaudra #True sinon #False.

La zone de découpage visible correspond à l'intersection entre la zone de découpage du graphique et la zone de découpage de la fenêtre.

Lorsque l'on crée un graphique, sa zone de découpage est dite infinie, cela signifie que l'ensemble de la surface est disponible pour dessiner.
La zone de découpage visible est différente de la zone de découpage, nous ne verrons à l'écran que la zone visible de découpage.

Si la zone de découpage visible du graphique est vide, ce la signifie qu'il n'y a pas de zone sur laquelle dessiner.
Par conséquent, rien ne pourra être dessiné lorsque la zone de découpage visible est vide.

La fonction est illustrée avec deux exemples presque identiques sauf pour le paramètre de combinaison de la zone de découpage visible qui change.
Pour le premier exemple, la zone de découpe rectangulaire est créé avec le mode #CombineModeComplement et pour le second avec le mode #CombineModeReplace.
Un troisième exemple utilise une zone de découpage en dehors de l'affichage de la fenêtre. Dans cet exemple, on utilise la fonction GdipIsClipEmpty() et la fonction GdipIsVisibleClipEmpty().
Cet exemple utilise le mode de combinaison #CombineModeReplace.

Pour le premier exemple, la nouvelle zone de découpage visible crée avec le mode de combinaison #CombineModeComplement est vide :

Avant combinaison, la zone initiale existante est infinie.

La zone à combiner est rectangulaire (X = 0, Y = 0, largeur = 350, hauteur = 250).

Après combinaison, la région existante initiale est exclue de la nouvelle zone. Or, la zone rectangulaire complète est une partie de la zone initiale existante, il en résulte que la zone combinée à une surface nulle. La zone de découpage visible est vide.

 

La fonction GdipIsVisibleClipEmpty() retournera #True. Il ne sera pas possible d'afficher sur cette zone avec GDI+. L'exemple tente d'afficher cette zone en rouge mais sans succès.


Pour le second exemple, la nouvelle zone de découpage créée avec le mode de combinaison #
CombineModeReplace n'est pas vide :

Avant combinaison, la région initiale existante est infinie.

La zone à combiner est rectangulaire (X = 0, Y = 0, largeur = 350, hauteur = 250).

Après combinaison, la zone rectangulaire remplace la zone initiale de découpage et devient la nouvelle zone de découpage. La zone de découpage visible n'est pas vide.

 

La fonction GdipIsVisibleClipEmpty() retournera #False. Il sera possible d'afficher sur cette zone. Cette zone sera colorée en rouge.

Pour le troisième exemple, la nouvelle zone de découpage créée avec le mode de combinaison #CombineModeReplace est non vide :

Avant combinaison, la zone initiale existante est infinie.

La zone à combiner est rectangulaire (X = -100, Y = -100, largeur = 50, hauteur = 50).

Après combinaison, la zone rectangulaire remplace la zone initiale de découpage et devient la nouvelle zone de découpage.

 

La fonction GdipIsClipEmpty() retournera #False. Il serait possible de dessiner sur cette zone avec GDI+ mais elle n'est pas visible. Par contre, la fonction GdipIsVisibleClipEmpty() retournera #True car l'intersection de la zone de découpage du graphique avec celle de la fenêtre n'est pas visible.

Résultat de la fonction
Si la fonction réussit, elle retourne #Ok qui est une constante de l'énumération status.
Si la fonction échoue, elle retourne une des autres valeurs de l'énumération status.
PB - OS

PureBasic v4.30 bêta 4 (Windows - x86)
Testé avec Windows Vista édition familiale Premium
Exemples
XIncludeFile "..\..\gdiplus.pbi"

EnableExplicit

#MainWindow = 0
#StatusBar = 0

Define .i


Procedure myCallback(window, message, wParam, lParam)
   Protected dc, ps.PAINTSTRUCT, resultat
   Protected *Localtoken, *Localgfx, *Localbrush
   
   Select message
      Case #WM_PAINT
         dc = BeginPaint_(window, @ps)
         If dc
            ; initialisation de Gdi+
            *Localtoken = Gdiplus_New()
            ; on vérifie que l'initialisation est Ok
            If *Localtoken
               ; création du graphique source associé au DC de la fenêtre principale
               If GdipCreateFromHDC(dc, @*Localgfx) = #Ok
                  ; création de la brush
                  If GdipCreateSolidFill(ARGB(#Red), @*Localbrush) = #Ok
                     ; création de la zone de découpage
                     GdipSetClipRectI(*Localgfx, 150, 50, 230, 200, #CombineModeComplement)
                     ; rempli un rectangle en bleu sur le graphique principal
                     GdipFillRectangleI(*Localgfx, *Localbrush, 0, 0, 350, 250)
                     resultat = 0
                     If GdipIsVisibleClipEmpty(*Localgfx, @resultat) = #Ok
                        If resultat
                           If IsStatusBar(#StatusBar)
                              StatusBarText(#StatusBar, 0, " GdipIsVisibleClipEmpty a retourné #True")
                           EndIf
                        Else
                           If IsStatusBar(#StatusBar)
                              StatusBarText(#StatusBar, 0, " GdipIsVisibleClipEmpty a retourné #False")
                           EndIf
                        EndIf
                     EndIf
                     ; supprime la brush
                     GdipDeleteBrush(*Localbrush)
                  EndIf
                  ; supprime l'objet graphique 
                  GdipDeleteGraphics(*Localgfx)
               EndIf
               GdiplusShutdown(*Localtoken)
            EndIf
            EndPaint_(window, @ps)
         EndIf
   EndSelect
   ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure


If OpenWindow(#MainWindow, 250, 100, 400, 250, "GdiPlus 1.0 - GdipIsVisibleClipEmpty", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   If CreateStatusBar(#StatusBar, WindowID(#MainWindow))
      AddStatusBarField(WindowWidth(#MainWindow))
      SetWindowCallback(@myCallback())
      
      ; boucle
      Repeat
      Until WaitWindowEvent() = #PB_Event_CloseWindow
      
   EndIf
EndIf
End

XIncludeFile "..\..\gdiplus.pbi"

EnableExplicit

#MainWindow = 0
#StatusBar = 0

Define .i



Procedure myCallback(window, message, wParam, lParam)
   Protected dc, ps.PAINTSTRUCT, resultat
   Protected *Localtoken, *Localgfx, *Localbrush
   
   Select message
      Case #WM_PAINT
         dc = BeginPaint_(window, @ps)
         If dc
            ; initialisation de Gdi+
            *Localtoken = Gdiplus_New()
            ; on vérifie que l'initialisation est Ok
            If *Localtoken
               ; création du graphique source associé au DC de la fenêtre principale
               If GdipCreateFromHDC(dc, @*Localgfx) = #Ok
                  ; création de la brush
                  If GdipCreateSolidFill(ARGB(#Red), @*Localbrush) = #Ok
                     ; création de la zone de découpage
                     GdipSetClipRectI(*Localgfx, 0, 0, 130, 200, #CombineModeReplace)
                     ; rempli un rectangle en bleu sur le graphique principal
                     GdipFillRectangleI(*Localgfx, *Localbrush, 0, 0, 350, 250)
                     resultat = 0
                     If GdipIsVisibleClipEmpty(*Localgfx, @resultat) = #Ok
                        If resultat
                           If IsStatusBar(#StatusBar)
                              StatusBarText(#StatusBar, 0, " GdipIsVisibleClipEmpty a retourné #True")
                           EndIf
                        Else
                           If IsStatusBar(#StatusBar)
                              StatusBarText(#StatusBar, 0, " GdipIsVisibleClipEmpty a retourné #False")
                           EndIf
                        EndIf
                     EndIf
                     ; supprime la brush
                     GdipDeleteBrush(*Localbrush)
                  EndIf
                  ; supprime l'objet graphique 
                  GdipDeleteGraphics(*Localgfx)
               EndIf
               GdiplusShutdown(*Localtoken)
            EndIf
            EndPaint_(window, @ps)
         EndIf
   EndSelect
   ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure


If OpenWindow(#MainWindow, 250, 100, 400, 250, "GdiPlus 1.0 - GdipIsVisibleClipEmpty exemple 2", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   If CreateStatusBar(#StatusBar, WindowID(#MainWindow))
      AddStatusBarField(WindowWidth(#MainWindow))
      SetWindowCallback(@myCallback())
      
      ; boucle
      Repeat
      Until WaitWindowEvent() = #PB_Event_CloseWindow
      
   EndIf
EndIf
End

XIncludeFile "..\..\gdiplus.pbi"

EnableExplicit

#MainWindow = 0
#StatusBar = 0

#SB_GETTEXT       = 1026
#SB_GETTEXTLENGTH = 1027

Define .i

Procedure.s GetStatusBartext(StatusBarStaticID, Field)
   Protected length, a$
   If IsStatusBar(StatusBarStaticID)
      length = SendMessage_(StatusBarID(StatusBarStaticID), #SB_GETTEXTLENGTH, Field ,0)
      If length
         a$ = Space(length & $0000FFFF)
         SendMessage_(StatusBarID(StatusBarStaticID), #SB_GETTEXT, Field, @a$)
         ProcedureReturn a$
      EndIf 
   EndIf
   ProcedureReturn ""
EndProcedure 


Procedure myCallback(window, message, wParam, lParam)
   Protected dc.l, ps.PAINTSTRUCT, resultat.l
   Protected *Localtoken, *Localgfx, *Localbrush
   
   Select message
      Case #WM_PAINT
         dc = BeginPaint_(window, @ps)
         If dc
            ; initialisation de Gdi+
            *Localtoken = Gdiplus_New()
            ; on vérifie que l'initialisation est Ok
            If *Localtoken
               ; création du graphique source associé au DC de la fenêtre principale
               If GdipCreateFromHDC(dc, @*Localgfx) = #Ok
                  ; création de la brush
                  If GdipCreateSolidFill(ARGB(#Red), @*Localbrush) = #Ok
                     ; création de la zone de découpage
                     GdipSetClipRectI(*Localgfx,  -100, -100, 50, 50, #CombineModeReplace)
                     ; rempli un rectangle en bleu sur le graphique principal
                     GdipFillRectangleI(*Localgfx, *Localbrush, 0, 0, 400, 250)
                     resultat = 0
                     If GdipIsClipEmpty(*Localgfx, @resultat) = #Ok
                        If resultat
                           If IsStatusBar(#StatusBar)
                              StatusBarText(#StatusBar, 0, " GdipIsClipEmpty a retourné #True")
                           EndIf
                        Else
                           If IsStatusBar(#StatusBar)
                              StatusBarText(#StatusBar, 0, " GdipIsClipEmpty a retourné #False")
                           EndIf
                        EndIf
                     EndIf
                     resultat = 0
                     If GdipIsVisibleClipEmpty(*Localgfx, @resultat) = #Ok
                        If resultat
                           If IsStatusBar(#StatusBar)
                              StatusBarText(#StatusBar, 0, GetStatusBartext(#StatusBar, 0) + Space(25) + "GdipIsVisibleClipEmpty a retourné #True")
                           EndIf
                        Else
                           If IsStatusBar(#StatusBar)
                              StatusBarText(#StatusBar, 0, GetStatusBartext(#StatusBar, 0) + Space(25) + "GdipIsVisibleClipEmpty a retourné #False")
                           EndIf
                        EndIf
                     EndIf
                    
                     ; supprime la brush
                     GdipDeleteBrush(*Localbrush)
                  EndIf
                  ; supprime l'objet graphique 
                  GdipDeleteGraphics(*Localgfx)
               EndIf
               GdiplusShutdown(*Localtoken)
            EndIf
            EndPaint_(window, @ps)
         EndIf
   EndSelect
   ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure


If OpenWindow(#MainWindow, 250, 100, 500, 309, "GdiPlus 1.0 - GdipIsClipEmpty/GdipIsVisibleClipEmpty exemple 3", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   If CreateStatusBar(#StatusBar, WindowID(#MainWindow))
      AddStatusBarField(WindowWidth(#MainWindow))
      SetWindowCallback(@myCallback())
      
      ; boucle
      Repeat
      Until WaitWindowEvent() = #PB_Event_CloseWindow
      
   EndIf
EndIf
End