vc6中MFC对话框下使用OpenGL显示的内容不正确

b362878179 2013-07-13 08:28:38

我在我编写的对话框上想加入一个picture控件,里面调用OpenGl来显示一些图像,这是加在一个线程下面的,其结果完全是乱的。
另外我还用一个小程序测试了下,发现用计时器触发就有效
OnTimer()
{
Draw();
SwapBuffer(hdc);
}(代码忘记带回来了,意会)


但是在线程下
ShowThread()
{
while(1)
{
Draw();
SwapBuffer(hdc);
}
}
出现的就是乱七八糟的东西,貌似这个Draw()根本就没有执行,只是两幅图在哪里交替,而且连别的程序中出现的图片都会贴出来。
实验室不能上网提问,回来提问又忘了带代码,只能意会了,求大神解答
...全文
178 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
b362878179 2013-07-15
  • 打赏
  • 举报
回复
感谢各位大神的悉心指导,我已经找到解决方法了。 是因为OpenGL的RC不能同时被两个线程占用,当主线程使用wglMakeContext(hdc,hrc)时就占用了rc,必须在主线程使用完后调用wglMakeContext(NULL,NULL),来消除连接,再在子线程中使用wglMakeContext(hdc,hrc),才能正常绘图。大致就是这样,谢谢各位,希望对持有同样问题的朋友有所帮助
b362878179 2013-07-15
  • 打赏
  • 举报
回复
引用 9 楼 schlafenhamster 的回复:
picture 控件的 那个 hdc 要 用 临界区 锁住
你的意思是这样吗? UINT ShowThread(LPVOID pParam) { COpenGLDlg *pDlg = (COpenGLDlg *)pParam; EnterCriticalSection(§ion); while (1) { RenderScene(); SwapBuffers(hrenderDC); Sleep(1000); } LeaveCriticalSection(§ion); } 依旧无效啊,还是乱七八糟的图像
b362878179 2013-07-15
  • 打赏
  • 举报
回复
引用 9 楼 schlafenhamster 的回复:
picture 控件的 那个 hdc 要 用 临界区 锁住
之前的代码贴的有问题,重新粘,之前的能帮删掉吗
// OpenGLDlg.cpp : implementation file 
// 

#include "stdafx.h" 
#include "OpenGL.h" 
#include "OpenGLDlg.h" 


#include <gl\gl.h> 
#include <gl\glu.h> 
#include <gl\glaux.h> 
	BOOL SetWindowPixelFormat(HDC hDC);   //设定象素格式 
	BOOL CreateViewGLContext(HDC hDC);     //View GL Context 
	int RenderScene();                                //绘制场景 
	
	HDC hrenderDC;      //DC 
	HGLRC hrenderRC;    //RC 
	float m_yRotate;    //转速 
	
	int PixelFormat; 
CRITICAL_SECTION Section;

#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 

///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 

class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
	
	
	// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	//}}AFX_DATA 
	
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
	
	// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
	
	
	
} 

void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
//{{AFX_MSG_MAP(CAboutDlg) 
// No message handlers 
//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 

///////////////////////////////////////////////////////////////////////////// 
// COpenGLDlg dialog 

COpenGLDlg::COpenGLDlg(CWnd* pParent /*=NULL*/) 
: CDialog(COpenGLDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(COpenGLDlg) 
	// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	
	PixelFormat=0; 
	m_yRotate = 0; 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 

void COpenGLDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(COpenGLDlg) 
	// NOTE: the ClassWizard will add DDX and DDV calls here 
	//}}AFX_DATA_MAP 
} 

BEGIN_MESSAGE_MAP(COpenGLDlg, CDialog) 
//{{AFX_MSG_MAP(COpenGLDlg) 
ON_WM_SYSCOMMAND() 
ON_WM_PAINT() 
ON_WM_QUERYDRAGICON() 
ON_WM_TIMER() 
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP() 

///////////////////////////////////////////////////////////////////////////// 
// COpenGLDlg message handlers 

