绘制位图的步骤
2016-03-07 23:25
471 查看
•GDI是图形设备接口(Graphics Device Interface)的英文首字母的简称。
•GDI是一个抽象的接口,是一个关于图形显示的函数库。通过这个接口可以实现对图形的颜色、线条的粗细等属性的控制。它是我们的程序与计算机硬件之间的一个桥梁。
•Windows图形编程就是针对Windows自带的图形设备接口函数库和设备环境(DC)进行操作。通过调用这些函数库中的函数来完成绘制工作。
设备环境DC(Device Context 又称为设备上下文,也称为设备描述表)。它是一个关于如何绘制图形的方法的集合,它既可以绘制各种图形,也可以确定在应用窗口中绘制图形的方式,就是绘图模式和映射模式。
获取DC设备上下文:
1.通过GetDC函数来获得相应窗口的HDC
GetDC函数适合在窗口现有图形的基础上进行绘制。
BeginPaint函数是将窗口上所有内容清除干净,然后在上面绘制。
3.通过CreateCompatibleDC 创建兼容内存DC
通过调用CreateCompatibleDC函数来创建与目标DC兼容的内存DC。一般用于解决界面的闪烁问题。
代码片段:
获取目标DC句柄:
(1)LoadBitmap图片的加载
HBITMAP WINAPI LoadBitmapW(HINSTANCE hInstance,LPCWSTR lpBitmapName);
函数的作用是从应用程序工程资源中读取位图数据。
第一个参数HINSTANCE,它是资源文件所在的模块的实例句柄
第二个参数BitmapName是位图在资源中的ID名称。
(2)LoadImage图片的加载
LoadImage这个函数可以加载位图、图标、光标多种图像数据。
第一个参数是设备DC。
第二个参数是HGDIOBJ,其实是一个void* 。这个函数传入一个新的GDI对象到第一个参数的DC中,并返回该DC的老的相同类型的GDI对象。
四、使用BitBlt函数将临时内存DC中的位图拷贝到目标DC上来
1.BitBlt绘制位图(非拉伸绘制)
BOOL WINAPI BitBlt (
HDC hdc, //目标DC的句柄
int x, int y, int cx, int cy, //目标区域
HDC hdcSrc, //源DC的句柄
int x1,int y1, //源区域的左上角
DWORD rop //操作标志,一般是 SRCCOPY,是拷贝的意思。
);
2.StretchBlt拉伸函数(绘制位图)
BOOL WINAPI StretchBlt(
HDC hdcDest, //目标DC的句柄
int xDest, int yDest, int wDest, int hDest, //目标DC的区域
HDC hdcSrc, //源DC的句柄
int xSrc, int ySrc, int wSrc, __in int hSrc, //源DC的区域
DWORD rop //操作标志,一般为SRCCOPY,意思为拷贝
);
位图的销毁是调用DeleteObject函数。
::DeleteObject(hbmpBack);
•GDI是一个抽象的接口,是一个关于图形显示的函数库。通过这个接口可以实现对图形的颜色、线条的粗细等属性的控制。它是我们的程序与计算机硬件之间的一个桥梁。
•Windows图形编程就是针对Windows自带的图形设备接口函数库和设备环境(DC)进行操作。通过调用这些函数库中的函数来完成绘制工作。
设备环境DC(Device Context 又称为设备上下文,也称为设备描述表)。它是一个关于如何绘制图形的方法的集合,它既可以绘制各种图形,也可以确定在应用窗口中绘制图形的方式,就是绘图模式和映射模式。
一、获得目标DC句柄(有三种方式)
获取DC设备上下文:1.通过GetDC函数来获得相应窗口的HDC
GetDC函数适合在窗口现有图形的基础上进行绘制。
代码段: { HDC hDC = ::GetDC(hWnd); //其他的绘图操作代码 …… ::ReleaseDC(hWnd,hDC); } GetDC中传入的参数hWnd是窗口的句柄,它返回和这个窗口相关的DC2.通过BeginPaint函数来获得所在窗口的HDC
BeginPaint函数是将窗口上所有内容清除干净,然后在上面绘制。
代码段: { PAINTSTRUCT ps; HDC hDC = ::BeginPaint(hWnd,&ps); //其他的绘图操作代码 ::EndPaint(hWnd,&ps); }
<div><div> typedef struct tagPAINTSTRUCT { </div><div> HDC hdc;// 显示器的设备环境句柄 </div><div> BOOL fErase;//是否擦除背景 </div><div> RECT rcPaint;//指定了需要绘图的窗口区域 </div><div> BOOL fRestore; </div><div> BOOL fIncUpdate; </div><div> BYTE rgbReserved[32]; </div><div> } PAINTSTRUCT;</div></div>
3.通过CreateCompatibleDC 创建兼容内存DC
通过调用CreateCompatibleDC函数来创建与目标DC兼容的内存DC。一般用于解决界面的闪烁问题。
代码片段:
{ HDC hMemDC = ::CreateCompatibleDC(hDest); //其他的绘图操作代码 … ::BitBlt(hDest,x,y,w,h,hMemDC,0,0,SRCCOPY); … ::DeleteDC(hMemDC); }
获取目标DC句柄:
(1)LoadBitmap图片的加载
HBITMAP WINAPI LoadBitmapW(HINSTANCE hInstance,LPCWSTR lpBitmapName);
函数的作用是从应用程序工程资源中读取位图数据。
第一个参数HINSTANCE,它是资源文件所在的模块的实例句柄
第二个参数BitmapName是位图在资源中的ID名称。
(2)LoadImage图片的加载
LoadImage这个函数可以加载位图、图标、光标多种图像数据。
1.从资源加载 hbmpBack = (HBITMAP) ::LoadImage (hInst,MAKEINTRESOURCE (IDB_BACK),IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS);
2.从文件路径加载 hbmpBack = (HBITMAP) ::LoadImage (NULL,_T(".\\1.bmp"),IMAGE_BITMAP,0, 0,LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION);
二、创建与目标DC兼容的临时内存DC
见CreateCompatiableDC()函数。HDC hMemDC = ::CreateCompatibleDC(hDC);
三、将位图句柄选入到临时内存DC中
HGDIOBJ WINAPI SelectObject(HDC hdc, HGDIOBJ h);第一个参数是设备DC。
第二个参数是HGDIOBJ,其实是一个void* 。这个函数传入一个新的GDI对象到第一个参数的DC中,并返回该DC的老的相同类型的GDI对象。
四、使用BitBlt函数将临时内存DC中的位图拷贝到目标DC上来
1.BitBlt绘制位图(非拉伸绘制)
BOOL WINAPI BitBlt (
HDC hdc, //目标DC的句柄
int x, int y, int cx, int cy, //目标区域
HDC hdcSrc, //源DC的句柄
int x1,int y1, //源区域的左上角
DWORD rop //操作标志,一般是 SRCCOPY,是拷贝的意思。
);
2.StretchBlt拉伸函数(绘制位图)
BOOL WINAPI StretchBlt(
HDC hdcDest, //目标DC的句柄
int xDest, int yDest, int wDest, int hDest, //目标DC的区域
HDC hdcSrc, //源DC的句柄
int xSrc, int ySrc, int wSrc, __in int hSrc, //源DC的区域
DWORD rop //操作标志,一般为SRCCOPY,意思为拷贝
);
五、将位图句柄选出临时内存DC
SelectObject函数。六、销毁临时的内存DC
位图的销毁位图的销毁是调用DeleteObject函数。
::DeleteObject(hbmpBack);
CBitmap Bmp; Bmp.LoadBitmap(IDB_BITMAP1); CDC memDC; memDC.CreateCompatibleDC(pDC); hOldBmp = memDC.SelectObject(&Bmp); pDC->BitBlt(0,0,600,600,&memDC,0,0,SRCCOPY); SelectObject(hOldBmp); DeleteObject(memDC);
相关文章推荐
- [leetcode 96]Unique Binary Search Trees--二叉搜索树的个数问题。
- 求最大公因数的若干方法
- Mininet的内部实现原理简介
- Git使用(3)
- 安卓开发:图片常识
- 输入三个整数 x,y,z ,请把这三个数由小到大输出。
- 51nod 1091 线段的重叠
- 一元多项式的乘积与和
- 安装虚拟机VMware问题汇总
- 基于CentOS7开发之路 --- 第三章 :CentOS 7 部署 tomcat 服务
- 修改JAVA_HOME无效,java版本保持不变的问题解决
- 用户和权限管理
- java中CAS算法保证原子性 无锁编程
- 【Java】面向对象思想以及类与对象的关系
- eclipse项目遇到红色叹号,该如何解决?
- 计算奖金利润
- Jeecg 学习笔记
- GLSurfaceView
- hibernate缓存机制详细分析
- hadoop搭建