截取的屏幕图像为什么都是黑的?

qwedcxza 2002-06-11 01:40:34

我首先建立屏幕 DC

m_ScrDC = CreateDC( "DISPALY", NULL, NULL, NULL );
m_ScrWidth = GetDeviceCaps( m_ScrDC, HORZRES );
m_ScrHigh = GetDeviceCaps( m_ScrDC, VERTRES );
然后从中转化并 bitblt 一个矩形到当前窗口, 蝌蚪是黑的.

是建立屏幕 DC 错误? 还是显示时错误?
...全文
169 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qwedcxza 2002-06-11
  • 打赏
  • 举报
回复


为什么要中转那么多层呢? 我只需要将屏幕转到当前窗口的 DC.

谢谢了! 可奇怪的是? 显示不出鼠标移动? 但鼠标点击的变化可以看到!!

msl 2002-06-11
  • 打赏
  • 举报
回复
估计你CreateCompatibleBitmap的时候DC参数不正确,你创建的位图为黑白位图,因而系统在帮你转换过来的时候,全部编程黑色。(我说的可能不对)
TopLevel 2002-06-11
  • 打赏
  • 举报
回复
下面是我写的截取指定位置区域屏幕的代码。给你看看。
HBITMAP CSemiTransparent::CreateDesktopBitmap(const POINT &pt, const RECT &rc)
{
CRect rcDesktop( 0, 0, 0, 0 );

// Get the Desktop window size;
GetWindowRect( GetDesktopWindow(), &rcDesktop );

int iScrWidth = rc.right - rc.left; //rcDesktop.Width();
int iScrHeight = rc.bottom - rc.top; //rcDesktop.Height();

// Get the Desktop window dc;
HDC hDesktopDC = GetDC( GetDesktopWindow() );

if ( hDesktopDC == NULL )
{
GetLastError();

return m_hScrBitmap;
}

HDC hMemDeskDC = CreateCompatibleDC( hDesktopDC );

if ( hMemDeskDC == NULL )
{
// Release the Desktop window dc;
ReleaseDC( GetDesktopWindow(), hDesktopDC );

return m_hScrBitmap;
}

m_hScrBitmap = CreateCompatibleBitmap( hDesktopDC, iScrWidth, iScrHeight );

if ( m_hScrBitmap == NULL )
{
// Release the Desktop window dc;
ReleaseDC( GetDesktopWindow(), hDesktopDC );

return m_hScrBitmap;
}

// Store the environmen;
HBITMAP hOldBitmap = (HBITMAP)SelectObject( hMemDeskDC, m_hScrBitmap );

if ( hOldBitmap == NULL )
{
// Delete the memory DC;
DeleteDC( hMemDeskDC );
// Release the Desktop window dc;
ReleaseDC( GetDesktopWindow(), hDesktopDC );

return m_hScrBitmap;

}

if ( BitBlt( hMemDeskDC,
0,
0,
iScrWidth,
iScrHeight,
hDesktopDC,
pt.x,
pt.y,
SRCCOPY
) == FALSE )
{
// Restore the environment.
SelectObject( hMemDeskDC, hOldBitmap );
// Delete the memory DC;
DeleteDC( hMemDeskDC );
// Release the Desktop window dc;
ReleaseDC( GetDesktopWindow(), hDesktopDC );

return m_hScrBitmap;

}

// Restore the environment.
m_hScrBitmap = (HBITMAP)SelectObject( hMemDeskDC, hOldBitmap );
// Delete the memory DC;
DeleteDC( hMemDeskDC );
// Release the Desktop window dc;
ReleaseDC( GetDesktopWindow(), hDesktopDC );


return m_hScrBitmap;
}
不用加注释了吧。
:)
pcman1990 2002-06-11
  • 打赏
  • 举报
回复
估计是显示时错误

16,548

社区成员

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

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

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