BOOL COpenGLDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
	
	// Add "About..." menu item to system menu. 
	
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
	
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
	
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application’s main window is not a dialog 
	SetIcon(m_hIcon, TRUE);   // Set big icon 
	SetIcon(m_hIcon, FALSE);  // Set small icon 

	///////////////////////OPENGL INIT///////////////////////// 
	CWnd *wnd=GetDlgItem(IDC_RENDER); 
    hrenderDC=::GetDC(wnd->m_hWnd); 
	if(SetWindowPixelFormat(hrenderDC)==FALSE) 
		return 0; 
	
	if(CreateViewGLContext(hrenderDC)==FALSE) 
		return 0; 
	glPolygonMode(GL_FRONT,GL_FILL); 
	glPolygonMode(GL_BACK,GL_FILL); 
	/////////////////////////////////////////// 
	
	
	
	glEnable(GL_TEXTURE_2D); 
	glShadeModel(GL_SMOOTH); 
	glViewport(0,0,259,231); 
	glMatrixMode(GL_PROJECTION); 
	glLoadIdentity(); 
	gluPerspective(45,1,0.1,100.0); 
	glMatrixMode(GL_MODELVIEW); 
	glLoadIdentity(); 
	glShadeModel(GL_SMOOTH);       // Enable Smooth Shading 
	glClearColor(0.0f, 0.070588f, 0.152941f, 0.5f);    // Black Background 
	glClearDepth(1.0f);         // Depth Buffer Setup 
	glEnable(GL_DEPTH_TEST);       // Enables Depth Testing 
	glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do 
	///////////////////////////////////////////////////////////////////////// 
	glEnableClientState(GL_VERTEX_ARRAY); 
	glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
	
	InitializeCriticalSection(§ion);

//	SetTimer(1,10,0); 
//	Draw();
	//////////////////////////////////////////////////////////////// 
	
	// TODO: Add extra initialization here 
	
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 

void COpenGLDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 

// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 

void COpenGLDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
		
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
		
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
		
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 

// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR COpenGLDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 



BOOL SetWindowPixelFormat(HDC hDC) 
{ 
	PIXELFORMATDESCRIPTOR pixelDesc; 
	
	pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR); 
	pixelDesc.nVersion = 1; 
	
	pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |  
		PFD_SUPPORT_OPENGL | 
		PFD_DOUBLEBUFFER | 
		PFD_TYPE_RGBA; 
	
	pixelDesc.iPixelType = PFD_TYPE_RGBA; 
	pixelDesc.cColorBits = 32; 
	pixelDesc.cRedBits = 0; 
	pixelDesc.cRedShift = 0; 
	pixelDesc.cGreenBits = 0; 
	pixelDesc.cGreenShift = 0; 
	pixelDesc.cBlueBits = 0; 
	pixelDesc.cBlueShift = 0; 
	pixelDesc.cAlphaBits = 0; 
	pixelDesc.cAlphaShift = 0; 
	pixelDesc.cAccumBits = 0; 
	pixelDesc.cAccumRedBits = 0; 
	pixelDesc.cAccumGreenBits = 0; 
	pixelDesc.cAccumBlueBits = 0; 
	pixelDesc.cAccumAlphaBits = 0; 
	pixelDesc.cDepthBits = 0; 
	pixelDesc.cStencilBits = 1; 
	pixelDesc.cAuxBuffers = 0; 
	pixelDesc.iLayerType = PFD_MAIN_PLANE; 
	pixelDesc.bReserved = 0; 
	pixelDesc.dwLayerMask = 0; 
	pixelDesc.dwVisibleMask = 0; 
	pixelDesc.dwDamageMask = 0; 
	
	PixelFormat = ChoosePixelFormat(hDC,&pixelDesc); 
	if(PixelFormat==0) // Choose default 
	{ 
		PixelFormat = 1; 
		if(DescribePixelFormat(hDC,PixelFormat, 
			sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0) 
		{ 
			return FALSE; 
		} 
	} 
	
	if(SetPixelFormat(hDC,PixelFormat,&pixelDesc)==FALSE) 
		
	{  
		return FALSE; 
	} 
	
	return TRUE; 
} 


BOOL CreateViewGLContext(HDC hDC) 
{ 
	hrenderRC = wglCreateContext(hDC); 
	
	if(hrenderRC==NULL) 
		return FALSE; 
	
	if(wglMakeCurrent(hDC,hrenderRC)==FALSE) 
		return FALSE; 
	
	
	
	return TRUE; 
} 

