永发信息网

VC++中为什么BitBlt()函数画不出图来??刚学VC++,菜鸟中菜鸟,希望各位大大帮帮忙!

答案:2  悬赏:70  手机版
解决时间 2021-02-13 06:39
相关的内容如下:1、新建一个单文档应用程序,命名为MyBitmap,将View的基类选择为CScrollView;
2、将*.bmp图像拷贝到res文件夹中,并导入到资源中;
3、在MyBitmapView.h中插入代码:
CDC* pdcMemory;
CBitmap* pBitmap;
CSize source; // 为另一个画图函数StretchBlt()定义的变量
CSize dest; // 为另一个画图函数StretchBlt()定义的变量
4、修改构造函数
pdcMemory = new CDC;
pBitmap = new CBitmap;
5、修改析构函数
delete pdcMemory;
delete pBitmap;
6、修改OnInitialUpdate()虚函数
BITMAP bm;
if(pdcMemory->GetSafeHdc()==NULL)
{
CClientDC dc(this);

OnPrepareDC(&dc);
pBitmap->LoadBitmap(IDB_BITMAP1);
pdcMemory->CreatCompatibleDC(&dc);
pdcMemory->SelectObject(pBitmap);

// 以下代码与调用StretchBlt()相关
pBitmap->GetObject(sizeof(bm),&bm);
source.cx=bm.bmWidth;
source.cy=bm.bmHeight;
dest=source+100;
dc.DPtoLP(&dest);
}
7、修改OnDraw()函数
pDC->BitBlt(100,100,500,500,pdcMemory,0,0,SRCCOPY);

结果:图像并没有显示出来。
注:1、如果不用上述3~6步,直接修改第7步为:
CBitmap bitmap;
CDC dcMemory;
bitmap.LoadBitmap(IDB_BITMAP1);
dcMemory.CreatCompatibleDC(pDC);
dcMemory.SelectObject(&bitmap);
pDC->BitBlt(100,100,500,500,pdcMemory,0,0,SRCCOPY);
这样的话,图像能够正常显示出来。
2、如果将第7步修改为使用StretchBlt()函数也能显示,修改OnDraw()函数代码
pDC->SetStretchBltMode(COLORONCOLOR);
pDC->StretchBlt(20,-20,dest.cx,-dest.cy,pdcMemory,0,0,source.cx,source.cy,SRCCOPY);

刚学VC++,麻烦各位大大们分析一下,为什么我使用BitBlt()函数时无法达到预想的目的,谢谢了!!

注1中的一句写错了
原语句:pDC->BitBlt(100,100,500,500,pdcMemory,0,0,SRCCOPY);
修改为:pDC->BitBlt(100,100,500,500,&dcMemory,0,0,SRCCOPY);
最佳答案
映射模式:MM_ANISOTROPIC
横坐标:往右递增
纵坐标:往下递减

当原点坐标为(0,0)时,
Y坐标如果为正,就跑到窗口上边去了,画的任何东西都是在窗口外面。
-------------------------------------------------------------------------------------
内存DC设置了映射模式,设备DC没有设置映射模式。当BitBlt时,需要使用内存DC的每一个点画到设备DC的对应点中,由于两个DC的映射模式不同,所以无法正确对应每一个点。例如坐标为100,50的点,对于内存DC和设备DC而言,不是同一个坐标点。
正确的逻辑和序列是:
设置设备DC的映射模式,
创建内存DC,
画图,
把内存DC中的图片COPY到设备DC中:
尽量使用BitBlt,不要使用StretchBlt进行COPY。原因是:
1)StretchBlt进行拉伸需要使用算法,执行速度肯定没BitBlt快
2)StretchBlt的拉伸会使图形失真,仔细看下一幅800*600的图片,用StretchBlt拉伸至全屏后,和用Windows自带的图片查看器进行拉伸后比对,就会发现StretchBlt很傻的。
3)图片拉伸算法有几个需要考量的指标:第一是尽可能使图片不失真第二是尽可能提高算法的执行速度。一和二之间是此消彼长的关系。要保真就失速度!StretchBlt不如一些专业图像软件做的拉伸效果就是因为StretchBlt并不是专业的图像处理函数,主要为了提高该函数的执行速度,因此会失真。要想不失真,自己写图像算法。

