响应WM_NCPAINT画边框,求示例!

大狗狗 2010-12-15 07:40:18
环境: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;
}
}

...全文
257 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
无幻 2010-12-15
  • 打赏
  • 举报
回复
w ye 我也来接分啦
heijiu 2010-12-15
  • 打赏
  • 举报
回复
我来接分啦
大狗狗 2010-12-15
  • 打赏
  • 举报
回复
找到原因了,就是个悲剧:

我程序原先为了减小启动时窗口的闪烁,弄了段延迟加载的代码--正是它导致了边框绘制的异常。

唉--每次当我焦头烂额之后,经常发现问题出在其它地方,各种悲剧。。。

大家只要按照网上方法绘制即可。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