int RenderScene()    
{ 
	
	
	///////////////////////////////////////////////// 
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
	
	
	glLoadIdentity(); 
	glTranslatef(0.0f,0.0f,-6.0f);      // Move Left 1.5 Units And Into The Screen 6.0 
	glRotated(m_yRotate, 0.0, 1.0, 0.0); 
	glBegin(GL_TRIANGLES); // Drawing Using Triangles 
	
	glVertex3f( 0.0f, 1.0f, 0.0f);     // Top 
	glVertex3f(-1.0f,-1.0f, 0.0f);     // Bottom Left 
	glVertex3f( 1.0f,-1.0f, 0.0f);     // Bottom Right 
	glEnd();           // Finished Drawing The Triangle 
	m_yRotate+=3; 
	return TRUE;
} 

void COpenGLDlg::OnTimer(UINT nIDEvent) //实时绘制场景 
{ 
	// TODO: Add your message handler code here and/or call default 
	RenderScene(); 
	m_yRotate +=3; 
	CDialog::OnTimer(nIDEvent); 
} 

void COpenGLDlg::Draw() //实时绘制场景 

{
	RenderScene(); 
}
UINT ShowThread(LPVOID pParam)
{
    COpenGLDlg *pDlg = (COpenGLDlg *)pParam; 
	EnterCriticalSection(§ion);
	while (1)
	{
		RenderScene();
		SwapBuffers(hrenderDC);
		Sleep(1000);
	}
	LeaveCriticalSection(§ion);
}
void COpenGLDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	AfxBeginThread(ShowThread,this);
//			RenderScene(); 
// 		SwapBuffers(hrenderDC);
}



// OpenGLDlg.h : header file 
// 

#if !defined(AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDED_) 
#define AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDED_ 

#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 

///////////////////////////////////////////////////////////////////////////// 
// COpenGLDlg dialog 

class COpenGLDlg : public CDialog 
{ 
	// Construction 
public: 
	COpenGLDlg(CWnd* pParent = NULL); // standard constructor 
	// Dialog Data 
	//{{AFX_DATA(COpenGLDlg) 
	enum { IDD = IDD_OPENGL_DIALOG }; 
	// NOTE: the ClassWizard will add data members here 
	//}}AFX_DATA 
	
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(COpenGLDlg) 
protected: 
	virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 
	//}}AFX_VIRTUAL 
	
	// Implementation 
protected: 
	HICON m_hIcon; 
	void Draw();
	// Generated message map functions 
	//{{AFX_MSG(COpenGLDlg) 
	virtual BOOL OnInitDialog(); 
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam); 
	afx_msg void OnPaint(); 
	afx_msg HCURSOR OnQueryDragIcon(); 
	afx_msg void OnTimer(UINT nIDEvent); 
	afx_msg void OnButton1();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP() 
}; 

//{{AFX_INSERT_LOCATION}} 
// Microsoft Visual C++ will insert additional declarations immediately before the previous line. 

#endif // !defined(AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDED_) 

b362878179 2013-07-13
  • 打赏
  • 举报
回复
补充一下 基于MFC的对话框Dialog的OpenGL程序框架 建立一个基于对话框的工程(名称:OpenGL) 并且在设置的Link里加入库opengl32.lib glu32.lib glaux.lib 为对话框添加picture control 控件,ID:IDC_RENDER 建立一个button1
b362878179 2013-07-13
  • 打赏
  • 举报
回复
程序大致就是下面这样,放在线程里就不好使,就是两幅图在互换,求指点
// OpenGLDlg.cpp : implementation file 
// 

#include "stdafx.h" 
#include "OpenGL.h" 
#include "OpenGLDlg.h" 


#include <gl\gl.h> 
#include <gl\glu.h> 
#include <gl\glaux.h> 


#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 

///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 

class CAboutDlg : public CDialog 
{ 
public: 
 CAboutDlg(); 

  
// Dialog Data 
 //{{AFX_DATA(CAboutDlg) 
 enum { IDD = IDD_ABOUTBOX }; 
 //}}AFX_DATA 

