显示区域
1:显示区域是整个应用程序中为被标题列,窗口边框,以及可选的菜单列,工具列,状态列和滚动条占据的部分。简而言之,就是窗口中可以由程序而难以书写和传递视觉信息的部分。
2:显示区域内可以为所欲为,只不过不能假定窗口大小是某一特定尺寸,所以尽管可以建立固定大小的窗口(这对于计算器之类的应用是合理的),但在大多数情况下使用者应该能够改变应用程序框口的大小。这有2种可能。一种是程序只有仅能显示「hello」的显示区域;还有另一种可能,即程序在一个大屏幕、高分辨率的系统上执行,其显示区域大得足以显示两整页文字。灵活地处理这两种极端是Windows程序设计的要点之一。
3:在windows中,只能在窗口的显示区域绘制文字和图形,而且不能确保在显示区域内显示的内容会一直保留到程序下一次有意的改写它时还保留在那里。 例如,使用者可能会移动另一个程序的窗口,这就可能覆盖您的应用程序的一部分,windows不会保存您的窗口中别其他程序覆盖的区域,当程序移开后,windows会要求您的程序更新显示区域的这个部分。
windows 是一个消息驱动程序,它通过把消息投入应用程序消息队列中或者把消息发送给合适的窗口消息处理成,将发生的各种事件通知给应用程序。windows通过发送WM_PAINT消息通知窗口消息处理程序。
WM_PAINT消息
1:windows给窗口消息处理程曦发送的第一WM_PAINT消息是在WinMain进入消息循环之前的初始化期间。此后,窗口消息处理程序就在任何时刻准备处理其他wm_paint消息。
2:窗口消息处理程序接受到WM_PAINT的情况
1:使用者移动窗口或者显示窗口时,窗口中先前被隐藏的重新可见
2:使用者改变窗口大小
3:程序使用ScrollWindow或Scroll函数滚动显示区域的一部分。
4:程序使用IvalidateRect或者IvalidateRgn函数刻意产生WM_PAINT
3: windows可能发送WM_PAINT消息
1:Windows擦除覆盖了部分窗口的对话框或者消息框
2:菜单拉下来,然后被释放
3:显示工具提示消息
4:windows总保存它覆盖的显示区域,然后恢复它
1:鼠标光标穿越显示区域
2:图标拖过显示区域
无效区域和有效区域
1:Windows内部为每个窗口保存一个「绘图信息结构」,这个结构包含了包围无效区域的最小矩形的坐标以及其它信息,这个矩形就叫做「无效矩形」,有时也称为「无效区域」。如果在窗口消息处理程序处理WM_PAINT消息之前显示区域中的另一个区域变为无效,则Windows计算出一个包围两个区域的新的无效区域(以及一个新的无效矩形),并将这种变化后的信息放在绘制信息结构中。Windows不会将多个WM_PAINT消息都放在消息队列中。
2:窗口消息处理程序可以通过呼叫InvaladataRECT是显示区域无效.
3:在处理WM_PAINT消息处理期间,窗口消息处理程序在呼叫了BeginPaint之后,整个显示区域即变为有效。程序也可以通过呼叫ValidateRect函数使显示区域内的任意矩形区域变为有效。如果这呼叫具有令整个无效区域变为有效的效果,则目前队列中的任何WM_PAINT消息都将被删除。
GDI
要在窗口的显示区域绘图,可以使用Windows的图形设备接口(GDI)函数,hdc参数是「设备内容句柄」,它是GDI的重要部分。实际上,每个GDI函数都需要将这个句柄作为函数的第一个参数。
hdc 设备内容句柄
1:句柄只不过是一个数值,Windows以它在内部使用对象。程序写作者从Windows取得句柄,然后在其它函数中使用该句柄。
2:设备内容句柄是gdi函数的窗口"通行证",有了这种设备内容句柄,就能自如的在显示区域上绘图.
3设备内容(简称dc),实际上是gdi内部保存的数据结构.设备内容与特定的显示设备相关(如视讯显示器),对于显示器,设备内容总是与显示器上的特定窗口相关.
4:设备中有些值是图形{属性},这些属性定义了gdi绘图函数工作的细节
5:当程序需要绘图的时候,它必须先取得设备内容句柄,然后用内定的属性值填入内部设备内容结构.可以通过呼叫不同的GDI函数改变这些默认值。利用其它的GDI函数可以取得这些属性的目前值。当然,还有其它的GDI函数能够在窗口的显示区域真正地绘图。当程序在显示区域绘图完毕后,必须释放设备内容句柄,句柄被释放后就不再有效了,且不能再被使用.
6:程序必须在处理单个消息处理期间取得和释放句柄。除了呼叫CreateDC(函数,在本章暂不讲述)建立的设备内容之外,程序不能在两个消息之间保存其它设备内容句柄。
取得设备句柄的方法
1