【问题标题】:Best way to customize winforms frame? [duplicate]自定义winforms框架的最佳方法? [复制]
【发布时间】:2019-06-28 11:45:50
【问题描述】:

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

编辑: 我写了这个。但是我现在该怎么画呢?

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

    }
    base.WndProc(ref m);
}

【问题讨论】:

  • 当我用谷歌搜索你的标题时,有很多结果。您能否使用您已经尝试过的哪些技术来更新您的问题?
  • Fancy Windows Forms。不过,VisualStudio 是一个 WPF 应用程序(带有一些 WinForms 部分)。不是一回事。
  • 自Vista以来的标准方式是使用DWM(主要是DwmExtendFrameIntoClientArea)C#/Winforms中的测试,来自MSDN示例:Custom Caption(也可以使用DirectComposition,但更多复杂...)
  • @Castorix 链接到示例/代码?
  • 我将 MS C++ 代码转换/改编为 C#,来自:Custom Window Frame Using DWM

标签: c# winforms nonclient-area


【解决方案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。

【讨论】:

    【解决方案2】:

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-13
      • 1970-01-01
      • 2010-12-15
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多