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子窗口或者我远程桌面浏览的时候就能看到效果了。就是直接运行看不到。我纳闷了。不知道有没有人遇到过这种问题啊,麻烦告诉一下怎么解决可以吗?谢了。
...全文
228 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
  • 打赏
  • 举报
回复
呵呵,顶楼上!!!
jianghupt 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;


}
}
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

111,129

社区成员

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

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

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