[ Mirko Rajkovača @ 27.03.2007. 18:33 ] @
Kako mogu unapred da odredim dimenzije nekog rtf dokumenta u pixelima (ili nekim drugim jedinicama)? Tj. kako mogu da odredim gde je kraj jedne strane rtf-a i pocetak druge samo na osnovu rtf fajla i dimenzija papira na kojem se stampa?
Svaka ideja je dobrodosla
(izvinjavam se ako je tema off topic ali programiram u C++ pa sam je tu stavio)

Hvala unapred
[ X Files @ 28.03.2007. 08:52 ] @
Ne znam šta konkretno želiš da postigneš, ali možda ti ovaj kod pomogne. Kod je za BCB, a kako
se radi o API-jima, verovatno se može modifikovati i za druge kompajlere.

Koristim ga za određivanje širine i visine RichEdit prozora za prikaz prevoda u Di rečniku. To je neki
isečak koji sam uspeo da izolujem iz ostatka koda. Takođe, iz iskustva znam da sistemski DPI ima
strahovotog uticaja na celu ovu priču...

Dalje, svakako pretresi sajt Robert Dunn-a, koji je jedan od ljudi specijalizovanih za manipulacijom
RichText-om:
http://home.att.net/~robertdunn/Yacs.html
Ima dosta primaera, FAQ, i sl...

I konačno, šta fali nekom alatu za Reporting tipa QR, Rave reports, Cristalreports, itd?


Code:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   POINTL pt;
   int line_idx, line_len;
   int width = 0;
   int height = 0;

   int char_height;
   CHARFORMAT fmt;
   CHARRANGE cr;

   // twips->pixels
   HDC hdc = GetDC( RichEdit1->Handle);
   int LogicalPixelsY = GetDeviceCaps( hdc, LOGPIXELSY );
   ReleaseDC( RichEdit1->Handle, hdc );

   int RichEditLines = RichEdit1->Lines->Count;

   for ( int i=0; i<RichEditLines; i++ )
   {
      line_idx = RichEdit1->Perform( EM_LINEINDEX, i, 0 );
      line_len = RichEdit1->Perform( EM_LINELENGTH, line_idx, 0 );

      RichEdit1->Perform( EM_POSFROMCHAR, (WPARAM)&pt,  line_idx+line_len );
      if ( width < pt.x )
         width = pt.x;
   }

   for( int x=0; x<line_len; ++x )
   {
      memset( &fmt, 0, sizeof( fmt ) );
      fmt.cbSize = sizeof( fmt );
      fmt.dwMask = CFM_SIZE;

      cr.cpMin = ( line_idx + x );
      cr.cpMax = ( cr.cpMin + 1 );

      RichEdit1->Perform( EM_EXSETSEL, 0, (int)&cr );
      RichEdit1->Perform( EM_GETCHARFORMAT, SCF_SELECTION,(int)&fmt );
      RichEdit1->Perform( EM_POSFROMCHAR, (int)&pt,cr.cpMin );

      char_height = MulDiv( fmt.yHeight / 20, LogicalPixelsY, 72 );

      if ( height < ( pt.y + char_height ) )
         height = ( pt.y + char_height );
   }


   int MAGIC_NUMBER_FOR_HEIGHT = 6;
   int MAGIC_NUMBER_FOR_WIDTH = 6;

   RichEdit1->Height = height + MAGIC_NUMBER_FOR_HEIGHT;
   RichEdit1->Width = width + MAGIC_NUMBER_FOR_WIDTH;
}

[ Mirko Rajkovača @ 30.03.2007. 09:36 ] @
Hvala XFiles ovo mi je trebalo, samo mi jos jedna stvar nije jasna

Code:
char_height = MulDiv( fmt.yHeight / 20, LogicalPixelsY, 72 );

Sta pretstavljaju konstante 20 i 72?

Sto se tice pitanja sto ne koristim QReport ili nesto sl. - doradjujem neki postojeci engine koji koristi RTF stampu pa odatle i ovo.

Hvala jos jednom
[ X Files @ 30.03.2007. 10:55 ] @
Citat:

Code:

char_height = MulDiv( fmt.yHeight / 20, LogicalPixelsY, 72 );

Sta pretstavljaju konstante 20 i 72?


Deljenje sa 20 konvertuje twips-e u points-e, a onda se koristi MulDiv() da konvertuje points-e u pixel-e.

Uostalom, pogledaj kako se uopšte došlo do tog rešenja:
http://tinyurl.com/37h6nc