Domanda

Io sono il rendering del testo in Direct2D/DirectWrite, ma la chiamata di SetLineSpacing() su entrambi i TextFormat o TextLayout sembra non avere effetto.Qualcuno sa perché?

È stato utile?

Soluzione

Sono sicuro al 99% che si tratta di un bug. Ho fatto un po 'di giocare con Direct2D ultimamente e anche avuto un problema con il SetLineSpacing() TextLayout, credo che sia lo stesso di quello che si descrivono, in quel caso posso confermare che non è solo per te. Riaprire il bug report su MS Connect, è stato chiuso.

Altri suggerimenti

ho anche lo stesso problema, come ha detto Dmitri Nesteruk.

Tuttavia, scopro che se si imposta l'interlinea "dopo CreateTextLayout", SetLineSpacing non può funzionare.

In caso contrario, se si imposta l'interlinea prima CreateTextLayout, si può lavorare ora.

Forse si può provare questo soluton.

PS: La mia env. è in Window Vista SP2.

Molte grazie.

Purtroppo non fornisci il codice che mostra quello che stai cercando di fare. Sto assumendo che si sta cercando di impostare l'interlinea in questo modo:

pTextLayout->SetLineSpacing(DWRITE_LINE_SPACING_METHOD_DEFAULT, lineSpacing, baseline);

La documentazione su MSDN non è molto chiaro circa i diversi metodi di interlinea. Il metodo predefinito determina la spaziatura per ogni linea da derivare dal font e linea oggetti usati, se presente, quindi ogni linea è l'altezza che deve essere secondo il suo contenuto. In questo caso, i due parametri, lineSpacing e baseline, vengono ignorate.

Se si dispone di un formato di testo che utilizza un singolo carattere (e la dimensione del carattere) e non oggetti in linea (o gli oggetti in linea che non sono superiori al testo), è possibile specificare l'interlinea uniforme. Questo è ciò che la DWRITE_LINE_SPACING_METHOD_UNIFORM è per. Ho appena provato e SetLineSpacing() chiamare con questo metodo risultati in linea uniforme distanziali in base agli argomenti passati.

A partire da Windows 10, v'è un metodo interlinea terza linea, DWRITE_LINE_SPACING_METHOD_PROPORTIONAL, che può essere usato per ottenere l'interlinea che è relativo a ciò che le dimensioni dei caratteri e oggetti in linea specificano. Tuttavia, questo è supportato solo su Windows 10.

La parte più fuorviante, nella mia esperienza, è che chiamando SetLineSpacing(DWRITE_LINE_SPACING_METHOD_DEFAULT, x, y) riesce senza un errore e il recupero dei parametri di interlinea in seguito, utilizzando il metodo GetLineSpacing(), restituisce i valori che sono stati forniti (mentre loro continuano a non ottenere nulla) . L'API è internamente consistente in questo senso, non scartando i valori specificati anche se non realizzano nulla utile. Inoltre, quando si chiama GetLineSpacing() su un IDWriteTextFormat o IDWriteTextLayout esempio appena creato, i valori vengono restituiti come zero (che è corretto poiché il metodo interlinea è DWRITE_LINE_SPACING_METHOD_DEFAULT). Al fine di essere in grado di fare qualcosa di utile, è necessario determinare l'interlinea di default per il tipo di carattere che si sta utilizzando. È possibile raggiungere questo chiamando IDWriteFont::GetMetrics() sul tipo di carattere che si sta utilizzando. L'interlinea predefinita è la somma dei valori ascent, descent e lineGap.

Charles Petzold ha scritto su questo in un articolo su Impaginazione Con DirectWrite .

mi sto perdendo qualcosa?

IDWriteTextFormat IDWriteTextLayout ha una funzione SetLineHeight ...

Hai controllato il HRESULT codice di errore restituito da SetLineSpacing()?

Suggerimento:Se si utilizza Visual Studio tipo eax,hr in uno di debug Orologio di windows per vedere eventuali errori di codice subito dopo la chiamata.

Fonte

minimo supportato dal client:Windows 7, Windows Vista SP2 e Aggiornamento della Piattaforma per Windows Vista.

Non si esegue una qualsiasi delle sopra indicate versioni di windows?Credo che il motivo per cui non vengono visualizzati eventuali modifiche perché qualsiasi versione di sotto di quelli di stati di cui sopra, non SetLineSpacing() in DirectWrite.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top