因此,基本上没有什么理由使用StretchBlt。

附上源代码:

//以下为设置坐标映射
pDC->SetMapMode(MM_ANISOTROPIC); //X、Y单位长度都自定义的映射模式
pDC->SetWindowOrg(0,0);//设置窗口左上角的坐标为
pDC->SetWindowExt(500,50);//设置窗口度量
pDC->SetViewportOrg(0,0);
pDC->SetViewportExt(rect.right,rect.bottom);

mDC.CreateCompatibleDC(pDC);

//创建一副关于屏幕DC的图画
CBitmap MemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC,500, 50); //注意内存位图的大小尺寸设置
//保留以前内存,并将这幅图选入到内存DC中
CBitmap *pOldBitmap=mDC.SelectObject(&MemBitmap);

//以下为画直线
CPen PenWave(PS_SOLID,5,RGB(255,0,255));//创建紫色的画笔PenWave
mDC.SelectObject(PenWave);
mDC.MoveTo(0,0);
mDC.LineTo(50,50);

//下面将内存DC上所绘内容一次性拷贝到当前DC
pDC->BitBlt(0,0,500, 50,&mDC,0,0,SRCCOPY);

//资源回收
mDC.SelectObject(pOldBitmap);
//MemBitmap.DeleteObject();这行没必要,CBitmap析构函数会做的
全部回答

参照msdn给出的关于cdc::bitblt 的解释

bool bitblt(

int x,

 int y,

 int nwidth,

int nheight,

cdc* psrcdc,

int xsrc, //指定原位图要绘制的左上角x坐标

int ysrc, //指定原位图要绘制的左上角y坐标

 dword dwrop //绘制方式:你用的是srccopy直接绘制

 );例如原图为200*200

注意中间的分割线

如下代码pdc->bitblt(0,0,200,200,&dcmemory,0,-100,srccopy); pdc->bitblt(0,0,200,200,&dcmemory,0,100,srccopy);

运行结果:

也就是说

pdc->bitblt(0,0,200,200,&dcmemory,0,-100,srccopy);

的显示效果为

pdc->bitblt(0,0,200,200,&dcmemory,0,100,srccopy);

的显示效果为:

他们拼接的效果即为:

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
谁帮我回答一下这三个问题?!
可惜他有爱侣,还可怎么争取?
有没有可以两个人联机很好玩的游戏
周宁县交警大队检测站地址有知道的么?有点事
耀记美食在哪里啊,我有事要去这个地方
寿宁县交警大队检测站怎么去啊,我要去那办事
化简2cosθ/√1-sin^2θ+√1-cos^2θ/sinθ
车灯防尘罩怎么拆下来,有车友可以回答一下这
库尔勒广旭图文设计地址有知道的么?有点事想
两个正五边形的周长分别为15和20,则它们半径
屏南县交警大队检测站地址在什么地方,我要处
梦见有人给戴了一串珍珠
星巴克咖啡机多少钱
柘荣县交警大队检测站地址好找么,我有些事要
老凹场山地址有知道的么?有点事想过去
推荐资讯
江淮康铃和好运有什么区别
大蛇头派出所在什么地方啊,我要过去处理事情
中心旅馆地址在什么地方,想过去办事
八年前被人打伤八年后报警还有用吗
淳安县民政局大病补助
夏迪亚尔婚庆服务部地址在哪,我要去那里办事
用微波炉煮方便面 如果里面打一个荷包蛋 要煮
我有一批俄罗斯产的99.99%钨金条出手,手续齐
搏一台球地址好找么,我有些事要过去
求教,怠速运转多长时间可充满电瓶,这个问题
用我的苹果id登陆过别人的手机会怎么样
手机一直震动,关了机也一直震动
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?