Domanda

Stiamo sviluppando un'applicazione dalla pelle con vari spigoli arrotondati sulla maggior parte delle sue finestre. Sto usando regioni finestra per definire le forme non rettangolari, ma quasi tutti gli oggetti alla aliasing frastagliato questo provoca, perché i pixel possono solo essere completamente opaco o completamente trasparenti.

Sono venuta in mente una soluzione a questo utilizzando finestre sovrapposte, ma vogliamo per assicurarsi che questo verrà eseguito (e, si spera funzionare bene) su una varietà di sistemi, e voglio vedere se qualcuno ha qualche idea migliore, o modi per ottimizzare quello che sto facendo. So finestre sovrapposte richiede Win2000 o poi, e questo è bene, dato che questo è già un requisito per altri motivi. Da alcuni test di base sembra ok su Vista, ma che è ancora alcuna garanzia.

Ecco quello che faccio: ho una finestra, lo chiamano A, con i comandi e il testo e tutto ciò che comprende quella finestra. Ho finestra B come figlio di finestra A, eccetto che ha lo stile WS_POPUP invece di WS_CHILD, in modo che possa posizionarsi al di fuori regione di A e viene disegnato sulla parte superiore di controlli di A. Finestra B ha anche lo stile WS_EX_LAYERED, e l'inizializzazione, io chiamo UpdateLayeredWindow con la bandiera ULW_ALPHA e una sorgente di corrente continua con una bitmap 32 bit con un canale alfa, per farlo disegnare con per-pixel alpha.

La bitmap utilizzato nella sorgente DC per finestra B è praticamente solo i pixel intorno al bordo della finestra che voglio fondono dolcemente da sfondo della finestra in piena trasparenza. Vorrei saltare l'intero approccio due finestra e basta usare una singola finestra a più livelli, tranne che quando si sta utilizzando UpdateLayeredWindow, che è tratto da un buffer di tenuta in memoria, al posto dei messaggi tipici WM_PAINT e tutto il resto, e cercando di ottenere controlli figlio interattivi (e finestre figlio) per lavorare bene con che suona come un notevole fastidio (e probabilmente non sarebbe nemmeno lavorare per tutto).

Quindi, è fondamentalmente finestra A con tutti i controlli figlio e quant'altro, con finestra B galleggiante direttamente su di esso, disegnando un bel bordo liscio. Mi rispondere ai WM_MOVE messaggi e così via spostando finestra B con esso, e ho finestra B disabilitato in modo che possa mai ottenere messa a fuoco o di ingresso (clic già passare attraverso, in quanto parti di esso che sono di opacità pari a zero, come la maggior parte delle sue parti interne, già sono esclusi dalla raccolta).

Per i calci, ecco cosa i pezzi sembrano, per mostrare quello che voglio dire un po 'meglio.

Quindi, funziona, ma non può essere certo che sia davvero il modo migliore per farlo. Ho due domande:

  • Questo suona accettabili, o c'è qualcosa di palesemente terribili su di esso?
  • Come funziona attualmente, sembra come se fosse con un off-screen tamponare la dimensione della finestra (che può essere fino a 1024x768), anche se molto pochi pixel di essa hanno tutti i dati l'opacità non-zero - sarebbe pena l'overhead e complessità aggiuntiva di tagliarlo in pezzi separati e confine composizione insieme?
È stato utile?

Soluzione

Il mio prodotto utilizza finestre sovrapposte per disegnare le piccole schede che attribuiamo a ogni finestra. Ho usato finestre sovrapposte per ottenere l'arrotondamento liscia senza aliasing. L'unico brutto problema che ho incontrato finora è che alcune finestre OpenGL scarabocchiare sulla cima di finestre sovrapposte su Windows XP e Vista senza DWM. Il suo un problema di basso livello e Microsoft non è stato terribilmente utile. È possibile riprodurre mediante l'apertura di Google Earth e trascinando l'applicazione sopra la finestra di rendering principale, la vostra finestra a più livelli scomparirà.

Altri suggerimenti

ho scoperto una cosa: avere pezzi di cornice separati può rendere significativamente più veloce di avere una sola finestra cornice gigante, con una grande distesa di pixel vuoto al centro. Non ho alcun numero effettivo, ma solo da un test rapido di provare entrambi, c'era una latenza evidente quando diverse finestre con finestre full frame sovrapposti l'un l'altro, ma quando i loro telai sono stati tagliati fino in componenti più piccoli, è stato molto stizzoso . Qualunque sia la testa di avere più finestre sovrapposte con i propri contesti di periferica non contribuisce molto, e avere grandi distese di pixel (vuoti o no!) Contribuisce ancora molto carico.

  1. Non dimenticare di testare sotto RDP e VM (Hyper-V e VMWare)
  2. Prova diverse carte GFX e sui netbook e laptop (se applicabile).
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top