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

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

编辑:说三道四文库 发布时间:2017-03-28 02:24
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);
超现实主义!用脑电波控制你的计算机设备 搜狐否认“情理之中”的退市 上市仍是最优选择 六大BaaS产品推荐:移动开发必备的后端云服务 未遵守承诺 微软遭遇欧盟7.31亿美元巨额罚单 PaaS正能量:6人团队,仅1人全职后端 支撑6000万用户 三星:我不抽成,收益100%让开发者拿去! 腾讯开放平台推“送红利计划” 承诺半年内不参与分成 JavaEE快速开发框架Wabacus 4.0发布,开发效率提高五倍以上 市盈率创新高 谷歌为什么会在苹果博弈中暂时胜出 从Rovio遇到危机,看现在应用市场的演变 Windows Azure支持Android应用 面向东亚推广云服务 抛弃DRAM、拥抱闪存,Facebook重做Memcached 夏普三星联姻 电子行业或将多元化发展 从下拉菜单设计细节看Amazon对用户体验的把握 Chartboost美女CEO:40人团队服务3亿移动玩家 Distimo:新晋开发者想让产品得到关注越来越难 OpenFeint绝迹后,开源项目OpenKit继续前进 美FDA通过搜索引擎和社交平台预警药品副作用 挖坟三星“眼球追踪技术”背后的技术团队 为什么开发者热衷在Stack Overflow上查阅API文档? Facebook推新News Feed 欲造就“个性化报纸” 女神程序员的一天:暴力测试social爬虫代码 2013IBM云存储路线图:更快,更简单,更安全 二战大数据故事:数学家、物理学家、概率论击败德国潜艇 软件定义网络服务商Pertino B轮融资2000万 Scringo社交组件,让你的应用“热闹”起来! Android开发必备:Eclipse 4.2 SR2版本发布 32场!2013年360HTML5校园行首站告捷 移动周报:不做内容,只钻技术的快播 一周消息树:中国开源发展缓慢的“病因” 百度应用引擎BAE正式开放 新增支持Node.js 下面的程序结果到底是什么?? BCB6下有什么好的报表控件? 页面中表单能不能存在于某个表格的两个单元格,请看里面的具体描述,谢谢! 下面的程序结果到底是什么?? 关于网络代理软件WINPROXY Server 2.0的设置的问题。 页面丢失 如何把TListView控键里面的内容输出到打印机! 请问:*.gsp格式文件,用什么打开? *** 高分,请问一个比较难的问题。哪位高手可以解决? *** 如何实现两台上INTERNET计算机之间文件传送? 关于网络代理软件WINPROXY Server 2.0的设置的问题。 关于加入到工程中的bmp文件 请问如何用PB实现个人相册中相片的增加,保存,浏览 [广告] 请帮忙测试一个MySQL的管理程序 我受不了拉。关于dll中的menu 关于网络代理软件WINPROXY Server 2.0的设置的问题。 发布站点的问题 winsock2 故障 如何实现两台上INTERNET计算机之间文件传送?有哪些方案可选? 关于linux下光驱的问题 如何提取Win2K/XP安装光盘的引导信息? 单元格日期格式从单元格中读出来时成了数字,如何另外的用代码还原成日期? 到底是怎么回事,北京拨号163有调整了吗? 在线的进来问点问题(jsp/javabean), 分不多其它帖子中送出 关于linux下光驱的问题 DELPHI怎样调用IE内核? 用PB7。0做的程序怎么用PB8。0打开呀 variant和array的转换问题 紧急:请给一个JRun Studio的最新正式版下载地址! 我的信誉分又被扣了,给个理由先!!!!!!!!!!!!!!!!! 问一个初级的问题? 新手问路:linux支持哪些语言? 怎么样在: sql server enterprise manager 中插入一条记录?? 如何动态向picture控件中加载图片 Bean的java里的class有什么区别? 为什么每退出一个程序或一个命令都会有一封信发给root!! 为什么每退出一个程序或一个命令都会有一封信发给root!! 菜鸟问题! 怎样在Window 98中设置环境变量,如Classpath=.....,path=....之类的. VB中常量字符串里要包含双引号怎么写? 我现在想装installshield,可是我找不到,不知道哪儿能单独下载!!!我的VC++ 6.0里没有奇怪了! 为什么关于adoquery等等生成xml数据文件以及如何从这些xml文件取数据的资料这么少啊??? 怎样在控件上画线,或者说怎样获取控件的Graphics对象. 大家快帮我回答这个问题吧,我会加分的:http://www.csdn.net/expert/topic/599/599906.xml?temp=.2423517 关于corba在delphi中的实现 比较难的一个问题: 用什么方法得到一个多播组的成员数量? 请问怎么解除两个互为复本的数据库之间的复本关系? 急,求一个API函数 用ATL开发组件来封装asp网页中遇到的问题:IRequest::get_Form(IRequestDictionary **ppDictReturn)应该怎么用?谢谢! 怎样用VB代码实现两个SQL SERVER数据库之间数据的复制。 有一个长方形的鱼塘,周长是90米,长和宽的比是5:4,这个鱼塘占地面积是多少平方米? 跨长江中,下游的省级行政区是( ) A.湖北 B.湖南 C.安徽 D.江西 拉力F=125N,在10s内将重物匀速提升2M,滑轮组的机械效率是80%,则物重,F做的功和功率分别是多少急 已知直角三角形的两条直角边的和为7,三角形的面积为6,求这个直角三角形的斜边长.急, 与甘肃省相邻的省级行政区有哪些 全国总面积是多少平方千米? 我国最大的省(自治区,直辖市)的面积是多少平方千米?最小的呢? 已知直角三角形的两条直角边长的和为7,三角形的面积为6,求这个直角三角形的斜边长.列方程. i超市运来98箱萝卜,运来的番茄筐数只萝卜的一半,运来的黄爪筐数是番茄的3倍.三种蔬菜一共运来多少筐? 我国最大的省【自治区,直辖市】的面积是多少平方千米? 直角三角形两直角边的和为7,面积为6,则斜边长为为什么 某菜市场运来一批蔬菜,黄瓜有2吨,黄瓜比萝卜的三分之二多三分之二吨,萝卜是西红柿的四分之三,西红柿几吨 长方形周长是19.4米,长比宽的2倍少0.8,这个长方形的面积是多少 直角三角形的面积为6,两直角边的和为7,则斜边长为答案是写5,可我算却是根号37.是怎么写呢? 一个棱长4分米的正方体水箱装满水,如果把这箱水倒入另一个长8分米,宽2.5分米的长方体水箱中,求高 长方形周长是6.8米,长比宽的3倍少0.2米,求长方形的面积 直角三角形两条直角边的和为7,面积为6,斜边长为多少?向shediaofengyun这种人,自己都不会,你真惭愧啊 一袋巧克力牛奶中,巧克力与奶的质量比是2;9,已知牛奶比巧克力重700克,巧克力和牛奶各有多少克 直角三角形的两条直角边长分别为根号2009减根号2008和根号2009加根号2008,则斜边长为 一个梯形的面积36平方分米,上底4分米,高6分米,求它的下底? 下图是一个大棚里各种蔬菜种植面积的统计图.芹菜10% 茄子20%黄瓜15%西红柿25%豆角150平方米 (1)这个蔬菜大棚的种植面积是多少?(2)芹菜的种植面积是多少平方米?(3)茄子的种植面 原有森林400公顷,荒地150公顷,为了增加绿色资源,准备把部分荒地改为森林,改完之后,要求荒地占森林的10%,问应把多少公顷荒地改为森林.求算式和题解,只有真正弄懂了以后才能解答这样的题 商店第一次买回6个皮球和12个乒乓球共用30元,第二次买回4个皮球和12个乒乓球共用24元,你知道一个皮球和一个乒乓球各是多少元吗? 某村有耕地100公顷,其中20公顷种植蔬菜,在扇形统计图上表示蔬菜种植面积的扇形圆心角是 某开发区欲开发一块四边形荒地现已测算出s1=2公顷,s2=4公顷,s3=3公顷试求这块荒地的总面积某开发区欲开发一块四边形荒地现已测算出S1=2公顷,S2=4公顷,S3=3公顷试求这块荒地的总面积 小明到商店买了一个乒乓球和一个皮球,一共用去了3.6元,如果皮球的价钱是乒乓球价钱的1.5倍.一个皮球和一个乒乓球各多少元? 小丽3分钟跳绳126下,小云2分钟跳绳多少下才和小丽跳的一样快 3台拖拉机5小时可以开拓荒地45公顷15台6小时可以开拓多少地 小明到商店买了一个乒乓球和一个皮球,一共用去了3.6元,如果皮球价钱是乒乓球价钱的1.5倍,皮球和乒乓球各多少元? 小青要调制2.2千克的巧克力奶茶,其中巧克力与牛奶的比是2:9,需要巧克力和牛奶各多少千克? 学校用174元买了7个小足球和5个小篮球,已知每个小足球的单价比小篮球便宜6元,小足球的单价多少元?列方程 直角三角形两条直角边的和为7,面积为6,则斜边为( ) A.√37 B.5直角三角形两条直角边的和为7,面积为6,则斜边为( ) A.√37 B.5 C.√38 D.7 如果西红柿种植面积为0.42公顷,那么三种蔬菜的种植总面积是多少 洪山乡扩建后的鱼塘面积达到31.1公顷,比原鱼塘面积增加了6%,原来鱼塘面积是多少公顷? 我买了3个篮球和50个乒乓球共用294元,1个篮球的价钱相当于16个乒乓球的价钱每个篮球多少元? (1)已知西红柿的种植面积为4.4公顷,三种蔬菜的总面积为多少公顷? 洪山乡扩建后鱼塘的面积达到37.1公顷 比原鱼塘面积增加6% 原来鱼塘面积是多少公顷 直角三角形的两条边长分别为12和5,则以第三边为直角边的等腰三角形面积为过程,最好不要有根号,谢谢题意太难懂了. 小聪用如图所示的滑轮组将重4N的物体匀速提高2m,他做的有用功为8J.若滑轮组的绳重及摩擦不计,他用这个滑轮组匀速提升9N的物体时,机械效率比提升4N物体时提高了10%,此时的拉力为5N (已 爸爸扩建了鱼塘面积比原来囎加了8分之1扩建后的鱼塘面积是90公须,扩建前鱼躺面积是多少公顷 有一快直角三角形的绿地,量得两直角边长分别为6m,8m.现要将绿地扩充成等腰三角形面积 如图所示是小明同学测滑轮组机械效率的实验装置图.他在2s内做了2.4J的有用功使重物匀速上升了0.4m,不计绳如图所示是小明同学测滑轮组机械效率的实验装置图.他在2s内做了2.4J的有用功使重 洪山乡扩建后的鱼塘面积达到37.1公顷,比原鱼塘面积增加了6%,增加了多少公顷 直角等腰三角形和直角三角形叠放放一起,求重叠部分的面积 物理小聪用如图所示的滑轮组将重4 N的物体匀速提高2m,他做的有用功为 ▲ J.小聪用如图所示的滑轮组将重4 N的物体匀速提高2m,他做的有用功为 ▲ J.若滑轮组的绳重及摩擦不计,他用这个滑 算一算,这种牛奶在哪个商店便宜.甲商店买10盒22元,乙商店买10送1,共24元. 如果等腰三角形的两条直角边的和比斜边长2cm,那么这个直角三角形的面积是多少? 有一块田地共4公顷,平均分成12分,其中的3份种黄瓜,4份种豆角,其余中茄子.问黄瓜占几公顷?黄瓜地占豆角地的几分之几?豆角地占茄子地的几分之几? 甲商店:买10盒牛奶22元,乙商店:买10盒牛奶送1盒,共24元,哪个商店买牛�� 一个三角形养鱼池的占地面积是0.24公顷,如果它的底和高都是整米数,那么它的底和高可能是多少米?(思考题) 一块地60公顷,已知黄瓜与豆角的面积比是3 :2,豆角与茄子的比是4 :5.求三种蔬菜各种了多少公顷土地.求一个最佳答案(最好要有浅显易懂的解释) 小朋友,本来你用10元钱买1盒牛奶是够了,但要再买一袋牛奶就不够了!今天是儿童节,给你买的牛奶打9折两样东西请拿好!还有找你的8角钱(一袋牛奶的标价是整数元)阿姨,我买一盒饼干和一 占地4公顷的正方形养鱼池,边长增加100米,面积增加多少公顷? 有40公顷土地,用他的六分之一种西红柿,五分之四种茄子,其余的种豆角,豆角占多少公顷 湖北省的土地面积是多少 一个长方形养鱼池,长50米,宽25米,这个养鱼池的占地面积是多少平方米?几个这样的鱼池面积约1公顷?要算式的. 如图所示,拉力F=125N,在10s内将重物匀速提升2m,滑轮组的机械效率是80%.则下列说法正确的是 A.绳子自由端移动距离为6mB.物体重是375N C.拉力F做的功是250J D.拉力F的功率为25W为什么B中不用F= 一个长方形养鱼池,周长是320米,长与宽的比是5:3,这个养鱼池的面积是多少平方米? 已知一直角三角形中的两条直角边a,b满足a+b=7,斜边c=6,则这个直角三角形的面积是? 不计绳重和摩擦力,拉力为125n.在10s内重物提升2m,此时滑轮组的机械效率为80%问物重?拉力的功率?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