Problemi con l'utilizzo delle modalità Penne GDI Win32 non supportate?
Domanda
La MSDN documentazione è (in qualche modo ) chiarire i seguenti due fatti sulle penne GDI:
-
Una penna cosmetica (creata tramite CreatePen o ExtCreatePen con PS_COSMETIC) deve essere larga 1 unità (beh, < = 1, ma non andiamo lì).
Una penna geometrica (ExtCreatePen w / PS_GEOMETRIC) deve essere solida (solo PS_SOLID, no PS_DASH, ecc.). Possono, tuttavia, tracciare linee più grasse.Questo è chiaramente documentato nel link che ho messo sopra come solo una restrizione 9x (sono stupido). A mia difesa, i commenti (cattivi) e la logica (rotta) nel mio codice mi hanno portato a credere diversamente. Alcuni altri articoli su Google devono essere stati scritti con il supporto solo di Windows 9x.
Perché posso annullare queste regole e fare in modo che GDI disegni con queste penne?
Posso creare penne cosmetiche grosse (larghezza = 10, ad esempio) e tratteggiate. Cavolo, posso creare una grossa penna geometrica tratteggiata!
Queste penne sembrano funzionare bene di solito . L'unico problema che ho visto è in Polilinea quando passo grandi matrici di punti - rende le linee molto lentamente. Tuttavia, Polyline agisce in modo strano con grandi array in generale - semplicemente agisce in modo diverso con le penne cattive . (i miei altri problemi con la polilinea potrebbero essere un'altra domanda ...)
È mai sicuro usare penne cosmetiche larghe o wide Geometric con motivi?
Soluzione
In generale dovresti aderire all'API documentata, altrimenti rischi di affidarti al comportamento specifico della versione del sistema operativo.
Le restrizioni ExtCreatePen
che descrivi (es. no PS_DASH
con PS_GEOMETRIC
) si applicano solo a Win9x, non a WinNT, quindi su NT / 2000 / XP la tua " grasso, penna geometrica tratteggiata quot; non dovrebbe essere un problema. Si noti inoltre che Polyline
presenta alcune limitazioni su Win9x.
Se vuoi linee tratteggiate, ti suggerirei di utilizzare PS_USERSTYLE
in modo da controllare la lunghezza dei trattini e degli spazi vuoti, piuttosto che fare affidamento su qualsiasi valore predefinito <=>.