SDK截图程序(一)
2016-01-01 04:25
260 查看
程序将系统窗口左上角100*100的图像复制到粘贴板上。程序的关键位置上加上了注释,相关知识《windows程序设计》第14章内容
#include <windows.h> #pragma comment(linker,"/subsystem:\"windows\"" ) HBITMAP GetBitmap(); LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName [] = TEXT ("BitBlt") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_INFORMATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, TEXT ("BitBlt Demo"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HDC hdcClient, hdcWindow ; static HDC hdcMem; HBITMAP hBitmap; PAINTSTRUCT ps ; switch (message) { case WM_CREATE: { hdcClient=GetDC(hwnd); //获得应用程序客户区窗口句柄 hdcWindow = GetWindowDC (NULL) ; //GetWindowDC可以获得整个应用程序窗口句柄(客户区和非客户区) //当参数传值为NULL的时候,得到系统窗口的句柄 hBitmap=CreateCompatibleBitmap(hdcClient,100,100); //创建与设备兼容的位图,宽100像素,高100像素 hdcMem=CreateCompatibleDC(hdcClient); //创建内存设备环境句柄 SelectObject(hdcMem,hBitmap); //将位图选进内存设备环境 BitBlt (hdcMem, 0, 0, 100,100, hdcWindow, 0, 0, SRCCOPY) ; //将系统窗口左上角100*100的图像像素复制到内存设备环境 OpenClipboard( hwnd ) ; //打开粘贴板 EmptyClipboard() ; //清空粘贴板 SetClipboardData( CF_BITMAP, hBitmap ) ; //设置粘贴板数据,即将位图设置进粘贴 //之前有将新建的位图选进内存设备环境,后来将系统窗口100*100像素图像复制移动到内存 //设备环境。我的理解是,将位图选进内存设备环境之后,针对内存设备环境的操作,改变了 //位图的内容,而不需要再将内存设备环境选进位图了 CloseClipboard() ; //关闭粘贴板 ReleaseDC (hwnd, hdcWindow) ; return 0 ; } case WM_SIZE: return 0 ; case WM_PAINT: hdcClient=BeginPaint (hwnd, &ps) ; BitBlt (hdcClient, 0, 0, 100,100, hdcMem, 0, 0, SRCCOPY) ; //这里我们做一个小测试,将截取的图片显示在客户区 //这样需要将hdcClient和hdcMem定义成static的 EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
相关文章推荐
- Autorun.inf文件(2):改变硬盘分区图标
- 关于Autorun.inf文件
- 黑马程序员——java面试题之基础语法
- 映像劫持技术(2):实例
- 映像劫持技术(1):简单介绍
- 将程序复制到系统目录,设置开机自启动
- 理解Fragment生命周期
- Fragment间的通信
- Java设计模式——六大原则
- Android之greenDao的使用
- 黑马程序员——网络编程之TCP协议
- HDU2853-Assignment KM 限制边的交换
- 接口回调
- cocos2d-x学习笔记【一】创建自己的场景类
- 黑马程序员——网络编程之UDP协议
- -bash: fork: retry: Resource temporarily unavailable
- 在新的一年里,小娜伴我前行
- ISO/IEC 9899:2011 条款6.8.4——选择语句
- 医道官途
- Android子线程中更新UI的三种方法和获取message的两种方法总结