关于创建位图的几个函数-----VC图像高手请进!

yueyue 2000-05-29 08:56:00
我用CreateBitmapIndirect()创建了一24位位图,选入DC时返回的位图指针有的时候
为NULL(请注意:是“有的时候”)。但上述函数返回值为TRUE。
而用CreateDC("DISPLAY",NULL,NULL,NULL);
CreateCompatibleBitmap(..);
创建的位图却是单色的。不知何故。
...全文
621 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yueyue 2000-06-04
  • 打赏
  • 举报
回复
这个问题我已解决。原来程序并没有错(希望没有错吧),只是显示器颜色设
置不是24位的,与程序中的设置不匹配,因此造成了错误。我做了一点改动,然后
就OK了。
在此还要谢谢大家的帮助。
foenix 2000-05-31
  • 打赏
  • 举报
回复
HDC CreateCompatibleDC(
HDC hdc // handle to DC
);
创建一个和某个已有设备兼容的设备上下文,选入的HBITMAP应该和它兼容,否则就会返回NULL。当该参数hdc为NULL时即CreateCompatibleDC(NULL);
将创建一个和显示器兼容的设备上下文,一般情况下创建Bitmap时用CreateCompatibleBitmap可以保证和设备上下文的兼容,但也可以用其他的创建Bitmap的函数,只要保持兼容就行,比如:假设我的显示分辨率是16为色,那么我用下面的代码是正确的:
CBitmap bitmap;
bitmap.CreateBitmap(100,100,1,16,NULL);
CDC dc;
dc.CreateCompatibleDC(NULL);
CBitmap *pOld=(CBitmap *)dc.SelectObject(&bitmap);
CRect rc(0,0,100,100);
CBrush br;
br.CreateSolidBrush(0x000000ff);
dc.FillRect(&rc,&br);

...
dc.SelectObject(pOld);
royluo 2000-05-31
  • 打赏
  • 举报
回复
yueyue:
这里是MSDN里关于
CreateCompatibleDC的说明
The CreateCompatibleDC function creates a memory device context (DC) compatible with the specified device.

HDC CreateCompatibleDC(
HDC hdc // handle to DC
);

A memory DC exists only in memory. When the memory DC is created, its display surface is exactly one monochrome pixel wide and one monochrome pixel high. Before an application can use a memory DC for drawing operations, it must select a bitmap of the correct width and height into the DC. To select a bitmap into a DC, use the CreateCompatibleBitmap function, specifying the height, width, and color organization required.

仔细看一下就说明你发生的现象是很正常的了
用CreateCompatibleDC建立内存DC后
必须用CreateCompatibleBitmap建立一个与这个DC兼容的Bitmap
你另外建一个Bitmap,然后SelectObject当然不对了。
另外CreateCompatibleDC创建的位图是单色的是很正常的
文档不是里清清楚楚的写着么。 :)
When the memory DC is created, its display surface is exactly one monochrome pixel wide and one monochrome pixel high.
yueyue 2000-05-31
  • 打赏
  • 举报
回复
To gamepolice:
可是为什么有时执行正确呢?
不知道你用没用过这个函数GetBitmap();它返回的BITMAP结构变量中bmBits的
值就是为0。
gamepolice 2000-05-31
  • 打赏
  • 举报
回复
BITMAP结构中还有一个参数,它表示位图数据,但在你所定义的变量中并没有给它分配内存空间。对于24位图来说,图像的大小为:WIDTH*HEIGHT*3。
yueyue 2000-05-31
  • 打赏
  • 举报
回复
To Kenny:
像你说的那样,我所需要的位图句柄hBitmap岂不是无法得到了吗?
还有,就是第一次选入DC时返回值有时为空,显然已经发生错误。而用
CreateCompatibleBitmap()创建的位图选入DC时返回值并不为空。
Kenny 2000-05-31
  • 打赏
  • 举报
回复
前边的东东我觉得没错,只是最后一句,最好改为:pBitmap->DelteObject();
yueyue 2000-05-31
  • 打赏
  • 举报
回复
今将部分源程序贴上,望各位大虾赐教:
...
HBITMAP hBitmap;
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
CBitmap bitmap;
BITMAP bmp;
bmp.bmType=0;
bmp.bmBitsPixel=24;
bmp.bmHeight=m_nHeight;
bmp.bmWidth=m_nWidth;
bmp.bmBits=0;
bmp.bmPlanes=1;
bmp.bmWidthBytes=3*bmp.bmWidth;
bitmap.CreateBitmapIndirect(&bmp);

CBitmap* pOldBitmap=MemDC.SelectObject(&bitmap);

//绘图操作....
...

CBitmap* pBitmap=MemDC.SelectObject(pOldBitmap);
hBitmap=(HBITMAP)pBitmap->Detach();
....
yueyue 2000-05-30
  • 打赏
  • 举报
回复
To jally:
请看我的上一贴;
To Kenny:
看来我还得声明一下(可惜不能用软驱,否则我一定将源程序贴上):
1。你不认为选入DC时的返回值有用吗?最起码它表明了你的程序执行正确与否。
2。选出的指针pOldBitmap,最终要选入,如果它选出的时候为空,那么选入后返
回的pBitmap必然为空,而我正要用到这个指针pBitmap。你说我能不担心吗?程序正是在这里出错。
Kenny 2000-05-30
  • 打赏
  • 举报
回复
你为什么要担心选入DC时的返回值呢,那只不过是DC中的原有位图指针,没有实际意义。不过为了使你的系统更可靠,在选入DC时,保存返回指针,绘制结束后,在把保存的值选入(既使是NULL也无所谓,因为它跟本没意义;而第二次选入时,返回值,一定是第一次被你选入的位图指针),最后再Destroy掉你创建的位图。
江王 2000-05-30
  • 打赏
  • 举报
回复
你用的是内存设备上下文,而此种上下文的初始状态是位图为黑白双色的。因此尽量不要在CreateCompatibleBitmap()函数中的参数中用内存设备上下文,除非它已经选入了一个彩色的位图,否则,哼哼,不生成一张黑白分明的"麻花脸"才怪呢。
yueyue 2000-05-30
  • 打赏
  • 举报
回复
用CreateDC()就不行吗?为何非要换呢,而且两者好像作用一样(猜的),现在我的机子
不好用,没法试.
现特声明如下:
1.这部分代码放在CDocument里.
2.我想强调的是CreateBitmapIndirect();
坎坷的菜贩 2000-05-30
  • 打赏
  • 举报
回复
将CreateCompatibleBitmap的DC参数换掉试试看,如GetDC(hWnd)等。
Kenny 2000-05-30
  • 打赏
  • 举报
回复
对不起,是我原来的理解有问题,又看一遍返回值的说明,才知是出现错误。谢谢,希望早日调试成功。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