求助c#调用API函数RedrawWindow更新指定区域问题

wu1987116 2013-02-17 06:22:23
网上找了半天资料没搞明白,求高手指点下如何用RedrawWindow清除屏幕上指定位置的矩形图象.

矩形是通过


IntPtr DesktopHandle = GetDC(IntPtr.Zero); Graphics g = System.Drawing.Graphics.FromHdc(DesktopHandle); Pen pen = new Pen(Color.Black, 2); g.DrawRectangle(pen, rect.Left, rect.Top, winWidth, winHeight);


画在桌面句柄的窗体上(桌面上),矩形下面有程序窗口。
想要达到的效果,利用RedrawWindow函数清除桌面指定区域绘制出来的矩形,包括画在另外应用程序窗口上的(绘制矩形时下面有其他窗口,所以显示在另个窗口里)
直接执行:RedrawWindow(IntPtr.Zero, null, IntPtr.Zero, 0x85);
可以清除绘制的矩形,但是整个桌面都刷新了一下,和F5效果一样(不要这样的效果,屏幕刷新),
现在想要的是局部刷新,
也就是RedrawWindow函数的2,3,4个参数如何声明和设置

调用代码如下

public class COMRECT
{
public int left;
public int top;
public int right;
public int bottom;
public COMRECT()
{
}
public COMRECT(int left, int top, int right, int bottom)
{
this.left = left;
this.top = top;
this.right = right;
this.bottom = bottom;
}
}

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool RedrawWindow(IntPtr hwnd, COMRECT rcUpdate, IntPtr hrgnUpdate, int flags);

//调用后直接刷新了整个桌面屏幕,和F5效果一样,
RedrawWindow(IntPtr.Zero, null, IntPtr.Zero, 0x85);

//调用这个没有效果,想要达到刷新屏幕上坐标左100,上100,右1000,下700的矩形,使这个范围内画在屏幕上的矩形消除掉,如果该区域内有窗口,矩形会有部分是在窗口上绘制的
COMRECT re = new COMRECT(100, 100,1000,700);
RedrawWindow(IntPtr.Zero, re,IntPtr.Zero, 0x85);
//RedrawWindow函数的第4个参数查了很多资料没有找到对应的值,不知道应该使用哪个参数及对应0X的值


不知道问题出在第2个参数还是第4个参数..

参数如下:
hwnd ----------- Long,要重画的窗口的句柄。零表示更新桌面窗口

lprcUpdate ----- RECT,窗口中需要重画的一个矩形区域

hrgnUpdate ----- Long,一个“区”的句柄,这个区描述了要重画的窗口区域。“区”:Region

fuRedraw ------- Long,规定具体重画操作的旗标。下列常数可组合使用,从而进行复杂的重画行动
RDW_ERASE
重画前,先清除重画区域的背景。也必须指定RDW_INVALIDATE
RDW_FRAME
如非客户区包含在重画区域中,则对非客户区进行更新。也必须指定RDW_INVALIDATE
RDW_INTERNALPAINT
即使窗口并非无效,也向其投递一条WM_PAINT消息
RDW_INVALIDATE
禁用(屏蔽)重画区域
RDW_NOERASE
禁止删除重画区域的背景
RDW_NOFRAME
禁止非客户区域重画(如果它是重画区域的一部分)。也必须指定RDW_VALIDATE
RDW_NOINTERNALPAINT
禁止内部生成或由这个函数生成的任何待决WM_PAINT消息。针对无效区域,仍会生成WM_PAINT消息
RDW_VALIDATE
检验重画区域
RDW_ERASENOW
立即删除指定的重画区域
RDW_UPDATENOW
立即更新指定的重画区域
RDW_ALLCHILDREN
重画操作包括子窗口(前提是它们存在于重画区域)
RDW_NOCHILDREN
重画操作排除子窗口(前提是它们存在于重画区域)


...全文
676 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
陈鑫伟 2014-02-16
  • 打赏
  • 举报
回复
我搞不懂 微软不是已经定义了矩形了吗。你为什么要自己定义一个COMRECT类呢,直接用Rectangle就好了嘛
wu1987116 2013-02-17
  • 打赏
  • 举报
回复
原来C#照着VC源代码调用API也可以。。。 以前一直对VC++没认识,,今天算是认识了
wu1987116 2013-02-17
  • 打赏
  • 举报
回复
换方法解决了 c#一句代码:ControlPaint.DrawReversibleFrame(new Rectangle(100, 100, 300, 300), Color.Transparent, FrameStyle.Thick); c#调API: int deskHwnd=(int)GetDesktopWindow(); int zero = GetWindowDC(deskHwnd); int oldRop2 = SetROP2(zero, 10); int newPen = CreatePen(0, 3, 0); int oldPen = SelectObject(zero, newPen); Rectangle(zero, rect.Left, rect.Top, rect.Right, rect.Bottom); Thread.Sleep(400); Rectangle(zero, rect.Left, rect.Top, rect.Right, rect.Bottom); SetROP2(zero, oldRop2); SelectObject(zero, oldPen); DeleteObject(newPen); ReleaseDC(deskHwnd, zero);

110,561

社区成员

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

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

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