C# 重绘问题

yang_629 2012-09-26 09:53:12
遇到一个恶心的问题。我重绘WinForm 窗口的标题栏,代码是从网上下载下来的,下面的就是的。
 [StructLayout(LayoutKind.Sequential)]
public class TRACKMOUSEEVENT
{
public int cbSize;
public int dwFlags;
public IntPtr hwndTrack;
public int dwHoverTime;
public TRACKMOUSEEVENT()
{
this.cbSize = Marshal.SizeOf(typeof(TRACKMOUSEEVENT));
this.dwHoverTime = 400;
}
}


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

[DllImport("comctl32.dll", ExactSpelling = true)]
private static extern bool _TrackMouseEvent(TRACKMOUSEEVENT tme);


private const int WM_NCPAINT = 0x0085;
private const int WM_NCACTIVATE = 0x0086;

private const int WM_NCLBUTTONDOWN = 0x00A1;
private const int WM_NCMOUSEMOVE = 0x00A0;
private const int WM_NCMOUSELEVEL = 0x02A2;
private const int WM_NCMOUSEHOVER = 0x02A0;
private const int TME_NONCLIENT = 0x00000010;

private bool TrackMouseEvent(TRACKMOUSEEVENT lpEventTrack)
{
if (lpEventTrack.dwFlags == TME_NONCLIENT)
{
/*画出标题栏关闭按钮*/
IntPtr hDC4 = GetWindowDC(lpEventTrack.hwndTrack);
//把DC转换为.NET的Graphics就可以很方便地使用Framework提供的绘图功能了
Graphics gs4 = Graphics.FromHdc(hDC4);
Image img4 = Image.FromFile("close_norm.png");
//显示背景图片
gs4.DrawImage(img4, 50, 5);
// MessageBox.Show("fengzanfeng");
return true;
}
return true;
}


可是为什么运行的时候看到不效果啊,但是如果我把这个窗口当作MDI子窗口或者我远程桌面浏览的时候就能看到效果了。就是直接运行看不到。我纳闷了。不知道有没有人遇到过这种问题啊,麻烦告诉一下怎么解决可以吗?谢了。
...全文
180 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Pigeon汪 2012-09-28
  • 打赏
  • 举报
回复
Control.Refresh();
yang_629 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
public class TRACKMOUSEEVENT
{
public int cbSize;
public int dwFlags;
public IntPtr hwndTrack;
public int dwHoverTime;
public TRACKMOUSEEVENT()
{
this.cbSize = Marshal.SizeOf(t……
[/Quote]

不行啊。。。。哎。。。
liangchengfck1 2012-09-27
  • 打赏
  • 举报
回复
luguo
Trent1985 2012-09-27
  • 打赏
  • 举报
回复
呵呵,顶楼上!!!
江湖评谈 2012-09-26
  • 打赏
  • 举报
回复
public class TRACKMOUSEEVENT
{
public int cbSize;
public int dwFlags;
public IntPtr hwndTrack;
public int dwHoverTime;
public TRACKMOUSEEVENT()
{
this.cbSize = Marshal.SizeOf(typeof(TRACKMOUSEEVENT));
this.dwHoverTime = 400;
}
}

---------------------------
结构体添加 this.dwFlags=TME_NONCLIENT 一句即可看到效果
yang_629 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
参考http://www.cnblogs.com/hanyonglu/archive/2011/04/12/2014228.html
[/Quote]

我把这个人写的代码全拷过来也不行。。。郁闷中。。。。
yang_629 2012-09-26
  • 打赏
  • 举报
回复
上面的代码,我好像少了一部分,如下

protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
// Rectangle vRectangle = new Rectangle((Width - 75) / 2, 3, 75, 25);
Rectangle vRectangle = new Rectangle(0, 0, 800, 30);
Rectangle vRectangleCloseBtn = new Rectangle(50, 5, 64, 19);
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);

/*画出标题栏ICON*/
Size si = new Size(SystemInformation.CaptionButtonSize.Width, SystemInformation.CaptionButtonSize.Height);
IntPtr hDC = GetWindowDC(m.HWnd);
//把DC转换为.NET的Graphics就可以很方便地使用Framework提供的绘图功能了
Graphics gs = Graphics.FromHdc(hDC);
Image img = Image.FromFile("abc.png");
//显示背景图片
gs.DrawImage(img, 5, 5);

/*画出标题栏关闭按钮*/
IntPtr hDC1 = GetWindowDC(m.HWnd);
//把DC转换为.NET的Graphics就可以很方便地使用Framework提供的绘图功能了
Graphics gs1 = Graphics.FromHdc(hDC);
Image img1 = Image.FromFile("close_norm.png");
//显示背景图片
gs.DrawImage(img1, 50, 5);


break;
//case WM_NCLBUTTONDOWN:
// Point vPoint = new Point((int)m.LParam);
// vPoint.Offset(-Left, -Top);
// if (vRectangle.Contains(vPoint))
// MessageBox.Show(vPoint.ToString());
// break;
case WM_NCMOUSEMOVE:
Point vPoint1 = new Point((int)m.LParam);
vPoint1.Offset(-Left, -Top);
if (vRectangleCloseBtn.Contains(vPoint1))
{
IntPtr hDC2 = GetWindowDC(m.HWnd);
//把DC转换为.NET的Graphics就可以很方便地使用Framework提供的绘图功能了
Graphics gs2 = Graphics.FromHdc(hDC2);
Image img2 = Image.FromFile("close_over.png");
//显示背景图片
gs2.DrawImage(img2, 50, 5);

TRACKMOUSEEVENT event1 = new TRACKMOUSEEVENT();
event1.dwFlags = TME_NONCLIENT;
event1.hwndTrack = (IntPtr)this.Handle;
event1.dwHoverTime = 400;
event1.cbSize = 100;
TrackMouseEvent(event1);


}
break;

case WM_NCMOUSELEVEL:
Point vPoint2 = new Point((int)m.LParam);
vPoint2.Offset(-Left, -Top);
if (vRectangleCloseBtn.Contains(vPoint2))
{
IntPtr hDC3 = GetWindowDC(m.HWnd);
//把DC转换为.NET的Graphics就可以很方便地使用Framework提供的绘图功能了
Graphics gs3 = Graphics.FromHdc(hDC3);
Image img3 = Image.FromFile("close_norm.png");
//显示背景图片
gs3.DrawImage(img3, 50, 5);
}
break;


}
}

110,825

社区成员

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

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

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