找回密码
 立即注册

QQ登录

只需一步,快速开始

lch922

中级会员

1

主题

13

帖子

906

积分

中级会员

积分
906

活字格认证

最新发帖
lch922
中级会员   /  发表于:2013-4-26 16:42  /   查看:12144  /  回复:18
您好,我目前正在评估TX TextControl ,目前有一个需求没有找到一个合适的解决方案。
我的需求是:将编辑器内的内容生成到一张图片,并且,这张图片只有一行文字。
请问TX TextControl能显示这个功能吗?
生成图片的效果如附件所示。

生成的图片

生成的图片

18 个回复

倒序浏览
lch922
中级会员   /  发表于:2013-4-26 16:45:00
沙发
还有,我设置了一个页面大小之后,能不能获取当前光标所在是第几页呢?
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-4-26 18:17:00
板凳
回复 1楼lch922的帖子

问题一,
请使用以下代码进行测试:

  1. private void Form1_Load(object sender, EventArgs e)
  2.         {
  3.             this.textControl1.Text = "dsafdsafffdsdsfdstextControl1fdf";
  4.         }

  5.         private void changePagesizeToolStripMenuItem_Click(object sender, EventArgs e)
  6.         {
  7.             //TXTextControl.TextControl tx2 = new TXTextControl.TextControl();
  8.             this.textControl1.ViewMode = TXTextControl.ViewMode.PageView;
  9.             this.textControl1.PageMargins = new TXTextControl.PageMargins(0, 0, 0, 0);
  10.             this.textControl1.PageSize = new TXTextControl.PageSize(5000, 20);

  11.             this.textControl1.Text = this.textControl1.Text;


  12.         }

  13.         private void saveImageToolStripMenuItem_Click(object sender, EventArgs e)
  14.         {
  15.             foreach (TXTextControl.Page item in this.textControl1.GetPages())
  16.             {
  17.                 Bitmap bm1 = item.GetImage(100, TXTextControl.Page.PageContent.All);
  18.                 Bitmap bm2 = new Bitmap(bm1.Width, bm1.Height);
  19.                 Graphics g = Graphics.FromImage(bm2);
  20.                 g.DrawImageUnscaled(bm1, 0, 0);
  21.                
  22.                
  23.                 bm2.Save("1.png", System.Drawing.Imaging.ImageFormat.Png);
  24.                 g.Dispose();
  25.                 bm2.Dispose();

  26.             }
  27.         }
复制代码
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-4-26 18:18:00
地板
回复 2楼lch922的帖子

问题二通过以下方式获取:

  1. this.textControl1.InputPosition.Page
复制代码
回复 使用道具 举报
lch922
中级会员   /  发表于:2013-4-26 18:57:00
5#
回复 3楼iceman的帖子

效率好高!谢谢!
另外:
第11行的this.textControl1.PageSize = new TXTextControl.PageSize(5000, 20);
请问5000与20这两个参数是怎样得来的呢?

编辑器内的字体大小有可能不是一样大的,也就是说,有些字的大小可能是10,而有些字体大小可能是100.我通过什么方式获取最高文字高度呢(用于确定页面的高度)?