 // ClassWizard generated virtual function overrides 
 //{{AFX_VIRTUAL(CAboutDlg) 
 protected: 
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
 //}}AFX_VIRTUAL 

// Implementation 
protected: 
 //{{AFX_MSG(CAboutDlg) 
 //}}AFX_MSG 
 DECLARE_MESSAGE_MAP() 
}; 

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
 //{{AFX_DATA_INIT(CAboutDlg) 
 //}}AFX_DATA_INIT 

  

} 

void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
 CDialog::DoDataExchange(pDX); 
 //{{AFX_DATA_MAP(CAboutDlg) 
 //}}AFX_DATA_MAP 
} 

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
 //{{AFX_MSG_MAP(CAboutDlg) 
  // No message handlers 
 //}}AFX_MSG_MAP 
END_MESSAGE_MAP() 

///////////////////////////////////////////////////////////////////////////// 
// COpenGLDlg dialog 

COpenGLDlg::COpenGLDlg(CWnd* pParent /*=NULL*/) 
 : CDialog(COpenGLDlg::IDD, pParent) 
{ 
 //{{AFX_DATA_INIT(COpenGLDlg) 
  // NOTE: the ClassWizard will add member initialization here 
 //}}AFX_DATA_INIT 
 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 

  PixelFormat=0; 
     m_yRotate = 0; 
 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 

void COpenGLDlg::DoDataExchange(CDataExchange* pDX) 
{ 
 CDialog::DoDataExchange(pDX); 
 //{{AFX_DATA_MAP(COpenGLDlg) 
  // NOTE: the ClassWizard will add DDX and DDV calls here 
 //}}AFX_DATA_MAP 
} 

BEGIN_MESSAGE_MAP(COpenGLDlg, CDialog) 
 //{{AFX_MSG_MAP(COpenGLDlg) 
 ON_WM_SYSCOMMAND() 
 ON_WM_PAINT() 
 ON_WM_QUERYDRAGICON() 
 ON_WM_TIMER() 
 //}}AFX_MSG_MAP 
END_MESSAGE_MAP() 

///////////////////////////////////////////////////////////////////////////// 
// COpenGLDlg message handlers 

BOOL COpenGLDlg::OnInitDialog() 
{ 
 CDialog::OnInitDialog(); 

 // Add "About..." menu item to system menu. 

 // IDM_ABOUTBOX must be in the system command range. 
 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
 ASSERT(IDM_ABOUTBOX < 0xF000); 

 CMenu* pSysMenu = GetSystemMenu(FALSE); 
 if (pSysMenu != NULL) 
 { 
  CString strAboutMenu; 
  strAboutMenu.LoadString(IDS_ABOUTBOX); 
  if (!strAboutMenu.IsEmpty()) 
  { 
   pSysMenu->AppendMenu(MF_SEPARATOR); 
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
  } 
 } 

 // Set the icon for this dialog.  The framework does this automatically 
 //  when the application’s main window is not a dialog 
 SetIcon(m_hIcon, TRUE);   // Set big icon 
 SetIcon(m_hIcon, FALSE);  // Set small icon 
  
///////////////////////OPENGL INIT///////////////////////// 
  CWnd *wnd=GetDlgItem(IDC_RENDER); 
    hrenderDC=::GetDC(wnd->m_hWnd); 
 if(SetWindowPixelFormat(hrenderDC)==FALSE) 
  return 0; 
  
 if(CreateViewGLContext(hrenderDC)==FALSE) 
  return 0; 
 glPolygonMode(GL_FRONT,GL_FILL); 
 glPolygonMode(GL_BACK,GL_FILL); 
/////////////////////////////////////////// 

  

 glEnable(GL_TEXTURE_2D); 
 glShadeModel(GL_SMOOTH); 
 glViewport(0,0,259,231); 
 glMatrixMode(GL_PROJECTION); 
 glLoadIdentity(); 
 gluPerspective(45,1,0.1,100.0); 
 glMatrixMode(GL_MODELVIEW); 
 glLoadIdentity(); 
 glShadeModel(GL_SMOOTH);       // Enable Smooth Shading 
 glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    // Black Background 
 glClearDepth(1.0f);         // Depth Buffer Setup 
 glEnable(GL_DEPTH_TEST);       // Enables Depth Testing 
 glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do 
 ///////////////////////////////////////////////////////////////////////// 
 glEnableClientState(GL_VERTEX_ARRAY); 
 glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

 SetTimer(1,10,0); 

//////////////////////////////////////////////////////////////// 

 // TODO: Add extra initialization here 
  
 return TRUE;  // return TRUE  unless you set the focus to a control 
} 

void COpenGLDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
 if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
 { 
  CAboutDlg dlgAbout; 
  dlgAbout.DoModal(); 
 } 
 else 
 { 
  CDialog::OnSysCommand(nID, lParam); 
 } 
} 

// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 

void COpenGLDlg::OnPaint()  
{ 
 if (IsIconic()) 
 { 
  CPaintDC dc(this); // device context for painting 

  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 

  // Center icon in client rectangle 
  int cxIcon = GetSystemMetrics(SM_CXICON); 
  int cyIcon = GetSystemMetrics(SM_CYICON); 
  CRect rect; 
  GetClientRect(&rect); 
  int x = (rect.Width() - cxIcon + 1) / 2; 
  int y = (rect.Height() - cyIcon + 1) / 2; 

  // Draw the icon 
  dc.DrawIcon(x, y, m_hIcon); 
 } 
 else 
 { 
  CDialog::OnPaint(); 
 } 
} 

// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR COpenGLDlg::OnQueryDragIcon() 
{ 
 return (HCURSOR) m_hIcon; 
} 

  

BOOL COpenGLDlg::SetWindowPixelFormat(HDC hDC) 
{ 
PIXELFORMATDESCRIPTOR pixelDesc; 

pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR); 
pixelDesc.nVersion = 1; 

pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |  
     PFD_SUPPORT_OPENGL | 
     PFD_DOUBLEBUFFER | 
     PFD_TYPE_RGBA; 

pixelDesc.iPixelType = PFD_TYPE_RGBA; 
pixelDesc.cColorBits = 32; 
pixelDesc.cRedBits = 0; 
pixelDesc.cRedShift = 0; 
pixelDesc.cGreenBits = 0; 
pixelDesc.cGreenShift = 0; 
pixelDesc.cBlueBits = 0; 
pixelDesc.cBlueShift = 0; 
pixelDesc.cAlphaBits = 0; 
pixelDesc.cAlphaShift = 0; 
pixelDesc.cAccumBits = 0; 
pixelDesc.cAccumRedBits = 0; 
pixelDesc.cAccumGreenBits = 0; 
pixelDesc.cAccumBlueBits = 0; 
pixelDesc.cAccumAlphaBits = 0; 
pixelDesc.cDepthBits = 0; 
pixelDesc.cStencilBits = 1; 
pixelDesc.cAuxBuffers = 0; 
pixelDesc.iLayerType = PFD_MAIN_PLANE; 
pixelDesc.bReserved = 0; 
pixelDesc.dwLayerMask = 0; 
pixelDesc.dwVisibleMask = 0; 
pixelDesc.dwDamageMask = 0; 

PixelFormat = ChoosePixelFormat(hDC,&pixelDesc); 
if(PixelFormat==0) // Choose default 
{ 
 PixelFormat = 1; 
 if(DescribePixelFormat(hDC,PixelFormat, 
  sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0) 
 { 
  return FALSE; 
 } 
} 

if(SetPixelFormat(hDC,PixelFormat,&pixelDesc)==FALSE) 

{  
 return FALSE; 
} 

return TRUE; 
} 


BOOL COpenGLDlg::CreateViewGLContext(HDC hDC) 
{ 
hrenderRC = wglCreateContext(hDC); 

if(hrenderRC==NULL) 
 return FALSE; 

if(wglMakeCurrent(hDC,hrenderRC)==FALSE) 
 return FALSE; 

  

return TRUE; 
} 

void COpenGLDlg::RenderScene()    
{ 


 ///////////////////////////////////////////////// 
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

  
 glLoadIdentity(); 
 glTranslatef(0.0f,0.0f,-6.0f);      // Move Left 1.5 Units And Into The Screen 6.0 
 glRotated(m_yRotate, 0.0, 1.0, 0.0); 
 glBegin(GL_TRIANGLES); // Drawing Using Triangles 
  
  glVertex3f( 0.0f, 1.0f, 0.0f);     // Top 
  glVertex3f(-1.0f,-1.0f, 0.0f);     // Bottom Left 
  glVertex3f( 1.0f,-1.0f, 0.0f);     // Bottom Right 
 glEnd();           // Finished Drawing The Triangle 
 SwapBuffers(hrenderDC); 
} 

