- bool CGPSGuidsDlg::InitMap(const WCHAR* fileName)
- {
- IImagingFactory* pImagingFactory;
- IImage* pImage;
- ImageInfo imageInfo;
- HBITMAP hBitmap;
- CDC* hDC = GetDC();
- ASSERT(hDC != NULL);
- HRESULT hr;
- bool rs = false;
-
- if (SUCCEEDED(hr = CoInitializeEx(NULL, COINIT_MULTITHREADED)))
- {
- if (SUCCEEDED(hr = CoCreateInstance(CLSID_ImagingFactory,NULL,
- CLSCTX_INPROC_SERVER,
- IID_IImagingFactory,
- (void**)&pImagingFactory)))
- {
- if (SUCCEEDED(hr = pImagingFactory->CreateImageFromFile(fileName, &pImage)))
- {
- pImage->GetImageInfo(&imageInfo);
- hBitmap = CreateCompatibleBitmap(hDC->GetSafeHdc(), imageInfo.Width, imageInfo.Height); //这里申请了很大内存并没有释放掉...
- /*hDC->DeleteDC()*/
- //DeleteCompatibleBitmap(hBitmap);
- DeleteDC(m_hMemDC);
- m_hMemDC = CreateCompatibleDC(hDC->GetSafeHdc());
- SelectObject(m_hMemDC, hBitmap);
- m_rcMem.left = 0;
- m_rcMem.top = 0;
- m_rcMem.right = imageInfo.Width;
- m_rcMem.bottom = imageInfo.Height;
-
- //draw the img to mem
- pImage->Draw(m_hMemDC, &m_rcMem, NULL);
- //大地图和小地图之间的比例
- m_nImageWidth = imageInfo.Width;
- m_nImageHeight = imageInfo.Height;
- rs = true;
- }
- }
- }
- DeleteObject(&hr);
- DeleteObject(hBitmap);
- DeleteObject(&imageInfo);
- if (pImagingFactory != NULL)
- {
- pImagingFactory->Release();
- pImagingFactory = NULL;
- }
-
- if (pImage != NULL)
- {
- pImage->Release();
- pImage = NULL;
- }
-
- CoUninitialize();
- if (hDC != NULL)
- {
- ReleaseDC(hDC);
- DeleteObject(hDC);
- }
- return rs;
- }
晕 ~
最好自己一步一步调试执行,如果有问题,肯定可以找不出来
这样要是能看出来,要调试器还啥用
那几个指针都关掉了啊。俺等着高手们的解答,顺便学习。
————————————————————————————————————————————————
现阶段连菜鸟都算不上,我就是来顶贴学习的。
引用: 引用 1 楼 zhaoyw_1127 的回复:
晕 ~
最好自己一步一步调试执行,如果有问题,肯定可以找不出来
这样要是能看出来,要调试器还啥用
多了个“不”字
~ ~
SelectObject(m_hMemDC, hBitmap);
选进去了。。没有选出来。。。选出来再删除m_hMemDC
引用: 引用 5 楼 zhengchao109 的回复:
m_hMemDC
? ? 这个需要使用的
选出了么?
Oldbitmap = ( HBITMAP )SelectObject(m_hMemDC, hBitmap);
SelectObject(m_hMemDC, Oldbitmap );
DeleteObject(hBitmap);
SelectObject(m_hMemDC, hBitmap);
这错了,没有SELECT回去
m_hMemDC,就算要用,每次用完总要free下啊
删除了 图片显示不了...
我是用这个来不断地更换读取图片...
把MAP文件打开....看出错的时候的提示信息!
根据PC所指的地址一步一步找!
引用: 引用 12 楼 dthxman 的回复:
m_hMemDC,就算要用,每次用完总要free下啊
CPaintDC dc(this);
HDC hDC;
hDC = dc.GetSafeHdc();
StretchBlt(hDC,
0,
0,
m_nScreenWidth,
m_nScreenHeight,
m_hMemDC,
m_nCurrentPostionX, //m_rcMem.left,
m_nCurrentPostionY,
m_nCurrentDisplayWidth,
m_nCurrentDisplayheight,
SRCCOPY);
m_tc.DrawMainMenu(&dc);
::DeleteDC(hDC);
我在这里用 怎样释放?
引用: 引用 15 楼 zhengchao109 的回复:
引用 12 楼 dthxman 的回复:
m_hMemDC,就算要用,每次用完总要free下啊
CPaintDC dc(this);
HDC hDC;
hDC = dc.GetSafeHdc();
StretchBlt(hDC,
0,
0,
m_nScreenWidth,
m_nScreenHeight,
m_hMemDC,
m_nCurrentPostionX,? ? ? ? //m_rcMem.left,
m_nCurrentPostionY,
m_nCurrentDisplayWidth,
m_nCurrentDisplayheight,
SRCCOPY);
m_tc.DrawMainMenu(&dc);
::DeleteDC(hDC);
我在这里用 怎样释放?
不用着急 释放 记得把图片选出来就好了。。。你退出的时候 记得释放就好了
你的问题主要是由于 你没有把图片Slect出来。。造成的内存泄漏
//选入m_hMemDC
Oldbitmap = ( HBITMAP )SelectObject(m_hMemDC, hBitmap);
//选出m_hMemDC
SelectObject(m_hMemDC, Oldbitmap ); //这里你不选出,每次都会加载进去一张图片。
//删除hBitmap
DeleteObject(hBitmap);