响应WM_NCPAINT画边框,求示例!

大狗狗 CSDN会员 大狗狗 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
环境:VS2005 C# WinForm

重载WndProc处理WM_NCPAINT,网上有示例,但都只是画了个标题栏。我想连边框也画,但不幸的是,窗口加载后,边框大部分竟然未能画出来(只有一部分着上了色,其余皆黑)。但用鼠标变化下窗口位置后,边框就正常地显示出来了。

下面代码是重画标题栏的,求哪位大虾给改进一下,使它能连边框也画出来。随便色彩形状,只要是能在窗口加载后按代码里的显示出来就行。


using System.Runtime.InteropServices;
using System.Drawing.Drawing2D;

[DllImport("user32.dll")]
private static extern IntPtr GetWindowDC(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

private const int WM_NCPAINT = 0x0085;
private const int WM_NCACTIVATE = 0x0086;
private const int WM_NCLBUTTONDOWN = 0x00A1;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
Rectangle vRectangle = new Rectangle((Width - 75) / 2, 3, 75, 25);
switch (m.Msg)
{
case WM_NCPAINT:
case WM_NCACTIVATE:
IntPtr vHandle = GetWindowDC(m.HWnd);
Graphics vGraphics = Graphics.FromHdc(vHandle);
vGraphics.FillRectangle(new LinearGradientBrush(vRectangle,
Color.Pink, Color.Purple, LinearGradientMode.BackwardDiagonal),
vRectangle);

StringFormat vStringFormat = new StringFormat();
vStringFormat.Alignment = StringAlignment.Center;
vStringFormat.LineAlignment = StringAlignment.Center;
vGraphics.DrawString("About", Font, Brushes.BlanchedAlmond,
vRectangle, vStringFormat);

vGraphics.Dispose();
ReleaseDC(m.HWnd, vHandle);
break;
case WM_NCLBUTTONDOWN:
Point vPoint = new Point((int)m.LParam);
vPoint.Offset(-Left, -Top);
if (vRectangle.Contains(vPoint))
MessageBox.Show(vPoint.ToString());
break;
}
}

...全文

相关推荐

评论 3
收藏 已收藏
分享
返回顶部
大狗狗 CSDN会员
C# 111,129 成员 642,540 内容