我从System.Windows.Forms.Form
类派生了一个类来创建自定义表单。
我已覆盖方法WndProc(ref m)
并处理WM_NCPAINT
窗口消息以使用我自己的自定义绘制标题栏。
我在下面提供了我的实现的基本版本。
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WindowMessages.WM_NCPAINT: // TO draw the title bar text and buttons
On_Wm_NcPaint(ref m);
break;
case WindowMessages.WM_NCCALCSIZE: //To define the client area size of the form.
On_Wm_NcCalcSize(ref m);
break;
case WindowMessages.WM_WINDOWPOSCHANGED:
On_Wm_WindowPosChanged(ref m);
break;
case WindowMessages.WM_NCLBUTTONUP: //For handling close,minimize and maximize operations.
On_Wm_NcLButtonUp(ref m);
break;
default:
base.WndProc(ref m);
break;
}
}
private void On_Wm_WindowPosChanged(ref Message m)
{
NativeMethods.WINDOWPOS wpos = (NativeMethods.WINDOWPOS)m.GetLParam(typeof(NativeMethods.WINDOWPOS));
if ((wpos.flags & WindowMessages.SWP_NOSIZE) == 0)
{
var rect = new NativeMethods.RECT();
NativeMethods.GetWindowRect(this.Handle, ref rect);
var region = NativeMethods.CreateRectRgn(0, 0, rect.Width, rect.Height);
if (region != IntPtr.Zero)
NativeMethods.SetWindowRgn(this.Handle, region, true);
Invalidate();
return;
}
base.WndProc(ref m);
}
这适合我。
问题是,从表单的顶部和左侧调整大小时,表单会闪烁。
当我通过从左侧调整大小来增加表单大小时,似乎发生了以下情况。
这种情况发生得很慢,所以它看起来像闪烁。
注意:表单中会出现闪烁。不在添加到表单中的控件中。
我尝试了以下方法来解决闪烁问题。
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer
| ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true);
this.DoubleBuffered = true;
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}
这些方法没有给出任何结果。
这种闪烁不会发生在基本形式(System.Windows.Forms.Form)
由于WindowMessage WM_WINDOWPOSCHANGED处理不正确,可能会发生这种情况。
请分享您的想法,摆脱这种闪烁,并顺利调整大小。
提前致谢