#include <windows.h> #define WINDOWCLASS TEXT("Test")
#define WNDTITLE TEXT("Test") #define WINDOW_WIDTH 480
#define WINDOW_HIGHT 420 LRESULT CALLBACK WndProc(HWND hWnd,UINT meg,WPARAM wParam,LPARAM lParam);
void Clear(); HDC hMemoryDC;
HDC hDC;
HBITMAP hBitMap; int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
HWND hWnd;
WNDCLASSEX wndClassEx =
{
sizeof(WNDCLASSEX),
CS_HREDRAW | CS_VREDRAW,
WndProc,
,,
hInstance,
LoadIcon(NULL,IDI_APPLICATION),
LoadCursor(NULL,IDC_ARROW),
(HBRUSH)GetStockObject(WHITE_BRUSH),
NULL,
WINDOWCLASS,
LoadIcon(NULL,IDI_WINLOGO)
}; RegisterClassEx(&wndClassEx);
hWnd = CreateWindowEx(
,
WINDOWCLASS,
WNDTITLE,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
WINDOW_WIDTH,
WINDOW_HIGHT,
NULL,
NULL,
hInstance,
NULL
); if (NULL == hWnd)
{
return ;
} // 4 个步骤:
// 1,创建设备上下文。
// 2,创建GDI对象。
// 3,将GDI对象赋给设备上下文。
// 4,BitBlt位块传输给其他设备,以用显示。 hDC = GetDC(hWnd); // 先将图片放入内存,在从内存放入屏幕,GetDC(hWnd) 得到窗口上下文的句柄
hMemoryDC = CreateCompatibleDC(hDC); // 为了读进内存,先建立与屏幕相兼容内存上下文
// 得到HBITMAP 对象 是一个HGDIOBJ
hBitMap = (HBITMAP)LoadImage(NULL,TEXT("C:\\Users\\boiceliu\\Pictures\\girl.bmp"),IMAGE_BITMAP, WINDOW_WIDTH,WINDOW_HIGHT ,LR_LOADFROMFILE);
//hBitMap = (HBITMAP)LoadImage(NULL,TEXT("C:\\Users\\boiceliu\\Pictures\\girl.bmp"),IMAGE_BITMAP,480,400,LR_LOADFROMFILE);
// 经测试LoadImage 的参数int cx,int cy 代表要将图片写入分辨率为cx * cy的内存区,如果和图片原始分辨率不同的话,你懂的。 if (NULL == hBitMap)
{
MessageBox(NULL,TEXT("NULL == hBitMap"),TEXT("ERROR"),MB_OK);
return ;
}
SelectObject(hMemoryDC,hBitMap); // 将HBITMAP 作为内存上下文的GDI对象。 ShowWindow(hWnd,nShowCmd);
UpdateWindow(hWnd); MSG msg; while (true)
{
if (PeekMessage(&msg,NULL,,,PM_REMOVE))
{
if (WM_QUIT == msg.message)
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
} void Clear()
{
//ReleaseDC(hWnd,hDC);
//ReleaseDC(hWnd,hMemoryDC);
DeleteDC(hDC);
DeleteDC(hMemoryDC);
} LRESULT CALLBACK WndProc(HWND hWnd, UINT msg,WPARAM wParam,LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps; switch (msg)
{
case WM_SIZE: case WM_PAINT:
{
hDC = BeginPaint(hWnd,&ps); // SRCCOPY 表示直接用源像素替换目的像素,这里还可以是一些其他的操作
// 大多位运算,以确定像素是怎样写入的。这些操作可以实现一些特效。
BitBlt(hDC,,,WINDOW_WIDTH,WINDOW_HIGHT,hMemoryDC,,,SRCCOPY);
EndPaint(hWnd,&ps);
}
break;
case WM_KEYDOWN:
{
if (VK_ESCAPE == wParam )
{
DestroyWindow(hWnd);
}
}
break;
case WM_CLOSE:
{
Clear();
DestroyWindow(hWnd);
}
break;
case WM_DESTROY:
{
PostQuitMessage();
}
break;
default:
return DefWindowProc(hWnd,msg,wParam,lParam);
}
return ;
}