请问,如何实现抓屏的功能

happyjsj 2002-05-14 06:04:45
根据用户输入的位置,进行截取.
谢谢!
...全文
29 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
znull 2002-05-14
在对话框上加一个按钮,一个picture控件。
通过Class Wizard建立与picture控件对应的变量m_Pic,Type为CStatic;

HBITMAP CGetDesktopDlg::CopyBitmap(LPRECT lpRect)
{
HDC hScrDC,hMemDC;
HBITMAP hBitmap,hOldBitmap;

int nX,nY,nX2,nY2;
int nWidth,nHeight;

int nScrX,nScrY; //屏幕分辨率

//确保选定区域不是空矩形
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;

//屏幕分辨率
nScrX=GetDeviceCaps(hScrDC,HORZRES);
nScrY=GetDeviceCaps(hScrDC,VERTRES);

//确保选定区域有效
if(nX<0) nX=0;
if(nY<0) nY=0;
if(nX2>nScrX) nX2=nScrX;
if(nY2>nScrY) nY2=nScrY;

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;
}

//在按钮事件中加入
LPRECT TempRect;
HBITMAP TempMap;

TempRect=new RECT();

TempRect->left=0;
TempRect->top=0;

TempRect->right=430;
TempRect->bottom=230;

TempMap=CopyBitmap(TempRect);

m_Pic.SetBitmap(NULL);
m_Pic.SetBitmap(TempMap);
delete TempRect;
回复
znull 2002-05-14
在对话框上加一个按钮,一个picture控件。
通过Class Wizard建立与picture控件对应的变量m_Pic,Type为CStatic;

HBITMAP CGetDesktopDlg::CopyBitmap(LPRECT lpRect)
{
HDC hScrDC,hMemDC;
HBITMAP hBitmap,hOldBitmap;

int nX,nY,nX2,nY2;
int nWidth,nHeight;

int nScrX,nScrY; //屏幕分辨率

//确保选定区域不是空矩形
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;

//屏幕分辨率
nScrX=GetDeviceCaps(hScrDC,HORZRES);
nScrY=GetDeviceCaps(hScrDC,VERTRES);

//确保选定区域有效
if(nX<0) nX=0;
if(nY<0) nY=0;
if(nX2>nScrX) nX2=nScrX;
if(nY2>nScrY) nY2=nScrY;

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;
}

//在按钮事件中加入
LPRECT TempRect;
HBITMAP TempMap;

TempRect=new RECT();

TempRect->left=0;
TempRect->top=0;

TempRect->right=430;
TempRect->bottom=230;

TempMap=CopyBitmap(TempRect);

m_Pic.SetBitmap(NULL);
m_Pic.SetBitmap(TempMap);
delete TempRect;
回复
pcman1990 2002-05-14
GetDC(NULL); 得到整个screen的DC
创建一个Memory DC并且调用CreateCompatibleDC();
CreateCompatibleBitmap()创建一个空的bitamp;
SelectObject()把这个bitmap选入Memory DC中;
BitBlt(); 把screen DC中指定位置的内容copy到Memory DC中去,这样内存中的bitmap就保存了screen的相应位置的内容。此时,你也可以直接使用Memory DC操作截取的screen的内容。
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-05-14 06:04
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……