windows编程:关于InvalidateRect的第3个参数问题。 50

我的理解是:若第3个参数为true,则会像擦掉黑板上的所有线条,再重新绘制WM_PAINT里的代码;否则,在黑板上直接绘制WM_PAINT里的代码(不擦除)。不知道这样理... 我的理解是:若第3个参数为true,则会像擦掉黑板上的所有线条,再重新绘制WM_PAINT里的代码;否则,在黑板上直接绘制WM_PAINT里的代码(不擦除)。不知道这样理解对吗?
如下代码是实现当点击窗口上某块位置会画一个叉,当再次点击同一块位置叉叉会消失。但是,若对InvalidateRect的理解正确的话,为什么第3个参数为false,若不擦除背景,怎么可能会使原来的线条消失呢?
switch(message)
{
case WM_SIZE :
cxBlock = LOWORD (lParam) / DIVISIONS ;
cyBlock = HIWORD (lParam) / DIVISIONS ;
return 0 ;
case WM_LBUTTONDOWN:
x = LOWORD (lParam) / cxBlock ;
y = HIWORD (lParam) / cyBlock ;
if (x < DIVISIONS && y < DIVISIONS)
{
fState [x][y] ^= 1 ;
rect.left = x * cxBlock ;
rect.top = y * cyBlock ;
rect.right = (x + 1) * cxBlock ;
rect.bottom = (y + 1) * cyBlock ;
InvalidateRect (hwnd, &rect, FALSE) ;
}
else
{
MessageBeep(0);
}
return 0;
case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;
for (x = 0 ; x < DIVISIONS ; x++)
for (y = 0 ; y < DIVISIONS ; y++)
{
Rectangle (hdc, x * cxBlock, y * cyBlock,(x + 1) * cxBlock, (y + 1) * cyBlock) ;
if (fState [x][y])
{
MoveToEx (hdc, x * cxBlock, y * cyBlock, NULL) ;
LineTo(hdc, (x+1) * cxBlock, (y+1) * cyBlock) ;
MoveToEx (hdc, x * cxBlock, (y+1) * cyBlock, NULL) ;
LineTo (hdc, (x+1) * cxBlock, y * cyBlock) ;
}
}
EndPaint (hwnd,&ps);
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
展开
 我来答
寻求zhe
2013-06-17 · 超过42用户采纳过TA的回答
知道小有建树答主
回答量:86
采纳率:0%
帮助的人:82.1万
展开全部
InvalidateRect()的第三个参数是决定是否给程序发送WM_ERASEBKGND消息,为FALSE的话则不发送该消息。如果想改变背景,可以在该消息的处理过程中对背景做一些处理。拿上面的例子来说就是在switc语句中添加一条:"case WM_ERASEBKGND:。。。//处理过程"。

对于上面的程序为什么仍然会擦除背景是因为:InvalidateRect函数会给系统发送WM_PAINT消息,因此在程序中执行到该函数时则给程序发送WM_PAINT消息,即转到WM_PAINT消息处理里面里,然后由fState[x][y]决定是否画叉,具体fState数组刚开始内容应该为0,所以刚开始什么都没有,但当你处理WM_LBUTTONDOWN时静fState[x][y]与1异或了所以变成了1,然后WM_PAINT消息里面的if (fState [x][y]){};这条语句就执行了,也就是画了叉,当再点的时候1与1异或又变成0了,所以又把叉给擦了。

说的有点多啊,可能表述的不太清楚。总的来说就是你每点一次左键都会响应一次WM_PAINT消息,而WM_PAINT的处理函数是把整个窗口分成很多个小方框,用一个数组来决定小方框里面是否画叉,如果数组元素为1则画叉,如果为0则不画。每次处理WM_PAINT消息都要对数组进行遍历一次已决定是否画叉。

因此我感觉InvalidateRect的第三个参数是true还是false跟这个程序没啥关系。
追问
我的疑问是:若某快区域现在是被画 叉了的,再次点击该域,fState[x][y]变为0了,重绘的时候就不会再画叉了(if语句不会执行),但我InvalidateRect的第3个参数为false,重绘不擦除背景,之前的叉叉不就是还在么?但实际情况却不是如此,这是为什么?
意法半导体(中国)投资有限公司
2023-06-12 广告
单片机,即单片微控制器,也称为单片微型计算机,是将中央处理器(CPU)、存储器(ROM,RAM)、输入/输出接口和其他功能部件集成在一块 在一个小块的集成电路上,从而实现对整个电路或系统的数字式控制。单片机不是完成某一个逻辑功能的芯片,而是... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
归悦欣cf
2013-06-15 · TA获得超过1443个赞
知道大有可为答主
回答量:4250
采纳率:59%
帮助的人:1321万
展开全部
背景刷新是在函数OnEraseBkgnd函数里进行,可以参考该函数说明。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wsj99868900
2013-06-14 · TA获得超过5712个赞
知道小有建树答主
回答量:250
采纳率:60%
帮助的人:47.2万
展开全部
额?我怎么发现这个函数就两个参数呢
追问
InvalidateRect (hwnd, &rect, FALSE) ;
windows版
追答
哦,是这样的,第一个参数,也就是窗口句柄,在MFC中默认是当前窗口句柄,所以干脆就把函数重写成后面两个参数。在MFC中,只需要后面两个参数。至于你说的第三个参数,我这边实验的结果是,是否重画的功能。ps.一般这个函数紧接着要写updateWindow(),强制刷新,即使你说的第三个参数是false,也能显示出重画的效果
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式