类似QQ的区域截图 大虾指教下如何操作区域截图呢?是不是首先把整个屏幕截取下来,然后显示在整个屏幕上,然后就是在自己截取下的屏幕上进行鼠标的选取操作?如果是,那截取下的屏幕是放在剪贴板上的,如何显示出来覆盖整个窗口呢?如果不是,该如何解决呢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 HWND hWnd = ::GetDesktopWindow();//获得屏幕的HWND. HDC hScreenDC = ::GetDC(hWnd); //获得屏幕的HDC. HDC MemDC = ::CreateCompatibleDC(hScreenDC); RECT rect; ::GetWindowRect(hWnd,&rect); SIZE screensize; screensize.cx=rect.right-rect.left; screensize.cy=rect.bottom-rect.top; HBITMAP hBitmap = ::CreateCompatibleBitmap(hScreenDC,screensize.cx,screensize.cy); HGDIOBJ hOldBMP = ::SelectObject(MemDC,hBitmap); ::BitBlt(MemDC,0,0,screensize.cx,screensize.cy,hScreenDC,rect.left,rect.top,SRCCOPY); ::SelectObject(MemDC,hOldBMP); ::DeleteObject(MemDC); ::ReleaseDC(hWnd,hScreenDC);这段代码就可以获得整个屏幕的拷贝,如何把它全屏呢 简单的截图程序是这样,截取桌面dc图像,建立一个对话框(放大到全屏),把桌面dc图像显示到这个对话框上, 这个对话框的wndproc来处理鼠标左键按下和释放我也做过这个东西,不过这种方法截取不到任务栏 vckbase.com里有一个跟QQ一样的小程序,可以下载来看看http://www.vckbase.com/document/viewdoc/?id=1673 我作过类似的程序,可以截取全屏,包括任务拦lpRect ----- 需要截取屏幕的区域HBITMAP GetBMPFormScreen(CRect* lpRect){ // 屏幕和内存设备描述表 HDC hScrDC, hMemDC; // 屏幕和内存设备描述表 HBITMAP hBitmap, hOldBitmap; // 位图句柄 int nX, nY, nX2, nY2; // 选定区域坐标 int nWidth, nHeight; // 位图宽度和高度 int xScrn, yScrn; // 屏幕分辨率 // 确保选定区域不为空矩形 if (IsRectEmpty(lpRect)) return NULL; //为屏幕创建设备描述表 hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL); //为屏幕设备描述表创建兼容的内存设备描述表 hMemDC = CreateCompatibleDC(hScrDC); // 获得选定区域坐标 nX = lpRect->left; nY = lpRect->top; nX2 = lpRect->right; nY2 = lpRect->bottom; // 获得屏幕分辨率 xScrn = GetDeviceCaps(hScrDC, HORZRES); yScrn = GetDeviceCaps(hScrDC, VERTRES); //确保选定区域是可见的 if (nX < 0) nX = 0; if (nY < 0) nY = 0; if (nX2 > xScrn) nX2 = xScrn; if (nY2 > yScrn) nY2 = yScrn; nWidth = nX2 - nX; nHeight = nY2 - nY; // 创建一个与屏幕设备描述表兼容的位图 hBitmap = CreateCompatibleBitmap (hScrDC, nWidth, nHeight); // 把新位图选到内存设备描述表中 hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // 把屏幕设备描述表拷贝到内存设备描述表中 BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY); //得到屏幕位图的句柄 hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); //清除 DeleteDC(hScrDC); DeleteDC(hMemDC); return hBitmap; } 多谢各位的帮忙,看来不少人和我有一样的疑问 cdo(Everything has a favourable turn)提供的例子很不错,在此谢过了 聊天软件用什么套接字 如何关闭用AfxBeginThread创建的线程 如何让一个标签跟随鼠标 我该如何遍历?关于IHTMLDocument2和IHTMLElementCollection 如何在Dev c++中import一个lib文件! thks. (菜鸟提问) 程序员喝酒文化 :) 妙不可言 windows退出的时候向所有进程发送的消息? 又是HtmlView的问题,这回是要去掉边框 非常非常非常简单的问题 如何用vc实现程序将自身加密? 为什么总是#3092啊 udp包发送时如何控制速率?
HDC hScreenDC = ::GetDC(hWnd); //获得屏幕的HDC.
HDC MemDC = ::CreateCompatibleDC(hScreenDC);
RECT rect;
::GetWindowRect(hWnd,&rect);
SIZE screensize;
screensize.cx=rect.right-rect.left;
screensize.cy=rect.bottom-rect.top;
HBITMAP hBitmap = ::CreateCompatibleBitmap(hScreenDC,screensize.cx,screensize.cy);
HGDIOBJ hOldBMP = ::SelectObject(MemDC,hBitmap);
::BitBlt(MemDC,0,0,screensize.cx,screensize.cy,hScreenDC,rect.left,rect.top,SRCCOPY);
::SelectObject(MemDC,hOldBMP);
::DeleteObject(MemDC);
::ReleaseDC(hWnd,hScreenDC);
这段代码就可以获得整个屏幕的拷贝,如何把它全屏呢
我也做过这个东西,不过这种方法截取不到任务栏
http://www.vckbase.com/document/viewdoc/?id=1673
HBITMAP GetBMPFormScreen(CRect* lpRect)
{
// 屏幕和内存设备描述表
HDC hScrDC, hMemDC;
// 屏幕和内存设备描述表
HBITMAP hBitmap, hOldBitmap;
// 位图句柄
int nX, nY, nX2, nY2;
// 选定区域坐标
int nWidth, nHeight;
// 位图宽度和高度
int xScrn, yScrn;
// 屏幕分辨率 // 确保选定区域不为空矩形
if (IsRectEmpty(lpRect))
return NULL;
//为屏幕创建设备描述表
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 获得选定区域坐标
nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;
// 获得屏幕分辨率
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);
//确保选定区域是可见的
if (nX < 0)
nX = 0;
if (nY < 0)
nY = 0;
if (nX2 > xScrn)
nX2 = xScrn;
if (nY2 > yScrn)
nY2 = yScrn;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
// 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap
(hScrDC, nWidth, nHeight);
// 把新位图选到内存设备描述表中
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight,
hScrDC, nX, nY, SRCCOPY);
//得到屏幕位图的句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);
return hBitmap;
}
cdo(Everything has a favourable turn)
提供的例子很不错,在此谢过了