标 题:【原创】使用Windows API画位图(BITMAP)
作 者: niesongsong
邮 箱:[email protected]
关键字:C语言、Windows API、BitBlt、StretchBlt、DC
时 间:2010-09-04
【前言】
有人说不要重新发明轮子,诚然,我同意这种说法,作为运行在Windows上的用户级程序均构架在Windows API之上。如果你了解或者深究Windows API,那么你写来的程序更易找到BUG,运行效率更高,前言,我只说到这。
【准备知识】
DC:(Device Context)设备上下文,对于一个有效的窗口而言,它将会有一个DC,它的作用很简单,说比如说,要画一幅图,DC就好比你作图的工具,里面保存了画笔、画刷等等信息,只是有这些信息,我们就能了解画出来的线的颜色,粗细风格等等。
获取DC主要有两个API:
GetWindowsDC:获取整个窗口的DC,可以在整个窗口上作图;
GetClientDC:获取窗口客户区的DC,只能在客户区上作图。
在http://dqzx.neuq.edu.cn/dqzx/bbs ... 1&postID=749352 曾经介绍非客户区与客户区的关系。
LoadBitmap:加载位图,只能加载资源中的位图。
LoadImage :加载图片(位图、光标、图标),它可以完全替代LoadBitmap,可以使用路径资源。
SelectObject:加元素选进DC,比如字体,颜色、背景画刷等等。
CreateCompatibleDC:创建兼容内存DC,意味,先将位图画在内存DC,再将内存里的东西画东西传送到当前DC,这样就实现了位图的绘制。
重点介绍下面的两个API
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
);
BOOL StretchBlt(
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 nWidthDest, // width of destination rectangle
int nHeightDest, // height of destination rectangle
HDC hdcSrc, // handle to source DC
int nXSrc, // x-coord of source upper-left corner
int nYSrc, // y-coord of source upper-left corner
int nWidthSrc, // width of source rectangle
int nHeightSrc, // height of source rectangle
DWORD dwRop // raster operation code
);
参数难以看懂,老规矩,图示就一目了然了(樱井姐姐):
非缩放:BitBlt
缩放:StretchBlt
【过程】(真没有好讲的)
1、建立内存兼容DC;
2、将位图选进内存兼容DC;
3、将内存兼容DC的内容位传输到真实DC。(两种方式,上面以阐述)
【关键代码】(代码说明一切,完整代码见附件)
int PaintBmp1(HDC hdc)
{
HDC hMemDC;
HBITMAP hbmp;
hbmp = MyLoadBitmap("test.bmp"); /*加载图片*/
hMemDC = CreateCompatibleDC(hdc); /*创建内存兼容DC*/
SelectObject(hMemDC,hbmp); /*选进内存DC*/
BitBlt(hdc,50,50,200,200,hMemDC,0,0,SRCCOPY); /*将位图内容传送到目标DC上*/
DeleteDC(hMemDC); /*删除内存DC*/
return GetLastError();
}
int PaintBmp2(HDC hdc)
{
HDC hMemDC;
HBITMAP hbmp;
hbmp = MyLoadBitmap("test.bmp");
hMemDC = CreateCompatibleDC(hdc);
SelectObject(hMemDC,hbmp);
StretchBlt(hdc,50,50,200,200,hMemDC,30,20,140,130,SRCCOPY); /*将位图内容伸缩得传送到目标DC上*/
DeleteDC(hMemDC);
return GetLastError();
}
HBITMAP MyLoadBitmap(char * Name)
{
return (HBITMAP)LoadImage(GetModuleHandle(0),
"test.bmp",
IMAGE_BITMAP,
0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
}