1.ValidateRect()函数的疑问
The BeginPaint function automatically validates the entire client area. Neither the ValidateRect nor ValidateRgn function should be called if a portion of the update region must be validated before the next WM_PAINT message is generated. The system continues to generate WM_PAINT messages until the current update region is validated.
这里说如果一部分更新区必须有效的话,在下一个WM_PAINT信息生成前,ValidateRect和ValidateRgn函数都不应被调用,是指什么情况啊?
E文不好,看不懂了,高手能否举个例子啊。
还有,这个无效,有效是什么意思啊,搞不懂。
如果无效一个矩形区,系统就会发WM_PAINT消息,然后BeginPaint函数把整个区域都变成有效,然后就是画图了,那就是说必须有效的区域才能画图?2.英寸的意思?
小字体是96象素/英寸,大字体是120象素/英寸
这里的英寸指的是什么尺寸啊?在屏幕上实际量到的尺寸,还是???
这样的话,在小字体情况下,一个象素是1/96英寸大小了,而大字体情况下一个象素是1/120英寸大小
根据msdn里说,字是由点(point)组成的,每个点的大小为1/72英寸(这里的英寸是什么意思?)
一般来说,一个字有10点组成,也就是说一个字的大小就是10/72英寸
然后再转换成象素,小字体是96*10/72象素,大字体是120*10/72象素,这样就对了,但是英寸是什么意思呢?
不太明白啊?高手能否指点一下?

解决方案 »

  1.   

    先第二个, 英寸是 WINDOWS 绘图的逻辑单位. 最终这个单位要映射到物理设备上. 详细信息你可以看 <<windows 程序设计>>. 第一个. ValidateRgn, ValidateRect 是使一个窗口的指定一个区域或矩形无效, 调用后,这两个函数都会在内部产生WM_PAIN 消息, 并直接调用到窗口过程, 窗口过程处理WM_PAINT进行重绘. 如果你在处理WM_PAINT的地方又设用了 ValidateXXX, 自然就产生了循环调用. 线程会死掉. understand?
      

  2.   

    "就是说必须有效的区域才能画图?"不是这个意思. 你任何时候都可以绘图. 调用 BeginPaint 会让windows系统内部置一个标记, 说明这个窗口已经重绘了,没有无效的区域了, 不需要再发 WM_PAINT 消息了. 
    你在处理WM_PAINT时, 可以用GetDC 获得DC,然后用这个DC画图, 但系统的标记未设置. 系统仍然会产生WM_PAINT, 你的窗口会不断的画啊画画到死为止. 在 DefWindowProc 这个函数内部, 它的操作很简单:
      BeginPaint
      EndPaint
      return 0;
      

  3.   

    噢, 对不起, 我的第一个回贴里的 ValidateXXX 系列有误, 应该是 InvalidateXXX 这才是使窗口无效的函数. ValidateXXX 会让窗口变得有效. 不会再产生 WM_PAINT 消息
      

  4.   

    第二个问题,我正在看programming windows,不明白英寸的这块内容
    能否请您说的详细点?
      

  5.   

    能显示.无效只是表示它将要被更新,windows系统准备会产生WM_PAINT 消息.
    你想想无效的产生原因,是因为A窗口的部分或全部被B窗口挡住,有一个事件后(A窗口被激活,或B窗口销毁等)A窗口原来被挡住不可见的部分变为可见,它需要重新画出那部分. 那部分就成为无效.