draw

zzzzzz7 2008-07-13 02:47:56
我想将textBox1(多行)的文本内容,完全按照所见格式重绘打印,但是遇到换行位置改变、行间距改变的问题

下面是在窗体上绘制textBox1的代码,文本框中的文本与绘制的排版不完全一样,求解决办法

Point p = new Point(textBox1.Location.X, 300);
Size s = textBox1.Size;
e.Graphics.DrawRectangle(new Pen(Color.Red), new Rectangle(p, s));
e.Graphics.DrawString(textBox1.Text, this.textBox1.Font, Brushes.Black, new Rectangle(p, s));


...全文
192 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
leon_wwj_66 2011-08-18
  • 打赏
  • 举报
回复
楼主,你的问题解决了吗?我现在也遇到这样的问题了。
zzzzzz7 2008-07-13
  • 打赏
  • 举报
回复
我明白了
Bitmap保存的是点阵,而打印时候绘制的文字全部是矢量的,点阵图像中的文字在高质量打印输出时就暴露出了不足
zzzzzz7 2008-07-13
  • 打赏
  • 举报
回复
感谢gomoku

Graphic.DrawImage()
应该是位图操作吧
Graphic.DrawString()却不存在这个问题

将上述例子运行,打印预览放大后观察,好像是经过消除锯齿的处理,感觉还是函数没有使用正确
czk598478 2008-07-13
  • 打赏
  • 举报
回复


// 该例子要添加一个文本框,并双击生成textBox1_TextChanged响应函数
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
using (Graphics g = this.CreateGraphics())
using (Bitmap tmp = new Bitmap( textBox1.Width, textBox1.Height ) )
{
textBox1.DrawToBitmap(tmp, new Rectangle(0, 0, tmp.Width, tmp.Height));
g.DrawImageUnscaled(tmp, 10, 10);
}
}
}




引用的
gomoku 2008-07-13
  • 打赏
  • 举报
回复
1、Graphic.Draw...()一般输出向量图型,向量图型可以无极细化。而Bitmap则是点阵,向量图型画到点阵上会损失一些信息。
2、Bitblt同样也是点阵操作。
3、屏幕演示时DrawToBitmap()还好用,但如果是高质量打印输出就要想别的方法了。
zzzzzz7 2008-07-13
  • 打赏
  • 举报
回复
似乎经过缩放变形过
zzzzzz7 2008-07-13
  • 打赏
  • 举报
回复
gomoku 的方法试过了
以前不知道DrawToBitmap这个方法,确实很好用
但是在PrintPage事件中,打印预览就会变得很模糊
private void printDocument1_PrintPage(System.Object sender, System.Drawing.Printing.PrintPageEventArgs e)
...{

e.Graphics.DrawImageUnscaled(tmp, 10, 10);

}






如同:
.net winform 打印窗体的方法(摘自VS2005帮助文档);
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern long BitBlt (IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);
private Bitmap memoryImage;
private void CaptureScreen()
...{
Graphics mygraphics = this.CreateGraphics();
Size s = this.Size;
memoryImage = new Bitmap(s.Width, s.Height, mygraphics);
Graphics memoryGraphics = Graphics.FromImage(memoryImage);
IntPtr dc1 = mygraphics.GetHdc();
IntPtr dc2 = memoryGraphics.GetHdc();
BitBlt(dc2, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height, dc1, 0, 0, 13369376);
mygraphics.ReleaseHdc(dc1);
memoryGraphics.ReleaseHdc(dc2);
}
private void printDocument1_PrintPage(System.Object sender, System.Drawing.Printing.PrintPageEventArgs e)
...{
e.Graphics.DrawImage(memoryImage, 0, 0);
}
private void printButton_Click(System.Object sender, System.EventArgs e)
...{
CaptureScreen();
printDocument1.Print();
}


gomoku 2008-07-13
  • 打赏
  • 举报
回复
你可以试试Control.DrawToBitmap:


// 该例子要添加一个文本框,并双击生成textBox1_TextChanged响应函数
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
using (Graphics g = this.CreateGraphics())
using (Bitmap tmp = new Bitmap( textBox1.Width, textBox1.Height ) )
{
textBox1.DrawToBitmap(tmp, new Rectangle(0, 0, tmp.Width, tmp.Height));
g.DrawImageUnscaled(tmp, 10, 10);
}
}
}
zzzzzz7 2008-07-13
  • 打赏
  • 举报
回复
参考了
http://topic.csdn.net/t/20030119/10/1372762.html
可以手动控制DrawString的行间距

还有一种使用bitblt的打印窗体的办法,但是在打印的时候会出现模糊,不能彻底解决

谁知道更好的方法?

110,825

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