现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

使用Windows API画位图(BITMAP)

2012-08-20 06:37 工业·编程 ⁄ 共 2287字 ⁄ 字号 暂无评论

有人说不要重新发明轮子,诚然,我同意这种说法,作为运行在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);
}

给我留言

留言无头像?