我想在窗口框架上绘制一些简单的矩形和文本,使其看起来像 Visual Studio。可以完成还是我应该制作一个无边框窗口并自己处理移动和调整大小?
编辑:我写了这个。但是我现在怎么画?
protected override void WndProc(ref Message m)
{
if (m.Msg == WndProcMsg.WM_PAINT) //0x000f
{
}
base.WndProc(ref m);
}
我想在窗口框架上绘制一些简单的矩形和文本,使其看起来像 Visual Studio。可以完成还是我应该制作一个无边框窗口并自己处理移动和调整大小?
编辑:我写了这个。但是我现在怎么画?
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 对象,您可以完成所有需要的绘图操作。据我记得,当所有者绘制窗口时,您可能会遇到一些闪烁,在这种情况下您应该考虑处理 WM_ERASEBACKGROUND 并返回 false。
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);
}