屏幕捕获程序.奇怪的现象,谁能解释.

musicbug 2000-06-30 08:31:00
对话框CGetDisplayDlg上,有一个按钮Button1.下面的代码很让人不解.看注释.当然实现下面的功能有更直接的方法.

//捕获屏幕的位图,并显示在对话框客户区上
void CGetDisplayDlg::OnButton1()
{
// TODO: Add your control notification handler code here
//step1得到屏幕位图句柄hbmp
HDC hdcScreen,hdcMem;
HBITMAP hbmp;
hdcScreen=CreateDC("DISPLAY",NULL,NULL,NULL);
hdcMem=::CreateCompatibleDC(hdcScreen);
int cx,cy;
cx=::GetSystemMetrics(SM_CXSCREEN);
cy=::GetSystemMetrics(SM_CYSCREEN);

hbmp=::CreateCompatibleBitmap(hdcScreen,cx,cy);

//位图句柄hbmp已经得到了.要下面的两条语句有什么用???
SelectObject(hdcMem,hbmp); //不能少
BitBlt(hdcMem,0,0,cx,cy,hdcScreen,0,0,SRCCOPY); //这条语句也不能少

//下面两条语句不能移到common处,画完了一起删除hdcScreen,hdcMem不一样吗?
DeleteDC(hdcScreen);
DeleteDC(hdcMem);

//step2在对话框客户区显示位图
HDC hdc,hdcMem1;
hdc=::GetDC(m_hWnd);
hdcMem1=::CreateCompatibleDC(hdc);
SelectObject(hdcMem1,hbmp);
CRect rect;
GetClientRect(&rect);
BitBlt(hdc,0,0,rect.right,rect.bottom,hdcMem1,0,0,SRCCOPY);

DeleteObject(hbmp);
DeleteDC(hdcMem1);
::ReleaseDC(m_hWnd,hdc);

//common
}
...全文
251 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Larky 2000-07-03
  • 打赏
  • 举报
回复
要想获取屏幕上的图像,是不是一定要调用bitblt,stretchblt,TransparentBlt三个函数中的一个啊?

musicbug 2000-06-30
  • 打赏
  • 举报
回复
我还是不明白为什么在对话框客户区显示位图前必须删除hdcMem的逻辑对象.ZPoint可以详细解释一下吗?
ad 2000-06-30
  • 打赏
  • 举报
回复
void CGetDisplayDlg::OnButton1()
{
// TODO: Add your control notification handler code here
//step1得到屏幕位图句柄hbmp
HDC hdcScreen,hdcMem;
HBITMAP hbmp;
hdcScreen=CreateDC("DISPLAY",NULL,NULL,NULL);
hdcMem=::CreateCompatibleDC(hdcScreen);
int cx,cy;
cx=::GetSystemMetrics(SM_CXSCREEN);
cy=::GetSystemMetrics(SM_CYSCREEN);

hbmp=::CreateCompatibleBitmap(hdcScreen,cx,cy);

//位图句柄hbmp已经得到了,但hbmp中是空白的
SelectObject(hdcMem,hbmp);
BitBlt(hdcMem,0,0,cx,cy,hdcScreen,0,0,SRCCOPY);
//这样hdcScreen中位图显示到hdcMem中,也就是复制到hbmp中

//既然不再使用这两个句柄了,就把它删掉
DeleteDC(hdcScreen);
DeleteDC(hdcMem);

//step2在对话框客户区显示位图
//以下过程是将一个位图显示到窗口中必做的过程
HDC hdc,hdcMem1;
hdc=::GetDC(m_hWnd);
hdcMem1=::CreateCompatibleDC(hdc);
SelectObject(hdcMem1,hbmp);
CRect rect;
GetClientRect(&rect);
BitBlt(hdc,0,0,rect.right,rect.bottom,hdcMem1,0,0,SRCCOPY);

DeleteObject(hbmp);
DeleteDC(hdcMem1);
::ReleaseDC(m_hWnd,hdc);
}
ZPoint 2000-06-30
  • 打赏
  • 举报
回复
当然可以放在最后,不过在对话框客户区显示位图前必须删除hdcMem的逻辑对象
SelectObject(hdcMem,hbmp);
BitBlt(hdcMem,0,0,cx,cy,hdcScreen,0,0,SRCCOPY);
DeleteObject(hdcMem);
...
//common
DeleteDC(hdcScreen);
DeleteDC(hdcMem);

musicbug,我想我和ad的回答应该足够了吧,给分吧!
musicbug 2000-06-30
  • 打赏
  • 举报
回复
我试过了ad下面的解释是对的
//-----------------------------------------
//位图句柄hbmp已经得到了,但hbmp中是空白的
SelectObject(hdcMem,hbmp);
BitBlt(hdcMem,0,0,cx,cy,hdcScreen,0,0,SRCCOPY);
//这样hdcScreen中位图显示到hdcMem中,也就是复制到hbmp中
//---------------------------------------------------

下面的语句,我想问的是,放到CGetDisplayDlg::OnButton1() 的最后为什么执行不正确
DeleteDC(hdcScreen);
DeleteDC(hdcMem);
请ad试试看

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