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

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

编辑:说三道四文库 发布时间:2017-08-24 05:26
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);
设计Browser及FTP程序 -VB资料 设计Chat程序 -VB资料 设计E-mail程序 -VB资料 使用VB获得一页的HTML代码 使用VB收发电子邮件 VB使用超链接和发送Email VB使用浏览器的文件复制对话框 输入/输出篇 -VB资料 通过WnetEnumResource函数获得网络资源 -VB资料 通往 Internet 的捷径-VB资料 显示计算机的名称 -VB资料 VB用 MAPI 控件实现发送邮件 VB用 WinSock 控件下载文件 VB用 Winsock 实现聊天的程序 VB用Internet Transfer编写FTP程序 VB用Sockets发送电子邮件 用VB 创建自己的通信程序 用VB5.0开发通信软件的技巧 用VB5开发IE 用VB编写网络寻呼 用VB编写小型的网络系统 用VB创建自己的通信程序 用VB构建Internet的应用 用VB开发标准CGI程序 用VB实现客户——服务器(TCP/IP)编程实例 用VB实现聊天讨论室和点对点会话 用VB写一个定时PING某IP的程序 用VB制作浏览器 用Visual Basic 5.0设计E-mail程序(MAPI) 用Visual Basic6.0编写客户服务器程序 用Visual Basic创建FTP组件 dbengine error: invalid blob length? 数据集打开问题 严重的问题???? 一个问题: 一个小问题,在线求助! 神秘的芭蕾舞鞋……¥%……·%·¥%·#¥%#·¥#@$%$#^% 无法进入系统,救救我吧 菜鸟问题,送分了!!! 得分小问题 小问题,请熟悉InterBase的大大进来看看。 做一个分布式的例子时的问题 大家帮我看下这几句问题到底出在哪里呀!!!!!!!谢谢 连接数据库的疑问,盼望解答!! 什么叫作实例? 菜鸟问题 十万火急:MDI的一个问题?????????在线等待!!!!!! 调查一下用汇编语言开发的工资如何?(深圳 ) 有关Builder版的兄弟定期进行网上技术交流的倡议书! 急!关系到我是否找到工作,请回答 如何根据Form的大小调整控件的大小 闪盘的另一个分区不能用了!!在线 连接数据库的疑问,盼望解答!! 急!急!急!请教一个共享的问题? 请问哪里有Class类和Method这两个类的说明呀!谢谢! 怎样打开CSDN电子版 请推荐一下有关于JAVA,JSP,JAVASCRIPT相关的好书 汽车与电脑谁重要(转) 转让 全新飞利普 820 彩屏手机一部(个人) 请问是否有可以统计数据的电子表格控件? 给点看法? 是不是来这里的人混得好的不多,搞得我都不敢跳槽了 倒霉就一个字,我只说一次。 一个关于Delphi的简单循环外提(编译优化)的测试,有兴趣进来看看 大家遇到这样的问题了吗? DTPicker的问题,急急急!!!! sun的ultra5启动时显示没有键盘设备,可能是键盘坏了,哪里能找到这种8芯的鬼键盘? softice调试时出现的有意思的问题 怎样终止一个函数? 关于j2ee的几个问题 谁有数值计算方法与c语言工程函数库的代码,急!!! 麻烦有项目开发经验的大虾进来看看,给项目估个价!谢谢! 急!!大问题!!求助!!发扬你们的美德吧! JAVA的配置问题 菊花在水里跳舞!!! 用什么来写啊!!!jdk还是jbuilder TP-LINK的RTL8029(AS)芯片的网卡怎么装? w32dasm怎么把程序中的中文字符串反汇编成指令了呢? 曾用B/S四层结构开发过OA的,请进!! sql语句的问题? 关于QUERY->SQL的赋值 c++学习中的问题,拿来和大家一起讨论。 蝉这篇文章中的宽恕是什么意思 高三生活作息回家开始做作业就8点了,做到10点半人实在是不行了,太累了想睡觉,于是我就睡了,然后三点半醒过来继续做作业,做到5点再睡到6点一刻起来,这两天都这样,我觉得这种生活可能会 《孔雀东南飞》原名 Excuse me,may I use your computer?英译中求你了 Did she send you an email?中文 高三科学作息? 1936年的柏林,希特勒对12万观众宣布奥运会开始.他要借世人瞩目的奥运会,证明雅利安人种的优越.我来扮演一位德国观众,在“情绪昂扬”到“倏忽沉静”这段时间里,我会想:---------------------- 连词成句 1.lingling send email didn't an 2.we there in went may 3.was she ago a many years4.a sing can song you 5.can't them i carry all6.years wasn't doctor ten he ago a 7.did see him you8.could she read write and what has been down has been down成分分析 There is agirl under the tree,She's drawing pictures.合成一句话 Sam and Jim have a blanket(对a blanket提问) 高三了科学的作息是怎么样的,要详细一点哈 甲、乙两人各走14千米,甲比乙早半小时走完全程.已知甲与乙速度的比为8∶7,求两人的速度各是多少? send,to,dad,an email.连词成句 utter balls "It's utter balls to say he represents democracy," The android browser is utter balls.One day the HC forum servers won't suck utter balls 在36÷9 =4中,如果9乘8,要保持商不变,那么36应( ) ann eats eggs and milk in the morning 那个词错了 What has been buried has often been buried well.如题 求这两种吊灯灯泡型号 Ann eats eggs and milk in the morning.这句子有没有错. 高三怎么安排作息科学 there are two books in my hand.(对划线部分提问)划线部分是two books 印度雅利安人和纳粹雅利安人是一个人种吗一个民族吗 amaze-balls是什么意思rt,整个互联网都查不到,出处是miley cyrus最近的电影so undercover,也许是俚语什么的吧,翻译人员也不懂,把它翻成了好球-_-#请问有美帝的同学知道吗? You'll have to spend ----writing your report here A.one day or two days B.one day or two C.a day or two .D.two days or one 为什么 雅利安人跟印度婆罗门是什么关系? 高三最科学的作息,要精确! He’ll have to spend ____ writing hie report here.A.one day or two days; B.one day or two; C.a day or two days ; D.a day or two选D为什么不选A啊 I didn‘t have any breakfast _____________a cup of milk 是填 except for 还是except 理由. Wrecking i will spend what i have to buy you a coat为什么不说i will spend what i have buying you a coat I have a cup of milk (改为复数形式的句子我超急的 disco you are planning to spend your money have fun this week,better ___ it-you've got some big bills coming.空格填什么,为什么呢 rest不是可数名词吗?为什么get some rest.后面不加s? 孔雀东南飞是谁写的? 直径为d的圆形钢板,现需切割一个矩形钢材.问如何切割,矩形的面积最大?并求出最大面积? 当rest为名词时,I 当rest为动词时,I rest啥意思当rest为名词时,I rest啥意思 孔雀东南飞是谁写的,属于什么题材 求一解答题:直径为d的圆形钢板,现需切割一个矩形钢料.问如何切割,矩形的面积最大?并求出最大面积? rest作为可数名词是什么意思 ‘孔雀东南飞’是什么?能写下来吗? I eat lots of fruit and vegetable对吗?如果不对那要怎么改? rest的名词是什么 孔雀东南飞中环境描写孔雀东南飞中,有哪些语句渲染了什么环境气氛?表达了什么思想 直径为d的圆形钢板,现需切割一个矩形刚料.问如何切割的矩形面积最大求最大面积 甲乙两车分别从ab两地相向而行,出发时,甲乙的速度比是5:4相遇后甲的速度减少20%,这样当甲到达B地时,乙离A地还有10千米,那么AB两地的距离时多少千米? purple的音标 I seldom eat fruit ()vegetable.A.and B.or 选什么? you should a___ have a glass of milk.根据提示填空, 描写课间操的作文(300字) 直径为D的原形钢板,现需切割一个矩形钢料.问如何切割,矩形的面积最大?并求出面积? 陕西科技馆里面有什么?是陕西的哦- - 课间操是什么? 《蝉》的文章主旨是什么7年级的小思写的.(不要教辅材料!) 急需~~~~~~! 参观陕西科技馆作文开头 求跨文化交际的案例分析,英文版的, 求 雪小蝉的文章 He likes making model planes.怎样改为否定句We like the same thing.变为否定句Ilike swimming.把主语变为He 跨文化交际 中文 案例分析哪里有跨文化交际的中文案例分析 日设立国家安全保障局拟起用多名自卫队日本岛根县拟出版《独岛问题的百问百答缅甸商家开始接受信用卡付款 硬件不足德媒:美窃听默克尔手机已长达十年 奥报告称美国一年有500名少年儿童因枪美购物网上售卖“清朝帽子”等万圣节形韩独岛宣传片因被指使用日剧片段已被临日本诈骗犯瞄准出台女 十余人被骗损失为落实核电设施出口 安倍破例再访土耳俄罗斯:在争议中力挺转基因食品英媒称中欧欲修补贸易关系 补贴问题仍德国组阁谈判紧张进行 新联合政府或增研究:提升信任感亦可靠食补 有效成分日本最大电信服务商操作失误 致半个日伊朗被指核能力相当发达 可在一个月内蒙古国总统启程访朝 成金正恩执政后首韩国整容手术事故层出不穷 整容共和国美国处方药价格高昂 民众被迫违法购外俄民调:超六成民众认为俄中存在多方面加拿大机场现可疑包裹 警方搜查机场附墨西哥20岁男子贩毒杀害数十人 墨警内地7地区上调最低工资标准 上海18今起出租车司机在乘客上车前禁问目的地宿命·成长·未来 记新疆第四次夺得从冠军“垄断”看CBA生态南昌中考物理化学实验操作考查5月10市民发现食品药品安全违法行为可拨打1南昌火车站清明旅客运输火爆 超8成互南昌中考体育考试5月15日开考 临时清明南昌瀛上墓区交通“亚历山大” 交南昌积极部署清明安全保障 将开展鲜花中国女队包揽麦考伦杯女子团体赛冠、亚高分遭疑 高三女生看试卷心就慌文章频频得罪媒体 马伊琍配合发声明因南昌开展“中小学生安全教育日”交通安江西通报都昌县副县长等7起违反八项规追思“捐友” 生命永存暴雨已致江西11.7万人受灾 2人死鹿心社:以开放倒逼改革 为经济发展营2014江西企退人员养老金上调10%江西邮政公司下属单位149㎡违建被拆沪昆高速小车追尾油罐车 致一死两伤(
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