【求助】VC++6.0 BitBlt屏幕截图再绘图到窗口无显示

天一亮就跑 2011-12-10 09:01:45
我想做一个png为背景的程序,但是用gdi++发现不会做,就想通过把屏幕截图贴到主窗口,再把png贴到窗口,来偷梁换柱实现png半透明效果。
这是网上找的代码:
CDC* pDC;
pDC = GetDC();
CDC dc;
dc.CreateDC("DISPLAY", NULL, NULL, NULL);
CRect clientRect;
GetClientRect(clientRect);
pDC->BitBlt(0, 0, clientRect.Width(),clientRect.Height(), &dc, 0, 0, SRCCOPY);
运行一下发现是程序默认背景色,没有屏幕截图出现,这是为什么?
...全文
169 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shen_wei 2011-12-12
  • 打赏
  • 举报
回复
HBITMAP CopyScreenToBitmap(LPRECT 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( _T("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;

}
天一亮就跑 2011-12-12
  • 打赏
  • 举报
回复
发现了,用《png透明窗体全攻略》,初始化时要加入:
    m_Blend.BlendOp=0; //theonlyBlendOpdefinedinWindows2000
m_Blend.BlendFlags=0; //nothingelseisspecial...
m_Blend.AlphaFormat=1; //...
m_Blend.SourceConstantAlpha=255;//AC_SRC_ALPHA // 透明度


结贴了
天一亮就跑 2011-12-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shen_wei 的回复:]

C/C++ code
HBITMAP CopyScreenToBitmap(LPRECT lpRect)
{
HDC hScrDC, hMemDC;
// 屏幕和内存设备描述表
HBITMAP hBitmap,hOldBitmap;
// 位图句柄
int nX, nY, nX2, nY2;
// 选定区域坐标
int nWid……
[/Quote]
我用了这个代码,并在oninitialdlg中加入了如下代码:

LPRECT lpRect = new CRect;
lpRect->left = 10;
lpRect->right = 263;
lpRect->top = 50;
lpRect->bottom = 655;
CBitmap bitmap;
CBitmap *pOldBitmap= NULL;
HBITMAP hBitmap;
hBitmap = CopyScreenToBitmap(lpRect);
CDC* pDC;
pDC = GetDC();
CDC memDC;
memDC.CreateCompatibleDC(pDC);
bitmap.Attach(hBitmap);
pOldBitmap = memDC.SelectObject(&bitmap);
pDC->BitBlt(0, 0, 253, 605, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBitmap);

ReleaseDC(&memDC);
bitmap.Detach();
bitmap.DeleteObject();

发现对话框出现的仍然是灰色框框,怎么解决?是不是什么东西没赋值好?
schlafenhamster 2011-12-11
  • 打赏
  • 举报
回复
HBITMAP CopyScreenToBitmap(CRect &Rect,HWND hwnd)
{
HDC hScrDC, hMemDC;
HBITMAP hOldBitmap,hBitmap;
int xScrn, yScrn;
// to screen coordinates.
MapWindowPoints(hwnd,NULL,(POINT *)&Rect,2);
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
hMemDC = CreateCompatibleDC(hScrDC);
//
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);
//
if (Rect.left < 0) Rect.left = 0;
if (Rect.top < 0) Rect.top = 0;
if (Rect.right > xScrn) Rect.right = xScrn;
if (Rect.bottom > yScrn) Rect.bottom = yScrn;
//
hBitmap = CreateCompatibleBitmap(hScrDC, Rect.Width(),Rect.Height());
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
BitBlt(hMemDC,0,0,Rect.Width(),Rect.Height(),hScrDC,Rect.left,Rect.top,SRCCOPY);
hBitmap =(HBITMAP)SelectObject(hMemDC,hOldBitmap);
//
DeleteDC(hScrDC);
DeleteDC(hMemDC);
//
return hBitmap;
}
天一亮就跑 2011-12-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 schlafenhamster 的回复:]

HBITMAP CopyScreenToBitmap(CRect &Rect,HWND hwnd)
{
HDC hScrDC, hMemDC;
HBITMAP hOldBitmap,hBitmap;
int xScrn, yScrn;
// to screen coordinates.
MapWindowPoint……
[/Quote]发现用了这个方法,出来的还是默认灰色调、、、现在正在努力找错
天一亮就跑 2011-12-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yu52000guang 的回复:]
想法很好,但这个想法不可行,程序不动或许看着不错,稍微拖动下,或切换别的窗口,刷新就会出问题的。如果你非要看看效果,可以搜下屏幕截图相关内容实现下试试。
png图做背景可以采用分层窗口来做,但分层窗口不显示控件,需要做一个联动窗口显示控件。或者更高级的用DirectUI
[/Quote]
屏幕截图我也试了,但是就是无法显示出截图,你有参考程序吗?
然后联动窗口就是上下叠层窗口吗?我找了下试了发现程序运行会跳出内存错误额,就是那个gdi+sdk的吧。directui我还没试过,去看看去、先谢谢了啊。
Icer 2011-12-10
  • 打赏
  • 举报
回复
想法很好,但这个想法不可行,程序不动或许看着不错,稍微拖动下,或切换别的窗口,刷新就会出问题的。如果你非要看看效果,可以搜下屏幕截图相关内容实现下试试。
png图做背景可以采用分层窗口来做,但分层窗口不显示控件,需要做一个联动窗口显示控件。或者更高级的用DirectUI
天一亮就跑 2011-12-10
  • 打赏
  • 举报
回复
没有人吗?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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