表单加载时未设置表单图形

我的表单有一个包含两个重叠矩形的组框。 表单的其他控件是两组四个数字上下控件来设置矩形的颜色。 (nudF1,2,3和4设置前面的矩形,nudB1,2,3和4设置后面的矩形。)一切正常,除了矩形不显示数字上下设置的颜色时表格首先加载。 数字向上控件的ChangeValue事件都调用ShowColors()方法。 表单的Load事件调用csColorsForm_Load()方法。 有什么建议?

namespace csColors { public partial class csColorsForm : Form { public csColorsForm() { InitializeComponent(); } private void csColorsForm_Load(object sender, EventArgs e) { this.BackColor = System.Drawing.Color.DarkBlue; SetColors(sender, e); } private void SetColors(object sender, EventArgs e) { Control control = (Control)sender; String ctrlName = control.Name; Graphics objGraphics; Rectangle rect1, rect2; int colorBack, colorFore; objGraphics = this.grpColor.CreateGraphics(); // If calling control is not a forecolor control, paint backcolor rectangle if (ctrlName.Substring(0,4)!="nudF") { colorBack = int.Parse(SetColorsB("nudB"), NumberStyles.HexNumber); SolidBrush BrushB = new SolidBrush(Color.FromArgb(colorBack)); rect1 = new Rectangle(this.grpColor.Left, this.grpColor.Top, this.grpColor.Width, this.grpColor.Height); objGraphics.FillRectangle(BrushB, rect1); } // Always paint forecolor rectangle colorFore = int.Parse(SetColorsB("nudF"), NumberStyles.HexNumber); SolidBrush BrushF = new SolidBrush(Color.FromArgb(colorFore)); rect2 = new Rectangle(this.grpColor.Left, this.grpColor.Top, this.grpColor.Width, this.grpColor.Height); objGraphics.FillRectangle(BrushF, rect2); objGraphics.Dispose(); } private string SetColorsB(string nam) { string txt=""; for (int n = 1; n <= 4; ++n) { var ud = Controls[nam + n] as NumericUpDown; int hex = (int)ud.Value; txt += hex.ToString("X2"); } return txt; } private void btnClose_Click(object sender, EventArgs e) { this.Close(); } } } 

我怀疑在Load事件中绘画还为时过早。 尝试在Paint事件中绘画。

要么:

你能用几个Panel控件,并设置背景颜色吗?

当Windows向其发送WM_PAINT消息时,组框与任何控件一样将自行绘制。 您确实可以使用Control.CreateGraphics()来绘制自己,绕过正常的绘制逻辑。 但是,当Windows决定控件需要再次重新绘制时,这种情况不会持续下去并随机消失。 当您最小化表单并将其还原时,这是显而易见的。 在启用Aero的Vista和Win7上不太明显,当您的表单与另一个窗口重叠时,不需要重新绘制。 但是在XP或禁用Aero时会很明显。

你不能可靠地工作,你必须使用Paint事件。 不是你的表格,组框控制’。 调用其Invalidate()方法以强制它在颜色更改时重新绘制。