先说说HBITMAP和BITMAP的区别,及两个结构
HBITMAP是一个句柄
DECLARE_HANDLE(HBITMAP);
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
BITMAP是一个结构,用于存储位图的信息
/* Bitmap Header Definition */
typedef struct tagBITMAP
{
LONG bmType; //类型,必须为0
LONG bmWidth; //位图宽度
LONG bmHeight; //位图高度
LONG bmWidthBytes; //每一行像素所在的byte数
WORD bmPlanes;//颜色平面数
WORD bmBitsPixel;//像素的位数
LPVOID bmBits;//位图内存指针
} BITMAP, *PBITMAP, NEAR *NPBITMAP, FAR *LPBITMAP;
先说下位图资源显示的步骤
1.加载位图资源
HBITMAP hBitmap = LoadBitmap((HINSTANCE)hWnd,MAKEINTRESOURCE(IDB_BITMAP1));
/*
* Resource Loading Routines
*/
WINUSERAPI
HBITMAP
WINAPI
LoadBitmapA(
__in_opt HINSTANCE hInstance,
__in LPCSTR lpBitmapName);
WINUSERAPI
HBITMAP
WINAPI
LoadBitmapW(
__in_opt HINSTANCE hInstance,
__in LPCWSTR lpBitmapName);
#ifdef UNICODE
#define LoadBitmap LoadBitmapW
#else
#define LoadBitmap LoadBitmapA
#endif // !UNICODE
2.获取位图信息
GetObject(hBitmap,sizeof(BITMAP),&bitmap);
WINGDIAPI int WINAPI GetObjectA(__in HANDLE h, __in int c, __out_bcount_opt(c) LPVOID pv);
WINGDIAPI int WINAPI GetObjectW(__in HANDLE h, __in int c, __out_bcount_opt(c) LPVOID pv);
#ifdef UNICODE
#define GetObject GetObjectW
#else
#define GetObject GetObjectA
#endif // !UNICODE
3.创建内存绘图设备环境上下文,创建与设备环境兼容的内存环境
HDC hdcMem = CreateCompatibleDC(hdc);
WINGDIAPI HDC WINAPI
CreateCompatibleDC(
__in_opt HDC hdc //绘图设备上下文
);
4.把GDI位图对象选入内存设备环境
SelectObject 该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。
SelectObject(hdcMem,hBitmap);
__gdi_entry WINGDIAPI HGDIOBJ WINAPI
SelectObject(
__in HDC hdc