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 }