GDIGDI+使⽤到的相关函数介绍
GDI,图像设备接⼝的简称。
⾸先介绍⼏个概念。
text函数什么意思
1、DC,设备上下⽂DeviceContext,也称为设备描述表。它是⼀个关于如何绘制图形的⽅法集合,既可以绘制各种图形,也可以确定在应⽤窗⼝中绘制图形的⽅式,即绘图模式和映射模式。Win32编程中使⽤HDC来标识。DC类似于画布,我们想要绘制图形⾸先就需要获得DC。
常见获得DC的⽅法
HDC hdc = ::GetDC(hwnd);
::ReleaseDC(hwnd,hdc);
此⽅法适合在窗⼝现有图形的基础上进⾏绘制。(获得DC后⼀定要记得Release,否则会造成内存泄漏)
PAINTSTRUCT ps;
HDC hdc = ::BeginPaint(hWnd,&ps);
::EndPaint(hWnd,&ps);
BeginPaint函数就是将窗⼝上所有内容清除⼲净,然后在上⾯绘制。参数ps可以指定更新的区域,⽽不必重绘制整个界⾯, BeginPaint和EndPaint总是被⽤来响应WM_PAINT 消息。
HDC hMemDC = ::CreateCompatibleDC(hDest);
//其他绘图操作代码
::BitBlt(hDest,x,y,w,h,hMemDC,0,0,SRCCOPY);//将hMemDC上绘制的图像数据拷贝到hDest上,界⾯此时才会显⽰
::DeleteDC(hMemDC);
通过调⽤CreateCompatibleDC函数来创建与⽬标DC兼容的内存DC,⼀般⽤于解决界⾯的闪烁问题。
2、常⽤的GDI对象
画笔Pen:负责画线,画边框(矩形边框,圆边框,饼边框)都是采⽤画笔来操作的。默认画笔是⿊⾊,
宽度为1,样式为实线的画笔。
画刷Brush:负责填充矩形,填充圆、饼等以及刷窗⼝背景。默认为⽩⾊画刷。
字体Font:负责基于具体字体对象的所有的⽂本绘制,默认字体是系统等宽字体,⽐如对话框标题。
区域Region:⽤HRGN表⽰,在窗⼝中⼀个区域可以是椭圆形,多边形或者更常见的矩形。
位图Bitmap:在GDI中,⽤HBITMAP来表⽰位图,GDI的绘制从答题上可以分为图形绘制和图像绘制。对于线,矩形,圆,饼等的绘制属于图形绘制,⽽对于位图的绘制是属于图像绘制。
3、使⽤GDI对象
SelectObject函数,选择使⽤的GDI对象
HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj)
hdc:设备上下⽂环境的句柄。
hgdiobj:被选择的对象的句柄,该指定对象必须由如下的函数创建。
返回值:返回该DC对象的⽼的相同类型的GDI对象。
HGDIOBJ GetStockObject(int i),获得默认的GDI对象
通过ID号来获得windows默认提供的⼀些GDI对象。ID号为预定义的宏,这些对象获得后,不需要⼈为的销毁。
//字体
#define OEM_FIXED_FONT 10
#define ANSI_FIXED_FONT 11
//画刷
#define WHITE_BRUSH  0
//画笔
#define WHITE_PEN  6
GetObject函数,获取GDI对象的信息
int GetObject(HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject);
第⼀个参数填⼊GDI对象的句柄;
第⼆个参数填⼊结构的⼤⼩;
第三个参数填⼊结构的指针,这⾥的结构对应相应的GDI对象的结构。
DeleteObject函数,删除GDI对象。
创建的GDI对象⼀定要删除,否则会造成内存泄漏。
4、绘制位图的步骤
获得⽬标DC句柄
创建与⽬标DC兼容的临时内存DC
将位图句柄选⼊到临时内存DC中
使⽤BitBlt函数将临时内存DC中的位图拷贝到⽬标DC上来
将位图句柄选出临时内存DC
销毁临时的内存DC
注意:⼀定要将位图句柄选出临时内存DC,否则⽬标DC被拷贝的位图也会被销毁掉。
下⾯是⽤到的函数
加载BitMap图⽚
HBITMAP LoadBitmap(HINSTANCE hInstance, LPCTSTR lpBitmapName);
从应⽤程序资源中读取位图数据,所以使⽤这个接⼝时,我们需要先将位图导⼊资源中。第⼀个参数传⼊资源所在的模块实例句柄,第⼆参数是位图在资源中的ID名称。
HBITMAP hbmp = LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BACK));
宏MAKEINTRESOURCE将数字的ID号转换成整形资源号字符串。
LoadBitmap已经被LoadImage函数取代了。
LoadImage函数可以加载位图、图标、光标等多种图像数据。
既可以从资源加载:
HBITMAP hbmp = (HBITMAP)::LoadImage(hInstance, MAKEINTRESOURCE(IDB_BACK)
,IMAGE_BITMAP,0,0,LR_CREATEDDIBSECTION|LR_LOADMAP3DCOLORS);
或者直接从路径加载:
HBITMAP hbmp = (HBITMAP)::LoadImage(NULL, _T(“.\\1.bmp”),IMAGE_BITMAP,0,0,
LR_LOADFORMFILE|LR_DEFAULTSIZE| LR_LOADMAP3DCOLORS);
BitBlt绘制位图函数。
BOOL BitBlt(  _In_  HDC hdcDest,  _In_  int nXDest,  _In_  int nYDest,  _In_  int nWidth,  _In_  int nHeight,  _In_  HDC hdcSrc,  _In_  int nXSrc,  _In_  int nYSrc,  _In_  DWORD dwRop); hDestDC:指向⽬标设备环境的句柄。
x:指定⽬标矩形区域左上⾓的X轴逻辑坐标。
y:指定⽬标矩形区域左上⾓的Y轴逻辑坐标。
nWidth:指定源在⽬标矩形区域的逻辑宽度。
nHeight:指定源在⽬标矩形区域的逻辑⾼度。
hSrcDC:指向源设备环境的句柄。
xSrc:指定源矩形区域左上⾓的X轴逻辑坐标。
ySrc:指定源矩形区域左上⾓的Y轴逻辑坐标。
dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜⾊数据,如何与⽬标矩形区域的颜⾊数据组合以完成最后的颜⾊。⼀般SRCCOPY是拷贝的意思。
HDC hDCmem = ::CreateCompatibleDC(hdc);
HBITMap hOldBmp = (HBITMap)::SelectObject(hDCmem,hbmpBack);
BITMAP bmp;
::GetObject(hbmpBack,sizeof(BITMAP),&bmp);
::BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight,HDCmem,0,0,SRCCOPY);
//绘图
::SelectObject(hDCmem,hOldBmp);
::DeleteDC(hDCmem);
拉伸图⽚
GetClientRect函数获得客户区⼤⼩
使⽤StretchBlt函数对图⽚进⾏拉伸
5、⽂字绘制
指定字体的⼤⼩编码的结构体LOGFONT
设置⽂字的颜⾊GetTextColor
获得⽂字的颜⾊SetTextColor
设置背景模式SetBKMode,设置DC的背景模式,相对应的GetBKMode是⽤来获取背景模式的。mode参数可以是TRANSPARENT(透明)与OPAQUE(不透明,默认值) DrawText函数和TextOut函数都是绘制⽂字的函数,前者通过控制绘制区域和绘制格式来控制绘制的位置,后者可以直接指定绘制的起始位置和结束位置。
6、绘制点,线,⾯
SetPixel/GetPixel设置/返回指定点的颜⾊。
MoveToEx设置线的绘制起点
LineTo绘制线
Rectangle采⽤选定的画笔和画刷来绘制矩形。画笔负责绘制矩形的边框,画刷负责填充矩形。
Ellipse绘制圆,需要指定这个圆的外接矩形。
Pie绘制扇形图
GDI+的介绍
GDI+是windows系统中的⼀个⼦系统,它主要负责在显⽰屏幕和打印设备输出有关信息,它是⼀组通过C++类实现的应⽤程序编程接⼝。GDI+对以前的Windows版本中GDI进⾏了优化,并添加了许多新的功能。作为图形设备接⼝的GDI+使得应⽤程序开发⼈员在输出屏幕和打印机信息的时候⽆需考虑具体显⽰设备的细节,他们只需要调⽤GDI+库输出的类的⼀些⽅法即可完成图形操作。
GDI+的使⽤⽅法
在使⽤GDI+的cpp⽂件中包含GdiPlus.h的头⽂件,并引⽤命名空间using namespace Gdiplus。
同时需要在项⽬属性中的连接器->输⼊->附加依赖项中加⼊gdiplus.lib。
同时需要在主程序的开始部分,添加如下代码:
//GDI+资源初始化
ULONG_PTR uToken = 0;
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&uToKen,&gdiplusStartupInput,NULL);
应⽤程序结束时,需要销毁GDI+资源
GdiplusShutdown(uToken);
GDI+系统中的透明度的概念
透明度是像素之间的⼀种合成运算,它的计算公式是:
输出颜⾊=前景⾊*Alpha/255 + 背景⾊*(255-Alpha)/255;
GDI+常⽤的⼏个类。
Graphics类,类似于GDI中DC。
Bitmap类,继承与Image类。
GDI+中使⽤Graphics类的DrawImage函数来绘制图⽚。
使⽤Graphics类measureString函数来测量字符串的需要容纳的矩形区域。
DrawLine/DrawRectangle/DrawEllipse/DrawPie画图
GDI+中的核⼼是Graphics类⽽GDI中是基于DC句柄的。
GDI+在GDI的设备环境DC上进⾏图形的绘制。GDI+就回吧当前的DC作为默认的⽬标画布,之后调⽤Graphics中的任何函数都会被绘制到DC对象上,当然每个函数的调⽤完成并不会⽴即反映到DC中,只有当Graphics类析构的时候才会把所有绘制的内容全部⼀次性地拷贝到hDC中。
Graphics提供了获得HDC的函数GetHDC,这样我们就可以在hDC上进⾏GDI函数的绘制。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。