正文

Windows程序设计[5]-认识一下GDI2006-03-30 21:22:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/rickone/11648.html

分享到:

其实我写的这几篇质量确实很低,我完全是按自己理解的写的,因为我也是初学,故显得有些乱。

以前看到论坛里讨论操作系统的贴子,主题是关于用哪个操作系统好,争得比较火爆。有人说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可以简单的建立自己的坐标系统,而对于前面的函数中的坐标都是用的逻辑坐标,所以可以非常方便的转化和映象。不再话下。

阅读(5503) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册