 |
应用程序窗口包括许多元素,如标题条、菜单条和窗口菜单(以前叫系统菜单)、最小化按钮、最大化按钮和恢复按钮、可变的边界、客户区、水平和垂直滚动条。应用程序的主窗口提倡包括所有这些元素。下图是一个典型的窗口:
绘图操作只能在客户区中进行。除客户区以外的部分都叫非客户区。(主持人注:如果要在非客户区绘图,需要响应WM_NCPAINT消息。参考:QA001338 "如何在窗体的标题栏中使用自定义的按扭"、QA002120 "拦截WM_MOUSEMOVE消息,但当鼠标位于窗口标题处时无法获取鼠标位置")
在 Windows的作图函数中,涉及逻辑坐标到设备坐标的转换。这里提到的窗口(window)、视口(viewport)是对应的概念。视口是与设备相关的一个矩形区域,坐标单位是与设备相关的。窗口的坐标是逻辑坐标,与设备无关。窗口坐标的原点与视口坐标的原点始终对应于同一点。对于同一个图形,用窗口坐标系统表达的该区域的长和宽与视口的坐标系统表达的长和宽是不同的。二者就定义了这两个坐标系统的比例关系。程序作图时,使用的坐标总是是窗口坐标。而实际的显示或输出设备却各有自己的坐标。例如,有的打印机设备水平和垂直分辨率不同,其象素实际上是长方形。程序编写画一个圆,若不经任何坐标转换,在打印机上输出的就是个椭圆。下面程序示范了如何将窗口逻辑坐标的x,y向象素宽度均映射为输出设备中的 1/64 英寸。
SetMapMode(hDC, MM_ISOTROPIC);
SetWindowExtEx(hDC, 64, 64, NULL);
SetViewportExtEx(hDC, GetDeviceCaps(hDC, LOGPIXELSX),
GetDeviceCaps(hDC, LOGPIXELSY), NULL);
细节请参看VC help:
platform SDK/ Graphics and Multimedia Services / Windows GDI / Coordinate Space and Transformations
此问题由曾侃回答。
附加关键字:编程, 源程序, programming, source code, C/C++, MFC, C++ Builder, Borland C++, Turbo C, C, BCB, 窗体与菜单, form, window, tform。
|