GDI基础
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
面向对象程序设计II
预备知识
GDI(Graphics Device Interface) DC(Device Context)
本章授课内容
GDI概述 设备环境(Device Context) 内存设备(Memory Device Context)
GDI概述
GDI概述
GDI是图形设备接口(Graphics Device Interface或Graphical Device Interface)的 简称,它是微软公司的视窗操作系统(Microsoft Windows)的三大内核部件(也称“子系统”)之一。 GDI主要任务是负责系统与绘图程序之间的信息交换, 处理所有Windows程序的图形输出。 利用GDI所提供的众多函数就可以方便的在屏幕、打印 机及其它输出设备上输出图形,文本等操作。 GDI的出现使程序员无需要关心硬件设备及设备驱动, 就可以将应用程序的输出转化为硬件设备上的输出,实 现了程序开发者与硬件设备的隔离,大大方便了开发工 作。
设备环境是windows内部使用的数据结构,它定义了 GDI函数在显示设备特定区域的工作方式。对视频显示 器来说,设备环境代表屏幕上的一块区域。 要想向某个区域输出文字或者绘制图形,必须先取得 代表此区域的设备环境句柄,以此句柄为参数调用的 GDI函数都是对该区域的操作。
case WM_PAINT: { char szText[] = “hello world!”; PAINTSTRUCT ps; hdc = ::BeginPaint(hwnd, &ps); ::TextOut(hdc,10,10,szText, strlen(szText)); ::EndPaint(hwnd,&ps); return 0; }
知识回顾
GDI(Graphics Device Interface) DC(Device Context)
设备环境
Windows的颜色和像素点
DC上的图形和文本都是由像素点组成的。内存中,用 颜色的取值来表示像素点。
色深指的是存储每个像素所用的位数,一般现在使用 的都是24位色,即用24位表示一个像素,每种颜色都 可以分为红,绿,蓝三原色,所以可以用红,绿,蓝 三分量的组合来表示一种颜色,每个分量占用8位。 在Win32编程中,统一使用32位的整数(一个 COLORREF值)来表示深度为24位的颜色。
COLORREF SetPixel( HDC hdc, // handle to DC int X, // x-coordinate of pixel int Y, // y-coordinate of pixel COLORREF crColor // pixel color );
用GetPixel获取某个像素点的颜色
绘制直线仅仅需要指定线的开始坐标,然后以线的另 一头的坐标为参数调用LineTo函数即可。
::MoveToEx(hDC, 0, 0 ,NULL); ::LineTo(hDC,0,500);
设备环境
自定义画笔
在DC结构中还有一个画笔对象句柄,每次绘画时, GDI函数都会去使用此句柄指示的画笔。画笔对象规定 了线条的宽度,颜色和风格 要想改变DC中默认的画笔,可以使用Windows预定义 的画笔对象,也可以创建新的画笔对象。预定义画笔 对象很简单,仅有 BLACK_PEN,WHITE_PEN,NULL_PEN三种。
设备环境
可以使用RGB宏将三个分量的值组合在一起。
#define RGB(r,g,b) ((COLORREF)(((BYTE)(r) | \ ((WORD)((BYTE)(g)) << 8)) | \ (((DWORD)(BYTE)(b)) << 16)))
用SetPixel函数设置某个像素点的颜色
设备环境
demo02 获得整个窗体的设备环境句柄:
char szText[] = “hello world”; HDC hdc = ::GetWindowDC(hwnd); ::TextOut(hdc,10,10,szText,strlen(szText)); ::ReleaseDC(hwd, hdc); GetWindowDC函数能够取得整个窗口的设备环境句柄,而不仅仅是 窗口的客户区,所以以这个设备句柄为参数的话,GDI函数就可以对 整个窗口区域进行操作。
GDI概述
GDI的结构
GDI概述
GDI由几百个函数和一些相关的数据类型、宏和结构组成 GDI的函数大致分为以下几种
• 取得(或者建立)和释放(或者清除)设备内容的函数 • 取得有关设备内容信息的函数 • 绘图函数 • 设定和取得设备内容参数的函数 • 使用GDI对象的函数
设备环境
设备环境(Device Context)
代码示例:
HDC hdc = ::BeginPaint(hWnd, &ps); HBRUSH hBrush = ::CreateSolidBrush(RGB(255,0,0)); HBRUSH hOldBrush = (HBRUSH)::SelectObject(hdc, hBrush); ::Rectangle(hdc,0,0, 100, 100 ); ::SelectObject(hdc, hOldBrush); ::DeleteObject(hBrush);
demo06
HDC CreateCompatibleDC( HDC hdc // handle to DC );
位拷贝函数
BOOL BitBlt( HDC hdcDest, // handle to destination DC int nXDest, // x-coord of destination upper-left corner int nYDest, // y-coord of destination upper-left corner int nWidth, // width of destination rectangle int nHeight, // height of destination rectangle HDC hdcSrc, // handle to source DC int nXSrc, // x-coordinate of source upper-left corner int nYSrc, // y-coordinate of source upper-left corner DWORD dwRop // raster operation code );
COLORREF GetPixel( HDC hdc, // handle to DC int nXPos, // x-coordinate of pixel int nYPos // y-coordinate of pixel );
设备环境
绘制线条
demo04
绘制线条的函数有画单条直线的LineTo,画多条直线 的Polyline和PolylineTo,画贝塞儿曲线的 PolyBezier和PolyBezierTo,画弧线的Arc和 ArcTo
设备环境
HDC hdc; demo03 char sz[] = “Hello world”; switch( message ) { case WM_LBUTTONDOWN: HDC hdc = ::GetDC(hWnd); ::SetTextColor( hdc, RGB(255,0,0) ); ::SetBkColor( hdc, RGB(0,0,255) ); ::TextOut( hdc, 10, 10, sz, strlen(sz) ); ::ReleaseDC( hWnd, hdc ); break; //......处理其他消息 }
设备环境
绘制区域与画刷 GFra bibliotekI提供了画不同图形的API,可以用Rectangle画矩 形,Ellipse画椭圆形,Polygon画多边形,Chord 画弧。
Rectangle( hdc, x1, y1, x2, y2); Ellipse( hdc, x1, y1, x2, y2 ); Polygon( hdc, lpPoint, 5);
//获取预定义画笔的句柄 HPEN hPen = (HPEN)::GetStockObject(BLACK_PEN); //将画笔句柄选入设备, SelectObject会根据句柄的种类自动替换 原来的对象,并返回原对象的句柄 HPEN hOldPen = (HPEN)::SelectObject(hdc,hPen); //开始在DC中绘图
设备环境
设备环境
客户区和非客户区窗口
应用程序窗口包括许多元素,如标题条、菜单条和窗 口菜单(以前叫系统菜单)、最小化按钮、最大化按钮 和恢复按钮、可变的边界、客户区、水平和垂直滚动 条。应用程序的主窗口提倡包括所有这些元素。
绘图操作只能在客户区中进行。除客户区以外的部分 都叫非客户区。如果要在非客户区绘图,需要响应 WM_NCPAINT消息。
设备环境
CreatePen函数创建自定义的画笔对象
HPEN CreatePen( int fnPenStyle, // pen style int nWidth, // pen width COLORREF crColor // pen color );
代码示例 demo05
HPEN hPen = ::CreatePen( PS_SOLID, 3, RGB(255,0,0)); HPEN hOldPen = (HPEN)::SelectObject(hdc, hPen); ::MoveToEx( hdc, 0, 100, NULL); ::LineTo( hdc, 500, 100 ); ::SelectObject(hdc, hOldPen); ::DeleteObject(hPen);//删除上面创建的画笔对象释放资源
如果不是在处理WM_PAINT消息,可以使用GetDC函数 取得窗口客户区的设备环境句柄,进而进行绘图操作
hDC = ::GetDC(hWnd); //.....//进行绘图 ::ReleaseDC(hWnd,hDC);
设备环境
设备环境结构里除了包含它所代表区域的位置和大小信 息外,还包含了绘制图形需要的所有其他属性信息,比 如,在输出文本时使用的字体,画图时使用的画笔,删 除背景时使用的刷子,选用的坐标系统等。 Windows不允许直接存取设备环境结构中成员的值,而 是提供了一些API函数来改变里面的默认值。
Windows内存DC
Windows内存DC
内存DC,是一个虚拟的内存设备上下文,也称为缓冲 DC. 在内存DC上绘图,结束后一次性从内存DC拷贝到设备 上下文DC,可以减少屏幕闪烁。 内存DC可以实现双缓存操作从而提高在绘图过程中的 用户体验。
Window内存DC
创建内存DC
预备知识
GDI(Graphics Device Interface) DC(Device Context)
本章授课内容
GDI概述 设备环境(Device Context) 内存设备(Memory Device Context)
GDI概述
GDI概述
GDI是图形设备接口(Graphics Device Interface或Graphical Device Interface)的 简称,它是微软公司的视窗操作系统(Microsoft Windows)的三大内核部件(也称“子系统”)之一。 GDI主要任务是负责系统与绘图程序之间的信息交换, 处理所有Windows程序的图形输出。 利用GDI所提供的众多函数就可以方便的在屏幕、打印 机及其它输出设备上输出图形,文本等操作。 GDI的出现使程序员无需要关心硬件设备及设备驱动, 就可以将应用程序的输出转化为硬件设备上的输出,实 现了程序开发者与硬件设备的隔离,大大方便了开发工 作。
设备环境是windows内部使用的数据结构,它定义了 GDI函数在显示设备特定区域的工作方式。对视频显示 器来说,设备环境代表屏幕上的一块区域。 要想向某个区域输出文字或者绘制图形,必须先取得 代表此区域的设备环境句柄,以此句柄为参数调用的 GDI函数都是对该区域的操作。
case WM_PAINT: { char szText[] = “hello world!”; PAINTSTRUCT ps; hdc = ::BeginPaint(hwnd, &ps); ::TextOut(hdc,10,10,szText, strlen(szText)); ::EndPaint(hwnd,&ps); return 0; }
知识回顾
GDI(Graphics Device Interface) DC(Device Context)
设备环境
Windows的颜色和像素点
DC上的图形和文本都是由像素点组成的。内存中,用 颜色的取值来表示像素点。
色深指的是存储每个像素所用的位数,一般现在使用 的都是24位色,即用24位表示一个像素,每种颜色都 可以分为红,绿,蓝三原色,所以可以用红,绿,蓝 三分量的组合来表示一种颜色,每个分量占用8位。 在Win32编程中,统一使用32位的整数(一个 COLORREF值)来表示深度为24位的颜色。
COLORREF SetPixel( HDC hdc, // handle to DC int X, // x-coordinate of pixel int Y, // y-coordinate of pixel COLORREF crColor // pixel color );
用GetPixel获取某个像素点的颜色
绘制直线仅仅需要指定线的开始坐标,然后以线的另 一头的坐标为参数调用LineTo函数即可。
::MoveToEx(hDC, 0, 0 ,NULL); ::LineTo(hDC,0,500);
设备环境
自定义画笔
在DC结构中还有一个画笔对象句柄,每次绘画时, GDI函数都会去使用此句柄指示的画笔。画笔对象规定 了线条的宽度,颜色和风格 要想改变DC中默认的画笔,可以使用Windows预定义 的画笔对象,也可以创建新的画笔对象。预定义画笔 对象很简单,仅有 BLACK_PEN,WHITE_PEN,NULL_PEN三种。
设备环境
可以使用RGB宏将三个分量的值组合在一起。
#define RGB(r,g,b) ((COLORREF)(((BYTE)(r) | \ ((WORD)((BYTE)(g)) << 8)) | \ (((DWORD)(BYTE)(b)) << 16)))
用SetPixel函数设置某个像素点的颜色
设备环境
demo02 获得整个窗体的设备环境句柄:
char szText[] = “hello world”; HDC hdc = ::GetWindowDC(hwnd); ::TextOut(hdc,10,10,szText,strlen(szText)); ::ReleaseDC(hwd, hdc); GetWindowDC函数能够取得整个窗口的设备环境句柄,而不仅仅是 窗口的客户区,所以以这个设备句柄为参数的话,GDI函数就可以对 整个窗口区域进行操作。
GDI概述
GDI的结构
GDI概述
GDI由几百个函数和一些相关的数据类型、宏和结构组成 GDI的函数大致分为以下几种
• 取得(或者建立)和释放(或者清除)设备内容的函数 • 取得有关设备内容信息的函数 • 绘图函数 • 设定和取得设备内容参数的函数 • 使用GDI对象的函数
设备环境
设备环境(Device Context)
代码示例:
HDC hdc = ::BeginPaint(hWnd, &ps); HBRUSH hBrush = ::CreateSolidBrush(RGB(255,0,0)); HBRUSH hOldBrush = (HBRUSH)::SelectObject(hdc, hBrush); ::Rectangle(hdc,0,0, 100, 100 ); ::SelectObject(hdc, hOldBrush); ::DeleteObject(hBrush);
demo06
HDC CreateCompatibleDC( HDC hdc // handle to DC );
位拷贝函数
BOOL BitBlt( HDC hdcDest, // handle to destination DC int nXDest, // x-coord of destination upper-left corner int nYDest, // y-coord of destination upper-left corner int nWidth, // width of destination rectangle int nHeight, // height of destination rectangle HDC hdcSrc, // handle to source DC int nXSrc, // x-coordinate of source upper-left corner int nYSrc, // y-coordinate of source upper-left corner DWORD dwRop // raster operation code );
COLORREF GetPixel( HDC hdc, // handle to DC int nXPos, // x-coordinate of pixel int nYPos // y-coordinate of pixel );
设备环境
绘制线条
demo04
绘制线条的函数有画单条直线的LineTo,画多条直线 的Polyline和PolylineTo,画贝塞儿曲线的 PolyBezier和PolyBezierTo,画弧线的Arc和 ArcTo
设备环境
HDC hdc; demo03 char sz[] = “Hello world”; switch( message ) { case WM_LBUTTONDOWN: HDC hdc = ::GetDC(hWnd); ::SetTextColor( hdc, RGB(255,0,0) ); ::SetBkColor( hdc, RGB(0,0,255) ); ::TextOut( hdc, 10, 10, sz, strlen(sz) ); ::ReleaseDC( hWnd, hdc ); break; //......处理其他消息 }
设备环境
绘制区域与画刷 GFra bibliotekI提供了画不同图形的API,可以用Rectangle画矩 形,Ellipse画椭圆形,Polygon画多边形,Chord 画弧。
Rectangle( hdc, x1, y1, x2, y2); Ellipse( hdc, x1, y1, x2, y2 ); Polygon( hdc, lpPoint, 5);
//获取预定义画笔的句柄 HPEN hPen = (HPEN)::GetStockObject(BLACK_PEN); //将画笔句柄选入设备, SelectObject会根据句柄的种类自动替换 原来的对象,并返回原对象的句柄 HPEN hOldPen = (HPEN)::SelectObject(hdc,hPen); //开始在DC中绘图
设备环境
设备环境
客户区和非客户区窗口
应用程序窗口包括许多元素,如标题条、菜单条和窗 口菜单(以前叫系统菜单)、最小化按钮、最大化按钮 和恢复按钮、可变的边界、客户区、水平和垂直滚动 条。应用程序的主窗口提倡包括所有这些元素。
绘图操作只能在客户区中进行。除客户区以外的部分 都叫非客户区。如果要在非客户区绘图,需要响应 WM_NCPAINT消息。
设备环境
CreatePen函数创建自定义的画笔对象
HPEN CreatePen( int fnPenStyle, // pen style int nWidth, // pen width COLORREF crColor // pen color );
代码示例 demo05
HPEN hPen = ::CreatePen( PS_SOLID, 3, RGB(255,0,0)); HPEN hOldPen = (HPEN)::SelectObject(hdc, hPen); ::MoveToEx( hdc, 0, 100, NULL); ::LineTo( hdc, 500, 100 ); ::SelectObject(hdc, hOldPen); ::DeleteObject(hPen);//删除上面创建的画笔对象释放资源
如果不是在处理WM_PAINT消息,可以使用GetDC函数 取得窗口客户区的设备环境句柄,进而进行绘图操作
hDC = ::GetDC(hWnd); //.....//进行绘图 ::ReleaseDC(hWnd,hDC);
设备环境
设备环境结构里除了包含它所代表区域的位置和大小信 息外,还包含了绘制图形需要的所有其他属性信息,比 如,在输出文本时使用的字体,画图时使用的画笔,删 除背景时使用的刷子,选用的坐标系统等。 Windows不允许直接存取设备环境结构中成员的值,而 是提供了一些API函数来改变里面的默认值。
Windows内存DC
Windows内存DC
内存DC,是一个虚拟的内存设备上下文,也称为缓冲 DC. 在内存DC上绘图,结束后一次性从内存DC拷贝到设备 上下文DC,可以减少屏幕闪烁。 内存DC可以实现双缓存操作从而提高在绘图过程中的 用户体验。
Window内存DC
创建内存DC