自定义 winforms 框架的最佳方式?
Best way to customize winforms frame?
我想在 window 框架上绘制一些简单的矩形和文本,使其看起来像 Visual Studio。可以做到还是我应该做一个无边界的 window 并自己处理移动和调整大小?
编辑:
我写了这个。但是我现在要怎么画呢?
protected override void WndProc(ref Message m)
{
if (m.Msg == WndProcMsg.WM_PAINT) //0x000f
{
}
base.WndProc(ref m);
}
您应该改为处理 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 对象,您可以执行所需的所有绘图操作。
据我所知,当所有者绘制 window 时,您可能会遇到一些闪烁,在这种情况下,您应该考虑处理 WM_ERASEBACKGROUND 和 return false.
https://docs.microsoft.com/en-us/windows/desktop/dwm/customframe 效果很好。
@Chris Taylor. You can download the project from his OneDrive
将其翻译成 C#
只需将 case Win32Messages.WM_NCHITTEST
修正为:
int ht = NCHitText(m);
if (callDWP)
{
callDWP = (ht == Win32Constants.HTNOWHERE);
result = new IntPtr(ht);
}
我想在 window 框架上绘制一些简单的矩形和文本,使其看起来像 Visual Studio。可以做到还是我应该做一个无边界的 window 并自己处理移动和调整大小?
编辑: 我写了这个。但是我现在要怎么画呢?
protected override void WndProc(ref Message m)
{
if (m.Msg == WndProcMsg.WM_PAINT) //0x000f
{
}
base.WndProc(ref m);
}
您应该改为处理 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 对象,您可以执行所需的所有绘图操作。 据我所知,当所有者绘制 window 时,您可能会遇到一些闪烁,在这种情况下,您应该考虑处理 WM_ERASEBACKGROUND 和 return false.
https://docs.microsoft.com/en-us/windows/desktop/dwm/customframe 效果很好。 @Chris Taylor. You can download the project from his OneDrive
将其翻译成 C#只需将 case Win32Messages.WM_NCHITTEST
修正为:
int ht = NCHitText(m);
if (callDWP)
{
callDWP = (ht == Win32Constants.HTNOWHERE);
result = new IntPtr(ht);
}