求教:如何将RichTextBox的内容保存为bmp文件

时间:2021-10-21 11:51:40
如何将RichTextBox的内容保存为bmp文件,请注意不是RichText。请大家多多关注

31 个解决方案

#1


RichTextBox???
这是什么?

#2


是一个ocx控件,可以存放RTF可是的东西。
我的问题还是换个问法:如何将RTF格式转为bmp格式

#3


通过内存stream不知道可不可以?
先存到内存中
然后再存成bmp
如果rtf可以直接saveas("...bmp")就好了

#4


er...

可以把那部分的屏幕截取出来,
再用bmp保存

#5


可不可以在form上对应该richtextbox的位置new一个paintbox,然后CopyRect,save就方便了。
我上次在自己的程序中的form上new了一个paintbox,设置好parent,然后就可以
截取该部分的图像了。

我没有试一下你的这个行不行 :)

#6


就是

#7


比较简单的方法:
    用CopyRect拷贝出rtf文件在Form上的坐标区间,再save成bmp.
同意二楼上。

玉笛书生

#8


大家都说用拷贝屏幕的方法,但是如果richtextbox有滚动条,那看不见的下半部分岂不是丢失了吗?

#9


garypeng(),能否贴上你的源程序?

#10


记不太清楚了,好像是
p = new TPaintBox(Form1);
p->Parent = Form1;
p->Left = ?
....
如果要保存其他部分,是否能试一下建一个内存中的bitmap,然后将richtext
输出到该bitmap上?

#11


是的,RichEdit1可以向打印机输出完整的内容,为什么不能完整地向画布Canvas输出呢?
关注!

#12


屏幕拷图的方式我也试过,滑动滚动条太麻烦了,
有没有办法一次就能生成.bmp,可行性还是有的,
因为RichEdit1->Print()是把整个图像输出到
打印机,为什么就不能顺便保存到文件呢?
继续关注!


#13


有没有这样的虚拟打印机驱动程序:却把打印机的结果 送入一个图像文件中,如.bmp中

#14


如何模拟鼠标滑动滚动条?

#15


这个滑动方法的生bmp的程序,我2年前试过,要找一找;
整个程序又长又难理解,不满意,也寻求更好更简单的办法

#16


找到了,我的程序不是滑动RichEdit,而是滑动它的容器ScrollBox1,
不完美.

#17


我的上面程序还有一个缺陷,必须先确定图像的长宽大小,太大了会空出好多,
太小则会切掉一部分;
我也想知道更好的方法!

#18


能否发给我?email adress:hjl2000@163.net

#19


干脆就贴出来了:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
      static int x1m=2048,y1m=2048;    //最大范围

      static int x0s=0,y0s=0,x1s=2000,y1s=2000;  //选定范围

      RichEdit1->Align=alNone;   //将RichEdit扩展开
      RichEdit1->Height=y1m;
      RichEdit1->Width=x1m;
      RichEdit1->HideScrollBars=True;
      RichEdit1->ScrollBars=ssNone;
      RichEdit1->Refresh();      // 立即改变属性

      int xi=ScrollBox1->ClientWidth;   //滚动步长
      int yi=ScrollBox1->ClientHeight;

      ScrollBox1->HorzScrollBar->Range=x1s+xi;
      ScrollBox1->VertScrollBar->Range=y1s+yi;
 
      int SB_x0=ScrollBox1->ClientOrigin.x-ClientOrigin.x;
      int SB_y0=ScrollBox1->ClientOrigin.y-ClientOrigin.y;
          // 滚动窗口左上角坐标

      Graphics::TBitmap *bitmap=new Graphics::TBitmap();
      bitmap->Width=x1s-x0s;
      bitmap->Height=y1s-y0s;

      int Lx0=ScrollBox1->HorzScrollBar->Position;
      int Ly0=ScrollBox1->VertScrollBar->Position;

      for (int y=y0s;y<=y1s;y+=yi)
          {
             int h=min(y+yi,y1s);
             ScrollBox1->VertScrollBar->Position=y;
             for (int x=x0s;x<=x1s;x+=xi)
                {
                  int w=min(x+xi,x1s);
                  ScrollBox1->HorzScrollBar->Position=x;
                  Application->ProcessMessages();
                  bitmap->Canvas->CopyRect(
                     Rect(x-x0s,y-y0s,w-x0s,h-y0s),Canvas,
                     Rect(SB_x0,SB_y0,SB_x0+w-x,SB_y0+h-y));
                }
          }
      ScrollBox1->HorzScrollBar->Position=Lx0;
      ScrollBox1->VertScrollBar->Position=Ly0;
      if (SaveDialog1->Execute())
         bitmap->SaveToFile(SaveDialog1->FileName);
      delete bitmap;

      RichEdit1->Align=alClient;
      RichEdit1->HideScrollBars=False;
      RichEdit1->ScrollBars=ssBoth;
      RichEdit1->Refresh(); 
}

