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

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

编辑:说三道四文库 发布时间:2017-02-25 07:46
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);
VB如何让程序拥有多个热键? VB如何让用户自行输入方程式,并计算其结果? VB如何使程序不在Ctrl+Alt+Del弹出的对话框内? VB如何使用 VB 编写自动反安装的程序? VB如何用VB建立快捷方式 VB如何用VB在桌面建立快捷方式 VB如何在 VB 中控制 Modem 行为? VB如何在VB中判断Windows9x的运行模式 VB如何在Visual Basic中实现异步执行程序 VB如何在开机时自动更换墙纸? 使回车具有 Tab 的功能-VB资料 输入时,自动转换成小写? -VB资料 显示多媒体信息 -VB资料 也谈Windows 下的自动存盘 -VB资料 一个小巧精致的CPU监视器 -VB资料 应用VB4.0实现工业控制的实时曲线和历史曲线 应用程序中实现关机功能-VB资料 萤幕抓取与萤幕保护程式 -VB资料 用VB5.0创建Windows快捷方式 用VB5.0收集键盘和鼠标信息 用VBA限制非注册软件使用时间 用VB编程检测当前电池使用情况 用VB编写定时关闭计算机的程序 用VB编写键盘拦截程序 用VB函数轻松访问系统注册表 用VB设计一个定时闹钟程序 用VB实现拖放功能 在VB中启动控制面板 在VB中异步执行程序 在Visual Basic中终止Windows 95 在关机或Logff前信息的拦截-VB资料 VFP函数转型VB 谁使用过windows media encoder sdk and meida format sdk 我高手在哪里?-------> 如何在第一时间里获得屏幕的变化呢?及获得屏幕变化的那部分?各位大师,帮帮我。谢了。 怎么在局域网中2000server下发布网站???? 有关CRecordset,ODBC,Sqlserver的数据库,为什么会变慢? 急!!!有谁知道XP的解密程序? 我用regeditset语句自动注册odbc数据源,注册完成之后程序可正常使用,但控制面版中的odbc数据源中却找不到该项,是不是还要修改某个文件?请告知为谢! !!!!请问这个怎么实现??(有图) 在多层系统中数据更新是如何实现的? Applet 里面怎么做菜单 串行口的简单问题,求救 如何在函数里面传字符串数组 请问哪里有《Delphi 4 编程技术内幕》随书附带的源码下载啊? 请教:将可执行程序安装到用户机上后,用什么办法控制其它用户非法复制使用? 我想隐藏MSFlexGrid2的的10到最后行,但不行!!急救!! 哪有STL 和BOOST库的SOURCE CODE 当 如何做安捷生产管理系统。如何下手!!! PB8在链接Access2000时,为何会发生问题.链接后在PB8中打开只能看库中数据,却不能修改! 我用OCX控件编程,插入OLE控件时,出现“需要协议文件”,我该怎么办呢? waveoutopen! 问个问题,我一直有疑惑 BDE中建立的Access库,怎么才能打开; Access的密码为空,用户名不知道; 第四次帖了,高手在哪儿? 为什么我装了一个元件后再安装一个另外的,会把第一个冲掉? 就要去实施了,不知道什么时候才能回来,散分 我是菜鸟,问一个很菜的问题,!!!!!!!!! ATL中创建的ActiveX控件,是怎么在程序中使用的???????????? 一个关于LotusScript的一个问题。调用公试。 **请教:怎么让MSFlexgrid的一行显示一种颜色. 一个小问题,希望有人能解答! DLL高手请入,关于在DLL中引出对象的问题?????? 求教!!有关DLL调用中返回字符串类型出错的问题。 Delphi怎么实现子类化? session 和 cookie 各有千秋,区别在那里啊?敬请赐教! fm1008leaf(小幻姬(玉笛书生的徒弟)):我考考你就知道你是真是假! jneu(沧海桑田)怎么不理我?有关宏拷贝问题 paradox中的NUM类型在sql语句中是什么类型?为什么asfloat会出错? 关于J2EE的就业前景,值不值的花二万元参加一个二十天的培训,欢迎大家热烈讨论 在listbox 中,如果知道了一个Item的内容,怎么知道它的indix 今有同仁问到,三十以后咋过。恰巧心情郁闷,发上几句牢骚。 少年暗恋对象,早已嫁作人妇。那天遇见街头,孩子叫我叔叔。 OICQ问题! 如何可获得Table 内字段的类型及长度? windows2000 server 的internet 共享怎样设置权限 软件开发的请进来讨论,关于报酬的问题。大家多提建议。 1.为什么有些地方可以用MessageBox函数,有些地方不可以2.mfc的CView::OnFilePrint提供了打印的方法,要是一个程序没有视图要打印一般用什么方法? 请问在DEVELOP2000里面可以使用进度条控件吗?怎么编程实现? ???oracle监听器问题? WebBrowser控件获得网页中文本框的名称该如何写? CFtpConnection 怎样在FastReport中控制或判断所连接的数据库表到了eof? CTypedPtrList模板对象中,如何删除指定位置的元素??十分着急! 请问用食醋可以做 醋酸白实验吗? 面粉怎么发酵 可乐和雪碧中都溶解了二氧化碳,当打开可乐或雪碧时,会看到有大量气泡产生,你认为气泡中的气体是? 1.图中大概是“神舟七号”发射3个月后的全球局部光照图,此时太阳直射点的坐标是______.2.属于新的一天的经度范围是______,新旧日期的面积之比为_______. 如何发酵面粉 二硫化亚铁和氧气反应配平的过程 双线桥法怎么表示 高一自然地理要点 如何配平化学方程式,举例说明一下...RT,例如:"向氢氧化铜中滴入稀盐酸."化学方程式如何得来的,又如何配平.最好是最小公倍数法的详细计算过程."向盛有澄清的石灰水的试管中吹气",这样又 硫化亚铁和氧气反应的化学方程式? 化学方程式配平最小公倍数法可以解决所有的化学方程式吗?为什么有的题目用不行呢? 化学方程式怎么配平?求回答,请举例. 二硫化亚铁与氧气反应的方程式 求初中化学方程式配平练习题我需要练习方程式配平 急需 基础习题.谢谢! 奇数配偶法配平化学方程式是不是不是所有这一类化学方程式都适用如 ( ) Fe3O4+( )CO===( )Fe+( )CO2 反应条件是高温 硫化亚铁与氧气反应,生成三氧化二铁和二氧化硫的反应,配平的具体过程是什么呀? 尖锐湿疣的醋酸白实验用食醋可以吗? 化学方程式配平怎么配平,常用的配平方法偶那些,考得最多的 是那种方法,求举例分析? 二硫化亚铁在沸炉中与氧气反应的化学方程式 用食醋能做醋酸白实验自我诊断尖锐湿疣吗? 3个连续奇数的和是15,这3 个奇数的最小公倍数是多少? “升失氧氧氧是还,降得还还还是氧”各指什么? 海带和大米哪个属于绿色食品?海带是不是蓝色食品?为什么? 高一生物必修一第二章知识点总结 降氧升还,得氧失还 为什么从海带中提取碘要海带用酒精湿润? 白酒,加碘盐,食用醋,冰水哪个是纯净物 升失氧:氧化反应,氧化性,还原剂,还原产物对不对啊?一直混掉… 烹鱼时加入少量的料酒和食醋可减少腥味,化学原理是什么? 用最小公倍数,奇偶配平数,观察法,灵活应用. 蒸馏水含有二氧化碳,对食用醋总酸量的测定将有何影响 鱼虾会产生腥味烹调时可加入食醋和料酒吗 什么是奇偶数配平法? 甘油和醋及蒸馏水如何调配我的皮肤是混合性肤质,两颊干干的,T字区油油的,而且很容易长痘痘,也有很多黑头. 食醋中的乙酸和料酒中的乙醇在烹调中化合成什么 怎么配P2+O5--P2O5?最后反应物的P2前为什么有个4? 用醋泡的酸萝卜 吃了有什么好处 可以给我举几个初中的例子 还有化学中需要注意的问题 九年级化学配平练习题(要内附答案的)越快越好 牛奶-奶牛,蜜蜂-蜂蜜,油菜-菜油,更多?后者是前者的产品. 九年级上册化学里要注意一些什么?特别是化学式.如何正确给化学方程式配平,有哪些方法? 一道化学配平题FeSO4+HNO3=Fe2(SO4)3+Fe(NO3)3+NO+H2O 白色不透明的酱油瓶可以装菜油吗?对于拿勺舀菜油腻烦了.想拿酱油瓶装.但是这塑料会和菜油其反应吗?请指出材质和原理, 食醋是由微生物发酵而;来的吗?面粉呢? 谁有初中化学配平练习 水+油+酱油+蜂蜜=?为什么会出现这个现象?快 酿造食醋里为什么添加食盐,有什么作用?我在看一些醋的配料里好多有食盐,好奇 为啥要添加盐呢 没人知道么? 化学配平的题 怎样用最小公倍数法来配平化学方程式啊 为什么说食醋生产是多种微生物参与的结果?常用的菌种有哪些? 用高锰酸钾制氧气的化学方程式 要配平 最小公倍数法配平化学方程式最小公倍数法是不是就是把各个同种物质的化学式的角标数字相乘?用初三学生知道的化学式讲解下 高二思想政治(必修四)生活与哲学 知识点总结人教版 流水账形式 如何配平很复杂的化学方程式?例如高锰酸钾取氧 如何配平化学方程式以及最小公倍数的方法请说明方法.再举个简单不要太复杂的例子.比较易懂.跪求了... 高一思想政治2政治生活(必修)的知识点问题2高一思想政治2政治生活(必修)第2008学年坚持人民民主专政的意义?我国公民享有的政治权利?最好标有页码 求高一必修一生物知识点 可用食醋来做醋白实验吗请问医生可以用我们平时吃的食醋(陈醋,米醋,白醋)来做判定尖锐湿疣的醋白实验吗? 配平的奇数配偶法 谁可以讲一下我不太懂 高一生物必修一知识点
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn