程序将系统窗口左上角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 }
原文:http://www.cnblogs.com/lanf/p/5092945.html