SDK截图程序(一)

时间:2021-12-24 19:08:03

程序将系统窗口左上角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 }