一种MFC下OPENGL的绘图框架(1)

工程名以XXX为例:

1.     给VS配置OpenGL的dll/lib/h等,这里略。

2.     在stdafx.h中添加

//包含 OpenGL 头文件

#include<GL/gl.h>
#include<GL/glu.h>
#include<GL/glaux.h>
#include<GL/glut.h>


3.     设置项目-项目名-属性-常规-字符集:使用多字节字符集


4.     对CXXXView添加WM_CREATE、WM_DESTROY、WM_SIZE的消息响应函数,暂时不编辑代码。

5.     在CXXXView.h中添加:

public:

HGLRC  m_hGLRC;  //OpenGL 绘制描述表 

CDC*  m_pDC;   //OpenGL 设备描述表 

HPALETTE m_hPalette;  //OpenGL 调色板

protected:

BOOL RenderScene(void);    

BOOL SetupPixelFormat(void); 

void SetLogicalPalette(void);

6.   在CXXXView.cpp

public:

HGLRC  m_hGLRC;  //OpenGL 绘制描述表 

CDC*  m_pDC;   //OpenGL 设备描述表 

HPALETTE m_hPalette;  //OpenGL 调色板

protected:

BOOL RenderScene(void);    

BOOL SetupPixelFormat(void); 

void SetLogicalPalette(void);

7. 编辑响应函数代码

Oncreate()内添加:

//初始化 OpenGL 

   m_pDC = newCClientDC(this); 

   if(!SetupPixelFormat())  

       return -1; 

   m_hGLRC =wglCreateContext(m_pDC->GetSafeHdc());

   wglMakeCurrent(m_pDC->GetSafeHdc(),m_hGLRC);

    return 0;

 

   Onsize()内添加:

//添加窗口缩放是的视口变换 

   glViewport(0,0,cx,cy);

OnDestroy()内添加:

             

//删除调色板、渲染上下文 

        ::wglMakeCurrent(NULL,NULL); 

        ::wglDeleteContext(m_hGLRC); 

        if(m_hPalette)  

            DeleteObject(m_hPalette); 

        if(m_pDC)  

       delete m_pDC;

 

8. 添加pfd设置。

在CXXXView.cpp中添加:

BOOLCXXXView::SetupPixelFormat(void) {

    PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR),    // pfd 结构的大小      

        1,                                // 版本号      

        PFD_DRAW_TO_WINDOW |              // 支持在窗口中绘图      

        PFD_SUPPORT_OPENGL |              // 支持 OpenGL      

        PFD_DOUBLEBUFFER,                 // 双缓存模式      

        PFD_TYPE_RGBA,                    // RGBA 颜色模式      

        24,                               // 24 位颜色深度      

        0,0, 0, 0, 0, 0,                 // 忽略颜色位      

        0,                                // 没有非透明度缓存      

        0,                                // 忽略移位位      

        0,                                // 无累加缓存      

        0,0, 0, 0,                       // 忽略累加位      

        32,                               // 32 位深度缓存          

        0,                                // 无模板缓存      

        0,                                // 无辅助缓存      

        PFD_MAIN_PLANE,                   // 主层      

        0,                                // 保留      

        0,0, 0                           // 忽略层,可见性和损毁掩模  

    };   

    int iPixelFormat;  // 为设备描述表得到匹配的像素格式  

    if((iPixelFormat =ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0) 

    {

        MessageBox("ChoosePixelFormat Failed", NULL, MB_OK);  

        returnFALSE;

    }     // 设置匹配的像素格式为当前的像素格式  

    if(SetPixelFormat(m_pDC->GetSafeHdc(),iPixelFormat, &pfd) == FALSE) 

    {  

        MessageBox("SetPixelFormat Failed", NULL, MB_OK);  

        returnFALSE; 

    } 

    if(pfd.dwFlags & PFD_NEED_PALETTE)  

        SetLogicalPalette();//设置逻辑调色板

 

    returnTRUE;

}

 

voidCXXXView::SetLogicalPalette(void) {

    struct { WORD Version;        

    WORDNumberOfEntries;        

    PALETTEENTRY aEntries[256]; }

    logicalPalette= { 0x300, 256 };

 

    BYTE reds[] = { 0, 36,72, 109, 145, 182, 218, 255 }; 

    BYTE greens[] = { 0, 36,72, 109, 145, 182, 218, 255 }; 

    BYTE blues[] = { 0, 85,170, 255 };

 

    for (int colorNum = 0;colorNum<256; ++colorNum)

    {

        logicalPalette.aEntries[colorNum].peRed= reds[colorNum & 0x07];        

        logicalPalette.aEntries[colorNum].peGreen= greens[(colorNum >> 0x03) & 0x07];        

        logicalPalette.aEntries[colorNum].peBlue= blues[(colorNum >> 0x06) & 0x03];        

        logicalPalette.aEntries[colorNum].peFlags= 0;

    }

 

    m_hPalette= CreatePalette((LOGPALETTE*)&logicalPalette);

}

按如上步骤框架搭建完后,应该能成功运行一个空白的程序。证明代码没错。

之后想要绘图,在自己建立的RenderScene函数中按顺序写绘图函数即可。


可能出现的问题:

XX模块对于SAFESEH 映像是不安全的。

解决方法:

1.打开该项目的“属性页”对话框。

2.单击“链接器”文件夹。

3.单击“命令行”属性页。

4.将 /SAFESEH:NO 键入“其他选项”框中,然后点击应用。

参考自https://blog.csdn.net/m0_37876745/article/details/78150209


猜你喜欢

转载自blog.csdn.net/sickbaimu/article/details/80643494