Tag: onpaint

如何创建逆png图像?

我正在创建在我的基础上绘制的png图像,从基础我可以保存一个png图像,供您参考 Graphics g = e.Graphics; …. g.DrawLine(pen, new Point(x, y), new Point(x1, y1)); ….. base.OnPaint(e); using (var bmp = new Bitmap(500, 50)) { base.DrawToBitmap(bmp, new Rectangle(0, 0, 500, 50)); bmp.Save(outPath); } 这是单色透明图像,现在我如何反转这个图像像png填充任何颜色和真实图像部分应该是透明的,有可能吗? 位细节:透明会变得不透明,填充的地方会变得透明

在resize时将图像绘制到Panel控件上会产生伪影

目前我正在尝试做我认为简单的任务: 在Windows窗体中的Panel控件的整个区域上绘制图像 。 (请忽略我可以使用BackgroundImage属性的那一刻) 要绘制的图像如下所示: 即一个黄色的盒子,周围有一个1像素的蓝色框架。 要绘制,我正在使用Panel控件的Paint事件: private void panel1_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawImage(Resources.MyImage, panel1.ClientRectangle); } 这在最初显示表单时看起来很好: 调整窗体大小(以及停靠的面板)时,它会在缩小时缩小边缘… …或者当它变得更大时它会绘制人工制品: 我很确定有一些相当简单和直接的东西,但我真的无法理解其中的原因。 因为我忽略了ClipRectangle并总是绘制所有内容,所以我认为图像会一直缩放。 我的问题是: 这些文物的原因是什么? (我喜欢理解这一点!) 为了摆脱人工制品,我该怎么做? (在每次resize时调用Invalidate旁边) 更新,解决方案: 感谢Ryan的回答 ,我找到了一个可接受的解决方案。 基本上我从Panel派生了一个类,重写了OnPaintBackground并且没有调用基本方法。 最后,我将以下代码添加到派生面板的构造函数中: base.DoubleBuffered = true; SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.ResizeRedraw, true); SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); UpdateStyles();

Onpaint事件(无效)在句点正常操作(运行时)后更改执行顺序

我有3个数据图,通过他们的绘画事件绘制。 当我有需要插入图表的数据时,我调用controls invalidate()命令。 第一个控件的paint事件实际上为其他2个图创建了一个位图缓冲区,以避免重复长循环。 因此,invalidate命令按特定顺序(1,2,3)。 这很好用,但是当绘制的数据到达图形窗口(PictureBox)的末尾时,数据通常会开始滚动,绘制事件开始以错误的顺序触发(2,3,1)。 以前有人遇到过这个吗? 为什么会发生这种情况?

图形DrawString将文本正确放置在System.Label上

我在VS2008中重写了我的Label控件的OnPaint方法: void Label_OnPaint(object sender, PaintEventArgs e) { base.OnPaint(e); dim lbl = sender as Label; if (lbl != null) { string Text = lbl.Text; e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; if (myShowShadow) { // draw the shadow first! e.Graphics.DrawString(Text, lbl.Font, new SolidBrush(myShadowColor), myShadowOffset, StringFormat.GenericDefault); } e.Graphics.DrawString(Text, lbl.Font, new SolidBrush(lbl.ForeColor), 0, 0, StringFormat.GenericDefault); } } 这是有效的,但我真的想知道如何垂直和水平居中文本。 我听说过MeasureString()方法,但我的“文本”使问题变得复杂,因为它可能包含分页符。 有人可以指导我如何做到这一点?

使用大量控件填充FlowLayoutPanel并根据需要绘制缩略图

我正在尝试制作一个ImageListBox控件,它将显示大量的缩略图,就像Picasa使用的缩略图一样。 这是我的设计: 我有一个FlowLayoutPanel ,其中填充了许多UserControl对象,例如4,000。 为每个UserControl分配一个Paint事件的委托。 调用Paint事件时,它会检查缩略图的内存缓存,如果映像不在缓存中,则会从磁盘中检索它。 我有两个问题需要解决: 即使UserControl不在视图中,WinForms似乎也会触发Paint事件。 实际上只有10个左右的控件在视图中,其余的不是( FlowLayoutPanel.AutoScroll设置为true )。 因此,它会尝试检索所有图像的缩略图,这需要很长时间。 将UserControl对象添加到FlowLayoutPanel需要相当长的时间,大约2-3秒。 我可以忍受它,但我想知道是否有更好的方法来做到这一点: UserControl[] boxes = new UserControl[N]; // populate array panel.SuspendLayout(); panel.Controls.AddRange(boxes); panel.ResumeLayout();

DoubleBuffered设置为true时覆盖OnPaint的问题

我创建了一个派生自Panel的自定义控件。 我用它来使用BackgroundImage属性显示一个Image。 我重写OnClick方法并将isSelected设置为true然后调用Invalidate方法并在覆盖的OnPaint中绘制一个矩形。 一切都很顺利,直到我将DoubleBuffered设置为true。 绘制矩形然后将其删除,我无法理解为什么会发生这种情况。 public CustomControl() : base() { base.DoubleBuffered = true; base.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw, true); } protected override void OnPaint(PaintEventArgs pe) { base.OnPaint(pe); PaintSelection(); } private void PaintSelection() { if (isSelected) { Graphics graphics = CreateGraphics(); graphics.DrawRectangle(SelectionPen, DisplayRectangle.Left, DisplayRectangle.Top, DisplayRectangle.Width – 1, DisplayRectangle.Height – 1); } }

C#:在ProgressBar上覆盖OnPaint不起作用?

认为创建一个自己绘制一些文本的ProgressBar应该很容易。 但是,我不太清楚这里发生了什么…… 我添加了以下两个覆盖: protected override void OnPaintBackground(PaintEventArgs pevent) { base.OnPaintBackground(pevent); var flags = TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter | TextFormatFlags.SingleLine | TextFormatFlags.WordEllipsis; TextRenderer.DrawText(pevent.Graphics, “Hello”, Font, Bounds, Color.Black, flags); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); var flags = TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter | TextFormatFlags.SingleLine | TextFormatFlags.WordEllipsis; TextRenderer.DrawText(e.Graphics, “Hello”, Font, Bounds, Color.Black, flags); } 但是,我没有文本,甚至似乎都没有调用这些方法。 这里发生了什么? 更新:感谢到目前为止的两个答案,我已经通过使用SetStyle(ControlStyles.UserPaint, true)来实际调用OnPaint […]

如何在C#中使用OnPaint事件?

我在网站上看到了一些类似的问题,但没有一个真正帮助过我。 我有一个函数,当单击一个按钮时,它会在窗体上绘制几行,这些按钮的形状会根据用户在某些文本框中输入的值而变化。 我的问题是,当我最小化forms时,线条消失,我明白这可以通过使用OnPaint事件来解决,但我真的不明白如何。 任何人都可以给我一个简单的例子,使用函数在按下按钮时使用OnPaint事件绘制一些东西吗?