请问大家一个Graphics写字的问题...没有在鼠标点击的位置显示...

liruiaizhuzhu 2008-11-24 11:56:25
问题说明:
我在pictureBox1_MouseDown事件里写的字不在鼠标点击的位置?
而且字体也没有10号大.这是咋回事呢?Graphics.FromImage(image)是不是这个的原因?
我用pictureBox1.CreateGraphics()这样可以在点击的位置写字,但是重绘又很麻烦.
如何解决呀?谢谢了...
代码如下:

//image对象初始化的时候创建的.
graphics = Graphics.FromImage(image);
//设置字体
Font font = new Font("黑体", 10, FontStyle.Bold);
//测试文字
string strTxt = "测试";
//在鼠标点击位置写字.
graphics.DrawString(strTxt, font, new SolidBrush(Color.Red), e.X, e.Y);
//释放
graphics.Dispose();
//显示写好字的图片
this.pictureBox1.Image = image;
...全文
310 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
kez 2012-01-10
  • 打赏
  • 举报
回复
mark
liruiaizhuzhu 2008-11-24
  • 打赏
  • 举报
回复
不好意思,刚吃饭去了.感谢各位热心的同志...

to ojekleen:
取e.X,e.Y应该是在该控件的当前位置吧?

to hm7921936:
不太明白你所说的控制他的位置是指什么位置,如果是写字的位置,
graphics.DrawString(strTxt, font, new SolidBrush(Color.Red), e.X, e.Y);
这样应该是指定了位置的.

to kanbozhang
我也觉得应该是你说的这样.而且可以实现在鼠标点击的位置写上字,
但是在重绘的时候,例如窗体移动了下.就没有了.
我也不能把这段代码放到Paint里.文字和位置都是不固定的.

to bloodish:
按照你的方法试了下,都不知道写到哪去了.

bloodish 2008-11-24
  • 打赏
  • 举报
回复
上面最后一句错了,不好意思
Point p = pb.PointToClient(new Point(e.X, e.Y));
graphics.DrawString(strTxt, font, new SolidBrush(Color.Red), p.X, p.Y);
方蓝 2008-11-24
  • 打赏
  • 举报
回复
用Graphics.FromImage(image);获取的Graphics不是当前pictureBox1的Graphics,必须用this.pictureBox1.CreateGraphics()才可以得到当前控件的绘图对象
bloodish 2008-11-24
  • 打赏
  • 举报
回复
PictureBox pb = new PictureBox();
Point p = pb.PointToClient(new Point(e.X, e.Y));
graphics.DrawString(strTxt, font, new SolidBrush(Color.Red), e.X, e.Y);
hm7921936 2008-11-24
  • 打赏
  • 举报
回复
this.pictureBox1.Image = image;
你用pictureBox1显示绘制的图象.但是你有控制他的位置吗
ojekleen 2008-11-24
  • 打赏
  • 举报
回复
this.pictureBox1位置并不是在鼠标位置吧
birdlonger 2008-11-24
  • 打赏
  • 举报
回复
mark !
hztltgg 2008-11-24
  • 打赏
  • 举报
回复
在鼠标事件里画图是个很不好的编程习惯呀,画图语句集中到Paint事件里处理好的多,SizeMode的问题就是多出来的问题了。
hztltgg 2008-11-24
  • 打赏
  • 举报
回复
用我的方法试试在解吧
liruiaizhuzhu 2008-11-24
  • 打赏
  • 举报
回复
啊,原来如此.跟SizeMode有关呀.
谢谢各位的帮助,结贴.
hztltgg 2008-11-24
  • 打赏
  • 举报
回复
楼主想不从绘画,只画一次?这不可能的吧,不符合windows的规范呀,窗口最大化最小化都要重画的。


做了个vb的例子,会跟着鼠标画的


Public Class Form1

Private point As Point

Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown

point.X = e.X
point.Y = e.Y
PictureBox1.Invalidate()
End Sub

Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint

Dim font As New Font("黑体", 10, FontStyle.Bold)
Dim strTxt As String = "测试"
e.Graphics.DrawString(strTxt, font, New SolidBrush(Color.Red), point.X, point.Y)

End Sub


End Class

wartim 2008-11-24
  • 打赏
  • 举报
回复

namespace WindowsApplication10
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
Bitmap Bmp = new Bitmap(pictureBox1.Image);
Graphics graphics = Graphics.FromImage(Bmp);
//设置字体
Font font = new Font("黑体", 10, FontStyle.Bold);
//测试文字
string strTxt = "测试";
//在鼠标点击位置写字.
if (pictureBox1.SizeMode == PictureBoxSizeMode.Normal ||
pictureBox1.SizeMode == PictureBoxSizeMode.AutoSize) // 按实际像素
graphics.DrawString(strTxt, font, new SolidBrush(Color.Red), e.Location);
else if (pictureBox1.SizeMode == PictureBoxSizeMode.StretchImage) // 按拉伸比例
{
graphics.DrawString(strTxt, font, new SolidBrush(Color.Red),
e.Location.X * pictureBox1.Image.PhysicalDimension.Width / pictureBox1.Width,
e.Location.Y * pictureBox1.Image.PhysicalDimension.Height / pictureBox1.Height);
}
else if (pictureBox1.SizeMode == PictureBoxSizeMode.Zoom)
{
// 没想好
}
else if (pictureBox1.SizeMode == PictureBoxSizeMode.CenterImage)
{
// 没想好
}
//释放
graphics.Dispose();
//显示写好字的图片
this.pictureBox1.Image = Bmp;

}
}
}
CraxyMouse 2008-11-24
  • 打赏
  • 举报
回复
用重绘吧,很简单的!
blog.csdn.net/dunao
看看我写的这个!
liruiaizhuzhu 2008-11-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 assky124 的回复:]
因为你的Graphics对象和你的PictureBox的Graphics对象并不是同一个

创建一个Graphics对象有什么问题
C# codeprivatevoidpictureBox1_MouseDown(objectsender, System.Windows.Forms.MouseEventArgs e)
{
Graphics g=this.pictureBox1.CreateGraphics();
g.Clear(SystemColors.Control);
g.DrawImage(this.pictureBox1.Image,0,0);

g.DrawString("test…
[/Quote]

我知道可以像你这样画.


graphics = this.pictureBox1.CreateGraphics();
Font font = new Font("黑体", 10, FontStyle.Bold);
string strTxt = "测试";
graphics.DrawString(strTxt, font, new SolidBrush(Color.Red), e.X, e.Y);
graphics.Dispose();


但是在重绘的时候,例如窗体移动了下.就没有了.
怎么解决呀?
assky124 2008-11-24
  • 打赏
  • 举报
回复
因为你的Graphics对象和你的PictureBox的Graphics对象并不是同一个

创建一个Graphics对象有什么问题

private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
Graphics g = this.pictureBox1.CreateGraphics();
g.Clear(SystemColors.Control);
g.DrawImage(this.pictureBox1.Image,0,0);

g.DrawString("test",this.Font,Brushes.Red,e.X,e.Y);
//this.pictureBox1_Paint(sender,new PaintEventArgs(g,this.pictureBox1.Bounds));
}

110,577

社区成员

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

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

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