2017-03-17 1 views
0

Je dessine des zones remplies avec des trous optionnels dans Delphi en utilisant les appels Win API (polygone). Les trous (ne pas les remplir avec la couleur bg) coupés par les régions d'écrêtage. Cela fonctionne bien jusqu'à ce que j'appelle un aperçu d'impression (et l'aperçu d'impression semble bien jusqu'à ce que la page visualisée ne contienne pas la (les) zone (s) remplie (s) avec le (s) trou (s)). Le contenu de la page dans l'aperçu avant impression tiré par le même appel de méthode de la zone remplie, juste avant d'appeler une mise à l'échelle de la taille du papier et la région de détourage sur le dc. La méthode de dessin d'objets surfaciques remplis ne combine pas sa propre opération de découpe avec le découpage de page. Comment faire une opération ET entre le clip de coupe de page et les autres (les trous de découpe doivent être OU liés les uns aux autres).Comment faire fonctionner ET entre une principale et d'autres régions de découpage?

La méthode de dessin d'objet FilledArea (seulement les lignes spécifiques de découpage):

... 
try 
    if (fHoles^.getCount > 0) then 
    begin 
    // Get a copy of the page clipping rgn 
    getClipRgn(dc, rgnPrev); 
    for i := 0 to fHoles^.getCount-1 do 
    begin 
     ... 
     // create a rgn to the Xth hole 
     rgn := createPolygonRgn(rgnPts^, rgnPtsCount, ALTERNATE); 
     if (rgn <> 0) then 
     begin 
     // combine the Xth rgn with the active rgn (OR because there could be many holes in a single filled area) 
     extSelectClipRgn(dc, rgn, RGN_DIFF); 
     // releases the Xth rgn 
     deleteObject(rgn); 
     end; 
     ... 
    end; 
    end; 
    // draw the polygon 
finally 
    if (fHoles^.getCount > 0) then 
    begin 
    // selects a copy of the page cutting rgn copy 
    selectClipRgn(dc, rgnPrev); 
    // releases the copy of the page cutting rgn 
    deleteObject(rgnPrev); 
    end; 
end; 

Le code de dessin zone de découpage aperçu avant impression:

// Creates a page clipping rgn 
rcRegion := createRectRgn(rcDevLeft_, rcDevTop_, rcDevRight_ + 2, rcDevBottom_ + 2); 
try 
    // Selects a copy of the page clipping rgn 
    selectClipRgn(dc_, rcRegion); 
    ... 
    // draw the page contents 
    ... 
finally 
    // Selects an empty clipping rgn 
    selectClipRgn(dc_, 0); 
    // Releases the created page clipping rgn 
    deleteObject(rcRegion); 
end; 

Un écran temps de conception tiré d'une zone remplie de deux trous: enter image description here

Un écran d'aperçu avant impression du même design (les lignes de contour décalées sont sign La zone de coupe de la page est ignorée, le contenu est dessiné deux fois en raison des deux pages) enter image description here

+0

Ceci est incompréhensible. –

+0

@SertacAkyuz Qu'est-ce que vous ne comprenez pas? –

+0

Qu'est-ce que vous faites. Un graphique de démonstration pourrait être bien. Ensuite, vous pourriez encore avoir besoin d'un [MCVE]. –

Répondre

0

OK. Je l'ai trouvé. Je devrais utiliser l'appel d'API de combiner de WinRgn pour définir les opérations de Boole entre les deux régions entrantes.