我正在开发一个自定义表单,该表单提供了更多选项来自定义表单的外观。
为此,我从类中派生了类System.Windows.Forms.Form
并重写了WndProc(ref Message m)
方法。
我已经处理了所需的窗口消息(WM_NCPAINT
、WM_NCCALCSIZE
等)来自定义表单。
我通过以下代码显示表单自定义表单,以通过按钮单击显示子表单。
CustomForm form = new CustomForm();
form.ShowDialog();
单击父窗体时,子窗体不闪烁。但在微软形式中,闪烁发生了。
我已经处理了窗口消息WM_NCCALCSIZE以指定表单的工作区大小,如下所示。
void On_WM_NcCalcSize(ref Message m)
{
rect.Top += borderThickness + titleBarHeight;
rect.Left += borderThickness;
rect.Right -= borderThickness;
rect.Bottom -= borderThickness;
m.Result = IntPtr.Zero;
Marshal.StructureToPtr(rect, m.LParam, true);
}
我已经处理了绘制自定义标题栏和边框以及其他自定义WM_NCPAINT。
我还通过以下代码处理了On_Wm_NcActivate。
private void On_Wm_NcActivate(ref Message m)
{
if (!this.IsMdiContainer)
NativeMethods.LockWindowUpdate(this.Handle);
base.WndProc(ref m);
NativeMethods.LockWindowUpdate(IntPtr.Zero);
if (Style != null)
{
var msg = new Message();
msg.Msg = WindowMessages.WM_NCPAINT;
msg.HWnd = m.HWnd;
msg.WParam = (IntPtr)1;
msg.LParam = (IntPtr)0;
On_Wm_NcPaint(ref msg);
}
}
我不知道我哪里做错了。所以请给我建议
您应该将"form"的父表单设置为父表单