说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

如何在内存中画好图,再在屏幕上显示出来?

编辑:说三道四文库 发布时间:2017-12-17 12:41
HTML文档下载 WORD文档下载 PDF文档下载
下面的代码没有达到预期的效果,请高手指点一二,谢谢!
void CSaveBmpView::OnDraw(CDC* pDC)
{
CSaveBmpDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

CRect rect;
GetClientRect(&rect);

CDC dcMem;
dcMem.CreateCompatibleDC(pDC);

BITMAPINFO bi;
memset(&bi,0,sizeof(bi));
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biWidth = rect.Width();
bi.bmiHeader.biHeight = rect.Height();
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 24;
bi.bmiHeader.biCompression = BI_RGB;

UINT *bits;
HBITMAP hBitmap = 
::CreateDIBSection(dcMem.m_hDC,&bi,DIB_RGB_COLORS,(void**)&bits,NULL,0);

::SelectObject(dcMem,hBitmap);

//填充一个四边形
int xLeft,yTop,xRight,yBottom;
xLeft = rect.left + 100;
yTop = rect.top + 100;
xRight = rect.right - 100;
yBottom = rect.bottom - 100;

dcMem.MoveTo(xLeft,yTop);
dcMem.LineTo(xRight,yTop+50);
dcMem.LineTo(xRight-50,yBottom);
dcMem.LineTo(xLeft,yBottom-50);
dcMem.LineTo(xLeft,yTop);

CBrush brush;
brush.CreateSolidBrush(RGB(0,255,0));
CBrush* pOldBrush = dcMem.SelectObject(&brush);

dcMem.FloodFill(xLeft+10,yTop+50,RGB(0,0,0));

dcMem.SelectObject(pOldBrush);
//End fill!

pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,rect.left,rect.top,
SRCCOPY);

SaveBmpToFile("Temp.bmp",&bi,bits);
}

int CSaveBmpView::SaveBmpToFile(const char *filename, BITMAPINFO *info, UINT *bits)
{
FILE* fp;
UINT size, //Size of file
infosize, //Size of bitmap info
bitsize;  //Size of bitmap pixels
BITMAPFILEHEADER header;
if((fp = fopen(filename,"wb")) == NULL)
return -1;
if(info->bmiHeader.biSizeImage == 0)
bitsize = (info->bmiHeader.biWidth *
info->bmiHeader.biBitCount+7)/8*
abs(info->bmiHeader.biHeight);
else
bitsize = info->bmiHeader.biSizeImage;

infosize = sizeof(BITMAPINFO);
size = sizeof(BITMAPFILEHEADER)+infosize+bitsize;

header.bfType = 'MB';
header.bfSize = size;
header.bfReserved1 = 0;
header.bfReserved2 = 0;
header.bfOffBits = sizeof(BITMAPFILEHEADER)+infosize;

if(fwrite(&header,1,sizeof(BITMAPFILEHEADER),fp) < 
sizeof(BITMAPFILEHEADER))
{
fclose(fp);
return -1;
}

if(fwrite(info,1,infosize,fp) < infosize)
{
fclose(fp);
return -1;
}

if(fwrite(bits,1,bitsize,fp) < bitsize)
{
fclose(fp);
return -1;
}

fclose(fp);
return 1;
}
不要使用 CreateDIBSection, 还是使用 CBitmap 比较好,使用CreateDIBSection 一般是为了直接操作位图数据。
http://www.ccw.com.cn/htm/produ/special/VC/jiqiao/01_9_13_20.asp
::CreateDIBSection(dcMem.m_hDC,&bi,DIB_RGB_COLORS,(void**)&bits,NULL,0);
上面的DC用pDC,不要用dcMem
楼上几位还是没发现问题啊,我调试了半天才发现
void CSaveBmpView::OnDraw(CDC* pDC)
{
CSaveBmpDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

CRect rect;
GetClientRect(&rect);

CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
dcMem.FillSolidRect(rect, RGB(255,255,255));

BITMAPINFO bi;
memset(&bi,0,sizeof(bi));
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biWidth = rect.Width();
bi.bmiHeader.biHeight = rect.Height();
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 24;
bi.bmiHeader.biCompression = BI_RGB;
UINT *bits;
HBITMAP hBitmap = 
::CreateDIBSection(dcMem.m_hDC,&bi,DIB_RGB_COLORS,(void**)&bits,NULL,0);

::SelectObject(dcMem.GetSafeHdc(), hBitmap);
dcMem.FillSolidRect(rect, RGB(255,255,255));

//&Igrave;&icirc;&sup3;&auml;&Ograve;&raquo;&cedil;&ouml;&Euml;&Auml;±&szlig;&ETH;&Icirc;
int xLeft,yTop,xRight,yBottom;
xLeft = rect.left + 100;
yTop = rect.top + 100;
xRight = rect.right - 100;
yBottom = rect.bottom - 100;

dcMem.MoveTo(xLeft,yTop);
dcMem.LineTo(xRight,yTop+50);
dcMem.LineTo(xRight-50,yBottom);
dcMem.LineTo(xLeft,yBottom-50);
dcMem.LineTo(xLeft,yTop);

CBrush brush;
brush.CreateSolidBrush(RGB(0,255,0));
CBrush* pOldBrush = dcMem.SelectObject(&brush);

dcMem.FloodFill(xLeft+10,yTop+50,RGB(0,0,0));

dcMem.SelectObject(pOldBrush);
//End fill!

pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,rect.left,rect.top,
SRCCOPY);