还有我想要的效果是将编辑器内的所有内容都保存到一张图片中,而不是分开来保存。
回复 使用道具 举报
lch922
中级会员   /  发表于:2013-4-26 19:00:00
6#
这是我生成图片的图片的代码,麻烦帮忙看一下这有没有什么问题?我测试的时候发现输入了内容之后生成图片最后面有些内容没有显示,但是图片的宽度应该是没问题的。
  1.       private void ExportImage_Click(object sender, EventArgs e)
  2.       {
  3.           bak_txt_box_.Clear();
  4.           Size page_size = new Size(0, 0);
  5.             byte[] bytes;
  6.             _textControl.Save(out bytes, TXTextControl.BinaryStreamType.InternalFormat);
  7.             bak_txt_box_.Load(bytes, TXTextControl.BinaryStreamType.InternalFormat);
  8.             foreach (TXTextControl.TextChar item in this.bak_txt_box_.TextChars) {
  9.                 page_size.Width += item.Bounds.Width;
  10.                 page_size.Height = Math.Max(item.Bounds.Height, page_size.Height);
  11.             }
  12.             bak_txt_box_.PageMargins = new TXTextControl.PageMargins(0.0, 0.0, 0.0, 0.0);
  13.             bak_txt_box_.PageUnit = TXTextControl.MeasuringUnit.Twips;
  14.             bak_txt_box_.PageSize = new TXTextControl.PageSize(page_size.Width,
  15.                 page_size.Height * 2);
  16.             foreach (TXTextControl.Page page in bak_txt_box_.GetPages()) {
  17.                 page.GetImage(100, TXTextControl.Page.PageContent.MainText).Save("D:/pix/" + page.Number + ".png");
  18.             }
  19.       }
  20. private TXTextControl.TextControl bak_txt_box_ = new TXTextControl.TextControl();
  21.          bak_txt_box_.ViewMode = TXTextControl.ViewMode.PageView;
  22.          bak_txt_box_.CreateControl();
  23.          bak_txt_box_.PageMargins = new TXTextControl.PageMargins(0.0, 0.0, 0.0, 0.0);
  24.          bak_txt_box_.PageUnit = TXTextControl.MeasuringUnit.Twips;
复制代码
回复 使用道具 举报
lch922
中级会员   /  发表于:2013-4-26 19:02:00
7#
bak_txt_box_.PageSize = new TXTextControl.PageSize(page_size.Width,
                page_size.Height * 2);

如果高度不乘以2的话,会提示抛异常:The top/bottom margins overlap the height of the page.
回复 使用道具 举报
lch922
中级会员   /  发表于:2013-4-26 19:23:00
8#
目前测试还发现:
1、删除文档内某些内容或者改变字体大小的时候,会出现文字叠到一起的情况。
2、某些RTF文档打开不了,异常如下:
  1. ************** 异常文本 **************
  2. System.Exception: Text filter error: Unknown format.
  3. (01-1D01)
  4.    在 TXTextControl.TextControlCore.?()
  5.    在 TXTextControl.TextControlCore.?(? , Int32 , Int32 , Int32 )
  6.    在 TXTextControl.TextControl.get_CanCopy()
  7.    在 TX_Text_Control_Words.frmMain.get_CanCopy() 位置 E:\C#\Text\TX Text Control Words\frmMain.cs:行号 69
  8.    在 TX_Text_Control_Words.frmMain.EnableToolbarButtons() 位置 E:\C#\Text\TX Text Control Words\frmMain.cs:行号 1558
  9.    在 TX_Text_Control_Words.frmMain.textControl_InputPositionChanged(Object sender, EventArgs e) 位置 E:\C#\Text\TX Text Control Words\frmMain.cs:行号 184
  10.    在 TXTextControl.TextControl.OnInputPositionChanged(EventArgs e)
  11.    在 TXTextControl.TextControl.?(Message& )
  12.    在 TXTextControl.TextControl.WndProc(Message& message)
  13.    在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
  14.    在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
  15.    在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
复制代码

3、打开某些word文档之后,CTRL+A全选后按Del,删除不了内容。


我的测试demo是TX Text Control Words
回复 使用道具 举报
lch922
中级会员   /  发表于:2013-4-26 19:46:00
9#
文字重叠。

文字重叠

文字重叠
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-4-27 15:43:00
10#
回复 5楼lch922的帖子

你好,
字体最大高度,也就是图片高度。可以通过逐个文字检测实现,fontsize 单位为 twips。

  1. TXTextControl.TextCharCollection tc = this.textControl1.TextChars;
  2.             foreach (TXTextControl.TextChar item in this.textControl1.TextChars)
  3.             {
  4.                 int fontSize = item.Bounds.Height;
  5.             }
复制代码

图片宽度,可以根据行数和页面宽度获取,PageMargins 单位为 1inch,PageSize 单位为 1inch。

  1. int width = (int)(Convert.ToDouble(this.textControl1.PageSize.Width) - this.textControl1.PageMargins.Left - this.textControl1.PageMargins.Right) * this.textControl1.Lines.Count;
复制代码


以上为大体实现思路,具体代码还需要您实现。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部