拷贝屏幕到控件上,发现严重失真(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);
...全文
652 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+的方法也可以,可以给个具体的代码吗?
内容概要:本文提出了一种针对电动汽车集群并网的分布式鲁棒优化调度模型,旨在应对大规模电动汽车接入电网所带来的不确定性与调度复杂性。该模型采用分布式优化框架,结合鲁棒优化理论,有效处理由用户行为、充电需求及可再生能源出力等多重不确定性因素引起的调度风险。通过构建考虑电池损耗、用户响应意愿及电网约束的多目标优化问题,实现了在保证电网运行安全与稳定的同时,最大化社会整体效益与用户参与积极性。文中详细阐述了模型的数学构建、求解算法及仿真验证过程,展示了该方法在降低峰值负荷、平抑负荷波动以及提升可再生能源消纳能力方面的显著优势。; 适合人群:具备一定电力系统、优化理论和MATLAB编程基础,从事智能电网、电动汽车调度、分布式能源管理等相关领域研究的研发人员和研究生。; 使用场景及目标:①为电力系统运营商提供高比例电动汽车接入场景下的鲁棒调度决策支持;②为学术研究人员提供分布式鲁棒优化在复杂能源系统中应用的典型案例与代码参考;③目标是提升电网韧性,优化资源配置,并促进电动汽车与电网的协同发展。; 阅读建议:此资源以MATLAB代码实现为核心,建议读者在学习时结合算法原理与代码细节,通过修改参数和场景设置进行仿真复现与结果分析,以深入理解分布式鲁棒优化的内在机制及其在解决实际工程问题中的应用价值。

19,463

社区成员

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

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