我一个看似唯一的问题所困扰......我有两个属性(其中包括)自定义控件称为边境和边框宽度。我注意到,设置这些值会影响控件的ClientRectangle的值。的WinForms控制自定义边框和边框宽度影响ClientRectangle
据我所知,WinForms控件没有“Border”和“BorderWidth”属性,所以我不能无意中设置任何可能导致此问题的基本属性。这里是问题...我有以下特性:
/// <summary>
/// Whether or not this control has a border
/// </summary>
[Browsable(true)]
public bool Border {
get {
return _border;
}
set {
_border = value;
this.Invalidate();
}
}
/// <summary>
/// The width (in pixels) of the controls border
/// </summary>
[Browsable(true)]
public int BorderWidth {
get {
return _borderWidth;
}
set {
if (value <= 1) value = 1;
_borderWidth = value;
}
}
}
我已经把断点在上面和尽快无论是在_border = value
或_borderWidth = value
线执行的this.ClientRectangle
立即改变的值设置器。就好像这些属性的值正在被.Net Framework读取并用于调整this.ClientRectaangle
。我没有任何代码可以做到这一点,而且我也不能,因为ClientRectangle
只是只读的。
运行前行_border = value
(设定值设定为 “真”)
Border = false
BorderWidth = 1
this.ClientRectangle = {X=0 Y=0 Width=150 Height=29}
后
Border = true
BorderWidth = 1
this.ClientRectangle = {X=1 Y=1 Width=148 Height=27}
之前运行_borderWidth = value
(其值设置为 “2” )
Border = true
BorderWidth = 1
this.ClientRectangle = {X=1 Y=1 Width=148 Height=27}
后
Border = true
BorderWidth = 2
this.ClientRectangle = {X=2 Y=2 Width=146 Height=25}
我不明白这是怎么可能的,因为我使用this.ClientRectangle
Paint事件来绘制边界和其他的东西,我结束了在更小的空间绘图比控制的实际大小;特别是边境不被下面的代码绘制控件的边缘:
private void DrawBorder(Graphics g, Rectangle r) {
if (Border) {
ControlPaint.DrawBorder(g, ClientRectangle, BorderColor, BorderWidth, ButtonBorderStyle.Solid,
BorderColor, BorderWidth, ButtonBorderStyle.Solid,
BorderColor, BorderWidth, ButtonBorderStyle.Solid,
BorderColor, BorderWidth, ButtonBorderStyle.Solid);
//float halfBorder = (float)BorderWidth/2;
//RectangleF r2 = new RectangleF(halfBorder, halfBorder, (float)r.Size.Width - halfBorder, (float)r.Size.Height - halfBorder);
//g.DrawRectangles(new Pen(BorderColor, BorderWidth), new RectangleF[] { r2 });
}
}
道歉长的帖子,只是想提供尽可能多的信息,可以提高得到的解决方案的机会。
谢谢大家。
感谢汉斯,你的水晶球部分正确。我有一个WndProc()覆盖在其他地方开始生活。但是它没有响应'WM_NCCALCSIZE'消息的代码。我所做的,面对面的时间,是我自己重写的ClientRectangle,我写了自己(没有剪切和粘贴),但完全忘记了!卫生署!我的ClientRectangle属性根据_border和_borderWidth重新计算X,Y,宽度和高度,以提供上述** true **边框行为。 – oak
我将其标记为正确的答案,因为它最接近帮助我追踪我自己的失礼。 – oak
也许在我给出的“真实边框”细节中有一小块金块,但如果删除问题可能更合适。 –