用下述方法将RICHEDIT的内容存入IMAGE时,如何确定IMAGE的尺寸?(可能值500分)(300分)

L

littley

Unregistered / Unconfirmed
GUEST, unregistred user!
我根据论坛上的帖子,采用以下方法将RICHEDIT的内容存到IMAGE中,最终目的是得到BMP图形。
既richedit-->bmp的问题。
原文作者说,只要IMAGE的尺寸合适,可得到整个RICHEDIT的内容,我的问题就是,如何确定
这个IMAGE的尺寸,使得其能存下RICHEDIT的所有内容?

或者:下述方法得到的图形与RICHEDIT中的显示格式又出入(特别是在RICHEDIT中有大段的文字
时尤为明显),如果诸位大侠有更好的将RICHEDIT中内容转化为BMP的方法(完全所见所得)
可得这300分外,我愿意再送200分。我试过抓图(抓当前显示的部分内容),剩下部分如何
滚动到一个合适的位置,一直让我头痛,因为有可能有最后一行字只有上半部分显示再RICHEDIT上

///////////////////////////////
附:我上文所说的RICHEDIT-->BMP的方法
uses RichEdit;

procedure TForm1.Button1Click(Sender: TObject);
var
Range: TFormatRange;
LastChar, MaxLen, LogX, LogY: Integer;
begin
FillChar(Range, SizeOf(TFormatRange), 0);
with Image1, Range do
begin
LogX := GetDeviceCaps(Canvas.Handle, LOGPIXELSX);
LogY := GetDeviceCaps(Canvas.Handle, LOGPIXELSY);
hdc := Canvas.Handle;
hdcTarget := hdc;
rc.right := Image1.ClientWidth * 1440 div LogX;
rc.bottom := Image1.ClientHeight * 1440 div LogY;
rcPage := rc;
LastChar := 0;
MaxLen := GetTextLen;
chrg.cpMax := -1;
repeat
chrg.cpMin := LastChar;
LastChar := SendMessage(RichEdit1.Handle, EM_FORMATRANGE, 1,
Longint(@Range));
until (LastChar >= MaxLen) or (LastChar = -1);
end;
SendMessage(RichEdit1.Handle, EM_FORMATRANGE, 0, 0);
Image1.Refresh;
end;

 
请试一下这样子,
bmp:=Tbitmap.create;
bmp.canvas.textout('从richedit中取出来的文字');
如果有不同字体什么的,就先得到字体,
然后用
bmp.canvas.font...
等办法,我没有试过,只是个想法;
还有就是在电脑报上看到一个利用Tmetailfile(可能没有写对)来打印的一个
例子,晚上找一下,看能不能找到。
 
谢谢各位热心的大侠!确定IMAGE长度的方法我自己找到了,因此这300分我决定分给解决
下述问题的人:
1、我现在认定我前述RICHEDIT-->BMP的方法得到的BMP与RICHEDIT的显示格式不完全对应的
原因是RICHEDIT的左右缩进造成的。
我设置 richedit1.leftindent:=0
richedit1.leftindent:=-5
均不能使richedit的左缩进真正为0,在RICHEDIT的每一行文字左边总空着几个象素,而我上面
RICHEDIT--》BMP的方法得到的BMP会把RICHEDIT左右缩进的象素去掉,造成BMP一行能显示的文字
有时比RICHEDIT多,也就是得到的BMP和RICHEDIT的显示格式不一一对应。
/////////////
使richedit 的左右缩进真正为0,既每行第一个文字紧贴着RICHEDIT的左边界,不能有任何
多余的象素 (可得这300分)
//////

2、或者解决下述问题也可:
RICHEDIT中所有内容转化为BMP的方法(完全所见所得)
可得500分 (这300+我另开一个200分得帖子)
 
确定IMAGE长度的方法?
能贴出来吗?
我用了你的源码得到的Image高度不变化!
我试过各种字体和格式,还没发现问题。
 
linsb:非常感谢你!在我的帖子里你都给出了很好的意见。我已经为你预留了至少50分了。
我确定image1.height的方法其实很笨拙,因为我的最终客户只使用几种大小的字体,因此
我的方法类似于

image1.height:=richedit1.lines.count * MAX_FONT_SIZE

有时非常浪费,但能确保能存下所有richedit 的内容
 
确实浪费很大,可遍历各行取得每行的MAX_FONT_SIZE,麻烦点但值得。
 
建议:用TRxRICHEDIT代替TRICHEDIT。
 
我用的就是rxRichedit,我以为在处理leftindent,paragh.linespace时是一样的,就随手
写的richedit.
 
这个问题我放弃了,
解决了http://www.delphibbs.com/delphibbs/DispQ.asp?LID=1117324
问题的人将得到这300分,另有一个帖子的200分我已经准备给linsb了
 
多人接受答案了。
 
顶部