可以不破坏原有的背景
int nMode =SetROP2(hDC, R2_NOTXORPEN);
HPEN hpenOld= (HPEN)SelectObject(hDC, hPen);
//得到鼠标所在处的窗口的区域
::GetWindowRect(hwndCapture,&rectCapture);
//在鼠标所在处的窗口四周画一红色的矩形,做为选定时的提醒
POINT pt;
pt[0] = CPoint(rectCapture.left, rectCapture.top);
pt = CPoint(rectCapture.right,rectCapture.top);
pt = CPoint(rectCapture.right,rectCapture.bottom);
pt = CPoint(rectCapture.left, rectCapture.bottom);
pt = CPoint(rectCapture.left, rectCapture.top);
::Polyline(hDC,pt,5);
//延时后再重绘红色的矩形,这样就不会破坏原有内容
Sleep(100);
::Polyline(hDC,pt,5);
::SelectObject(hDC,hpenOld);
::ReleaseDC(NULL,hDC);
}
CDialog::OnMouseMove(nFlags, point);
}
void CScreenCaptureDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
//得到鼠标所在处的窗口的区域宽、高
int nWidth=rectCapture.Width();
int nHeight=rectCapture.Height();
HDC hdcScreen, hMemDC;
HBITMAP hBitmap, hOldBitmap;
//建立一个屏幕设备环境句柄
hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL);
hMemDC = CreateCompatibleDC(hdcScreen);
//建立一个与屏幕设备环境句柄兼容、与鼠标所在处的窗口的区域等大的位图
hBitmap = CreateCompatibleBitmap(hdcScreen, nWidth, nHeight);
// 把新位图选到内存设备描述表中
hOldBitmap =(HBITMAP)SelectObject(hMemDC, hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hdcScreen,rectCapture.left,rectCapture.top,SRCCOPY);
//取回鼠标所在处的窗口屏幕位图的句柄
hBitmap =(HBITMAP)SelectObject(hMemDC, hOldBitmap);
DeleteDC(hdcScreen);
DeleteDC(hMemDC);
// 返回位图句柄
//打开剪贴板,并将位图拷到剪贴板上
OpenClipboard() ;
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap);
//关闭剪贴板
CloseClipboard();
MessageBox("屏幕内容已经拷到剪贴板上!");
//终止鼠标捕获
ReleaseCapture();
//恢复窗口显示模式
ShowWindow(SW_NORMAL);
}
说明:在本程序中,如果用户在对话框中按住鼠标左键不放,那么,
程序便开始“抓图”,当选择好抓图的目标后,松开鼠标左键,这时,抓图的目标窗口的画面就自动保存至剪贴板中了。如果你想将位置保存到一个BMP文件,你可以到http://www.cideguru.com中查找具体文档。
瞧,屏幕抓图程序的制作是不是良简单?你也可以对该程序进行改良,加入个性化的界面或功能,我想其运用效果并比会比专业的屏幕抓图程序差。在我的主页 “国税之家”(http://nationaltax.home.chinaren.com)的“个人世界”中,就有一个做好的屏幕抓图
程序,试一试?