在大多数 GDI 函数调用中,使用 COLORREF 值(只是一个32位的无符号长整数)来表示一种色彩。COLORREF 值按照红、绿和蓝色的亮度指定了一种颜色,通常叫做“RGB色彩”。
windows 头文件 WINGDI.H 提供了几种使用 RGB 色彩值的宏。RGB 宏要求三个参数分别代表红、绿和蓝值,然后将它们组合为一个无符号长整数:
#define RGB(r,g,b) ((COLORREF)(((BYTE)(r) | \
((WORD)((BYTE)(g)) << 8)) | \
(((DWORD)(BYTE)(b)) << 16 )))
注意三个参数的顺序是红、绿和蓝值。因此,值 RGB(255,255,0) 是0x0000FFFF 或黄色(红色和绿色的合成)。
可以调用 GetNearestColor 来决定与某一色彩最接近的纯色:
crPureColor = GetNearestColor(hdc,crColor);
对于打印机,经常用“每英寸的点数(dpi)”表示分辨率。
例如,大多数激光打印机有300或600 dpi 的分辨率。
视频显示器的分辨率是以水平和垂直的总的像素数来表示的。
例如,1024 * 768。
备注:
Windows 应用程序可以使用 SM_CXSCREEN 和 SM_CYSCREEN 参数从 GetSystemMetrics 得到像素尺寸。
程序也可以用 HORZRES(水平分辨率)和 VERTRES 参数从 GetDeviceCaps 中得到同样的值。
BOOL UpdateWindow(
HWND hWnd // handle to window
);
如果客户区的任一部分无效,UpdateWindow 将导致 Windows 用 WM_PAINT 消息调用窗口过程(如果整个客户区有效,则不调用窗口过程)。
这一 WM_PAINT 消息不进入消息队列,直接由 Windows 调用窗口过程。窗口过程完成刷新后立即退出,Windows 将控制返回给程序中 UpdateWindow 调用之后的语句。
如果希望立即刷新无效区域,可以在调用 InvalidateRect 之后调用 UpdateWindow函数。
确定窗口客户区大小的一个好方法是在窗口过程中处理WM_SIZE消息。
在窗口大小改变时,Windows(操作系统) 给窗口过程发送一个 WM_SIZE 消息。传给窗口过程的 lParam 参数的低位字节中包含客户区的宽度,高位字节中包含客户区的高度。
LOWORD(lParam); // 获取客户区的宽度
HIWORD(lParam); // 获取客户区的高度
Windows 是一个消息驱动系统。它通过把消息投入应用程序消息队列中或者把消息发送给合适的窗口过程,将发生的各种事件通知给应用程序。
一个Windows 程序可以包含多个窗口过程。一个窗口过程总是与调用RegisterClass注册的特定窗口类相关联。
程序通常不直接调用窗口过程。窗口过程通常由 Windows 本身调用。通过调用 SendMessage 函数,程序能够直接调用它自己的窗口过程。
窗口过程在处理消息时,必须返回0。窗口过程不予处理的所有消息应该被传给名为 DefWindowProc 的 Windwos 函数。
从 DefWindowProc 返回的值必须由窗口过程返回。
客户区就是程序自由绘图并且向用户交付可视输出的窗口区域。
客户区不包含滚动条所占据的空间。