SDI窗口中,如何在不丢失已画出的图形的前提下,更改背景色呢?

vegetablebird_ 2008-04-19 02:00:04
要写一个画图的程序,要求能够更改背景色,请问如何在不影响已画出图形的情况下根据菜单栏命令更改背景色呢?
...全文
103 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
vegetablebird_ 2008-04-23
谢谢paerxiushi、shaxing、jennyvenus和大家的耐心教导,我想,如果我继续努力的话,有一天也会像大家一样牛的吧。
回复
luawkk 2008-04-22
不管更改什么都是要重画的,如果你做过游戏界面的话,是很容易实现的,呵呵,楼主努力吧
回复
wflishh 2008-04-22
是可以的。就是用类似于透明图片的处理方式。把图像提取出来,
回复
paerxiushi 2008-04-22
在调用那个函数前,先在视图上涂一层与位图同大小的新背景色.
回复
paerxiushi 2008-04-22
用CDC::SelectObject(CGdiObject *p)将一个CBitmap对象选入当前DC.这不能表示已经在CDC上画图了,事实上,它只不过是修改了DC(设备描述符)的属性,DC也是一种结构,它由各种属性组成,比如画刷,画笔,裁剪矩形等。因此,selectObject只是为类赋值,而没有为类型(设备描述符)执行操作。你想想使用画刷的例子,在画图之间,我们是不是总要先selectObject将对象选入到设备,然后再调用rectangle等方法作图。实际,位图的情况也是一样的道理。因为,位图的描述需要有个缓冲的过程,不能直接描制在一个设备上,需要两个设备才行。这也就是为什么只有当调用BitBlt或者StretchBlt后,才绘制了位图,而这两个方法涉及到两个设备,pDC一个,第五个参数又是一个。
回复
shaxing 2008-04-22
[Quote=引用 9 楼 vegetablebird_ 的回复:]
谢谢各位的热情指导,我还有一件事不明白,用CDC::SelectObject(CGdiObject *p)将一个CBitmap对象选入当前DC,究竟代表什么意思?我在OnDraw中加入下面的代码让程序显示ID为IDB_BITMAP的图像:

C/C++ codepBitmap->LoadBitmap(IDB_BITMAP);
other = pMemDC->SelectObject(pBitmap);
BITMAP bmp;
pBitmap->GetBitmap(&bmp);
CRect r;
GetClientRect(&r);
pDC->StretchBlt(0,0,r.right,r.bottom,…
[/Quote]

将一个CBitmap对象选入当前DC就相当以在DC上铺上图片,你以后的画图其实就是画在Bitmap上。而且如果你不选进一张图的话,兼容DC的大小只是一个象素大。你选进多大的图DC的大小就变为多大
回复
other是被保存的dc,也就是pMemDC的初始状态。之后pBitmap被pMemDC表现出来,假如你显示pMemDC的话。
回复
vegetablebird_ 2008-04-22
谢谢各位的热情指导,我还有一件事不明白,用CDC::SelectObject(CGdiObject *p)将一个CBitmap对象选入当前DC,究竟代表什么意思?我在OnDraw中加入下面的代码让程序显示ID为IDB_BITMAP的图像:
pBitmap->LoadBitmap(IDB_BITMAP);
other = pMemDC->SelectObject(pBitmap);
BITMAP bmp;
pBitmap->GetBitmap(&bmp);
CRect r;
GetClientRect(&r);
pDC->StretchBlt(0,0,r.right,r.bottom,pMemDC,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
pMemDC->SelectObject(other);
pBitmap->DeleteObject();

其中other以及pBitmap都是指向CBitmap的指针,pMemDC是由pDC创建的兼容DC(在OnCreate中完成),以上变量都是View类的成员。
那other = pMemDC->SelectObject(pBitmap)后,对pMemDC有什么影响呢?是不是将pBitmap画在pMemDC上?
回复
lonkil 2008-04-20
基本原则是先画背景,再画你画出的图形.这样就不会被覆盖了.

回复
卡米尔 2008-04-20
学习~
回复
paerxiushi 2008-04-20
以下是透明图像的代码段,你需要将透明色设置成背景色就可以了,这个函数的第四个参数就是原位图。
void CDrawTransView::DrawTransparent(int x,int y,CDC* pDC,CBitmap* pBitmap,COLORREF Color)
{
BITMAP bm;
pBitmap->GetObject(sizeof(BITMAP),&bm);
CDC ImageDC;
ImageDC.CreateCompatibleDC(pDC);
CBitmap* pOldImageBitmap=ImageDC.SelectObject(pBitmap);//将位图选入到设备环境

CDC MaskDC;
MaskDC.CreateCompatibleDC(pDC);

CBitmap MaskBitmap;
MaskBitmap.CreateBitmap(bm.bmWidth,bm.bmHeight,1,1,NULL);//创建一个黑白的设备,因为设备像素位上默认为0,也就是默认为黑色
CBitmap* pOldMaskBitmap=MaskDC.SelectObject(&MaskBitmap);

ImageDC.SetBkColor(Color);//设置图像的背景色,也就是指定了透明色
MaskDC.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&ImageDC,0,0,SRCCOPY);//将源图像复制到屏蔽设备环境中,那么透明色的部分将不会参与位运算,而非透明的部分而参与位运算

CDC OrDC;
OrDC.CreateCompatibleDC(pDC);
CBitmap OrBitmap;
OrBitmap.CreateCompatibleBitmap(&ImageDC,bm.bmWidth,bm.bmHeight);
CBitmap* pOldOrBitmap=OrDC.SelectObject(&OrBitmap);

OrDC.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&ImageDC,0,0,SRCCOPY);//将源图像复制指定设备环境中
//OrDC.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MaskDC,0,0,0x220326);

CDC TempDC;
TempDC.CreateCompatibleDC(pDC);

CBitmap TempBitmap;
TempBitmap.CreateCompatibleBitmap(&ImageDC,bm.bmWidth,bm.bmHeight);
CBitmap* pOldTempBitmap=TempDC.SelectObject(&TempBitmap);

TempDC.BitBlt(0,0,bm.bmWidth,bm.bmHeight,pDC,x,y,SRCCOPY);//将默认设备环境中图像复制到临时环境中
TempDC.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MaskDC,0,0,SRCAND);//将屏幕设备环境中的图像怀临时环境中的数据AND运算,产生了屏幕面具
TempDC.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&OrDC,0,0,SRCPAINT);//将OrDC环境中图像与临时环境图像数据OR运算,产生了透明位图

pDC->BitBlt(x,y,bm.bmWidth,bm.bmHeight,&TempDC,0,0,SRCCOPY);//将内存中的透明图像输出到前台设备中。

TempDC.SelectObject(pOldTempBitmap);
OrDC.SelectObject(pOldOrBitmap);
MaskDC.SelectObject(pOldMaskBitmap);
ImageDC.SelectObject(pOldImageBitmap);

}
透明图像也就是指定了一个位图中的透明颜色,当这个图像输出到设备中后,位图的非透明部分将覆盖原设备上的颜色,而位图上的透明区域仍将显示出原来设备的颜色。
回复
菜牛 2008-04-19
按照矢量图处理,参考MSDN例子DrawCli
回复
sdi程序,就是一个dc,dc中存放的都是点阵位图,是无法直接更改的。

建议按照动画窗口
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-04-19 02:00
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……