LoadImage 和 BitBlt

  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 }
View Code

 

posted @ 2013-09-07 17:09  lc_cnblog  阅读(510)  评论(0编辑  收藏  举报