读书人

怎样从一幅图片分割出若干位图作为几

发布时间: 2012-04-13 13:50:24 作者: rapoo

怎样从一幅图片分割出若干位图,作为几个按钮的贴图?
如题。

[解决办法]
在VC中显示位图常用取BitBlt()方法,它是将一幅位图从一个设备场景复制到另一个。源和目标DC相互间必须兼容。
虽然此方法的功能是这样的,但是我一直没有理解网上一些例子代码,不知道其用到的各DC和位图如何得到,及它们之间的关系。
今天工作中要将一些位图显示到窗口中,所以重要学习了一下。
我已经将要用的位图导入到工程资源中,所以我可以用:
CBitmap cbmp;
cbmp.LoadBitmap(IDB_BMP1);
这样得到一个CBitmap对象。
然后:
BITMAP bitmap;
cbmp.GetBitmap(&bitmap);
这样得到一个BITMAP对象,之所以要得到此对象是因为从其中可以得到位图的大小数据。
然后计算得到要在什么位置显示此位图(可以放在一个CRect rect;对象中)。

然后显示此位图,这是最重要的一步:
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
hOldBitmap = dcMemory.SelectObject(&cbmp);
pDC->BitBlt(rect.left,
rect.top,
bitmap.bmWidth,
bitmap.bmHeight,
&dcMemory,
0,0,
SRCCOPY);
其中pDC是一个CDC*,是将要在其中显示位图的设备环境。

这样位图就已经显示出来了,但是还要释放资源:
cbmp.DeleteObject();
dcMemory.SelectObject(hOldBitmap);
dcMemory.DeleteDC();
其中,要将临时设备环境选择入初始时位图,否则将不能正确释放!!

总结:
要在一个设备环境中显示位图,不能直接在上面“画”(目前我是我么觉得的),需要创建一个与之相兼容的新设备环境然后将位图选择入些新设备环境,然后再从些新设备环境中拷备位图以显示到正确的设备环境中。而选入这个动作相当与已经将位图“画在了临时设备环境中”(实际上并没有画,否则就可以直接选入要画图的CDC了),而且选入后位图在临时设备环境中的位置是左上角!
[解决办法]
最笨的方法是自己贴图!
[解决办法]
一般用imagelist。

[解决办法]
CImageList类
[解决办法]
楼主其实不用截取.这个其实只是将整张bmp,load到内存之后通过bitblt更改参数得到显示而已,并不是进行了切分.
因为位图存在于内存中所以其他的贴图操作不会再次load位图.

你只需要这样

BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );

将CDC* pSrcDC中的位图作为整张的位图加载 调整 int xSrc, int ySrc 参数到合适的位置,调整3,4参数约束显示范围即可
[解决办法]
CButtonST中的透明按钮。
[解决办法]
win+r 键入mspaint ctrl+e 看见两个框 往里填数 可以求出左上角的图,将原图ctrl+r适当旋转,再ctrl+e、填数,如此反复,任你分成几乘几,都可以切出来

读书人网 >VC/MFC

热点推荐