一、获取DC方法
为了进行绘图 ,必须获得一个设备描述表DC。有多种方式获得DC:
1、利用windows SDK全局函数获得
HDC hdc;
Hdc=::GetDC(m_hWnd);
…
::ReleaseDC(m_hWnd,hdc);
2、利用MFC的CDC封装类实现
CDC *pDC=GetDC();
…
ReleaseDC(pDC);
3、利用MFC的CClientDC类实现,此类派生于CDC类,并在构造函数中调用GetDC,在析构函数中调用ReleaseDC。
CClientDC dc(this);
This指针代表CClientDC对象所属的类对象,如视图类CXXView
二、有多种方法实现在窗口中显示位图:
1、BitBlt函数和StretchBlt函数(属于CDC类)
(1)创建位图
CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP); //加载应用程序中的资源位图
(2)创建兼容DC
CDC dcCompatible; dcCompatible.CreateCompatibleDC(pDC);
(3)将位图选入兼容DC中
dcCompatible.SelectObject(&bitmap);
(4)将兼容DC中的位图贴到当前DC中
pDC->BitBlt(rect.left,rect.top,rect.width,rect.height,&dcCompatible,0,0,SRCCOPY);
BOOL BitBlt(int x,int y,int nWidth,int nHeight,CDC *pSrcDC,int
xSrc,int ySrc,DWORD dwRop);
x和y指定目标矩形左上角的坐标。
nWidth,nHeight指定目标矩形区域宽度和高度。
xSrc和ySrc指定源矩形区域左上角的x和y坐标。
得到rect GetClientRect(&rect);
BOOL StretchBlt(int x,int y,int nWidth,int nHeight,CDC *pSrcDC,int
xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop);
StretchBlt函数比BitBlt函数多了两个参数nSrcWidth和nSrcHeight,表示原矩形的宽度和高度。要得到选入位图的宽度和高度,可以调用CBitmap类的GetBitmap函数得到。
Int GetBitmap(BITMAP *pBitMap);
示例:BITBMP bmp;
Bitbmp.GetBitmap(&bmp);
pDC->StretchBlt(---bmp.bmWidth,bmp.bmHeight---);
2、StretchDIBits()(全局API函数)
BOOL StretchDIBits(HDC hdc,int x,int y,int nWidth,int nHeight,int
xSrc,int ySrc,int nSrcWidth,int nSrcHeight,CONST VOID
*lpvBits,CONST BITMAPINFO *lpbmi,UINT fuColorUse,DWORD dwrop);
Hdc:设备上下文句柄
LpvBits:指向DIB数据图像的指针
Lpbmi:指向BITMAPINFOR结构的指针
示例:
::StretchDIBits(pDC->GetSafeHdc(),0,0,width,height,0,0,bitmapWidth,bitmapHeight,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
StretchDIBit函数的具体解释:
int
StretchDIBits(
HDC hdc,
// 指向目标设备环境的句柄。
int XDest,
//
指定目标矩形左上角位置的X轴坐标,按逻辑单位来表示坐标。
int YDest,
//
指定目标矩形左上角的Y轴坐标,按逻辑单位表示坐标
int nDestWidth,
//
指定目标矩形的宽度
int nDestHeight,
//
指定目标矩形的高度
int XSrc,
//
指定DIB中源矩形(左上角)的X轴坐标,坐标以像素点表示
int YSrc,
//
指定DIB中源矩形(左上角)的Y轴坐标,坐标以像素点表示
int nSrcWidth,
// 按像素点指定DIB中源矩形的宽度
int nSrcHeight,
//
按像素点指定DIB中源矩形的高度
CONST VOID *lpBits,
// 指向DIB位的指针,这些位的值按字节类型数组存储
CONST BITMAPINFO *lpBitsInfo, //
指向BITMAPINFO结构的指针,该结构包含有关DIB方面的信息
UINT iUsage,
//
表示是否提供了BITMAPINFO结构中的成员bmiColors,如果提供了,那么该bmiColors是否包含了明确的RGB值或索引
DWORD dwRop
//
指定源像素点、目标设备环境的当前刷子和目标像素点是如何组合形成新的图像
);
参数iUsage必须取下列值,这些值的含义如下:
DIB_PAL_COLOR:表示该数组包含对源设备环境的逻辑调色板进行索引的16位索引值。
DIB_RGB_COLORS:表示该颜色表包含原义的KGB值,若想了解更多的信息,请参考下面备注一节。
返回值:如果函数执行成功,那么返回值是拷贝的扫描线数目,如果函数执行失败,那么返回值是GDI_CRROR。