一 位图的使用
1 位图 - 通过保存图像上每个点的颜色,生成相应
的位图文件。
光栅图 - 可以理解为图像点阵的保存,放大后模糊
矢量图 - 可以理解为绘图命令的保存,每次放大或者缩小都会重新绘制
.wmf格式
2 位图资源的使用
2.1 加载位图资源
HBITMAP LoadBitmap(
HINSTANCE hInstance, //位图资源所在应用程序句柄
LPCTSTR lpBitmapName ); //位图资源ID字符串
返回位图句柄HBITMAP
2.2 创建放置位图的DC
HDC CreateCompatibleDC( HDC hDC );
创建一个和指定的hDC相匹配的DC(DC中
包含信息一致)
2.3 将位图放入创建的DC中
SelectObject
2.4 绘制位图到当前DC中
BOOL BitBlt(
HDC hdcDest, //绘制的目的DC句柄
int nXDest, //绘制的目的左上x坐标
int nYDest, //绘制的目的左上y坐标
int nWidth, //绘制的目的宽
int nHeight, //绘制的目的高
HDC hdcSrc, //需要绘制的DC句柄
int nXSrc, //需要绘制的原图的起始X坐标
int nYSrc, //需要绘制的原图的起始y坐标
DWORD dwRop); //绘图方式
//拉伸位图
BOOL StretchBlt(
HDC hdcDest, //绘制的目的DC句柄
int nXOriginDest,//绘制的目的左上x坐标
int nYOriginDest, //绘制的目的左上y坐标
int nWidthDest,//绘制的目的宽
int nHeightDest, //绘制的目的高
HDC hdcSrc, //需要绘制的DC句柄
int nXOriginSrc,//需要绘制的原图的起始X坐标
int nYOriginSrc,//需要绘制的原图的起始y坐标
int nWidthSrc,//需要绘制的原图的宽
int nHeightSrc,//需要绘制的原图的高
DWORD dwRop ); //绘图方式
2.5 取出位图
SelectObject
2.6 删除创建的DC
DeleteDC
2.7 删除位图
DeleteObject
2.8 获取位图信息
int GetObject(
HGDIOBJ hgdiobj,//GDI对象句柄,这里就是HBITMAP
int cbBuffer,//位图信息的BUFF的大小
LPVOID lpvObject ); //位图信息的BUFF指针
位图的BUFF类型为 BITMAP 结构
void DrawBmp(HDC hDC) { //加载位图资源 HBITMAP hBmp = LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_BALL01)); //获取位图的相关信息 BITMAP bmpInfo = {0}; GetObject(hBmp, sizeof(bmpInfo), &bmpInfo); //创建放置位图的DC HDC hBmpDC = CreateCompatibleDC(hDC); //将位图放入hBmpDC中 HBITMAP hOldBmp = (HBITMAP)SelectObject(hBmpDC, hBmp); //绘制位图 BitBlt(hDC, 100, 100, bmpInfo.bmWidth, bmpInfo.bmHeight, hBmpDC, 0, 0, SRCCOPY); //拉伸绘制 StretchBlt(hDC, 200, 100, 200, 200, hBmpDC, 0, 0, 48, 48, SRCCOPY); //取出位图 SelectObject(hBmpDC, hOldBmp); //删除DC DeleteDC(hBmpDC); //删除位图 DeleteObject(hBmp); } void OnPaint(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps = {0}; HDC hDC = BeginPaint(hWnd,&ps); DrawBmp(hDC); EndPaint(hWnd,&ps); }
二 坐标系和映射模式
可以实现基础的放大和缩小的功能
1 坐标系
1.1 设备坐标系:屏幕 窗口 客户区坐标系
设备坐标系以像素为单位,X正方向从左往右,Y正方向从上往下.
屏幕坐标系 - 以屏幕的左上角为(0,0)点
窗口坐标系 - 以窗口最外边框的左上角为(0,0)点
客户区坐标系 - 以窗口内的客户区的左上角为(0,0)点
1.2 逻辑坐标系
以逻辑单位定义坐标系. 绘图过程中使用
的坐标基本是以逻辑坐标系绘制. 默认情况
下和设备坐标系保持一致,但是可以修改.
2 映射模式
逻辑坐标系和设备坐标系之间映射关系.
2.1 映射模式的种类
MM_TEXT - 默认使用的映射方式, 逻辑坐标系和设备坐标系一致.
MM_LOMETRIC - 0.1MM毫米, X方向向右,Y方向向上
MM_HIMETRIC - 0.01MM, X方向向右,Y方向向上
MM_LOENGLISH - 0.1in英寸, X方向向右,Y方向向上
MM_HIENGLISH - 0.01in,X方向向右,Y方向向上
MM_TWIPS - 1/1440in, X方向向右,Y方向向上
MM_ISOTROPIC - 可以指定逻辑单位和XY正方向 X轴单位大小=Y轴的单位大小
MM_ANISOTROPIC - 可以指定逻辑单位和XY正方向
X轴单位与Y轴的单位可以不相等.
2.2 映射模式的使用
2.2.1 设置新映射模式
int SetMapMode(
HDC hdc, //DC句柄 handle of device context
int fnMapMode ); //新的映射方式
返回旧的映射方式
2.2.2 绘图
2.2.3 恢复旧映射模式
SetMapMode( hdc, nOldMap );
2.2.4 MM_ISOTROPIC/MM_ANISOTROPIC模式
需要设定X/Y轴正方向,以及逻辑单位和设备
单位的比例.
//设备坐标,像素
BOOL SetViewportExtEx(
HDC hdc, //DC句柄
int nXExtent, //显示区域的X轴的单位
int nYExtent, //显示区域的Y轴的单位
LPSIZE lpSize ); //旧值
//逻辑坐标
BOOL SetWindowExtEx(
HDC hdc, //DC句柄
int nXExtent, //逻辑单位的X轴的单位
int nYExtent, //逻辑单位的X轴的单位
LPSIZE lpSize ); //旧值
SetViewportExtEx和SetWindowExtEx函数
的单位数量的比例关系,就是设备单位和
逻辑单位之间的比例关系. 可以使用单位
的正负号,来确定逻辑坐标系中X和Y轴的
正方向.例如:
SetViewportExtEx( hDC, 10, 10, NULL );
SetWindowExtEx( hDC, 2, -2, NULL );
MM_ISOTROPIC X轴和Y轴比例关系相等.
MM_ANISOTROPIC X轴和Y轴比例关系可不等
2.3 坐标系的原点
2.3.1 窗口坐标系 - 逻辑坐标系
视口坐标系 - 设备坐标系
2.3.2 窗口坐标系和视口坐标系原点重合,也
可以修改
SetViewportOrgEx 设备坐标系原点对应
逻辑坐标系的位置
SetWindowOrgEx 逻辑坐标系原点对应
设备坐标系的位置