如何在窗口显示一张位图呢?可以用BitBlt函数(bit block transfer 位块传送),基本按照这几步就可以了
第一步:加载位图,获得位图句柄
第二步:从位图句柄获取位图信息,比如宽度,高度等
第三步:创建兼容DC
第四步:将位图选进DC
然后就可以使用BitBlt函数显示位图了
BitmapDemo.cpp
# include<windows.h>
# include"resource.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR lpCmdLine,
int iCmdShow
)
{
static TCHAR szAppName[] = TEXT("Bitmap Demo");
WNDCLASS wndclass;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hIcon = LoadIcon(hInstance,IDI_APPLICATION); //同上
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = WndProc;
wndclass.lpszClassName = szAppName;
wndclass.lpszMenuName = NULL;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
if (!RegisterClass(&wndclass))//注册窗口类
{
MessageBox(NULL, TEXT("Program requires windows NT!"), szAppName, MB_ICONERROR);
return 0;
}
HWND hwnd;
hwnd = CreateWindow(szAppName, TEXT("Bitmap Demo"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);//在窗口风格用或语句就可以加上滚动条了
//CW_USEDEFAULT表示采用系统默认的值
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
HDC hdc;
PAINTSTRUCT ps;
static HBITMAP hBitImage;
BITMAP bitmap;
static int cxBit, cyBit;//位图的宽度,高度
HDC hdcMemory;
switch (uMsg)
{
case WM_CREATE:
//第一步:加载位图,获得位图句柄
hBitImage=LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance, TEXT("BitMapDemo"));
//第二步:从位图句柄获取位图信息,比如宽度,高度等
GetObject(hBitImage, sizeof(BITMAP), &bitmap);
cxBit = bitmap.bmWidth;
cyBit = bitmap.bmHeight;
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
MoveWindow(hwnd, 100, 50, cxBit, cyBit, TRUE);
//第三步:创建兼容DC
hdcMemory = CreateCompatibleDC(hdc);
//第四步:将位图选进DC
SelectObject(hdcMemory, hBitImage);
BitBlt(hdc, 0, 0, cxBit, cyBit, hdcMemory, 0, 0, SRCCOPY);
EndPaint(hwnd, &ps);
DeleteDC(hdcMemory);
return 0;
case WM_CLOSE:
DeleteObject(hBitImage);
PostQuitMessage(0);
//DestroyWindow(hwnd);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}