zoukankan      html  css  js  c++  java
  • 28、深入浅出MFC学习笔记,View功能的加强和重绘效率的提高

    1、同一份Document的多个views,在Document的一个view改变了后,如何同步其它view呢?

        让所有的Views 同步更新资料的关键在于两个函数:

        1CDocument::UpdateAllViews:这个函数会巡访所有隶属同一份Document的各个Views,找到一个就通知一个,而所谓「通知」就是调用其OnUpdate 函数。

    2CView::OnUpdate:我们可以在这个函数中设计绘图动作。或许是全部重绘,或许想办法只绘必要的一小部份。

    wps_clip_image-14058

    通常你不应该在OnUpdate 中执行绘图动作,所有的绘图动作最好都应该集中在OnDraw;你在OnUpdate函数中的行为应该是计算哪一块区域需要重绘,然后调用CWnd::InvalidateRect,发出WM_PAINTOnDraw去画图。

        结论是,改善同步更新以及绘图效率的前置工作如下:

        1)定义hint 的数据类型,用以描述已遭修改的资料区域。

        2)当使用者透过View 改变了Document 内容,程序应该产生一个hint,描述此一修改,并以它做为参数,调用UpdateAllViews

    3)改写CMyView::OnUpdate,利用hint 设计高效率绘图动作,使hint 描述区之外的区域不要重画。

    virtual void OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint );
    

    2、默认情况下,OnUpdate 所收到的无效区(也就是重绘区),是Document Frame 窗口的整个内部。

    3、带有滚动条的窗口的重绘

    示例代码

    CStroke* pStroke = (CStroke*)pHint;
    CClientDC dc(this);
    OnPrepareDC(&dc);
    CRect rectInvalid = pStroke->GetBoundingRect();
    dc.LPtoDP(&rectInvalid);
    InvalidateRect(&rectInvalid);
    

    其中,OnPrepareDC虚函数会因滑块的位置而调整DC原点;LPtoDP则是把装置位标改为逻辑坐标(以窗口绘图区左上角为原点的窗口坐标系统,改为以文件左上角为原点的逻辑坐标系统)。

    4、大窗口中的小窗口,Splitter[1,P484]

    参考

    [1] 深入浅出MFC

  • 相关阅读:
    windwos8.1英文版安装SQL2008 R2中断停止的解决方案
    indwows8.1 英文版64位安装数据库时出现The ENU localization is not supported by this SQL Server media
    Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
    SQL数据附加问题
    eclipse,myeclipse中集合svn的方法
    JAVA SSH 框架介绍
    SSH框架-相关知识点
    SuperMapRealSpace Heading Tilt Roll的理解
    SuperMap iserver manage不能访问本地目的(IE9)
    Myeclipse中js文件中的乱码处理
  • 原文地址:https://www.cnblogs.com/mydomain/p/1967480.html
Copyright © 2011-2022 走看看