大家好,我正在在做mfc wince应用程序,需要在界面上贴图,在帖图的时候碰见一个难题,还想请大家解答一下。
本来我用的是网上用得非常多的一种贴图方式,这种方式贴图的代码等下会列出来,请大家指教。用这种方式贴图还是比较好的,不用添加什么库文件,只要给程序包含几个头文件,再添加上几一些代码就是了。贴图的方式如下:
IImage* pImage = NULL;
IImagingFactory* pImagingFactory = NULL;
//初始化COM环境
if(FAILED(hr = CoInitializeEx(NULL,COINIT_MULTITHREADED)))
{
TRACE(L"COINT_MULTITHREADED ERROR");
return TRUE;
}
//创建ImagingFactory接口对象
hr = CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void**)&pImagingFactory);
if(FAILED(hr))
{
TRACE(L"IMAGE FACTORY CREATED ERROR");
goto finish;
}
hr = pImagingFactory->CreateImageFromFile(szFileName,&pImage);
if(FAILED(hr))
{
TRACE(L"IMAGE LOAD ERROR");
goto finish;
}
CDC* pDC = GetDC();
RECT rect;
rect.top = 0;
rect.left = 0;
rect.bottom = 287;
rect.right = 467;
mapDC.CreateCompatibleDC(pDC);
m_bmp.CreateCompatibleBitmap(pDC,467,287);
mapDC.SelectObject(m_bmp);
pImage->Draw(mapDC.m_hDC,&rect,NULL);
这种方法恐怕做过winCE模拟器上贴图的都知道。可以帖png、jpg图片。
但是这种方法贴图却有一个很大的问题。当我在帖本地(而非从网上下载下来的)png图的时候,有时候会出现图片失真的情况,本来好好的一张图,在界面上展示的时候就是乱七八糟的。
然后我就又从网上找到了另外一种帖图的方法。是一个叫做CoImageDll的工程,里面含有一些库文件,还有好几个源代码文件,但是供帖图的人调用的代码接口比较简单。只有下面这七个:
//外部调用使用以下7个接口
//获取图像宽度
int GetWidth();
//获取图像高度
int GetHeight();
//从文件中加载PNG
//dwFlag = 0: 24 or 32 PNG
//dwFlag = 1: 16PNG
BOOL LoadImageFile(const TCHAR * filename, int dwFlag = 0);
//从资源中加载PNG
//wID 资源ID
BOOL LoadImageResource(HMODULE hMod, WORD wID);
//释放位图资源
void FreeImage();
//图片是否有效
BOOL IsVaild();
//绘制Image到指定DC上
BOOL DrawImage(HDC hdc, int nXDest, int nYDest, int nWidth, int nHeight, int nXSr0, int nYSrc, int iAlpha = 255, int iFlag = 0);
可能你们也在网上用到过,不管怎样,我个人还是觉得这种贴图的方式要好一些吧。我加上一些库文件,调用给外部程序提供的这几个接口,显示出图片来是没有什么问题的,我调用时写的代码是这样的:
CosImage pngImage;
pngImage.LoadImageFile(mapPath, 0);
if (pngImage.IsVaild())
{
//获取图像宽度
int width = pngImage.GetWidth();
//获取图像高度
int height = pngImage.GetHeight();
CBitmap m_bmp;
CDC mapDC;
CDC* pDC = (CDC*)GetDC();
RECT rect;
rect.top = 0;
rect.left = 0;
rect.bottom = height;
rect.right = width;//427X280
mapDC.CreateCompatibleDC(pDC);
m_bmp.CreateCompatibleBitmap(pDC,width,height);
mapDC.SelectObject(m_bmp);
pngImage.DrawImage(mapDC.GetSafeHdc(), 0, 0, width, height, 0, 0, 255, 0);
memDC.StretchBlt(206-5,95,width,height,&mapDC,0,0,width,height,SRCCOPY);
pDC->BitBlt(0,0,800,480,&memDC,0,0,SRCCOPY);
pngImage.FreeImage();
ReleaseDC(pDC);
mapDC.DeleteDC();
m_bmp.DeleteObject();
}
第一次运行的时候是没有什么问题的,但是在第二运行时,就会出现这样一个错误:
应用程序ConManClient2.exe出现严重错误,必须被关闭。
但是编译是没有问题的。这个问题我弄不了,真的是不晓得怎么办了,请大家帮帮我呀,我在网上也找到过一些mfc贴图的程序,但是有好多是不能用的,能用的也就是只有这一个了。
请大家看下能不能帮我解决下这个问题,或者给我提供另外一个方法也是可以的,谢谢啦!
------解决方案--------------------
你贴的第一段程序是通过IImage组件接口来完成绘图的。
只要系统具备JPG,PNG等图片的解码器组件,这段代码就可以用。
第二种方式,“CoImageDll”
从名字上看,我觉得它内部也是调用IImage接口来完成绘图工作的。
只不过又加了一层封装。
这两种方法的实质都是一样的。问题最大可能还是出在你的调用方式上。
代码太长了,没有那么多时间去看。
建议楼主好好看看,有没有内存泄露,野指针等问题。
该释放的COM对象有没有释放,该delete的指针有没有删除并置NULL。
多单步调试一下。
对于使用IImage接口进行绘图,建议楼主用一下雨兄的CImager。
------解决方案--------------------
估计是你第二次的时候是因为初始化组件的问题
------解决方案--------------------
楼主你需要贴什么格式的图啊?
我也在做mfc wince应用程序,现在只实现了BMP格式的贴图,但是图片太大,刷图慢。
现在也在找别的方法贴图,楼主的问题有没有解决啊?