我的窗体有一个分组框,其中包含两个重叠的矩形。窗体的其他控件是两组四个数字上下控件,用于设置矩形的颜色。(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();
}
}
}
3条答案
按热度按时间euoag5mw1#
我怀疑在
Load
事件中绘制有点为时过早。请尝试在Paint
事件中绘制。或者:
你能不能只用几个面板控件,并设置它们的背景颜色?
l5tcr1uw2#
与任何控件一样,当Windows向分组框发送WM_PAINT消息时,分组框将自己绘制。您确实可以使用Control.CreateGraphics()来绘制自己,绕过正常的绘制逻辑。但这种情况不会持续很久,当Windows决定控件需要重新绘制自己时,这种情况会随机消失。当您最小化窗体并还原它时,这种情况很明显。在启用了Aero的Vista和Win7上,这种情况就不那么明显了,当你的窗体被另一个窗口覆盖时,重绘是不必要的。2但是在XP或者禁用Aero的情况下,重绘是很明显的。
你不能让它可靠地工作,你 * 必须 * 使用Paint事件。不是你的表单,是分组框控件的。调用它的Invalidate()方法来强制它在颜色改变时重新绘制。
toiithl63#