MFC学习小例子屏幕抓图程序代码
- 格式:doc
- 大小:27.00 KB
- 文档页数:5
我们先从简单的开始吧.先分一个类:(一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID)(二) 动态载入图片(即只需要在程序中指定图片的路径即可载入)为方便说明,我们已经建好一个基于对话框的工程,名为Ttest.对话框类为CTestDlg(一) 非动态载入图片.方法1.先从最简单的开始,用picture 控件来实现. 步骤:先在资源里Import一张图片,ID为IDB_BITMAP2 然后在对话框上添加一个picture控件,右键点击打开属性,将type下拉框选择BITMAP,紧跟着下面就出现一个Image下拉框,拉开就会看到所有已经载入好的图片,选择你要的图片.运行程序即可看到.方法2.通过背景图同样如上,先载入一张图片,ID为IDB_BITMAP2 TestDlg.h中CBrush m_brBk;//在public中定义TestDlg.cpp中在初始化函数OnInitDialog()中加入:BOOL CTestDlg::OnInitDialog(){CDialog::OnInitDialog();CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP2);m_brBk.CreatePatternBrush(&bmp);bmp.DeleteObject();...return TRUE; // return TRUE unless you set the focus to a control}在打开类向导,找到WM_CTLCOLOR消息,重载得对应函数OnCtlColor(),添加如下:HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr =CDialog::OnCtlColor(pDC, pWnd, nCtlColor);if (pWnd == this){return m_brBk;}return hbr;}(二) 动态载入图片.方法3 图像控件(本例用KoDak 图像编辑控件)1. 首先应该保证系统中有这个控件。
mfc简单绘图程序报告简单绘图程序1 需求说明1.1 问题描述设计一个简单的绘图应用程序,可以绘制图形或自由绘制线段,可以更改颜色、画笔粗细、保存文件。
1.2功能说明1.图形绘制功能:直线、椭圆、矩形。
在菜单栏中选择需要的图形(也可以通过工具栏中选择)用鼠标便能在视图中绘出相应的图形。
2.可以绘制自由线段3.对图形的操作:能通过菜单栏弹出对话框选择线宽、自定义颜色,也可以擦除绘制的线段。
4.可以保存绘图文件,保存后打开可以继续绘制。
2.1.3 数据说明在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。
在CDzyView类中添加一个私有变量xz;用来保存用户的选择(直线、矩形、椭圆、自由绘图)在绘制时都可有两点来确定其图形。
当鼠标左击时得到一个点,当鼠标停止移动时得到另外一个点。
为视图类CDzyView分别捕获鼠标左键按下和弹起这两个消息。
当鼠标左键按下时,需要将鼠标当前按下点保存至sx、sy,在鼠标移动停止后,将当前坐标保存至ex,ey.其他主要数据说明:int fd 判断是否为自由绘图模式int w 线宽int R RGB中的Rint G RGB中的Gint B RGB中的BCGraph类中int m_nType:保存后重绘时用户的选择int qdx; 重绘起点xint qdy; 重绘起点yint zdx; 重绘终点xint zdy; 重绘终点yCLine类中int cx; 重绘线宽int sx; 重绘起点xint sy; 重绘起点yint zx; 重绘终点xint zy; 重绘终点yint w; 重绘线宽自定义颜色对话框关联变量:IDC_EDIT_RED int m_RedIDC_EDIT_GREEN int m_GreenIDC_EDIT_BLUE int m_BlueIDC_SCROLL_RED CScrollBar m_SredIDC_SLIDER_GREEN CSliderCtrl m_SgreenIDC_SPIN_BLUE CSpinButtonCtrl m_Sblue2 分析、设计与实现2.1 主要功能设计与实现2.1.1 有关文档视图功能的设计与实现单文档结构可序列化的类CGraph从CObject派生可序列化的类CLine从CObject派生对话框类zdyyanse从CDialog派生2.1.2 有关消息处理的设计与实现方案:需要响应的消息应有:鼠标移动、鼠标左键按下、鼠标左键抬起、菜单栏中的画矩形、画直线、画椭圆、自由绘图、更多选项中的自定义颜色、工具栏中的红色、蓝色、绿色、线宽1、线宽2、线宽3、橡皮擦。
MFC画图程序步骤MFC(Microsoft Foundation Class)是一种用于开辟Windows应用程序的C++类库。
在MFC中,我们可以使用GDI(Graphics Device Interface)来创建和操作图形。
下面是使用MFC创建一个简单的画图程序的步骤。
步骤1:创建一个新的MFC项目首先,打开Visual Studio并选择创建一个新的项目。
在项目类型中,选择Visual C++ -> MFC,然后选择MFC应用程序类型。
输入项目名称并选择保存的位置。
在应用程序类型中,选择“单文档”或者“多文档”视图,具体根据你的需求而定。
点击“确定”按钮创建项目。
步骤2:设计用户界面在MFC应用程序中,用户界面是通过对话框资源来设计的。
在资源视图中,双击IDD_DIALOG(或者其他对话框资源)以打开对话框编辑器。
在对话框编辑器中,你可以添加按钮、文本框、菜单等控件来设计你的用户界面。
在画图程序中,你可以添加一个画布控件来显示绘制的图形。
步骤3:添加绘图功能在MFC中,你可以使用GDI来进行绘图操作。
打开你的对话框类的头文件(例如,CMyDialog.h),添加以下头文件引用:#include <afxwin.h>#include <afxext.h>#include <afxdisp.h>在对话框类的源文件(例如,CMyDialog.cpp)中,添加以下代码来处理绘图操作:```void CMyDialog::OnPaint(){CPaintDC dc(this); // 用于绘制的设备上下文// 在这里进行绘图操作dc.Rectangle(100, 100, 200, 200); // 绘制一个矩形dc.Ellipse(300, 100, 400, 200); // 绘制一个椭圆}```步骤4:处理绘图事件在对话框类的消息映射中添加对绘图事件的处理。
MFC获取picture控件的鼠标点击坐标位置的方法MFC 获取picture控件的鼠标点击坐标位置的方法在一个自定义的Dialog中加入了picture控件,想要获取鼠标在该控件上的点击位置,遇到一些困难,最终解决了。
方法如下:其实挺简单的,首先用自定义的Dialog类重载CDialog的PreTranslateMessage函数,并在其中用到了Dialog的OnLButtonDown函数(其实不用也行,我只是想把操作封在这个函数里)这样就可以通过此函数传递点击位置。
BOOL PrintDialog::PreTranslateMessage(MSG* pMsg){// TODO: Add your specialized code here and/or call the base classif(pMsg->message == WM_LBUTTONDOWN &&GetDlgItem(IDC_PACKPIC)->GetSafeHwnd() == pMsg->hwnd)OnLButtonDown(MK_LBUTTON, pMsg->pt); //在此传递点击部位在对话框中的坐标return CDialog::PreTranslateMessage(pMsg);}接下来在Dialog中的OnLButtonDown函数中判段是否点在picture控件内(lRect是控件的区域)if((point.x>=lRect.left && point.x<=lRect.right) && (point.y>=lRect.top &&point.y<=lRect.bottom)){// 通过对point的处理,获得实际在picture控件中的点击位置(坐标),完成。
point.x-=lRect.left;point.y-=lRect.top;}。
mfc项目开发实例85个全文共四篇示例,供读者参考第一篇示例:MFC(Microsoft Foundation Classes)是一种面向Windows操作系统开发的图形用户界面应用程序框架,它是微软公司推出的一种软件开发工具,为开发人员提供了一系列类和函数,用于快速、简便地创建Windows应用程序。
在本文中,我们将介绍一些MFC项目开发的实例,希望对MFC开发者有所启发和帮助。
一、MFC项目开发实例之文件操作1. 创建一个MFC项目,实现文件的读取和写入功能。
可以通过CFile类来实现文件的打开、读取、写入和关闭操作。
2. 创建一个MFC项目,实现文件夹的遍历和文件的拷贝功能。
可以使用CFileFind类来查找文件和文件夹,使用CopyFile函数来实现文件的拷贝。
6. 创建一个MFC项目,实现数据库连接和查询功能。
可以使用CDatabase类和CRecordset类来连接数据库和执行SQL查询。
11. 创建一个MFC项目,实现多文档视图窗口的创建和切换功能。
可以通过CMDIChildWnd类和CDocument类来创建多文档视图窗口。
12. 创建一个MFC项目,实现对话框的创建和控件的添加功能。
可以通过CDialog类和CWnd类来创建对话框,使用CButton类、CEdit类和CListCtrl类等控件来添加在对话框中。
13. 创建一个MFC项目,实现菜单和工具栏的添加和事件处理功能。
可以通过CMenu类和CToolBar类来添加菜单和工具栏,使用消息映射来处理菜单和工具栏事件。
14. 创建一个MFC项目,实现状态栏和进度条的显示和更新功能。
可以通过CStatusBar类和CProgressCtrl类来创建状态栏和进度条,使用SetPaneText和SetPos函数来更新状态栏和进度条。
15. 创建一个MFC项目,实现动画和图像显示功能。
可以使用CImageList类和CAnimateCtrl类来实现动画和图像的显示。
学了MFC一段时间后,试着要用对话框打开一幅bmp图像并保存,结果发现网上这些资料太少了,而且有的也讲不清,讲不全,所以自己磕磕碰碰捣鼓了好久,期间也谢谢各位大神的指导,现在我终于完成,特意写出来与大家分享,各位菜鸟共勉。
一、首先要先了解bmp位图结构/d06c23543c1ec5da50e2706d.html可以去看看,内容不多但是够看,也容易懂二、了解位图的显示函数SetStretchBltMode()StretchDIBits()具体函数介绍自己百度一下,我就不多说了三、开始做啦1、新建一个MFC对话框文档默认其他设置,点击完成后会出现这个界面在按钮上单击鼠标右键,在弹出的列表中选择属性把标题改为读取图片再添加一个按钮,把ID改为IDC_SA VE,标题改为保存图片在控件中选择图像,然后在对话框画一个大小适宜的矩形框,在选中对话框点击右键,选择属性,把ID改为IDC_PICTURE回到对话框界面,双击读取图片按钮,这时会弹出一个对话框,点确定然后就会跳到关联函数这边了先把CDialog::OnOK();注释起来,这个是点击按钮后对话框就会关闭的函数然后在// CDialog::OnOK();下面添加以下代码代码都有注释,不懂的地方可以自己再百度//CFileDialog为VC中打开文件对话框类BITMAPFILEHEADER bmpHeader;//文件头BITMAPINFOHEADER bmpInfo;//信息头CFileDialog dlg(TRUE, "*.BMP", NULL, NULL,"位图文件(*.BMP)|*.bmp;*.BMP|",this);CFile bmpFile;//记录打开文件CString strFileName;//记录选择文件路径if (!dlg.DoModal() == IDOK) return;strFileName = dlg.GetPathName();//以只读的方式打开文件if(!bmpFile.Open(strFileName, CFile::modeRead|CFile::typeBinary)) return;if(bmpFile.Read(&bmpHeader,sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER)){AfxMessageBox("read bmp header failed!");return;}if (bmpHeader.bfType != 0x4d42){AfxMessageBox("invalid file type!");return;}if(bmpFile.Read(&bmpInfo,sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER)){AfxMessageBox("read bmp infor header failed!");return;}if (bmpInfo.biBitCount != 24){AfxMessageBox("File is not 24 bit.Application doesn't support this kind of file!");return;}pBmpInfo = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER)];if (!pBmpInfo){AfxMessageBox("memory error!");return;}//为图像数据申请空间memcpy(pBmpInfo,&bmpInfo,sizeof(BITMAPINFOHEADER));DWORD dataBytes = bmpHeader.bfSize - bmpHeader.bfOffBits;pBmpData = (BYTE*)new char[dataBytes];if (!pBmpData){AfxMessageBox("memory error!");delete pBmpData;return;}if (bmpFile.Read(pBmpData,dataBytes) != dataBytes){AfxMessageBox("Read bmp data failed!");delete pBmpInfo;delete pBmpData;return;}bmpFile.Close();CWnd *pWnd=GetDlgItem(IDC_PICTURE);//获得pictrue控件窗口的句柄CRect rect;pWnd->GetClientRect(&rect);//获得pictrue控件所在的矩形区域CDC *pDC=pWnd->GetDC();//获得pictrue控件的DC//显示图片pDC->SetStretchBltMode(COLORONCOLOR);StretchDIBits(pDC->GetSafeHdc(),0,0,rect.Width(),rect.Height(),0,0,bmpInfo.biWidth,bmpI nfo.biHeight,pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);iBmpWidth=bmpInfo.biWidth;iBmpHeight=bmpInfo.biHeight;然后在这个.cpp文件头处添加BITMAPINFO* pBmpInfo; //记录图像细节BYTE* pBmpData; //图像数据int iBmpWidth; // 输入的宽度,以像素为单位int iBmpHeight; // 输入的高度,以像素为单位这些是全局变量,主要是为了后面图像保存可以用的再回到对话框界面,双击保存图片按钮,这时会弹出一个对话框,点确定然后就会跳到关联函数这边了在// TODO: Add your control notification handler code here下添加下面这些代码BITMAPFILEHEADER bmpf;//文件头BITMAPINFOHEADER bmpi;//信息头int Widthbytes;CFile bmpFile;CString strFileName;CFileDialog dlg(FALSE, "*.BMP", NULL, NULL,"位图文件(*.BMP)|*.bmp;*.BMP|");if (!dlg.DoModal() == IDC_SA VE) return;strFileName = dlg.GetPathName();if (bmpFile.Open(strFileName, CFile::modeCreate | CFile::modeReadWrite) == 0) return ;Widthbytes = (iBmpWidth*3+3)/4*4;//位图对齐,确保为4的倍数/* BITMAPFILEHEADER结构填写*/bmpf.bfType = 0x4d42;bmpf.bfOffBits =sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);bmpf.bfSize = bmpf.bfOffBits + Widthbytes *iBmpHeight;bmpf.bfReserved1 = 0;bmpf.bfReserved2 = 0;/* BITMAPINFOHEADER结构填写*/bmpi.biSize = sizeof(BITMAPINFOHEADER);bmpi.biWidth = iBmpWidth;bmpi.biHeight =iBmpHeight;bmpi.biPlanes = 1;bmpi.biBitCount = 24;//24位bmpi.biCompression = BI_RGB;bmpi.biSizeImage =0;bmpi.biXPelsPerMeter = 0;bmpi.biYPelsPerMeter = 0;bmpi.biClrUsed = 0;bmpi.biClrImportant = 0;bmpFile.Write(&bmpf,sizeof(bmpf));//写文件头;bmpFile.Write(&bmpi,sizeof(bmpi));//写信息头;bmpFile.Write(pBmpData,Widthbytes*iBmpHeight);//写图像数据信息;bmpFile.Close();OK全部完成了,编译运行一下,点击打开图片按钮就能显示图片了呵呵,写得不够专业,还望大家不吝赐教。
41. if (iBits <= 1)42. wBitCount = 1;43. elseif (iBits <= 4)44. wBitCount = 4;45. elseif (iBits <= 8)46. wBitCount = 8;47. elseif (iBits <= 24)48. wBitCount = 24;49. else50. wBitCount = iBits;51.52. DWORD dwPaletteSize=0; //调色板大小,位图中像素字节大小53. if (wBitCount <= 8)54. dwPaletteSize = (1 << wBitCount) *sizeof(RGBQUAD);55.56.57. BITMAP bm; //位图属性结构58. ::GetObject(hBitmap, sizeof(bm), (LPSTR)&bm);59.60.61. BITMAPINFOHEADER bi,bi1; //位图信息头结构62. bi.biSize = sizeof(BITMAPINFOHEADER);63. bi.biWidth = bm.bmWidth;64. bi.biHeight = bm.bmHeight;65. bi.biPlanes = 1;66. bi.biBitCount = wBitCount;67. bi.biCompression = BI_RGB; //BI_RGB表示位图没有压缩68. bi.biSizeImage = 0;69. bi.biXPelsPerMeter = 0;70. bi.biYPelsPerMeter = 0;71. bi.biClrUsed = 0;72. bi.biClrImportant = 0;73. bi1=bi;74. bi1.biBitCount=24;75.76. DWORD dwBmBitsSize = ((bm.bmWidth * wBitCount+31)/32) * 4 * bm.bmHeight;77. HANDLE hDib = ::GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)); //为位图内容分配内存78. LPBITMAPINFOHEADER lpbi =(LPBITMAPINFOHEADER)GlobalLock(hDib);79. *lpbi = bi;80.81. HANDLE hPal = ::GetStockObject(DEFAULT_PALETTE); // 处理调色板82. HANDLE hOldPal=NULL;83. if (hPal)84. {85. hDC = ::GetDC(NULL);86. hOldPal = SelectPalette(hDC,(HPALETTE)hPal, FALSE);87. RealizePalette(hDC);88. }89. int nOutputBytes = 0;90. unsigned char *pJpp,*m_pDibBits;91. pJpp = new unsigned char [dwBmBitsSize];92. m_pDibBits = new unsigned char [dwBmBitsSize];93. //::GetDIBits(hDC, hBitmap, 0, (UINT)bm.bmHeight,m_pDibBits,(BITMAPINFO*)lpbi,DIB_RGB_COLORS);94. ::GetDIBits(hDC, hBitmap, 0, (UINT) bm.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize, (BITMAPINFO*)lpbi,DIB_RGB_COLORS);// 获取该调色板下新的像素值95. if (hOldPal)//恢复调色板96. {97. SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);98. RealizePalette(hDC);99. ::ReleaseDC(NULL, hDC);100. }101. memcpy(m_pDibBits,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwPaletteSize,dwBmBitsSize); // by tang wei m_pDibBits指向BMP的出去三个头部分后的实际数据102. /* int i=0,j=0;103.104. for(j=0;j105. {106. if(j%4==3)107. j++;108. m_pDibBits[i]=m_pDibBits[j];109. i++;110. }*/111.112.113. BITMAPFILEHEADER bmfHdr; //位图文件头结构114. bmfHdr.bfType = 0x4D42; // "BM" // 设置位图文件头115. DWORD dwDIBSize = sizeof(BITMAPFILEHEADER) +sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;116. bmfHdr.bfSize = dwDIBSize;117. bmfHdr.bfReserved1 = 0;118. bmfHdr.bfReserved2 = 0;119. bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;120.121. HANDLE hFile = CreateFile(strFileName1, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL |FILE_FLAG_SEQUENTIAL_SCAN, NULL);//创建位图文件122. DWORD dwWritten;123. WriteFile(hFile, (LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER), &dwWritten, NULL); // 写入位图文件头124. WriteFile(hFile, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);// 写入位图文件其余内容125.126. //By Tang Wei 同时把位图文件部分写到txt里面。
屏幕抓图程序代码说明:1.建立基于MFC的单文档应用程序2.增加菜单项抓图3.向视图类添加变量:HDC m_hdcCompatible;//与屏幕兼容设备HBITMAP m_hbmpScreen;//屏幕抓图的位图句柄/ Capture123View.h : CCapture123View 类的接口//#pragma onceclass CCapture123View : public CScrollView{protected: // 仅从序列化创建CCapture123View();DECLARE_DYNCREATE(CCapture123View)// 属性public:CCapture123Doc* GetDocument() const;// 操作public:// 重写public:virtual void OnDraw(CDC* pDC); // 重写以绘制该视图virtual BOOL PreCreateWindow(CREATESTRUCT& cs);protected:virtual void OnInitialUpdate(); // 构造后第一次调用virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);// 实现public:virtual ~CCapture123View();#ifdef_DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:// 生成的消息映射函数protected:DECLARE_MESSAGE_MAP()public:HDC m_hdcCompatible;//与屏幕兼容设备HBITMAP m_hbmpScreen;//屏幕抓图的位图句柄//菜单项抓图处理函数afx_msg void OnGrabscreen();};#ifndef_DEBUG// Capture123View.cpp 中的调试版本inline CCapture123Doc* CCapture123View::GetDocument() const{ return reinterpret_cast<CCapture123Doc*>(m_pDocument); }#endif// Capture123View.cpp : CCapture123View 类的实现//#include"stdafx.h"#include"Capture123.h"#include"Capture123Doc.h"#include"Capture123View.h"#ifdef_DEBUG#define new DEBUG_NEW#endif// CCapture123ViewIMPLEMENT_DYNCREATE(CCapture123View, CScrollView)BEGIN_MESSAGE_MAP(CCapture123View, CScrollView)// 标准打印命令ON_COMMAND(ID_FILE_PRINT, &CScrollView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, &CScrollView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CScrollView::OnFilePrintPreview) ON_COMMAND(ID_GRABSCREEN, &CCapture123View::OnGrabscreen)END_MESSAGE_MAP()// CCapture123View 构造/析构CCapture123View::CCapture123View(){// TODO: 在此处添加构造代码}CCapture123View::~CCapture123View(){}BOOL CCapture123View::PreCreateWindow(CREATESTRUCT& cs){// TODO: 在此处通过修改// CREATESTRUCT cs 来修改窗口类或样式return CScrollView::PreCreateWindow(cs);}// CCapture123View 绘制void CCapture123View::OnDraw(CDC* pDC){CCapture123Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;//关键代码SelectObject(pDC->m_hDC,m_hbmpScreen);BitBlt(pDC->m_hDC,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYS CREEN),m_hdcCompatible,0,0,SRCCOPY);// TODO: 在此处为本机数据添加绘制代码}void CCapture123View::OnInitialUpdate(){CScrollView::OnInitialUpdate();CSize sizeTotal;// TODO: 计算此视图的合计大小sizeTotal.cx=GetSystemMetrics(SM_CXSCREEN);sizeTotal.cy=GetSystemMetrics(SM_CYSCREEN);/*sizeTotal.cx = sizeTotal.cy = 100;*/SetScrollSizes(MM_TEXT, sizeTotal);}// CCapture123View 打印BOOL CCapture123View::OnPreparePrinting(CPrintInfo* pInfo){// 默认准备return DoPreparePrinting(pInfo);}void CCapture123View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: 添加额外的打印前进行的初始化过程}void CCapture123View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: 添加打印后进行的清理过程}// CCapture123View 诊断#ifdef_DEBUGvoid CCapture123View::AssertValid() const{CScrollView::AssertValid();}void CCapture123View::Dump(CDumpContext& dc) const{CScrollView::Dump(dc);}CCapture123Doc* CCapture123View::GetDocument() const// 非调试版本是内联的{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCapture123Doc)));return (CCapture123Doc*)m_pDocument;}#endif//_DEBUG// CCapture123View 消息处理程序void CCapture123View::OnGrabscreen()HDC hdcScreen=::GetDC(NULL);m_hdcCompatible=CreateCompatibleDC(hdcScreen);m_hbmpScreen=CreateCompatibleBitmap(hdcScreen,GetDeviceCaps(hdcScreen,H ORZRES),GetDeviceCaps(hdcScreen,VERTRES));SelectObject(m_hdcCompatible,m_hbmpScreen);BitBlt(m_hdcCompatible,0,0,GetDeviceCaps(hdcScreen,HORZRES),GetDeviceCa ps(hdcScreen,VERTRES),hdcScreen,0,0,SRCCOPY);HCURSOR hCursor=GetCursor();POINT ptCursor;GetCursorPos(&ptCursor);ICONINFO IconInfo;if (GetIconInfo(hCursor,&IconInfo)){ptCursor.x-=((int)IconInfo.xHotspot);ptCursor.y-=((int)IconInfo.yHotspot);if (IconInfo.hbmMask!=NULL){DeleteObject(IconInfo.hbmMask);}if (IconInfo.hbmColor!=NULL){DeleteObject(IconInfo.hbmColor);}}DrawIconEx(m_hdcCompatible,ptCursor.x,ptCursor.y,hCursor,0,0, 0,NULL,DI_NORMAL|DI_COMPAT);Invalidate();// TODO: 在此添加命令处理程序代码}。