RICHEDIT使用問題?(100分)

  • 主题发起人 主题发起人 mala_hong
  • 开始时间 开始时间
M

mala_hong

Unregistered / Unconfirmed
GUEST, unregistred user!
如何根據richedit讀入的文件如rtf文件格式來控制richedit的height值?
 
rtf 有多种字体啊,怎么可能这么简单?
如果是普通文本还比较容易,先判断每一行的高度,
用行数乘以高度就得到 richedit 的高度,但是还要
判断是否超过 屏幕的高度 screen.height
 
如果一定要進行多字體控制, 有辦法解決嗎? 如果超過Screen.height又怎樣呢?
 
还有点小问题,文本不能小于2行。你再完善一下吧。
procedure TForm1.Button2Click(Sender: TObject);
var
sInfo : tagSCROLLINFO;
begin
sInfo.cbSize := SizeOf(TScrollInfo);
sInfo.fMask := SIF_RANGE;
RichEdit1.Height := 0;
GetScrollInfo(Richedit1.Handle, SB_VERT, sInfo);
RichEdit1.Height := sInfo.nMax + RichEdit1.Font.Size;
end;
 
//如果一定要進行多字體控制, 有辦法解決嗎?
那只有分析 rtf 文件格式了,分析没一行最高的字体的高度,
剩下的类似前面说的了

//如果超過Screen.height又怎樣呢?
那就看不到多余的部分了啊
 
unreal好, 好像不大對勁, 出來的height值遠遠大于實際值.sInfo.nmax值是什么? 值太大.
對于tagSCROLLINFO你能給我詳解嗎? 或再給我詳細一點好嗎? 我看的不是很懂!!
beta好, 可以告訴我怎樣控制每一行的字體高度嗎?



 
我说过文本不能小于2行!
sInfo.nmax是滚动条的高度。这个方法要比去判断文本的高度方便的多。
因为无论怎样,滚动条的高度是和文本的高度一样的。
 
謝謝unreal, 終于可以了, 太謝謝你了, 再麻煩一下, 是否可以知道每一行
字體的height值?待會給你加分!!!!
 
//怎樣控制每一行的字體高度
不是控制,是分析,需要分析rtf源文件,前提是你了解 rtf 文件格式
比如 {/f2/fs20/b program}
表明 用的 f2 字体(font table中定义的),字体大小10号,粗体 显示 program
然后到 font table 中找到:{/fonttbl...{/f2/fmodern Courier New;}}
说明 program 用的 Courier New 字体,字号10,这样你就可以判断他的高度了
麻烦吧,已知字符串极其字体信息,要判断高度还需要另行处理
 
謝謝beta, 不過我真的對rtf文件格式, 你能給我一舉簡單的例子來說明嗎, 不甚感激!!!
 
如果没有单独提取某一行的高度的需要,用unreal的方法比较简单
当然如果一定要单独提取某一行的高度,恐怕就需要分析 rtf 文件了
如果你有那个耐心我可以慢慢给你讲。
我现在上 bbs 很慢,可以在 oicq 上交流,
unreal, mala_hong 方便的话留下你们的 oicq 号码
我的:442248
 
beta, 不好意思, 我們公司用的是DDN專線上網, 我沒有帳號, 故沒有QQ, 能給我e_mail嗎?
是這樣的, 我公司要我做一個屏保, 要將在word編輯的格式不變在屏保中顯示出來, 在朋友
你們的幫助下, 大部分已完成, 只是文本的滾動是靠timer來控制,故最好知道, 每一行文本
高度, 讓滾動的是一行行的文字,而不是TOP+常量不規則滾動. 還有更好的幫法嗎?

 
不早说,那就简单了,不需要判断每一行的高度,直接在 ontimer 里面加入:
SendMessage(RichEdit1.Handle, EM_LINESCROLL, 0, 1);
就可以了,每次滚动一行,richedit 自己判断行高度
 
应该没有问题了吧
 
不好意思, 可能是讀rtf文本確定的richedit高度原因, 只閃不滾, 還有我是通過整個
richedit從底到頂循環滾動的(像電影字幕一行行從底部出現一直到頂消失后循環),
SendMessage(RichEdit1.Handle, EM_LINESCROLL, 0, 1);而是在richedit內滾動,
能實現我上面所說的功能嗎, 能發送消息讀到richedit的跳動的高度嗎? 或更好的辦法?

 
//只閃不滾?
不会吧,我的richedit滚的很好啊,是不是只有一页,所以滚不动?
//像電影字幕一行行從底部出現一直到頂消失后循環
那就现在前面加一页的空行然后开始滚动不就行了?

再试一试吧
 
beta好, 怎樣指定richedit當前行?
 
比如你要指定到第10行:
richedit1.SelStart := richedit1.Perform(EM_LINEINDEX, 10 - 1, 0);
就可以了
 
beta好, 最后一個問題, 怎樣讓循環滾動?
 
滚动到最后一行了过后,再翻到第一行啊。
至于判断最后一行,可以在 ontimer 时候累加一个变量,
当这个变量达到 richedit1.lines.count 的时候说明
到达了最后一行,你就翻到第一行就可以了。
 
后退
顶部