Newsgroup: it.comp.programmare.win32
Titolo: Renderizzare testo RTF...

Ciao a tutti!
Ho dei problemi nel disegnare il contenuto di un controllo RTF in un DC.
Ecco il mio codice.
FORMATRANGE fr;
fr.hdc = pDC->m_hDC;
fr.hdcTarget = pDC->m_hAttribDC;
fr.chrg.cpMax = -1;
fr.chrg.cpMin = 0;
fr.rc = textBlockRect;
fr.rcPage = textPageRect;
m_richedit.FormatRange(&fr, TRUE);
m_richedit.FormatRange(NULL, FALSE);
Dove pDC è un comune CPaintDC ricevuto da CView::OnDraw, textBlockRect è il
rettangolo contenente le coordinate del rettangolo dove disegnare e
textPageRect contiene le dimensioni della pagina.
I sintomi: il testo viene disegnato ma spostato di alcuni pixel. Potete
vedere un esempio all'indirizzo 
http://zip.to/kojak/mathesis1.gif
 . La
scritta rossa dovrebbe essere nel rettangolo rosso, la verde nel verde, etc.
La cosa strana è che il numero di pixel di cui sono spostate le scritte
rispetto ai rettangoli che dovrebbero circondarle non è costante! Aumenta
man mano che la posizione x/y aumenta.
E' davvero un enigma, ci ho perso su un sacco di tempo e non sono riuscito a
cavarci niente. Può darsi che il problema sia causato da un'errata
conversione delle coordinate da logiche a TWIPS... io uso questa formula:
 textBlockRect = blockRect.MulDiv(1440, 76);
 textPageRect  = pageRect.MulDiv(1440, 76);
Sinceramente non ricordo dove l'ho trovata ma mi sembrava corretta,
all'epoca ;-)
Se avete anche solo del codice funzionante passatemelo che poi me lo studio
io!!!
Grazie in anticipo!
--
Kojak
vrke...@hotmail.com
http://zip.to/kojak
Life would be much easier if I had the source code.

Scusate, l'indirizzo corretto dell'immagine č
http://spazioweb.inwind.it/kojak/mathesis1.gif
 .


  textPageRect  = pageRect.MulDiv(1440, 76);
Che io sappia, l'unità di misura dei twip varia in base alla risoluzione 
dello schermo. Non mi piacciono quelle costanti

 dello schermo. Non mi piacciono quelle costanti
Hai ragione. Ecco il mio codice riveduto, corretto e QUASI funzionante :)
void CTextBlock::Draw(CDC * pDC, const CRect& pageRect)
{
 CRect blockRect(m_rect.left + pageRect.left, m_rect.top + pageRect.top,
  m_rect.right + pageRect.left, m_rect.bottom + pageRect.top);
 blockRect.NormalizeRect();
 // Convert logical -> device
 CRect physBlockRect(blockRect);
 CRect physPageRect(pageRect);
 pDC->LPtoDP(physBlockRect);
 pDC->LPtoDP(physPageRect);
 // Convert device -> twips
 CRect twipsBlockRect(physBlockRect);
 CRect twipsPageRect(physPageRect);
 pDC->SaveDC();
 pDC->SetMapMode(MM_TWIPS);
 pDC->DPtoLP(twipsBlockRect);
 pDC->DPtoLP(twipsPageRect);
 pDC->RestoreDC(-1);
 pDC->SaveDC();
 // offset by printing offset
 pDC->SetViewportOrg(physBlockRect.left, physBlockRect.top);
 pDC->SetMapMode(MM_TEXT);
 twipsBlockRect.bottom = abs(twipsBlockRect.bottom - twipsBlockRect.top);
 twipsBlockRect.right = abs(twipsBlockRect.right - twipsBlockRect.left);
 twipsBlockRect.top = 0;
 twipsBlockRect.left = 0;
 // adjust DC because richedit doesn't do things like MFC
 if (::GetDeviceCaps(pDC->m_hDC, TECHNOLOGY) != DT_METAFILE &&
pDC->m_hAttribDC != NULL)
 {
  ::ScaleWindowExtEx(pDC->m_hDC,
   ::GetDeviceCaps(pDC->m_hDC, LOGPIXELSX),
   ::GetDeviceCaps(pDC->m_hAttribDC, LOGPIXELSX),
   ::GetDeviceCaps(pDC->m_hDC, LOGPIXELSY),
   ::GetDeviceCaps(pDC->m_hAttribDC, LOGPIXELSY), NULL);
 }
 // Output
 FORMATRANGE fr;
 fr.hdc = pDC->m_hDC;
 fr.hdcTarget = pDC->m_hAttribDC;
 fr.chrg.cpMax = -1;
 fr.chrg.cpMin = 0;
 fr.rc = twipsBlockRect;
 fr.rcPage = twipsPageRect;
 m_richedit.FormatRange(NULL, FALSE);
 m_richedit.FormatRange(&fr, TRUE);
 m_richedit.FormatRange(NULL, FALSE);
 pDC->RestoreDC(-1);
 // Bounding rectangle...
 CPen * pOldPen = (CPen *) pDC->SelectObject(&m_borderPen);
 CBrush * pOldBrush = (CBrush *) pDC->SelectObject(&Preferences.nullBrush);
 if (m_border)
  pDC->Rectangle(blockRect);
 pDC->SelectObject(pOldPen);
 pDC->SelectObject(pOldBrush);
}
Ho spulciato il codice di MFC per l'anteprima di stampa di CRichEditView e
questo codice adesso funziona bene quando sono in anteprima di
stampa/stampa. Non va invece quando visualizzo la view su schermo. Le
posizioni x/y sono corrette, ma cambiano le dimensioni dei blocchi. Ho
aggiornato l'immagine all'indirizzo
http://spazioweb.inwind.it/kojak/mathesis1.gif
 e
http://spazioweb.inwind.it/kojak/mathesis2.gif
 .
Grazie a tutti quelli che hanno letto questo messaggio!
