我根本找不到类似的东西(基本上 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 颜色和 trancparencyKey 之外,没有更改任何默认设置,但我不认为与此有关系。
更新
代码中的小错误是使用
Panel's Bounds
属性,该属性在运行时将引用其 Panel's Location
中的 Parent
!但绘图代码必须是相对于该对象的,而不是其父对象!
所以不要使用
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);
}
将
myButtonObject1.FlatStyle
设置为 FlatStyle.Standard
。