SaveBmpToFile("Temp.bmp",&bi,bits);
}
有两种方法
1.记录点然后把他连起来。
2.记录图象的特征然后绘画出来,如圆有圆心,半径。画N个圆就存储N个这样的信息然后绘画出来。
deadhorse(死马) 是正确的!

我试了!
up
CBitmap backBitmap;
CDC mem;
mem.CreateCompatibleDC(pDC);
backBitmap.CreateCompatibleBitmap(&mem,wid,hei);
CBitmap* oldBit=mem.SelectObject(&backBitmap);
mem.TextOut("It's testing !",102,11);
pDC->BitBlt(0,0,wid,hei,&mem,0,0,SRCCOPY);
mem.SelectObject(oldBit);
Android开发者不可或缺的四大工具 Mozilla开源TogetherJS:让网站拥有实时协作功能 可穿戴技术专家Jawbone UP向所有开发者开放API 18款在线代码片段测试工具 Gartner咨询公司研究副总裁彼得&#183;福斯特布鲁克:互联网安全新兴威胁与挑战 美国智库战略与国际研究中心(CSIS)詹姆斯&#183;刘易斯:网络安全神话、传说与现实 云安全联盟中国分会理事赵粮:建设可信的云生态环境 Web前端优化最佳实践及工具集锦 2013中国互联网安全大会(ISC)9月23日隆重举行 科技界最聪明的人:Facebook首任CTO激情燃烧的岁月 继乔布斯时间胶囊出土 其儿时的家或成历史遗迹 微软向7亿Windows 7用户发布Internet Explorer 11预览版 乐视腾讯深度合作 超级电视26日易迅网首发 开源jQuery插件推荐 帮你快速构建单页网站 实时数据追踪?Salutron发布LifeTrak API Infoworld Bossie Awards:最好的开源App锦集 除了乔布斯的鼠标 值得装入时间胶囊的十大科技产品 2013中国互联网安全大会:云环境带来的安全隐患和机遇 2013中国互联网安全大会:软件安全新挑战 专访Line大中华区总裁:即使卖萌,也能深入人心 iOS开发者必备:四款后端服务工具 市场研究公司:iPhone5C/5S成本分别是173、199美元 对软件开发有利的5个敏捷编程方法 移动端性能大比拼:CSS Sprites vs. Data URI 三大峰会七大论坛,2013移动开发者大会将于11月在京举行 黑莓47亿美元收购的背后 微软或成最大受益者 搜索大战升级:360搜狗相互起诉对方不正当竞争 诺基亚将于10月22日发布6款新产品 平板Lumia 2520等 从17美元到50美元 Facebook股价上涨背后的两大关键 12个理由:为什么我会认为Android比iOS 7好! AMD推 &amp;quot;Mantle&amp;quot; API 欲释放GPU全部潜能 怎样对网页 中某一部分进行更新? 一个简单但是让我无法理解的问题,请教各位! j2me怎样显示从servlet传来的图片(字节数组)?? 在客户端可以通过jsp写二进制文件嘛? winrunner的自动运行程序问题。 和桌面通信的问题!!!!!!! 谁Dephi方面的入门电子书籍?谢谢了 【道歉】请hellosun和flyever进来领分! ???上传大文件??? 请问如何控制asp.net客户端(IE)的用户数 关于触发器的问题! 谁知道如何获得MSHFLexGrid被选中的记录(前提:按住shift键选择了多条记录)? 求助,有关Oracle控制文件的警告信息 查询记录数多与某数值的记录。 对了,问个弱问题 想实现一个功能 当选择表单select0里边的“产品分类“,然后自动探出另外一个select1表单,选择select1表单里边的分类信息搜索,选择表单 MSSQL server 的 Function 是个烂东西 数据录入问题 InstallShield的两个基本问题。 敬请指点谜经!万分感谢! 动态配置ODBC连接问题 做个调查,你买彩票吗? 我怎么打不开本版精华区的帖子了 急!如何在datagrid控件运行后显示的表格中加一列,用来表明现在的状态 关于窗口分割 CSDN的这个BBS,回复时老是提示超时已过期,来看看是不是这个原因 关于打在帧结构的问题 可不可以用vb在PE的文件上加上一段自己的代码呢?(不用汇编,用纯vb) 关于utf-8编码 如何在数据窗口中任意某行某列的字体颜色? "保存文件老提示文件被占用",是不是编译器的bug? 在网页中如何发短信? MapXtreme中运行/HelloWorld/mappage.asp报的错误 outlook...foxmail.... 哪位大侠提供有效的 msdn2001.10三CD的下载地址,论坛上搜索到的都是过期的连接,多谢了!!! 水晶报表问题 java调用系统功能? 怎样用asp打开一个复杂的excel表格(内有很多列合并和行合并、工作簿已重命名)? 有牛人能帮忙翻译一下么,我看的头都晕了,好文章呀!.(转载) 请问大家一个WinCE的下载引导问题 关于数据库的 大家有没有这种感觉? 想买本计算机专业书 却发现她很贵 不买 却又急需 !!!矛盾!痛苦! 如何恢复98休眠功能? 局域网中的一台机子中的文件夹是共享的,在外网怎么访问?? sql语句中日期格式怎么写,很简单 急,域名查询,网络实名的功能怎么做??? 關於mail發送的,出現如下錯誤:jsp.error.badaction,怎樣解決? 用过 True DBGrid Pro 7.0 兄弟请帮帮忙!在线等待! 有请老牛,ginger,cxx1997,和其他聪明的人进来,我有重要事情宣布! 小弟用Jbuilder 做的JSP 程序,,我放在Apache哪个目录里面呀 importfile使用问题! lg20+log100(底)25(真)如何求出,不带根号详细过程lg25/lg100=lg5,log100(底)25(真)=2/2*lg5=lg5 不理解 肝病生物细胞疗法是真的吗 一个人叫你丫头是甚么意思 请问你们知道如何能加强对英语语法和英语单词的记忆吗?我经常背完就忘记,很无奈,又很浪费时间我英语学得还可以,但就是经常背完的东西马上就忘了,一到考试前就得拼命地练,十分浪 求7^(lg20)×(1/2)^(lg0.7)的值求7^(lg20)·(1/2)^(lg0.7)的值 怎样熟记英语单词,英语语法怎样快速掌握? 怎样记住英语单词和掌握英语语法. 获奖喜报怎么写 lg20+log100 25 |lg20+log100 25|以100为底 25的对数 请把这张喜报发下去的张是什么意思六年级天天练上的 lg20+log100(底)25(真)+2*(3^1/2)*(12^1/6)*【(3/2)^1/3】希望看得懂的朋友帮忙做一下,我打了好久 浙江组团赴沪招贤 舟山重磅“潜水挖才普陀山南海观音文化节开幕 传统佛教活“微力量”成中国农村草根进入电子商务浙江普陀山千手公益以佛之名传递慈善缅甸少数民族武装组织峰会达成和平共识泰警方密切关注反特赦条例示威活动 严阿根廷总统脑部手术后康复良好北京首尔共办“中国日”活动 庆祝20江西赣州通报染色橙排查结果:个别所为中国护照含金量有望提高 各国降低签证华裔打破纽约到洛杉矶最快驾车纪录 仅东本宗方免费二手车评估克里米亚议会通过入俄决议雅园变电站 还是要建用国际化营商环境抓住资本信心南宁小伙放弃事业 义无反顾照顾无亲无活禽销售受影响 老广转向冰鲜鸡法媒:美国士兵所能分摊到军费预算是中LGD8.5代液晶项目建筑工程完工国美: 今日起千款产品同步低价明年底全市限行黄标车拒签变质腊肉遭快递员殴打玄天武神轮回巅峰极道枭雄网游之怒焰骑士异界为尊疯狂的召唤死神设计师暧昧专家猎美香都异世之神龙进化逍遥九天榔梅祠旅游龙头香旅游飞升崖旅游两仪殿旅游南岩旅游一柱十二梁旅游九曲黄河墙旅游牂牁江风景名胜区旅游汾湖公园旅游清水塘旅游太行山旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