先说GDI,GDI:Graphics Device Interface,图形设备接口。是一个图形显示的函数库,通过调用接口可以实现图形图像的绘制。
DC:Device Content,俗称设备上下文,是绘图的重要部分。相当于画布的作用,确定绘图模式和映射模式。
(1)获取DC:
(a)HDC dc = GetDC(hwnd);参数为窗口句柄,返回窗口对应的DC。为NULL时,返回的是桌面的DC。
最后使用DeleteDC(dc);释放。
(b)CreateCompatibleDC(HDC);创建目标兼容DC,一般用于解决闪烁问题。 如下:
HDC hMemDc = CreateCompatibleDC(hDc);
RECT rcCliemt;
GetClientRect(hWnd,rcClient);
HBITMAP hBitmap = CreateCompatibleBitmap(hDc,rcClient.right-rcClient.left,rcClient.bottom-rcClient.top);
HBITMAP hOldBitMaop = (HBITMAP)SelectObject(hMemDc,hBitmap);
.....
BitBlt(Hdc,rcClient.left,rcClient.top,rcClient.right-rcClient.left,rcClient.bottom-rcClient.top,hMemDc,0,0,SRCCOPY);
SelectObject(hMemDc,hOldBitmap);
DeleteObject(hBitmap);
DelectDc(hMemDc);
(c)使用BeginPaint和EndPaint函数,返回DC的句柄,BeginPaint是将背景擦除后再重新再DC上绘制。
其中参数使用到了POINTSTRUCT类型的参数。 此结构内可以指定要擦除的区域。
POINTSTRUCT pt;
hdc = BeginPaint(hwnd,&pt);
....
EndPaint(hwnd,&pt);
(2)GDI的对象
(a)画笔pen,HPEN为画笔的句柄
使用CreatePen创建一个画笔,选进DC内,在使用完毕以后将画笔选出,然后使用DeleteObject删除画笔。
HPEN hPen = CreatePen(PS_SOLID,1,RGB(0,0,0));//参数1设置各种样式的画笔
HPEN hOldPen = SelectObject(hdc,&hPen);
.....
SelectObject(hdc,hOldPen);
DeleteObject(hPen);
使用系统默认的画笔不需要删除,例如:SelectObject(hdc,GetStockObject(BLACK_PEN));
(b)画刷brush,HBRUSH为画刷的句柄
画刷的的创建,CreateHatchBrush();//创建阴影画刷
CreatePatternBrush();//创建纹理画刷
CreateSolidBrush();//创建单色画刷
使用方式同画笔,选进-->使用--->选出----->删除
使用系统默认的画刷不需要删除,例如:SelectObject(hdc,GetStockObject(BLACK_BRUSH));
(c)字体,使用CreateFontInDirect()创建字体,参数为一个字体的结构LOGFONT,如下:
LOGFONT lf;
lf.lfWeight = 10;
lf.lfHeight = 10;
lf.lfCharSet = GB2312_CHARSET;
HFONT hfont = CreateFontIndirect(&lf);
使用方式同画笔,选进-->使用--->选出----->删除
也可以使用系统字体:SelectObject(hdc,GetStockObject(SYSTEM_FONT));
(d)区域REGION
创建区域CreateRectRgnIndirect(),具体不详。
(e)位图bitmap
使用CreateCompatibleBitmap(hdc,cx,cy)创建一个兼容的位图,并且与指定的dc关联,当然也可以使用selectObject将其选到其他DC内。
使用方式同画笔,选进-->使用--->选出----->删除
使用LoadBitmap加载一个位图:LoadBitmap(hdc,MAKRINTRESOURCE(IDB_BACK);
使用LoadImage加载一个位图、光标、图标等等。
(f)绘制文字 DrawText\TextOut例如:
RECT rc;
DrawText(hdc,L"asdasd",-1,&rc,DT_NOCLIP);//使用绘图区和格式控制位置,超出文本区可以使用省略号代替
TextOut(hdc,10,10,L"asdasda",-1);//使用起始点控制位置
setTextColor()//设置字体颜色
SetBkMode(TRANSPARENT);//设置背景模式(透明或不透明)
(g)绘制
BitBlt();//原图绘制
StretchBlt();//拉伸绘制
(h)修改一个点
SetPixel(hdc,x,y,RGB());
GetPixel(hdc,x,y,RGB());
(i) 画图形
画圆:Ellipse(hdc,x,y,cx,cy);
画矩形:Rectangle(hdc,x,y,cx,cy);
画线:MoveTo(hdc,x,y);---->LineTo(hdc,x,y);
画饼图:Pie(hdc,x,y,cx,cy,nx1,ny1,nx2,ny2);
(j)使用GetObject()获得GDI对象的属性信息。例如:
BITMAP bm;
GetObject(hdc,sizeof(BITMAP),&bm);
下面继续说GDI+,这是xp系统的一个子系统,为了增加xp的绘图效率,微软已经将GDI+从应用层转移到了内核层了。
他主要负责在显示屏幕和打印设备输出有关信息。接口是通过c++类实现的。
(a)使用方法:
#include <comdef.h>//win32工程,需包含
#include <GdiPlus.h>
#pragma comment(lib,"GdiPlus.lib")
using namespace GdiPlus;
//
ULONG_PTR token;
GdiplusStartupInput in;
GdiplusStartup(&token,&in);
//
GdiplusShutdown(&token);
(b)Graphics类,类似于GDI的DC,是GDI+最重要的类。
构造函数Graphics graphics(HDC)/(HWND)/(IMAGE *image)
画图片:DrawImage();//
绘制文字:DrawString();
测量字符串:MeasureString();
字符串去尾:SetTrimming();
画直线:DrawLine();
画矩形:DrawRectangle();
画圆:DrawEllipse();
画饼图:DrawPie();
填充矩形:FillRectangle();
FillEllipse();
FillPis();
(c)BITMAP类
构造函数:BITMAP bitmap(PATH)/(....构造一个空的bmp)
拷贝:Clone();//重载函数好多
(d)画刷类
SolidBrush solidbrush(PS_SOLID,1,RGB(0,0,0));//单色画刷
HatchBrush hbrush();//阴影画刷
TextureBrush tbrush();//纹理画刷
LinearGradientBrush lbrush();//渐变画刷
(e)画笔类 Pen
pen(color,wid);
pen (brush,wid);HDC hd = CreateCompatibleDC(m_hMemDC);
HBITMAP Bitmap1 = ::CreateCompatibleBitmap(hdc,rect.right-rect.left,rect.bottom-rect.top);
HBITMAP OldBmp = (HBITMAP)::SelectObject(hd,Bitmap1);
Graphics gra(hd);
Image im(L"test.bmp");
gra.DrawImage(&im,0,0,m_rect.right-m_rect.left,m_rect.bottom-m_rect.top);
BLENDFUNCTION ftn;
ftn.BlendOp = AC_SRC_OVER;
ftn.BlendFlags = 0;
ftn.SourceConstantAlpha = (m_rect.right-m_rect.left)/4;
ftn.AlphaFormat = 0;
AlphaBlend(m_hMemDC,0,0,m_rect.right-m_rect.left,m_rect.bottom-m_rect.top,hd,0,0,m_rect.right-m_rect.left,m_rect.bottom-m_rect.top,ftn);
SelectObject(hd,OldBmp);
DeleteObject(Bitmap1);
DeleteDC(hd);
(1)alphablend函数使用,实现图片的半透明效果:
HBITMAP Bitmap1 = ::CreateCompatibleBitmap(hdc,rect.right-rect.left,rect.bottom-rect.top);
HBITMAP OldBmp = (HBITMAP)::SelectObject(hd,Bitmap1);
Graphics gra(hd);
Image im(L"test.bmp");
gra.DrawImage(&im,0,0,m_rect.right-m_rect.left,m_rect.bottom-m_rect.top);
BLENDFUNCTION ftn;
ftn.BlendOp = AC_SRC_OVER;
ftn.BlendFlags = 0;
ftn.SourceConstantAlpha = (m_rect.right-m_rect.left)/4;
ftn.AlphaFormat = 0;
AlphaBlend(m_hMemDC,0,0,m_rect.right-m_rect.left,m_rect.bottom-m_rect.top,hd,0,0,m_rect.right-m_rect.left,m_rect.bottom-m_rect.top,ftn);
SelectObject(hd,OldBmp);
DeleteObject(Bitmap1);
DeleteDC(hd);