winforms 加载窗体时未设置窗体图形

jucafojl  于 2023-01-31  发布在  其他
关注(0)|答案(3)|浏览(111)

我的窗体有一个分组框,其中包含两个重叠的矩形。窗体的其他控件是两组四个数字上下控件,用于设置矩形的颜色。(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();
        }

    }
}
euoag5mw

euoag5mw1#

我怀疑在Load事件中绘制有点为时过早。请尝试在Paint事件中绘制。
或者:
你能不能只用几个面板控件,并设置它们的背景颜色?

l5tcr1uw

l5tcr1uw2#

与任何控件一样,当Windows向分组框发送WM_PAINT消息时,分组框将自己绘制。您确实可以使用Control.CreateGraphics()来绘制自己,绕过正常的绘制逻辑。但这种情况不会持续很久,当Windows决定控件需要重新绘制自己时,这种情况会随机消失。当您最小化窗体并还原它时,这种情况很明显。在启用了Aero的Vista和Win7上,这种情况就不那么明显了,当你的窗体被另一个窗口覆盖时,重绘是不必要的。2但是在XP或者禁用Aero的情况下,重绘是很明显的。
你不能让它可靠地工作,你 * 必须 * 使用Paint事件。不是你的表单,是分组框控件的。调用它的Invalidate()方法来强制它在颜色改变时重新绘制。

toiithl6

toiithl63#

private Rectangle rc;

private void Form1_Load(object sender, EventArgs e)
{
    rc = new Rectangle(150, 150, 120, 60);
    this.Paint += Form1_Paint;
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.FillRectangle(new SolidBrush(Color.Black), rc);
}

相关问题