VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 400|回复: 6

[讨论] InvalidateRect总是无效

[复制链接]
46_avatar_middle
最佳答案
4 
在线会员 发表于 2022-4-27 06:02:18 | 显示全部楼层 |阅读模式
CRect clientRect;
GetClientRect(&clientRect);
InvalidateRect(clientRect, FALSE);
上面的代码能够引发OnPaint调用,但是设置的无效区域总是为空,导致无法重绘无效区域:
InvalidateRect总是无效

是我做错了吗,错在哪里了?




上一篇:正在阅读《Windows图形编程》
下一篇:旋转3d图形,保持编辑框焦点
52_avatar_middle
最佳答案
1 
在线会员 发表于 2022-4-27 12:53:21 | 显示全部楼层
本帖最后由 VC低调 于 2022-4-27 12:57 编辑

是SDK编程吗?InvalidateRectAPI 是有三个参数的,我看你的,只有两个参数,指定窗体句柄试试,最后一个参数设置为 TRUE试试 加Q1225744392一起学习
17_avatar_middle
最佳答案
40 
在线会员 发表于 2022-4-27 13:01:48 | 显示全部楼层
单纯那几句看不出问题。这个给你参考。

  1.           case  WM_LBUTTONDOWN:
  2.                   //InvalidateRect(hWnd, NULL, true);//添加更新区域
  3.                   //UpdateWindow(hWnd);//更新区域不为空,则马上发出WM_PAINT消息
  4.                
  5.                   //不管窗口的任何部分是否无效,都会导致WM_PAINT消息被发布到窗口。
  6.                   RedrawWindow(hWnd, NULL, NULL, RDW_INTERNALPAINT);
  7.                   break;

  8.           case  WM_NCPAINT://自定义绘制非客户区
  9.                   HDC  hdc = GetWindowDC(hWnd);
  10.                   RECT  r;
  11.                   r.left = 0;
  12.                   r.top = 0;
  13.                   r.right = 300;
  14.                   r.bottom = 30;
  15.                   HBRUSH  brh = CreateSolidBrush(RGB(255, 0, 0));
  16.                   FillRect(hdc, &r, brh);
  17.                   SetBkMode(hdc, TRANSPARENT);
  18.                   TextOutA(hdc, 5, 5, "自定义窗口标题", 14);//最后一个参数为字符串长度
  19.                   DeleteObject(brh);
  20.                   ReleaseDC(hWnd,  hdc);
  21.                   return  true;
  22.                   //break;
  23.         }
复制代码
46_avatar_middle
最佳答案
4 
ico_lz  楼主| 发表于 2022-4-27 19:36:31 | 显示全部楼层
VC低调 发表于 2022-4-27 12:53
是SDK编程吗?InvalidateRectAPI 是有三个参数的,我看你的,只有两个参数,指定窗体句柄试试,最后一个参 ...

不是sdk,用的是MFC
46_avatar_middle
最佳答案
4 
ico_lz  楼主| 发表于 2022-4-27 20:15:13 | 显示全部楼层
yoobaby 发表于 2022-4-27 13:01
单纯那几句看不出问题。这个给你参考。

我的情况是这样的:
1.我在自绘窗口
2.去掉了窗口的标题栏和边框,只剩下一个客户区
3.我在客户区上部划了一部分区域作为标题栏区域,并自绘完成了
4.划定了客户区四周的一部分作为4个边框,也自绘完成了

现在的问题是
1.我需要拖动窗口的边框,以便改变窗口的大小
2.改变窗口的大小就需要重绘边框,以及部分区域的背景色
3.我现在能做的是拖动边框将窗口变小
4。我拖动边框将窗口变大,比如往下拖动底部边框,但是拖不动,而实际上整个窗口是变大了的。
通过代码:
CRect clientRect;
GetClientRect(&clientRect);
能够发现clientRect.bottom 从355 变成了 566
但是看起来窗口大小没有改变

而我设定的无效区域好像不能超过窗口的原始大小355

我这么重绘窗口的思路有问题吗?
60_avatar_middle
最佳答案
4 
在线会员 发表于 2022-4-29 09:22:11 | 显示全部楼层
CIA 发表于 2022-4-27 20:15
我的情况是这样的:
1.我在自绘窗口
2.去掉了窗口的标题栏和边框,只剩下一个客户区

一般情况下InvalidateRect在WM_SIZING和WM_SIZE不同情况下效果不一样,OnDraw或者OnPaint前否完成各种参数的更新也不一样,注意一下先后顺序可能就好了。
46_avatar_middle
最佳答案
4 
ico_lz  楼主| 发表于 2022-4-29 20:59:02 | 显示全部楼层
netforfun 发表于 2022-4-29 09:22
一般情况下InvalidateRect在WM_SIZING和WM_SIZE不同情况下效果不一样,OnDraw或者OnPaint前否完成各种参 ...

为何效果不一样呢,我相关资料吗?
msdn中没有查询到相关的信息
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-6-10 05:09

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表