1 #include <windows.h>
2
3 #define WINDOWCLASS TEXT("Test")
4 #define WNDTITLE TEXT("Test")
5
6 #define WINDOW_WIDTH 480
7 #define WINDOW_HIGHT 420
8
9 LRESULT CALLBACK WndProc(HWND hWnd,UINT meg,WPARAM wParam,LPARAM lParam);
10 void Clear();
11
12
13 HDC hMemoryDC;
14 HDC hDC;
15 HBITMAP hBitMap;
16
17 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
18 {
19 HWND hWnd;
20 WNDCLASSEX wndClassEx =
21 {
22 sizeof(WNDCLASSEX),
23 CS_HREDRAW | CS_VREDRAW,
24 WndProc,
25 0,0,
26 hInstance,
27 LoadIcon(NULL,IDI_APPLICATION),
28 LoadCursor(NULL,IDC_ARROW),
29 (HBRUSH)GetStockObject(WHITE_BRUSH),
30 NULL,
31 WINDOWCLASS,
32 LoadIcon(NULL,IDI_WINLOGO)
33 };
34
35 RegisterClassEx(&wndClassEx);
36 hWnd = CreateWindowEx(
37 0,
38 WINDOWCLASS,
39 WNDTITLE,
40 WS_OVERLAPPEDWINDOW,
41 CW_USEDEFAULT,
42 CW_USEDEFAULT,
43 WINDOW_WIDTH,
44 WINDOW_HIGHT,
45 NULL,
46 NULL,
47 hInstance,
48 NULL
49 );
50
51 if (NULL == hWnd)
52 {
53 return 0;
54 }
55
56
57 // 4 个步骤:
58 // 1,创建设备上下文。
59 // 2,创建GDI对象。
60 // 3,将GDI对象赋给设备上下文。
61 // 4,BitBlt位块传输给其他设备,以用显示。
62
63
64 hDC = GetDC(hWnd); // 先将图片放入内存,在从内存放入屏幕,GetDC(hWnd) 得到窗口上下文的句柄
65 hMemoryDC = CreateCompatibleDC(hDC); // 为了读进内存,先建立与屏幕相兼容内存上下文
66 // 得到HBITMAP 对象 是一个HGDIOBJ
67 hBitMap = (HBITMAP)LoadImage(NULL,TEXT("C:\\Users\\boiceliu\\Pictures\\girl.bmp"),IMAGE_BITMAP, WINDOW_WIDTH,WINDOW_HIGHT ,LR_LOADFROMFILE);
68 //hBitMap = (HBITMAP)LoadImage(NULL,TEXT("C:\\Users\\boiceliu\\Pictures\\girl.bmp"),IMAGE_BITMAP,480,400,LR_LOADFROMFILE);
69 // 经测试LoadImage 的参数int cx,int cy 代表要将图片写入分辨率为cx * cy的内存区,如果和图片原始分辨率不同的话,你懂的。
70
71 if (NULL == hBitMap)
72 {
73 MessageBox(NULL,TEXT("NULL == hBitMap"),TEXT("ERROR"),MB_OK);
74 return 0;
75 }
76 SelectObject(hMemoryDC,hBitMap); // 将HBITMAP 作为内存上下文的GDI对象。
77
78 ShowWindow(hWnd,nShowCmd);
79 UpdateWindow(hWnd);
80
81 MSG msg;
82
83 while (true)
84 {
85 if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
86 {
87 if (WM_QUIT == msg.message)
88 {
89 break;
90 }
91 TranslateMessage(&msg);
92 DispatchMessage(&msg);
93 }
94 }
95 return msg.wParam;
96 }
97
98 void Clear()
99 {
100 //ReleaseDC(hWnd,hDC);
101 //ReleaseDC(hWnd,hMemoryDC);
102 DeleteDC(hDC);
103 DeleteDC(hMemoryDC);
104 }
105
106 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg,WPARAM wParam,LPARAM lParam)
107 {
108 HDC hDC;
109 PAINTSTRUCT ps;
110
111 switch (msg)
112 {
113 case WM_SIZE:
114
115 case WM_PAINT:
116 {
117 hDC = BeginPaint(hWnd,&ps);
118
119 // SRCCOPY 表示直接用源像素替换目的像素,这里还可以是一些其他的操作
120 // 大多位运算,以确定像素是怎样写入的。这些操作可以实现一些特效。
121 BitBlt(hDC,0,0,WINDOW_WIDTH,WINDOW_HIGHT,hMemoryDC,0,0,SRCCOPY);
122 EndPaint(hWnd,&ps);
123 }
124 break;
125 case WM_KEYDOWN:
126 {
127 if (VK_ESCAPE == wParam )
128 {
129 DestroyWindow(hWnd);
130 }
131 }
132 break;
133 case WM_CLOSE:
134 {
135 Clear();
136 DestroyWindow(hWnd);
137 }
138 break;
139 case WM_DESTROY:
140 {
141 PostQuitMessage(0);
142 }
143 break;
144 default:
145 return DefWindowProc(hWnd,msg,wParam,lParam);
146 }
147 return 0;
148 }