窗口得到WM_PAINT消息, 完成这个消息之后是如何将新的内容更新到屏幕上面去的?
一直不明白, 还请指教.

解决方案 »

  1.   

    响应WM_PAINT函数就会调用
    OnPaint函数
    在OnPaint中通过调用CDC函数将图形或图像画到屏幕上
      

  2.   

    你的意思是说WM_PAINT里面会自己去调用更新?
    那么是哪个函数, 或者消息去更新的呢?
    谢谢.
      

  3.   

    re: xuanzg(小钢娃)
    呵~~没来晚.
      

  4.   

    响应WM_PAINT函数就会调用
    OnPaint函数
    在OnPaint中通过调用CDC函数将图形或图像画到屏幕上
      

  5.   

    晕...
    消息WM_PAINT->调用函数OnPaint->函数OnPaint中,画要显示的内容
      

  6.   

    Re: ExplorerOfVc(寥若晨星)
    晕..第一位的COPY版.
      

  7.   

    -_____-|||
    几位误会我的意思了, 这里说的"画显示的内容", 它是画到SCREEN DC上面, 还是FRAME DC上面如果是SCREENT DC上面, 那就没有问题了, 如果是FRAME DC上的话, 那么是在什么地方将FRAME DC上面的更新区域提交到SCREEN DC上面呢?
    谢谢.
      

  8.   

    应该是:
    响应WM_PAINT消息就会调用
    OnPaint函数
    在OnPaint中通过调用CDC函数将图形或图像画到屏幕上
    ,写错了,呵呵。WM_PAINT本身只是个消息的标识,并不是函数
    MFC中为WM_PAINT这个消息配备的相应函数是OnPaint,也就是说
    你的程序一接受到WM_PAINT,就自动调用OnPaint
      

  9.   

    画到客户区的dc上,既不是屏幕dc,也不是框架dc,他们的重画由他们自己维护,你不用管,WM_PAINT处理消息的过程就是把内容会知道屏幕上的过程
      

  10.   

    WM_PAINT处理消息的过程就是把内容会知道屏幕上的过程.这句是不是说当前的DC其实就是映射到SCREEN DC上面呢? 我画到这个DC上面的东西其实就是画到SCREEN DC上面呢?
    不管是不是这倒是个不错的想法.
      

  11.   

    Re: gufengduyu(聪明的呆呆龙)
    呵呵~
    我是想知道WM_PAINT(OnPaint)倒底将要画的东西画到什么地方去了, 最终是如何显示到屏幕上面的.
    感谢你的帮忙~
      

  12.   

    你是要剖析GDI的内部结构吧, 我也想知道:)
      

  13.   

    一旦某个窗口需要重画
    窗口过程便会收到WM_PAINT消息
    (MFC中映射到了On_Paint函数中)
    可以调用API函数来获得需要重画的区域的HDC
    (MFC中已经封装了此过程)
    你只需要在此DC中重画
    即可保证得到所需要的结果
      

  14.   

    我同意聪明的呆呆龙,如果ONPAINT没有改写,则会自动调用ONDRAW。
      

  15.   

    正如   ctan(ctan)   所言, 我正是想知道GDI内部结构(不过也只是冰山一角啦).
    还请各位帮帮忙~~~~
    非常感谢.
      

  16.   

    简述(随便写写,一家之言):
    在DOS时代,我们做显示时,往往必须获得硬件相关的参数/资源,然后调用中断子程序来显示.
    这样做最大的问题就是硬件的兼容性不能保证,换个显卡你的程序能不能运行就成了一个很大的问题.
    为了解决这个问题,Win32的GDI对硬件显示层作了屏蔽,通过一个标准而统一的HDC资源作显示(给我一个HDC,我可以做一切显示),HDC与显卡子程序的交流由操作系统/驱动程序负责.
    当前活动且保持在屏幕最前(即需要显示)的显示区域会映射到内存的显示区域(操作系统管理),所以你在自己HDC上画的东东,会"自动"地将"需要显示的部分"映射到此显示区域,再定时由操作系统将其传输到显存上进行显示.
      

  17.   

    OHHH~~ VERY GOOD~
    这里也讲到了:
      "所以你在自己HDC上画的东东,会"自动"地将"需要显示的部分"映射到此显示区域"
    就是说当前PAINT的就是SCREEN DC了.那么窗口也就没有自己的DC了? 每次要PAINT的时候, 由GDI建立一块映射到当前SCREEN DC上面的DC过来给窗口来PAINT, EndPaint()就是将画完的DC提交上去...
    也就是说, 所有的窗口对PAINT的操作都只是在一个大的SCREEN DC上面操作, 根本没有FRAME DC这个东西, 这个只是一个映射出来的SCREEN DC上的区域.
    这样子说对吗?
    通过的话这个帖可以结了~~
      

  18.   

    基本上可以这么理解.
    再进一步:
    每一个窗口创建以后都会申请到一个DC,(DC本质就是一个表格),申请到DC后,会往这个DC里填相关数据.以后如果这个窗口需要显示时(我认为如果这个窗口没有显示的时候,在内存里是不应该有显示的,当然,如果考虑效率使用显示缓冲的话,则另当别论,其间利敝很难说),则通过DC里的数据,把窗口在内存里"画"出来.
    再细一些,窗口的子窗口怎么显示?估计DC是可以找到它的"子"DC的,譬如通过链表一类的结构.具体怎么实现就没有必要深究了,实现方法千千万.以上皆为凭空而言,仅作为理解之用,无理论依据...
      

  19.   

    谢谢  nlstone(天外流星)  这想法很棒.
    谢谢各位.