定制Winforms框架的最佳方法?

时间:2019-06-28 11:45:50

标签: c# winforms nonclient-area

我想在窗口框架上绘制一些简单的矩形和文本,使其看起来像Visual Studio。可以做到吗,还是我应该制作一个无边界的窗口并自己移动和调整大小?

编辑: 我写的但是我现在该如何绘画?

protected override void WndProc(ref Message m)
{
    if (m.Msg == WndProcMsg.WM_PAINT) //0x000f
    {

    }
    base.WndProc(ref m);
}

2 个答案:

答案 0 :(得分:1)

您应该改为处理WM_NCPAINT:

if (m.Msg == WM_NCPAINT) 
            { 

                IntPtr hdc = GetWindowDC(m.HWnd); 
                if ((int)hdc != 0) 
                { 
                    Graphics g = Graphics.FromHdc(hdc); 
                   .... work with graphics
                    ReleaseDC(m.HWnd, hdc); 
                } 

            } 

使用Graphics对象,您可以执行所需的所有绘制操作。 据我所记得,当所有者绘制窗口时,您可能会遇到一些闪烁,在这种情况下,您应该考虑处理WM_ERASEBACKGROUND并返回false。

答案 1 :(得分:0)

https://docs.microsoft.com/en-us/windows/desktop/dwm/customframe很好用。 @Chris Taylor将其翻译为C#。您可以从他的OneDrive

下载项目

只需使用以下方法修复case Win32Messages.WM_NCHITTEST

int ht = NCHitText(m);
if (callDWP) 
{ 
   callDWP = (ht == Win32Constants.HTNOWHERE);
    result = new IntPtr(ht);
}