位图
可以将视讯显示器看作是一幅大的点阵图。在屏幕上看到的图素由储存在视讯显示卡上记忆体中的位元来描述。任何视讯现实的矩形区域也是一个点阵图,其大小是它所包含的行列数。
实际上是一个将图像从视讯显示的一个区域复制到另一个区域。
可以使用 Bitblt()函数来实现视讯显示器上图像的呈现。
下面是Bitblt()的参数:
BitBlt( _In_ HDC hdc, _In_ int x, _In_ int y, _In_ int cx, _In_ int cy, _In_opt_ HDC hdcSrc, _In_ int x1, _In_ int y1, _In_ DWORD rop);
Bitblt()函数从称为【来源(source)】的装置内容中将一个矩形区的图素传输到称为【目的(destination)】的另一个装置内容中相同大小的矩形区。
所谓的目的装置内容就是视窗的显示区域,装置内容代号从BeginPaint获得,当然你也可以在键鼠操作中,在WM_CREATE中自定义hdMem,通过
hdcMem = CreateCompatibleDC(hdc);.
这条语句实现。
来源装置内容是应用程式的整个视窗,此装置内容代号从GetWindowDC获得。显然,这两个装置内容指的是同一个实际设备(视讯显示器)。但是,这两个装置内容的坐标原点不同。
In int x1, In int y1参数指明了来源图像左上角的坐标位置。在Bitblt中,这两个参数设置为0,表示图像从来源装置内容(即整个视窗)的左上角开始,In int cx, In int cy参数是图像的宽度和高度。
可以使用以下代码准确获得来源图像的宽度和高度:
GetObject(hBitmap, sizeof(BITMAP), &bitmap);
cxSource = bitmap.bmWidth;
cySource = bitmap.bmHeight;
In int x, In int y,表示了复制图像位置左上角的坐标位置。在Bitblt中,这两个参数设定为不同的值可以实现来源图像在视讯显示器中的复制。
Bitblt的最后一个参数是位元映射操作形态。Bitblt是从实际视讯显示记忆体传输图素,而不是从系统功能表图示的其他图像传输。如果移动Bitblt视窗使得部分系统功能表图示移出屏幕,然后调整Bitblt视窗的尺寸使其重画,这时,Bitblt显示区域中显示的是功能表图示的一部分。Bitblt函数不在存取整个图像。
下面进行具体操作的说明:
注意若使用LoadImage函数导入图像,来源图像类型必须是bmp类型。
LoadImage(
_In_opt_ HINSTANCE hInst,//加载外部资源时设置为null
_In_ LPCWSTR name,//完整的来源图像文件路径 或者 文件名
_In_ UINT type,//图片类型,IMAGE_CURSOR || IMAGE_ICON || IMAGE_BITMAP
_In_ int cx,
_In_ int cy,
_In_ UINT fuLoad);//通常为LR_DEFAULTCOLOR || LR_CREATEDIBSECTION ,若是加载外部资源,即我们现在进行的操作,则设置为 LR_LOADFROMFILE
将来源图像存放在项目文件夹中,若不进行存放操作,则要在第二个参数中写明完整的来源图像文件路径。
In int cx, In int cy两个参数,想要按照来源图像文件的实际尺寸加载,那么就要设置 In int cx, In int cy = 0,并且fuLoad 不指定LR_DEFAULTSIZE。
若有一定的图像大小要求,则 In int cx, In int cy不为0(设置为要求所限制的规格),并且fuLoad不指定LR_DEFAULTSIZE,此时,来源图像会根据实际大小进行缩放。
这里的 LR_DEFAULTSIZE 只对Icon和Cursor起作用,对Bitmap不起作用。
一段代码实例:
在LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){}中定义
static HBITMAP hBitmap;
BITMAP bitmap;
然后再编写以下代码:
case WM_CREATE:
{
hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
hBitmap = (HBITMAP)LoadImage(NULL, TEXT("作业素材.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
GetObject(hBitmap, sizeof(BITMAP), &bitmap);
cxSource = bitmap.bmWidth;
cySource = bitmap.bmHeight;
hdc2 = GetDC(hWnd);
hdcMem = CreateCompatibleDC(hdc2);//must be located in Creat part...
return 0;
}
然后在WM_PAINT中使用Bitblt进行图像的绘制:
case WM_PAINT:
{
HDC hdc = BeginPaint(hWnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hBitmap);
BitBlt(hdc, x1,x2, cxSource, cySource, hdcMem, 0, 0, SRCCOPY);
EndPaint(hWnd, &ps);
}
break;