SDK截图程序(一)

程序将系统窗口左上角100*100的图像复制到粘贴板上。程序的关键位置上加上了注释,相关知识《windows程序设计》第14章内容

 1 #include <windows.h>
 2 #pragma comment(linker,"/subsystem:\"windows\"" )
 3 HBITMAP GetBitmap();
 4 
 5 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
 6 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
 7             PSTR szCmdLine, int iCmdShow)
 8 {
 9 
10      static TCHAR szAppName [] = TEXT ("BitBlt") ;
11      HWND         hwnd ;
12      MSG          msg ;
13      WNDCLASS     wndclass ;
14      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
15      wndclass.lpfnWndProc   = WndProc ;
16      wndclass.cbClsExtra    = 0 ;
17      wndclass.cbWndExtra    = 0 ;
18      wndclass.hInstance     = hInstance ;
19      wndclass.hIcon         = LoadIcon (NULL, IDI_INFORMATION) ;
20      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
21      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
22      wndclass.lpszMenuName  = NULL ;
23      wndclass.lpszClassName = szAppName ;
24      
25      if (!RegisterClass (&wndclass))
26      {
27           MessageBox (NULL, TEXT ("This program requires Windows NT!"),
28                       szAppName, MB_ICONERROR) ;
29           return 0 ;
30      }
31      
32      hwnd = CreateWindow (szAppName, TEXT ("BitBlt Demo"), 
33                           WS_OVERLAPPEDWINDOW, 
34                           CW_USEDEFAULT, CW_USEDEFAULT,
35                           CW_USEDEFAULT, CW_USEDEFAULT,
36                           NULL, NULL, hInstance, NULL) ;
37      ShowWindow (hwnd, iCmdShow) ;
38      UpdateWindow (hwnd) ;
39 
40      while (GetMessage (&msg, NULL, 0, 0))
41      {
42           TranslateMessage (&msg) ;
43           DispatchMessage (&msg) ;
44      }
45      return msg.wParam ;
46 }
47 
48 LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
49 {
50     static HDC         hdcClient, hdcWindow ;
51     static HDC hdcMem;
52     HBITMAP hBitmap;
53     PAINTSTRUCT ps ;
54     
55     switch (message)
56     {
57         case WM_CREATE:
58         {
59             hdcClient=GetDC(hwnd);   //获得应用程序客户区窗口句柄
60             hdcWindow = GetWindowDC (NULL) ;  //GetWindowDC可以获得整个应用程序窗口句柄(客户区和非客户区)
61             //当参数传值为NULL的时候,得到系统窗口的句柄
62             hBitmap=CreateCompatibleBitmap(hdcClient,100,100);   //创建与设备兼容的位图,宽100像素,高100像素
63             hdcMem=CreateCompatibleDC(hdcClient);                //创建内存设备环境句柄
64             SelectObject(hdcMem,hBitmap);                        //将位图选进内存设备环境
65           
66             BitBlt (hdcMem, 0, 0, 100,100,  hdcWindow, 0, 0, SRCCOPY) ;   //将系统窗口左上角100*100的图像像素复制到内存设备环境
67  
68             OpenClipboard( hwnd ) ;   //打开粘贴板
69             EmptyClipboard() ;        //清空粘贴板
70             SetClipboardData( CF_BITMAP, hBitmap ) ;   //设置粘贴板数据,即将位图设置进粘贴
71 
72             //之前有将新建的位图选进内存设备环境,后来将系统窗口100*100像素图像复制移动到内存
73             //设备环境。我的理解是,将位图选进内存设备环境之后,针对内存设备环境的操作,改变了
74             //位图的内容,而不需要再将内存设备环境选进位图了
75 
76             CloseClipboard() ;       //关闭粘贴板
77             ReleaseDC (hwnd, hdcWindow) ;
78             return 0 ;
79         }
80 
81     case WM_SIZE:
82         
83         return 0 ;
84 
85     case WM_PAINT:
86           hdcClient=BeginPaint (hwnd, &ps) ;
87           BitBlt (hdcClient, 0, 0, 100,100,  hdcMem, 0, 0, SRCCOPY) ;  //这里我们做一个小测试,将截取的图片显示在客户区
88           //这样需要将hdcClient和hdcMem定义成static的
89           EndPaint (hwnd, &ps) ;
90           return 0 ;
91 
92     case WM_DESTROY:
93           PostQuitMessage (0) ;
94           return 0 ;
95      }
96 
97     return DefWindowProc (hwnd, message, wParam, lParam) ;
98 }

 

posted @ 2016-01-01 04:25  廖凡  阅读(611)  评论(0编辑  收藏  举报