GDI:我们很容易清楚,图形设备接口(Graphics Device Interface),就跟API一样。它不只是在windows应用程序的界面开发中被使用,就连windows本身也是使用GDI来实现的。窗口的标题栏,客户区以及按钮和列表等等都是由GDI绘制的,我们之前学习的控件都是经过了加工之后的成品,方便我们使用。如果想要把自己心中的控件和窗口画出来就要学会这门GDI。现如今,每个应用程序的窗口,控件都是他们团队自己设计的,利用现成的控件类,窗口类开发的APP很少,QQ,360,WPS等这些软件的窗口和控件都是自定义控件,只有这样才能让图形绚丽多彩,更加美观。
DC 我们称之为设备上下文,或者设备环境。早期开发图形程序都是直接针对具体设备进行的,要开发一个图形软件必须先了解什么型号的显示卡或者打印机,根据每个厂家提供不同的接口编写不同的代码来开发。进入windows时代,操作系统通过对驱动程序的统一管理,将设备接口细节隐藏于操作系统内部。程序员在编写图形程序时,只要调用一个公用的虚拟设备即可,这个虚拟设备环境也就是DC。
HDC,设备环境句柄就是专门用于绘图操作的句柄,CDC则是对应的类。就像HWND和CWnd一样。
通过HDC句柄绘图有三种方式,即标准客户区绘图,临时客户区绘图,全窗口绘图。为此分别有三个相应的类:CPaintDC,CClientDC,
CWindowDC。
CPaintDC:标准客户区绘图,窗口刷新时不消失,在WM_PAINT消息下使用。
CWindowDC:全窗口绘图,窗口刷新时不消失,在WM_NCPAINT消息下使用。
CClientDC:临时客户区绘图,窗口刷新就消失,在任何时候都可使用。
在获取设备环境后,就可以对其绘画,绘画工具有笔,画刷,位图,区域
CPaintDC dc(this);
CRect rect;
GetClientRect(rect);
dc.ellipse(rect);
//dc.rectangle(rect);//一个区域内重复画会覆盖本rect以前的画
//dc.roundrect(rect, cpoint(50, 40));
cstring text;
//dc.fillsolidrect(rect,rgb(100,0,100));
dc.setbkmode(transparent);
text.format(l"%d,%d,%d,%d", rect.top, rect.left, rect.right, rect.bottom);
dc.drawtext(text, rect1,cp_utf8);
cpen p(ps_dot, 4, rgb(255, 0, 0));
cpen *oldp=dc.selectobject(&p);
dc.rectangle(rect);
cbrush b(rgb(0, 0, 255));
cbrush* oldb=dc.selectobject(&b);
dc.ellipse(rect);
dc.selectobject(oldb);
dc.selectobject(oldp);
dc.roundrect(rect, cpoint(50, 40));
cbitmap map;
map.loadbitmapw(IDB_BITMAP1);
cbrush b1(&map);
dc.selectobject(&b1);