#20


BCB(:)),你的办法好像可以,再让我试试

#21


BCB(:)),
你的方法可以,谢谢。另外,可以确定richedit一共有多少页,那就可以确定需要多大的作图区了。如果横向的长度一定,我可以算出面积大小,但是如果横向长度不定,我还不知道如何计算长度。
虽然,这种方法可行,但是我觉得它的效率太低,是否可以通过剪贴板实现,但是在剪贴板中的格式转换问题我不是太明白,你有没有兴趣探讨探讨?

#22


用剪贴板没信心
暂时没有更好的办法

#23


RichTextBox.Copy()后,剪贴板中的格式有以下几种:

        文本(CF_TEXT)
        图片(CF_BITMAP)
        OEM文本
        Unicode文字
        增强型图元文件

从剪贴板中读出CF_BITMAP格式的数据,这个不难吧,保存它为bmp文件,就OK啦。

#24


bgsn,我是要将所有的内容都拷贝出来,不仅仅是CF_BITMAP的内容

#25


RichTextBox.SelectAll();
RichTextBox.Copy();
剪贴板里不就是整个RichTextBox内容的位图了吗?!

#26


hj12000,我想你有一个概念没搞清楚:

  剪贴板里的CF_BITMAP格式数据就是整个RichTextBox内容的图形表示——包括文本 + 嵌入的位图 + 嵌入的ActiveX控件或者ActiveX文档的图形表示。

#27


bgsn(不告诉你),是吗?那么CF_TEXT难道是所有内容的图形表示吗?我想不对吧!
如果我仅仅copy一串字符,那在剪贴板中是不会有CF_BITMAP格式的数据的,你如何解释呢?

#28


  to hjl2000:你错了,即使你只拷贝一串字符,RichTextBox也会同时向剪贴板中写入
CF_TEXT和CF_BITMAP两种格式的数据,不信你用剪贴板查看器看看。

#29


bgsn(不告诉你),你说的不对,我从记事本中copy了一段文字,在剪贴板的浏览器中有四种格式
1.Unknown Clipformat
2.Unknown Clipformat
3.CF_TEXT
4.CF_OEMTEXT
不信,你可以自己试试

#30


记事本用的是普通的EditBox,写字板用的才是RichTextBox

我把事情想的太简单了,RichTextBox的剪贴机制比较复杂,我会继续关注的。

#31


我知道,我用的是RichTextBox。我只是据一个例子。

如果有进展通知我,上面有我的email地址。

#1


RichTextBox???
这是什么?

#2


是一个ocx控件,可以存放RTF可是的东西。
我的问题还是换个问法:如何将RTF格式转为bmp格式

#3


通过内存stream不知道可不可以?
先存到内存中
然后再存成bmp
如果rtf可以直接saveas("...bmp")就好了

#4


er...

可以把那部分的屏幕截取出来,
再用bmp保存

#5


可不可以在form上对应该richtextbox的位置new一个paintbox,然后CopyRect,save就方便了。
我上次在自己的程序中的form上new了一个paintbox,设置好parent,然后就可以
截取该部分的图像了。

我没有试一下你的这个行不行 :)

#6


就是

#7


比较简单的方法:
    用CopyRect拷贝出rtf文件在Form上的坐标区间,再save成bmp.
同意二楼上。

玉笛书生

#8


大家都说用拷贝屏幕的方法,但是如果richtextbox有滚动条,那看不见的下半部分岂不是丢失了吗?

#9


garypeng(),能否贴上你的源程序?

#10


记不太清楚了,好像是
p = new TPaintBox(Form1);
p->Parent = Form1;
p->Left = ?
....
如果要保存其他部分,是否能试一下建一个内存中的bitmap,然后将richtext
输出到该bitmap上?

#11


是的,RichEdit1可以向打印机输出完整的内容,为什么不能完整地向画布Canvas输出呢?
关注!

#12


屏幕拷图的方式我也试过,滑动滚动条太麻烦了,
有没有办法一次就能生成.bmp,可行性还是有的,
因为RichEdit1->Print()是把整个图像输出到
打印机,为什么就不能顺便保存到文件呢?
继续关注!


#13


有没有这样的虚拟打印机驱动程序:却把打印机的结果 送入一个图像文件中,如.bmp中

#14


如何模拟鼠标滑动滚动条?

#15


这个滑动方法的生bmp的程序,我2年前试过,要找一找;
整个程序又长又难理解,不满意,也寻求更好更简单的办法

#16


找到了,我的程序不是滑动RichEdit,而是滑动它的容器ScrollBox1,
不完美.

#17


我的上面程序还有一个缺陷,必须先确定图像的长宽大小,太大了会空出好多,
太小则会切掉一部分;
我也想知道更好的方法!

#18


能否发给我?email adress:hjl2000@163.net

