問題描述:我在一個MFC對話框上放置了一個tab control,我對這個tab control進行初始化,定義了兩頁,每個頁面都系結了一個child的對話框,這里暫且定義為對話框1,對話框2,對話框1我要顯示動態影像,對話框2我要顯示資料。對話框1我使用OpenGL進行影像的顯示。
這些都做好后,發現在對話框1和對話框進行切換時,直接就記憶體泄漏。好奇怪的問題。如果我把下文中的m_pDisplay->Create( ****)函式注釋掉,視窗切換就沒任何問題了。
我對對話框1的OpenGL的配置代碼如下:
CRect rect(150,20, 500, 370); //定義繪圖區域的大小
m_pDisplay->Create( NULL,
NULL,
//定義視窗風格
WS_CHILD|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_VISIBLE,
rect,
this,
0);
為了方便顯示我定義了OpenGL類COpenGL,基類是CWH,m_pDisplay就是一個類物件。類的實作方法如下所示。
int COpenGL::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您專用的創建代碼
//設定當前的繪影像素格式
MySetPixelFormat(::GetDC(m_hWnd)); // 設定當前的繪影像素格式
hdc = ::GetDC(m_hWnd); // 獲得繪圖描述表
hglrc = wglCreateContext(hdc); // 創建繪圖描述表
wglMakeCurrent(hdc, hglrc); // 使繪圖描述表為當前呼叫現程的當前繪圖描述表
return 0;
}
int COpenGL::MySetPixelFormat(HDC hdc)
{
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // 資料結構的大小
1, // 版本號
PFD_DRAW_TO_WINDOW | // 視窗繪制支持
PFD_SUPPORT_OPENGL | // OpenGL支持
PFD_DOUBLEBUFFER, // 雙快取支持
PFD_TYPE_RGBA, // GRBA顏色模式
24, // 24位顏色模式
0, 0, 0, 0, 0, 0, // 忽略顏色位
0, // 無Alpha快取
0, // 忽略移位位
0, // 無累積快取
0, 0, 0, 0, // 忽略累加位
32, // 32位深度快取
0, // 無模板快取 0, // no auxiliary buffer 無輔助快取
PFD_MAIN_PLANE, // main layer 主層
0, // reserved 保留
0, 0, 0 // 忽略層、可見性及損毀掩碼
};
int iPixelFormat;
// get the device context's best, available pixel format match
// 選擇匹配像素格式,回傳索引,為設備描述表得到最匹配的像素格式
if((iPixelFormat = ChoosePixelFormat(hdc, &pfd)) == 0)
{
MessageBox(NULL, _T("ChoosePixelFormat Failed"), MB_OK);
return 0;
}
// make that match the device context's current pixel format
// 設定像素格式到設備描述表, 設定最匹配的像素格式為當前的像素格式
if(SetPixelFormat(hdc, iPixelFormat, &pfd) == FALSE)
{
MessageBox(NULL, _T("SetPixelFormat Failed"), MB_OK);
return 0;
}
return 1;
}
void COpenGL::InitDrawArea()
{ glShadeModel (GL_SMOOTH); // Select Smooth Shading
glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Set Perspective Calculations To Most Accurate
quadratic=gluNewQuadric(); // Create A Pointer To The Quadric Object
gluQuadricNormals(quadratic, GLU_SMOOTH); // Create Smooth Normals
gluQuadricTexture(quadratic, GL_TRUE); // Create Texture Coords
glEnable(GL_TEXTURE_2D); // Enable Texture Mapping
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); // Set Texture Max Filter
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); // Set Texture Min Filter
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); // Set The Texture Generation Mode For S To Sphere Mapping
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); // Set The Texture Generation Mode For T To Sphere Mapping
}
BOOL COpenGL::DrawImage(int nWidth, int nHeight, int nChanel, GLubyte* pPixelData)
{
if (nChanel == 1)
{
//該函式的功能是,根據指定的引數,生成一個2D紋理(Texture) //1:R 2:RA 3:RGB 4:RGBA
glTexImage2D(GL_TEXTURE_2D, 0, 1, nWidth, nHeight, 0, GL_RED, GL_UNSIGNED_BYTE, (GLvoid*)pPixelData);
}
else if (nChanel == 3)
{
glTexImage2D(GL_TEXTURE_2D, 0, 3, nWidth, nHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*)pPixelData);
}
else if (nChanel == 2)
{
glTexImage2D(GL_TEXTURE_2D, 0, 2, nWidth, nHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*)pPixelData);
}
else
{
return FALSE;
}
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glBegin(GL_QUADS);
{
glTexCoord2f(0.0f,0.0f); glVertex3f(-1.0f,+1.0f,0.0f);
glTexCoord2f(0.0f,1.0f); glVertex3f(+1.0f,+1.0f,0.0f);
glTexCoord2f(1.0f,1.0f); glVertex3f(+1.0f,-1.0f,0.0f);
glTexCoord2f(1.0f,0.0f); glVertex3f(-1.0f,-1.0f,0.0f);
}
glEnd();
glFlush();
SwapBuffers(hdc);
return TRUE;
}
uj5u.com熱心網友回復:
@微型螞蟻
uj5u.com熱心網友回復:
直接就記憶體泄漏? 什么現象,用什么工具檢測的,記憶體泄漏不是應該在程式結束時才列印泄漏的嗎?如果切換程序中記憶體泄漏最明顯的現象應該只是記憶體增長。
或者說你指的是崩潰?
還有注釋掉Create,你的OpenGL視圖不是也顯示不出來了?
第一次能夠顯示,切換時崩潰應該關注你在切換時做了哪些處理(主要關注是不是Opengl視窗是不是反復呼叫了Create),可能跟你Opengl視圖初始化和繪圖沒什么關系。
uj5u.com熱心網友回復:
我記得MFC是有一個bug的。。。會莫名其妙有檢測出泄漏,但是我當時是因為同時還用了glut庫,估計里面也有初始化視窗的東西所以沖突了吧轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/132515.html
標籤:圖形處理/算法
