无法使用 Control.OnPaint 方法
Can't get Control.OnPaint method to work
我根本找不到类似的东西(基本上 so else 的每个问题总是语法问题)而且...,情况有点复杂。为了避免使用 500 行代码,我将对它的大部分内容进行描述:
我有一个作为父窗体的窗体 (MdiParent
),另一个窗体是一个子窗体,但基本上是一个功能齐全的窗体。我在子窗体中使用了几个 OnPaint 方法, 工作得很好,父窗体 上的 3 个自定义按钮也有自己的 OnPaint 方法。这 3 个按钮(实际上是面板)和父窗体上的所有其他控件都包含在 PictureBox 中完全填充父窗体,并用于通过 TransparencyKey 使父窗体的背景透明/点击(没有找到任何其他这样做的方法)。
问题是父级上的每个 OnPaint 方法根本不起作用(它们正在执行但不绘制任何东西)。
这是一些代码,但这不是我要说的问题:
this.myButtonObject1.BackColor = System.Drawing.Color.Red;
this.myButtonObject1.Location = new System.Drawing.Point(840, 0);
this.myButtonObject1.Name = "myButtonObject1";
this.myButtonObject1.Size = new System.Drawing.Size(50, 50);
this.myButtonObject1.TabIndex = 0;
this.myButtonObject1.Click += new System.EventHandler(this.myButton1_Click);
this.myButtonObject1.Paint += new System.Windows.Forms.PaintEventHandler(this.myButtonObject1_Paint);
private void myButtonObject1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
LinearGradientBrush lgb = new LinearGradientBrush(new PointF(0, 0), new PointF(myButtonObject1.Width, myButtonObject1.Height), Color.Green, Color.Lime);
Pen p = new Pen(lgb, 5);
g.DrawRectangle(p, myButtonObject1.Bounds);
lgb.Dispose();
p.Dispose();
}
如果有人能告诉我;我做错了什么?
PS:我使用的是 .net 4.5,VS 2015,除了 TopMost
FormBorderStyle
ShowInTaskbar
StartPosition
和ofc 颜色和 transparencyKey,但我认为这与此无关。
将 myButtonObject1.FlatStyle
设置为 FlatStyle.Standard
。
更新
您的代码中的小错误是使用 Panel's Bounds
属性,它在运行时将引用其 Parent
中的 Panel's Location
!但是绘图代码必须是相对对象,而不是它的父对象!
所以不要使用Bounds
而是ClientRectangle
并确保设置正确PenAlignment
:
using (LinearGradientBrush lgb =
new LinearGradientBrush(ClientRectangle, Color.Green, Color.Lime, 0f) ) //or some angle!
using (Pen p = new Pen(lgb, 5))
{
p.Alignment = PenAlignment.Inset;
g.DrawRectangle(p, ClientRectangle);
}
我根本找不到类似的东西(基本上 so else 的每个问题总是语法问题)而且...,情况有点复杂。为了避免使用 500 行代码,我将对它的大部分内容进行描述:
我有一个作为父窗体的窗体 (MdiParent
),另一个窗体是一个子窗体,但基本上是一个功能齐全的窗体。我在子窗体中使用了几个 OnPaint 方法, 工作得很好,父窗体 上的 3 个自定义按钮也有自己的 OnPaint 方法。这 3 个按钮(实际上是面板)和父窗体上的所有其他控件都包含在 PictureBox 中完全填充父窗体,并用于通过 TransparencyKey 使父窗体的背景透明/点击(没有找到任何其他这样做的方法)。
问题是父级上的每个 OnPaint 方法根本不起作用(它们正在执行但不绘制任何东西)。
这是一些代码,但这不是我要说的问题:
this.myButtonObject1.BackColor = System.Drawing.Color.Red;
this.myButtonObject1.Location = new System.Drawing.Point(840, 0);
this.myButtonObject1.Name = "myButtonObject1";
this.myButtonObject1.Size = new System.Drawing.Size(50, 50);
this.myButtonObject1.TabIndex = 0;
this.myButtonObject1.Click += new System.EventHandler(this.myButton1_Click);
this.myButtonObject1.Paint += new System.Windows.Forms.PaintEventHandler(this.myButtonObject1_Paint);
private void myButtonObject1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
LinearGradientBrush lgb = new LinearGradientBrush(new PointF(0, 0), new PointF(myButtonObject1.Width, myButtonObject1.Height), Color.Green, Color.Lime);
Pen p = new Pen(lgb, 5);
g.DrawRectangle(p, myButtonObject1.Bounds);
lgb.Dispose();
p.Dispose();
}
如果有人能告诉我;我做错了什么?
PS:我使用的是 .net 4.5,VS 2015,除了 TopMost
FormBorderStyle
ShowInTaskbar
StartPosition
和ofc 颜色和 transparencyKey,但我认为这与此无关。
将 myButtonObject1.FlatStyle
设置为 FlatStyle.Standard
。
更新
您的代码中的小错误是使用 Panel's Bounds
属性,它在运行时将引用其 Parent
中的 Panel's Location
!但是绘图代码必须是相对对象,而不是它的父对象!
所以不要使用Bounds
而是ClientRectangle
并确保设置正确PenAlignment
:
using (LinearGradientBrush lgb =
new LinearGradientBrush(ClientRectangle, Color.Green, Color.Lime, 0f) ) //or some angle!
using (Pen p = new Pen(lgb, 5))
{
p.Alignment = PenAlignment.Inset;
g.DrawRectangle(p, ClientRectangle);
}