拷贝屏幕到控件上,发现严重失真(SetStretchBltMode(HALFTONE)无用)

jinzihan_005 2011-04-28 10:03:41
屏幕到控件上,发现严重失真(SetStretchBltMode(HALFTONE)无用,代码如下:

CDC screenDC,memdc;
HBITMAP hBitmap;
int cx,cy;

cx = GetSystemMetrics(SM_CXSCREEN);
cy = GetSystemMetrics(SM_CYSCREEN);

screenDC.CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
memdc.CreateCompatibleDC(&screenDC);
hBitmap = CreateCompatibleBitmap(screenDC,cx,cy);
SelectObject(memdc,hBitmap);
BitBlt(memdc,0,0,cx,cy,screenDC,0,0,SRCCOPY);


CStatic *picctl = (CStatic*)GetDlgItem(IDC_STATIC1);
//picctl->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
CRect rect;
picctl->GetClientRect(&rect);

CBitmap bit;
bit.Attach(hBitmap);
BITMAP bmpinfo;
bit.GetBitmap(&bmpinfo);

CDC picctldc;
picctldc.CreateCompatibleDC(picctl->GetDC());
picctldc.SelectObject(&bit);
picctl->GetDC()->SetStretchBltMode(HALFTONE);//这句似乎没有作用
picctl->GetDC()->StretchBlt(rect.top,rect.left,rect.Width(),rect.Height(),&memdc,0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,SRCCOPY);
...全文
602 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
coofly 2012-11-15
  • 打赏
  • 举报
回复
引用 5 楼 jinzihan_005 的回复:
自己已经解决了,用的是GDI+的代码,之前是因为配置GDI+时出的问题,代码本身没有问题,但是用StretchBlt方法还是失真,不明白原因。下午以后能够解决吧。
有问题跑出来问,自己解决了又不说,真见不得你们这种人 我也遇到这个问题了,说下解决办法吧 在DrawImage之前加入 gdiDC.SetInterpolationMode(Gdiplus::InterpolationModeHighQuality); 即可 SetInterpolationMode方法可以设置差值模式,默认为低,设置为高就行了
jinzihan_005 2011-04-30
  • 打赏
  • 举报
回复
自己已经解决了,用的是GDI+的代码,之前是因为配置GDI+时出的问题,代码本身没有问题,但是用StretchBlt方法还是失真,不明白原因。下午以后能够解决吧。
jinzihan_005 2011-04-29
  • 打赏
  • 举报
回复
GDI+的方法如下,但控件上确没有出现希望的拷贝屏幕图像,郁闷啊~~~~,希望指点,代码如下:

// 得到屏幕DC
HWND hDeskWnd = ::GetDesktopWindow(); //获得屏幕的HWND.
CDC *pDestDC = CDC::FromHandle(::GetDC(hDeskWnd)); //获取当前整个屏幕DC
int screenWidth = pDestDC->GetDeviceCaps(HORZRES); //屏幕宽
int screenHeight = pDestDC->GetDeviceCaps(VERTRES); //屏幕高


// 创建与屏幕兼容的Bitmap
CBitmap memBitmap;
memBitmap.CreateCompatibleBitmap(pDestDC, screenWidth, screenHeight);

// 创建屏幕的内存DC
CDC memDC;
memDC.CreateCompatibleDC(pDestDC);

// 将兼容Bitmap格式选入内存DC
memDC.SelectObject(&memBitmap);

// 将屏幕DC数据copy至内存DC
memDC.BitBlt(0, 0, screenWidth, screenHeight, pDestDC, 0, 0, SRCCOPY);

// 获得位图信息
BITMAP bmpInfo;
memBitmap.GetBitmap(&bmpInfo);

// 生成BITMAPINFO
BITMAPINFO m_BITMAPINFO;
memset(&m_BITMAPINFO, 0, sizeof(BITMAPINFO));
m_BITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_BITMAPINFO.bmiHeader.biPlanes = 1;
m_BITMAPINFO.bmiHeader.biBitCount = bmpInfo.bmBitsPixel;
m_BITMAPINFO.bmiHeader.biCompression = BI_RGB;
m_BITMAPINFO.bmiHeader.biWidth = bmpInfo.bmWidth;
m_BITMAPINFO.bmiHeader.biHeight = bmpInfo.bmHeight;

// 获取位图数据
BYTE * pBuffer = new BYTE[bmpInfo.bmWidthBytes * bmpInfo.bmHeight];//等同于w*h*4=32位颜色

GetDIBits(memDC.m_hDC, (HBITMAP) memBitmap.m_hObject, 0, screenHeight, pBuffer,
(LPBITMAPINFO) &m_BITMAPINFO, DIB_RGB_COLORS);

// 生成位图
Bitmap *pSrcBmp = Bitmap::FromBITMAPINFO(&m_BITMAPINFO, (void*)pBuffer);


//绘制到控件上
Graphics gdiDC = GetDlgItem(IDC_STATIC1)->m_hWnd;
CStatic *picctl = (CStatic*)GetDlgItem(IDC_STATIC1);
CRect rect;
picctl->GetClientRect(&rect);
gdiDC.DrawImage(pSrcBmp, rect.left,rect.top,rect.Width(),rect.Height());

// 释放内存
delete pSrcBmp;
delete pBuffer;
ReleaseDC(pDestDC);
__lhy 2011-04-29
  • 打赏
  • 举报
回复
SetStretchBltMode(COLORONCOLOR);
jinzihan_005 2011-04-29
  • 打赏
  • 举报
回复
楼上的方法也试过了,没有作用
jinzihan_005 2011-04-28
  • 打赏
  • 举报
回复
如果真的没有解决办法,有GDI+的方法也可以,可以给个具体的代码吗?

19,468

社区成员

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

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