C# 自定义边框窗口窗体和滚动条可见性

C# 自定义边框窗口窗体和滚动条可见性,c#,winforms,C#,Winforms,我必须使用Windows窗体创建自定义边框窗口。目前,我正在使用WM_NCCALSIZE修改边框的大小,并使用WM_NCPAINT进行自定义绘图。 我意识到,当我在处理WM_NCCALSIZE消息时不调用基本WndProc时,滚动条将不会被绘制。 那么,如果我手动处理WM_NCCALSIZE,我可以拥有一个本地的、正常的滚动条吗?我该怎么做呢?您可以先调用base.WndProc(ref m),然后处理消息以修改边框的大小 protected override void WndProc(ref

我必须使用Windows窗体创建自定义边框窗口。目前,我正在使用WM_NCCALSIZE修改边框的大小,并使用WM_NCPAINT进行自定义绘图。 我意识到,当我在处理WM_NCCALSIZE消息时不调用基本WndProc时,滚动条将不会被绘制。
那么,如果我手动处理WM_NCCALSIZE,我可以拥有一个本地的、正常的滚动条吗?我该怎么做呢?

您可以先调用
base.WndProc(ref m)
,然后处理消息以修改边框的大小

protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        ...
        case WM_NCCALCSIZE:
        {
            base.WndProc(ref m);
            //Work your magic...
        }
        default: base.WndProc(ref m);
    }
}

您可以首先调用
base.WndProc(ref m)
,然后处理消息以修改边框的大小

protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        ...
        case WM_NCCALCSIZE:
        {
            base.WndProc(ref m);
            //Work your magic...
        }
        default: base.WndProc(ref m);
    }
}

是的,我可以。但我在互联网上搜索过,没有人调用base方法。我想知道这样做是否会产生开销或其他问题?这确实取决于基本实现对
WM\u NCCALCSIZE
的作用,但我怀疑您是否会看到任何可测量的效果。如果它能给你想要的结果,那就去做吧:)谢谢。虽然我确实想要一个不需要调用base方法(只调用本机DefWndProc过程)的解决方案,但我认为这是一个可以接受的解决方案。你能写下你的评论作为答案吗,我会接受:)作为答案张贴。顺便说一句,我很确定基本实现确实调用了本机
DefWndProc
。是的,我可以。但我在互联网上搜索过,没有人调用base方法。我想知道这样做是否会产生开销或其他问题?这确实取决于基本实现对
WM\u NCCALCSIZE
的作用,但我怀疑您是否会看到任何可测量的效果。如果它能给你想要的结果,那就去做吧:)谢谢。虽然我确实想要一个不需要调用base方法(只调用本机DefWndProc过程)的解决方案,但我认为这是一个可以接受的解决方案。你能写下你的评论作为答案吗,我会接受:)作为答案张贴。顺便说一句,我很确定基本实现确实调用了本机
DefWndProc