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;
}