如何在设计器中更新自定义控件?

时间:2016-05-31 18:20:55

标签: c# winforms

我创建了一个派生自Panel的自定义控件。 一切都很好,除了在设计师我的控制只是在它失去焦点时重新绘制。 我错过了什么?

以下是CustomControl.cs的代码

using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace Picwing
{
    public partial class xPanel : Panel
    {
        private SizeF textSize;

        public xPanel() {
            InitializeComponent();
        }

        [Browsable(true)]
        public override string Text {
            get { return base.Text; }
            set { base.Text = value; }
        }

        protected override void OnPaint(PaintEventArgs pe) {
            base.OnPaint(pe);
            textSize = pe.Graphics.MeasureString(Text, Font);
            pe.Graphics.DrawRectangle(new Pen(ForeColor, 1), pe.ClipRectangle.X, pe.ClipRectangle.Y + textSize.Height / 2, pe.ClipRectangle.Width - 1, pe.ClipRectangle.Height - textSize.Height / 2 - 1);
            pe.Graphics.FillRectangle(new SolidBrush(BackColor), 5, 0, textSize.Width, textSize.Height);
            pe.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), pe.ClipRectangle.X + 6, pe.ClipRectangle.Y);
        }
    }
}

这是在xPanel1内移动label1之后拍摄的打印屏幕,在它失去焦点之前。 enter image description here

1 个答案:

答案 0 :(得分:1)

您的问题是因为在控件上绘画时使用pe.ClipRectangle。 不要使用DisplayRectangle。请根据您的要求使用ClientRactanglepe.ClipRectangle

当您绘制InitializeComponent();边界时,如您所见,绘图将在控件的最小无效部分上完成。

注意:

  • 除非您使用面板组件的设计器向其添加一些其他组件,否则您不需要在构造函数中使用DisplayRectangle

  • 如果您使用FillRectangle,则使用0,5方法代替DisplayRectangle.X + 5, DisplayRectangle.Y使用GroupBox

  • 如果您尝试绘制自定义 $.ajax({ type: "POST", url: "utils.php?do=saveTick", data: {'dtData': JSON.stringify(sendData)}, success: function (data) { alert(data.status); if (data.status != "SUCCESS") { $("#updateDiv").dialog('destroy'); alert("Failed!"); $("#btnPrint").attr('disabled', false); return false; } else { me.confirmSave(); } } }, 'json' ); ,可以查看Custom GroupBox BackColor to Transparent