#19


干脆就贴出来了:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
      static int x1m=2048,y1m=2048;    //最大范围

      static int x0s=0,y0s=0,x1s=2000,y1s=2000;  //选定范围

      RichEdit1->Align=alNone;   //将RichEdit扩展开
      RichEdit1->Height=y1m;
      RichEdit1->Width=x1m;
      RichEdit1->HideScrollBars=True;
      RichEdit1->ScrollBars=ssNone;
      RichEdit1->Refresh();      // 立即改变属性

      int xi=ScrollBox1->ClientWidth;   //滚动步长
      int yi=ScrollBox1->ClientHeight;

      ScrollBox1->HorzScrollBar->Range=x1s+xi;
      ScrollBox1->VertScrollBar->Range=y1s+yi;
 
      int SB_x0=ScrollBox1->ClientOrigin.x-ClientOrigin.x;
      int SB_y0=ScrollBox1->ClientOrigin.y-ClientOrigin.y;
          // 滚动窗口左上角坐标

      Graphics::TBitmap *bitmap=new Graphics::TBitmap();
      bitmap->Width=x1s-x0s;
      bitmap->Height=y1s-y0s;

      int Lx0=ScrollBox1->HorzScrollBar->Position;
      int Ly0=ScrollBox1->VertScrollBar->Position;

      for (int y=y0s;y<=y1s;y+=yi)
          {
             int h=min(y+yi,y1s);
             ScrollBox1->VertScrollBar->Position=y;
             for (int x=x0s;x<=x1s;x+=xi)
                {
                  int w=min(x+xi,x1s);
                  ScrollBox1->HorzScrollBar->Position=x;
                  Application->ProcessMessages();
                  bitmap->Canvas->CopyRect(
                     Rect(x-x0s,y-y0s,w-x0s,h-y0s),Canvas,
                     Rect(SB_x0,SB_y0,SB_x0+w-x,SB_y0+h-y));
                }
          }
      ScrollBox1->HorzScrollBar->Position=Lx0;
      ScrollBox1->VertScrollBar->Position=Ly0;
      if (SaveDialog1->Execute())
         bitmap->SaveToFile(SaveDialog1->FileName);
      delete bitmap;

      RichEdit1->Align=alClient;
      RichEdit1->HideScrollBars=False;
      RichEdit1->ScrollBars=ssBoth;
      RichEdit1->Refresh(); 
}

#20


BCB(:)),你的办法好像可以,再让我试试

#21


BCB(:)),
你的方法可以,谢谢。另外,可以确定richedit一共有多少页,那就可以确定需要多大的作图区了。如果横向的长度一定,我可以算出面积大小,但是如果横向长度不定,我还不知道如何计算长度。
虽然,这种方法可行,但是我觉得它的效率太低,是否可以通过剪贴板实现,但是在剪贴板中的格式转换问题我不是太明白,你有没有兴趣探讨探讨?

#22


用剪贴板没信心
暂时没有更好的办法

#23


RichTextBox.Copy()后,剪贴板中的格式有以下几种:

        文本(CF_TEXT)
        图片(CF_BITMAP)
        OEM文本
        Unicode文字
        增强型图元文件

从剪贴板中读出CF_BITMAP格式的数据,这个不难吧,保存它为bmp文件,就OK啦。

#24


bgsn,我是要将所有的内容都拷贝出来,不仅仅是CF_BITMAP的内容

#25


RichTextBox.SelectAll();
RichTextBox.Copy();
剪贴板里不就是整个RichTextBox内容的位图了吗?!

#26


hj12000,我想你有一个概念没搞清楚:

  剪贴板里的CF_BITMAP格式数据就是整个RichTextBox内容的图形表示——包括文本 + 嵌入的位图 + 嵌入的ActiveX控件或者ActiveX文档的图形表示。

#27


bgsn(不告诉你),是吗?那么CF_TEXT难道是所有内容的图形表示吗?我想不对吧!
如果我仅仅copy一串字符,那在剪贴板中是不会有CF_BITMAP格式的数据的,你如何解释呢?

#28


  to hjl2000:你错了,即使你只拷贝一串字符,RichTextBox也会同时向剪贴板中写入
CF_TEXT和CF_BITMAP两种格式的数据,不信你用剪贴板查看器看看。

#29


bgsn(不告诉你),你说的不对,我从记事本中copy了一段文字,在剪贴板的浏览器中有四种格式
1.Unknown Clipformat
2.Unknown Clipformat
3.CF_TEXT
4.CF_OEMTEXT
不信,你可以自己试试

#30


记事本用的是普通的EditBox,写字板用的才是RichTextBox

我把事情想的太简单了,RichTextBox的剪贴机制比较复杂,我会继续关注的。

#31


我知道,我用的是RichTextBox。我只是据一个例子。

如果有进展通知我,上面有我的email地址。