c++ win32api中用什么函数可以擦区域背景?类似于InvalidateRect(hwnd,NULL,true),但不是全部区域
2个回答
展开全部
BOOL InvalidateRect(
__in HWND hWnd,
__in const RECT *lpRect,
__in BOOL bErase
);
这才是InvalidateRect的原型。你将lpRect设为NULL,所以才更新整个区域。如果你传入一个矩形区域结构的指针。那么就只会更新这块矩形区域。
还有这函数的用处是使得指定矩形区域将被redraw。
还有个功能类似的函数:
BOOL InvalidateRgn(
__in HWND hWnd,
__in HRGN hRgn,
__in BOOL bErase
);
只不过这个函数指定的不是某块矩形区域,而是某块区域。这区域有可能是圆的或其他什么形状。具体看你传入的区域结构怎么定义。当然当hRgn也为NULL时,功能就和InvalidateRect一个样了
还有我可没抄百度哦
__in HWND hWnd,
__in const RECT *lpRect,
__in BOOL bErase
);
这才是InvalidateRect的原型。你将lpRect设为NULL,所以才更新整个区域。如果你传入一个矩形区域结构的指针。那么就只会更新这块矩形区域。
还有这函数的用处是使得指定矩形区域将被redraw。
还有个功能类似的函数:
BOOL InvalidateRgn(
__in HWND hWnd,
__in HRGN hRgn,
__in BOOL bErase
);
只不过这个函数指定的不是某块矩形区域,而是某块区域。这区域有可能是圆的或其他什么形状。具体看你传入的区域结构怎么定义。当然当hRgn也为NULL时,功能就和InvalidateRect一个样了
还有我可没抄百度哦
追问
sn.left=snake.lx*20+20;
sn.top=snake.ly*20+68;
sn.right=snake.lx*20+20+20;
sn.bottom=snake.ly*20+68+20;
InvalidateRect(hWnd, NULL,false);
InvalidateRect(hWnd, &sn, true);
编译通过 但还是全屏闪
追答
闪屏的原因是因为windows刷新窗口前,会先用背景色覆盖刷新区域,然后再绘制真正的东西。解决方法就是用内存DC,在内存DC上面画了再拷贝到pDC,就是所谓的double buffer啦。同时还处理WM_ERSEBKGND消息,在OnEraseBkgnd里面直接返回TRUE,这样windows就不会用背景色先行填充刷新区域了。而是由你负责直接将结果填入刷新区域。
还有一般上诉方法是要人工负责更新整个窗口的
展开全部
InvalidateRect不就是吗?其中第2个参数就可以指定重绘区
---------------------------------------------------------------------------------------------------
该函数向指定的窗体添加一个矩形,然后窗口客户区域的这一部分将被重新绘制。
BOOL InvalidateRect(
HWND hWnd, // handle of window with changed update region
CONST RECT *lpRect, // address of rectangle coordinates
BOOL bErase // erase-background flag
);
参数:
hWnd:要更新的客户区所在的窗体的句柄。如果为NULL,则系统将在函数返回前重新绘制所有的窗口, 然后发送 WM_ERASEBKGND 和 WM_NCPAINT 给窗口过程处理函数。
lpRect:无效区域的矩形代表,它是一个结构体指针,存放着矩形的大小。如果为NULL,全部的窗口客户区域将被增加到更新区域中。
bErase:指出无效矩形被标记为有效后,是否重画该区域,重画时用预先定义好的画刷。当指定TRUE时需要重画。
返回值:
函数成功则返回非零值,否则返回零值。
说明:被标记为无效矩形的区域直到WM_PAINT消息被处理完之后才会消失,或者使用ValidateRect(),ValidateRgn()函数来使之有效。当应用程序的消息队列中为空时,并且窗体要更新的区域非空时,系统会发送一个WM_PAINT消息到窗体。
这两个都用于声明客户区无效,当下一个WM_PAINT消息到来时发生重画。
其中InvalidateRect(hwnd, NULL, true);重画时将擦除背景。
InvalidateRect(hwnd, NULL, false);重画时不擦除背景
需要:
Windows NT/2000/XP/Vista: 包含Windows NT 3.1以及之后版本。
Windows 95/98/Me: 包含Windows 95 以及之后版本。
Header: 声明在 Winuser.h中; 包含在Windows.h中。
Library: Use User32.lib.
---------------------------------------------------------------------------------------------------
该函数向指定的窗体添加一个矩形,然后窗口客户区域的这一部分将被重新绘制。
BOOL InvalidateRect(
HWND hWnd, // handle of window with changed update region
CONST RECT *lpRect, // address of rectangle coordinates
BOOL bErase // erase-background flag
);
参数:
hWnd:要更新的客户区所在的窗体的句柄。如果为NULL,则系统将在函数返回前重新绘制所有的窗口, 然后发送 WM_ERASEBKGND 和 WM_NCPAINT 给窗口过程处理函数。
lpRect:无效区域的矩形代表,它是一个结构体指针,存放着矩形的大小。如果为NULL,全部的窗口客户区域将被增加到更新区域中。
bErase:指出无效矩形被标记为有效后,是否重画该区域,重画时用预先定义好的画刷。当指定TRUE时需要重画。
返回值:
函数成功则返回非零值,否则返回零值。
说明:被标记为无效矩形的区域直到WM_PAINT消息被处理完之后才会消失,或者使用ValidateRect(),ValidateRgn()函数来使之有效。当应用程序的消息队列中为空时,并且窗体要更新的区域非空时,系统会发送一个WM_PAINT消息到窗体。
这两个都用于声明客户区无效,当下一个WM_PAINT消息到来时发生重画。
其中InvalidateRect(hwnd, NULL, true);重画时将擦除背景。
InvalidateRect(hwnd, NULL, false);重画时不擦除背景
需要:
Windows NT/2000/XP/Vista: 包含Windows NT 3.1以及之后版本。
Windows 95/98/Me: 包含Windows 95 以及之后版本。
Header: 声明在 Winuser.h中; 包含在Windows.h中。
Library: Use User32.lib.
参考资料: http://baike.baidu.com/view/1226797.htm
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询