void COpenGLDlg::OnTimer(UINT nIDEvent) //实时绘制场景 
{ 
 // TODO: Add your message handler code here and/or call default 
 RenderScene(); 
 m_yRotate +=3; 
 CDialog::OnTimer(nIDEvent); 
} 


  

// OpenGLDlg.h : header file 
// 

#if !defined(AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDED_) 
#define AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDED_ 

#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 

///////////////////////////////////////////////////////////////////////////// 
// COpenGLDlg dialog 

class COpenGLDlg : public CDialog 
{ 
// Construction 
public: 
 COpenGLDlg(CWnd* pParent = NULL); // standard constructor 


  BOOL SetWindowPixelFormat(HDC hDC);   //设定象素格式 
 BOOL CreateViewGLContext(HDC hDC);     //View GL Context 
    void RenderScene();                                //绘制场景 

 HDC hrenderDC;      //DC 
 HGLRC hrenderRC;  //RC 
 float m_yRotate;       //转速 

 int PixelFormat; 

  

// Dialog Data 
 //{{AFX_DATA(COpenGLDlg) 
 enum { IDD = IDD_OPENGL_DIALOG }; 
  // NOTE: the ClassWizard will add data members here 
 //}}AFX_DATA 

 // ClassWizard generated virtual function overrides 
 //{{AFX_VIRTUAL(COpenGLDlg) 
 protected: 
 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 
 //}}AFX_VIRTUAL 

// Implementation 
protected: 
 HICON m_hIcon; 

 // Generated message map functions 
 //{{AFX_MSG(COpenGLDlg) 
 virtual BOOL OnInitDialog(); 
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam); 
 afx_msg void OnPaint(); 
 afx_msg HCURSOR OnQueryDragIcon(); 
 afx_msg void OnTimer(UINT nIDEvent); 
 afx_msg void OnButton1();
 //}}AFX_MSG 
 DECLARE_MESSAGE_MAP() 
}; 

//{{AFX_INSERT_LOCATION}} 
// Microsoft Visual C++ will insert additional declarations immediately before the previous line. 

#endif // !defined(AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDED_) 

schlafenhamster 2013-07-13
  • 打赏
  • 举报
回复
下载我的“DynViews.zip”0分 http://download.csdn.net/detail/schlafenhamster/4206078 在对话框标签控件中产生OpenGL视图。共有5个不同的gl视图
b362878179 2013-07-13
  • 打赏
  • 举报
回复
引用 3 楼 xianglitian 的回复:
while是循环 而且你这里是永真循环 你确定这样没问题? CPU占用超过90%了吧
这样应该没问题,但关键是这样貌似没有执行draw(),是OPenGL有什么特别的吗
向立天 2013-07-13
  • 打赏
  • 举报
回复
while是循环 而且你这里是永真循环 你确定这样没问题? CPU占用超过90%了吧
b362878179 2013-07-13
  • 打赏
  • 举报
回复
引用 1 楼 xianglitian 的回复:
那就用计时器好了 跨线程操作界面对象本来就是不安全的
这个是一个很大的界面上的一小块,必须要写到一个线程里边去才能做到同步。是不是这个draw()一定要一个消息来触发呢?while(1)算不上是一个消息触发吗?
向立天 2013-07-13
  • 打赏
  • 举报
回复
那就用计时器好了 跨线程操作界面对象本来就是不安全的
schlafenhamster 2013-07-13
  • 打赏
  • 举报
回复
picture 控件的 那个 hdc 要 用 临界区 锁住
向立天 2013-07-13
  • 打赏
  • 举报
回复
引用 4 楼 b362878179 的回复:
[quote=引用 3 楼 xianglitian 的回复:] while是循环 而且你这里是永真循环 你确定这样没问题? CPU占用超过90%了吧
这样应该没问题,但关键是这样貌似没有执行draw(),是OPenGL有什么特别的吗 [/quote] draw有没有执行调试一下不就知道了

16,472

社区成员

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

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

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