其实我写的这几篇质量确实很低,我完全是按自己理解的写的,因为我也是初学,故显得有些乱。以前看到论坛里讨论操作系统的贴子,主题是关于用哪个操作系统好,争得比较火爆。有人说WINDOWS是垃圾,有人说LINUX是王者,可能还有的人是DOS迷吧,意见不大统一。我觉得WINDOWS最好的东西也就是这个了GDI,图形设备接口,因为它是图形化直观的操作计算机,所以在PC机进入普通人生活的时候,这样简单直观的操作系统也就为很多人接受了。我觉得WINDOWS甚至可以成为操作系统的标准,或者说个人计算机操作系统的标准,就像网络一样ISO/OSI虽然是国际标准,但是事实上的标准却是TCP/IP,在这个时候,市场决定了标准。不扯远了,说GDI。这个接口有什么用?它可以让我们轻易的使用图形设备。这里需要先确定一个设备环境(Device Context),简称DC(这个名字你很熟?),它就是一个区域,比如一个窗体,它会占有显示器中间的一个矩形框区域,常用的区域都矩形,因为当区域重叠的时候方便系统计算覆盖情况。如下部分程序:case WM_PAINT:{ char szText[]="Hello!Windows!"; HDC hdc; PAINTSTRUCT ps; hdc=::BeginPaint(hwnd,&ps); //在这里画图 ::TextOut(hdc,10,10,szText,strlen(szText)); ::EndPaint(hwnd,&ps); return 0;}显然是在处理WM_PAINT消息,收到这个消息就说明,客户区需要重画,比如我们在调整窗体大小后。hdc是设备环境的句柄,ps是特定的PaintStruct,::BeginPaint()是获得特定窗口句柄的客户区DC句柄,当然hwnd就是该实例的主窗口句柄了。最后的::EndPaint()关闭hdc,在它们之间可以对hdc所指的DC中绘图。而::TextOut()则是绘制文字的GDI函数了。此外,还可以用::GetWindowDC(hwnd)获得hwnd的整个窗口的设备环境句柄,包括了整个窗体区域。用它得到的hdc就不是用::EndPaint()关闭,而是用::ReleaseDC(hwnd,hdc);释放。除了在处理WM_PAINT消息之外,在其它的函数中如果要绘图,则用::GetDC(hwnd)获得窗口客户区DC句柄,同样用::ReleaseDC()释放。RGB色彩空间WINDOWS中的像素是32位的,但是只有前24位使用,分三个部分,分别是红、绿、蓝分量,位信息如下:31...24,23...16,15...8,7...0空(0) 蓝 绿 红于是就可以用这样的宏把三个分量合起来表示颜色#define RGB(r,g,b) (COLORREF)((BYTE)(r)|(WORD)((BYTE)(g)<<8)|(DWORD)((BYTE)(b)<<16))比如RGB(255,0,0)就表示红色画线条画线条的时候,有一个当前点,用::MoveToEx(hdc,x,y,NULL)设置当前点。从当前点出发,可以画直线::LineTo(hdc,x,y);,它带有To说明画了之后将改变当前点。画多个线条::Polyline(hdc,lpPoint,cPoints)lpPoint是*Point型,是点的起始地址,cPoints是点的个数,它将不改变当前点;另外一个::PolylineTo()将改变当前点。画区域区域边线需要设定画笔,区域内需要设定刷子。新建的画刷用::SelectObject()选中,同时返回老的画刷,用完后用::DeleteObject()释放前还需把老的画刷选中还原。可以画的图形有:画矩形的Rectangle,画椭圆的Ellipse,画多边形的Polygon,画弦的Chord等。此外还有坐标系统,用GDI可以简单的建立自己的坐标系统,而对于前面的函数中的坐标都是用的逻辑坐标,所以可以非常方便的转化和映象。不再话下。

评论