Invalidate(TRUE)内部机制及刷新窗口部分区域的办法

Invalidate(TRUE)都干了些什么。其实,它只是间接向消息队列添加了WM_ERASEBKGND和WM_PAINT两个消息。但是,如果使用Invalidate(FALSE)的话,则只有WM_PAINT消息产生,这时是不会有任何闪烁的。


刷新窗口部分区域的办法:


RECT rc;
GetClientRect(&rc);
int xStartPos = rc.left + 20;
int yStartPos = rc.top + 20;

rc.left = xStartPos + 5* LimiterAxisIntervalWidth;
rc.top = yStartPos + 5* LimiterAxisIntervalWidth;
rc.bottom = rc.top + 6 * 8 * LimiterAxisIntervalWidth - 5*LimiterAxisIntervalWidth;
rc.right = rc.left + 6 * 8 * LimiterAxisIntervalWidth - 5 * LimiterAxisIntervalWidth;

InvalidateRect(&rc,TRUE);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在 MFC 窗口中画图并且刷新窗口后图形仍然存在,可以通过以下步骤实现: 1. 在 MFC 应用程序中创建一个继承自 CWnd 的类,这个类将用于绘制图形和处理窗口消息。 2. 在这个类的构造函数中创建一个用于绘制图形的 CDC 对象。 3. 重写 OnPaint() 函数,在该函数中使用 CDC 对象绘制图形。 4. 如果需要实现图形的动态更新,可以使用定时器或者其他方式触发 Invalidate() 函数,使窗口重绘。 下面是一个简单的示例代码,用于在 MFC 窗口中绘制一个矩形并实现动态更新: ```c++ class CMyWnd : public CWnd { public: CMyWnd() { m_rect.SetRect(100, 100, 200, 200); m_bMoving = false; m_pTimer = new CTimer(this); m_pTimer->SetTimer(50); } afx_msg void OnPaint() { CPaintDC dc(this); dc.Rectangle(m_rect); } afx_msg void OnTimer(UINT nIDEvent) { if (nIDEvent == m_pTimer->GetTimerID()) { if (m_bMoving) { m_rect.OffsetRect(5, 0); Invalidate(); } } CWnd::OnTimer(nIDEvent); } afx_msg void OnLButtonDown(UINT nFlags, CPoint point) { if (m_rect.PtInRect(point)) { m_bMoving = true; } CWnd::OnLButtonDown(nFlags, point); } afx_msg void OnLButtonUp(UINT nFlags, CPoint point) { m_bMoving = false; CWnd::OnLButtonUp(nFlags, point); } private: CRect m_rect; bool m_bMoving; CTimer* m_pTimer; }; ``` 在应用程序的 InitInstance() 函数中创建该窗口: ```c++ BOOL CMyApp::InitInstance() { // ... CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame; CMyWnd* pMyWnd = new CMyWnd; pMyWnd->Create(NULL, L"My Window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CRect(0, 0, 400, 400), pMainFrame, 0); pMyWnd->UpdateWindow(); // ... return TRUE; } ``` 这段代码创建了一个大小为 400x400 的窗口窗口中绘制了一个大小为 100x100 的矩形,并且矩形可以通过鼠标拖动实现移动。同时,定时器每隔 50 毫秒触发一次,如果矩形正在移动,则调用 Invalidate() 函数使窗口重绘。这样就能实现动态更新了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ToneChip

授人以鱼不如授人以渔

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值