Winapi OpenGL在子窗口中运行时隐藏面的去除问题

Winapi OpenGL在子窗口中运行时隐藏面的去除问题,winapi,opengl,3d,Winapi,Opengl,3d,我正在尝试用openGL绘制二次曲面。当使用单个窗口时,我的程序可以正常工作。现在我需要一个控制面板,所以我创建了两个窗口,一个是框架窗口,另一个是OpenGL运行的子窗口。但是当OpenGL在子窗口中运行时,隐藏面移除出现问题,而如果我使用单个窗口,则不存在此问题。我没有更改绘图功能,只是获取子窗口的dc并设置rc。这是代码。感谢帮助 #include <windows.h> //Windows header #include <gl\glut.h>

我正在尝试用openGL绘制二次曲面。当使用单个窗口时,我的程序可以正常工作。现在我需要一个控制面板,所以我创建了两个窗口,一个是框架窗口,另一个是OpenGL运行的子窗口。但是当OpenGL在子窗口中运行时,隐藏面移除出现问题,而如果我使用单个窗口,则不存在此问题。我没有更改绘图功能,只是获取子窗口的dc并设置rc。这是代码。感谢帮助

#include <windows.h> //Windows header
#include <gl\glut.h>                                    //glut
#include <gl\glaux.h>                                   //glaux
#define hID 6310                                        //ID of child window

LRESULT CALLBACK WndProc   (HWND, UINT, WPARAM, LPARAM) ;
LRESULT CALLBACK OpenProc (HWND, UINT, WPARAM, LPARAM) ;

TCHAR       szChildClass[] = TEXT ("OpenGL");     //child window class name
TCHAR       szAppName[] = TEXT ("Frame");         //frame window class name
HWND        hwndopen;                             //child window
handle
HWND        hwnd;                                 //frame window handle
MSG         msg ;                                 //message structure
HDC         hdc = NULL;                           //device context used in child window
HGLRC       hrc = NULL;                           //rendering context
HINSTANCE   hInstance;                            //application instance
GLuint      PixelFormat;                                //pixformat
BOOL        active=TRUE;                           
BOOL        keys[256];
float       rquad[3]={0,0,0};                     //angle of rotate    
// pfd Tells Windows How We Want Things To Be
static  PIXELFORMATDESCRIPTOR pfd={
sizeof(PIXELFORMATDESCRIPTOR),
1,PFD_DRAW_TO_WINDOW|
PFD_SUPPORT_OPENGL|
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,  
16,
0, 0, 0, 0, 0, 0,
0,0,0,0, 0, 0, 0,
16,
0,
0,
PFD_MAIN_PLANE,
0,
0, 0, 0 
};

/* Here I draw a color cube and I draw black line in every  edge
of the cube,the I draw 3 color lines to show x,y,z coordinate
axis*/
int DrawGLScene(void)                                   
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity();                                   
glTranslatef(0.0f,0.0f,-10.0f);                     
glRotatef(rquad[0],1.0f,0.0f,0.0f);                 
glRotatef(rquad[1],0.0f,1.0f,0.0f); 
glRotatef(rquad[2],0.0f,0.0f,1.0f);                 
glBegin(GL_QUADS);                                  
glColor3f(0.0f,1.0f,0.0f);                  
glVertex3f( 1.0f, 1.0f,-1.0f);                  
glVertex3f(-1.0f, 1.0f,-1.0f);                  
glVertex3f(-1.0f, 1.0f, 1.0f);                  
glVertex3f( 1.0f, 1.0f, 1.0f);              
glColor3f(1.0f,0.5f,0.0f);                      
glVertex3f( 1.0f,-1.0f, 1.0f);                  
glVertex3f(-1.0f,-1.0f, 1.0f);                  
glVertex3f(-1.0f,-1.0f,-1.0f);                  
glVertex3f( 1.0f,-1.0f,-1.0f);                  
glColor3f(1.0f,0.0f,0.0f);                      
glVertex3f( 1.0f, 1.0f, 1.0f);                  
glVertex3f(-1.0f, 1.0f, 1.0f);                  
glVertex3f(-1.0f,-1.0f, 1.0f);                  
glVertex3f( 1.0f,-1.0f, 1.0f);                  
glColor3f(1.0f,1.0f,0.0f);                      
glVertex3f( 1.0f,-1.0f,-1.0f);                  
glVertex3f(-1.0f,-1.0f,-1.0f);                  
glVertex3f(-1.0f, 1.0f,-1.0f);                  
glVertex3f( 1.0f, 1.0f,-1.0f);                  
glColor3f(0.0f,0.0f,1.0f);                      
glVertex3f(-1.0f, 1.0f, 1.0f);              
glVertex3f(-1.0f, 1.0f,-1.0f);                  
glVertex3f(-1.0f,-1.0f,-1.0f);                  
glVertex3f(-1.0f,-1.0f, 1.0f);                  
glColor3f(1.0f,0.0f,1.0f);                      
glVertex3f( 1.0f, 1.0f,-1.0f);                  
glVertex3f( 1.0f, 1.0f, 1.0f);                  
glVertex3f( 1.0f,-1.0f, 1.0f);                  
glVertex3f( 1.0f,-1.0f,-1.0f);                  
glEnd();                                            


glBegin(GL_LINES);
glColor3f(1.0f,1.0f,1.0f);
glVertex3f( 1.0f, 1.0f,-1.0f);                  
glVertex3f(-1.0f, 1.0f,-1.0f);                  
glVertex3f(-1.0f, 1.0f,-1.0f);                  
glVertex3f(-1.0f, 1.0f, 1.0f);                  
glVertex3f(-1.0f, 1.0f, 1.0f);                  
glVertex3f( 1.0f, 1.0f, 1.0f);              
glVertex3f( 1.0f, 1.0f,-1.0f);                  
glVertex3f( 1.0f, 1.0f, 1.0f);              
glVertex3f( 1.0f,-1.0f, 1.0f);              
glVertex3f(-1.0f,-1.0f, 1.0f);              
glVertex3f(-1.0f,-1.0f, 1.0f);                  
glVertex3f(-1.0f,-1.0f,-1.0f);                  
glVertex3f(-1.0f,-1.0f,-1.0f);                  
glVertex3f( 1.0f,-1.0f,-1.0f);                  
glVertex3f( 1.0f,-1.0f,-1.0f);                  
glVertex3f( 1.0f,-1.0f, 1.0f);                  
glVertex3f( 1.0f, 1.0f, 1.0f);                  
glVertex3f( 1.0f, -1.0f, 1.0f);             
glVertex3f( -1.0f, 1.0f, 1.0f);             
glVertex3f( -1.0f, -1.0f, 1.0f);                
glVertex3f( -1.0f, 1.0f, -1.0f);                
glVertex3f( -1.0f, -1.0f, -1.0f);               
glVertex3f( 1.0f, 1.0f, -1.0f);             
glVertex3f( 1.0f, -1.0f, -1.0f);                
glEnd();    
glBegin(GL_LINES);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 0.0f, 0.0f, 0.0f);  
glVertex3f( 10.0f, 0.0f, 0.0f);
glColor3f(1.0f,1.0f,0.0f);
glVertex3f( 0.0f, 0.0f, 0.0f);
glVertex3f( 0.0f, 10.0f, 0.0f);
glColor3f(1.0f,0.0f,1.0f);
glVertex3f( 0.0f, 0.0f, 0.0f);
glVertex3f( 0.0f, 0.0f, 10.0f);
glEnd();    
return TRUE;                                        
}


BOOL InitGL(void)                                       //init opengl
{
glShadeModel(GL_SMOOTH);                            // Enable Smooth Shading
glClearColor(1.0f,0.0f,1.0f,0.5f);
   glClearDepth(1.0f);                              glEnable(GL_DEPTH_TEST);                            glDepthFunc(GL_LEQUAL);                         glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
   return TRUE;
}

// resize the opengl scene in child window
void ReSizeGLScene(int width, int height)
{
 if (height==0)   //avoid zero to be the divisor 
                            {
    height=1;
}
glViewport(0,0,(int)width,(int)height);         
glMatrixMode(GL_PROJECTION);                        
glLoadIdentity();                                   
gluPerspective(45.0f,(float)width/(float)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);                         
glLoadIdentity();                               
}



int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                PSTR szCmdLine, int iCmdShow)
{


WNDCLASS     wndclass ;
BOOL         flag=TRUE;
hInstance    = GetModuleHandle(NULL);
InitGL();

wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc   = WndProc ;
wndclass.cbClsExtra    = 0 ;
wndclass.cbWndExtra    = 0 ;
wndclass.hInstance     = hInstance ;
wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
wndclass.lpszMenuName  = NULL ;
wndclass.lpszClassName = szAppName ;

if (!RegisterClass(&wndclass))                                  
{
MessageBox(NULL,"窗口类注册失败","演示程序 ",MB_OK|MB_ICONINFORMATION);
    return 0;
}
wndclass.lpfnWndProc   = OpenProc ;
wndclass.cbWndExtra    = sizeof (long) ;
wndclass.hIcon         = NULL ;
wndclass.hbrBackground = NULL;
wndclass.lpszClassName = szChildClass ;

if (!RegisterClass(&wndclass))                                  
{
    MessageBox(NULL,"子窗口类注册失败","演示程序",MB_OK|MB_ICONINFORMATION);
    return 0;
}

if(!(hwnd = CreateWindow (szAppName, TEXT ("Frisa"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT,
    NULL, NULL, hInstance, NULL)))
{
    MessageBox(NULL,"窗口创建失败","演示程序",MB_OK|MB_ICONINFORMATION);
    return FALSE;                           
}

ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;

while (flag)
{
    if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    {
        if (msg.message==WM_QUIT)           
        {
            if (!UnregisterClass(szChildClass,hInstance))           
            {
                MessageBox(NULL,"子窗口类注销失败","演示程序",MB_OK | MB_ICONINFORMATION);
                hInstance=NULL;                                 
            }

            if (!UnregisterClass(szAppName,hInstance))          
            {
                MessageBox(NULL,"窗口类注销失败","演示程序",MB_OK | MB_ICONINFORMATION);
                hInstance=NULL;                             
            }
            flag=FALSE;
        }
        else                                    
        {
            TranslateMessage(&msg);             
            DispatchMessage(&msg);              
        }
    }
    else
    {
        if (active && !DrawGLScene())   // Active?  Was There A Quit Received?
        {
            flag=FALSE;                         // ESC or DrawGLScene Signalled A Quit
        }
        else                                    // Not Time To Quit, Update Screen
        {

            SwapBuffers(hdc);                   // Swap Buffers (Double Buffering)
        }
        if(keys[VK_RIGHT]){rquad[0]+=0.12;}
        if(keys[VK_LEFT]){rquad[0]=0;rquad[1]=0;rquad[2]=0;}
        if(keys[VK_UP]){rquad[1]+=0.12;}
        if(keys[VK_DOWN]){rquad[2]+=0.12;}
    }
}

return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

int   cxBlock, cyBlock;

switch (message)
{
case WM_CREATE :
    if(!(hwndopen= CreateWindow (szChildClass, NULL,
        WS_CHILDWINDOW | WS_VISIBLE,
        0, 0, 0, 0,
        hwnd,(HMENU)(hID),
        (HINSTANCE)GetWindowLong (hwnd, GWL_HINSTANCE),
        NULL)))
    {
        MessageBox(NULL,"子窗口创建失败","演示程序",MB_OK|MB_ICONINFORMATION);
        return 0;                               
    }
    if (!(hdc=GetDC(hwndopen)))                         
    {               
        MessageBox(NULL,"设备描述表创建失败","演示程序",MB_OK|MB_ICONINFORMATION);
        return 0;
    }

    if (!(PixelFormat=ChoosePixelFormat(hdc,&pfd)))
    {               
        MessageBox(NULL,"未找到匹配的像素格式","演示程序",MB_OK|MB_ICONINFORMATION);
        return 0;
    }

    if(!SetPixelFormat(hdc,PixelFormat,&pfd))   
    {               
        MessageBox(NULL,"设置像素格式失败","演示程序",MB_OK|MB_ICONINFORMATION);
        return 0;
    }

    if (!(hrc=wglCreateContext(hdc)))           
    {               
        MessageBox(NULL,"获取渲染描述表失败","演示程序",MB_OK|MB_ICONINFORMATION);
        return 0;
    }

    if(!wglMakeCurrent(hdc,hrc))                
    {               
        MessageBox(NULL,"渲染描述表激活失败","演示程序",MB_OK|MB_ICONINFORMATION);
        return 0;
    }
    return 0 ;

case WM_ACTIVATE:                           // Watch For Window Activate Message
    // LoWord Can Be WA_INACTIVE, WA_ACTIVE, WA_CLICKACTIVE,
    // The High-Order Word Specifies The Minimized State Of The Window Being Activated Or Deactivated.
    // A NonZero Value Indicates The Window Is Minimized.
    if ((LOWORD(wParam) != WA_INACTIVE) && !((BOOL)HIWORD(wParam)))
        active=TRUE;                        // Program Is Active
    else
        active=FALSE;                       // Program Is No Longer Active
    return 0;                               // Return To The Message Loop

case WM_SIZE :
    cxBlock = LOWORD (lParam);
    cyBlock = HIWORD (lParam);
    MoveWindow (hwndopen,
        5,5,
        (int)(cxBlock*0.80),(int)(cyBlock*0.98), TRUE) ;
    ReSizeGLScene((int)(cxBlock*0.80),(int)(cyBlock*0.97));
    return 0 ;

case WM_LBUTTONDOWN :
    MessageBeep (0) ;
    return 0 ;

case WM_KEYDOWN:                
    keys[wParam] = TRUE;                
    return 0;                       

case WM_KEYUP:                              
    keys[wParam] = FALSE;
    return 0;

case WM_CLOSE:
    DestroyWindow(hwnd);
    return 0;

case WM_DESTROY :
    if (hrc)                                            
    {
        if (!wglMakeCurrent(hdc,NULL))
        {
            MessageBox(NULL,"DC和RC关联解除失败","演示程序",MB_OK | MB_ICONINFORMATION);
        }

        if (!wglDeleteContext(hrc)) 
        {
            MessageBox(NULL,"RC释放失败","演示程序",MB_OK | MB_ICONINFORMATION);
        }

        hrc=NULL;
    }

    if (!DestroyWindow(hwnd))   
    {
        MessageBox(NULL,"窗口句柄释放失败","演示程序",MB_OK | MB_ICONINFORMATION);
        hwnd=NULL;  
    }

    PostQuitMessage (0) ;
    return 0 ;

}
return DefWindowProc (hwnd, message, wParam, lParam) ;
  }

LRESULT CALLBACK OpenProc (HWND hwnd, UINT message, 
                       WPARAM wParam, LPARAM lParam)
{
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
#包含//窗口标题
#包括//过剩
#包括//glaux
#定义hID 6310//子窗口的ID
LRESULT回调WndProc(HWND、UINT、WPARAM、LPARAM);
LRESULT回调OpenProc(HWND、UINT、WPARAM、LPARAM);
TCHAR szChildClass[]=文本(“OpenGL”)//子窗口类名称
TCHAR szAppName[]=文本(“框架”)//框架窗口类名称
HWND hwndopen//子窗口
手柄
HWND-HWND//框架窗把手
味精//消息结构
HDC HDC=NULL//在子窗口中使用的设备上下文
HGLRC hrc=零//呈现上下文
HINSTANCE HINSTANCE//应用实例
GLuint像素格式//PIX格式
BOOL active=TRUE;
布尔键[256];
浮点rquad[3]={0,0,0}//旋转角
//pfd告诉Windows我们希望事情是怎样的
静态像素描述符pfd={
sizeof(像素格式描述符),
1,PFD_绘图_至_窗口|
PFD_支持_OPENGL|
PFD_双缓冲器,
PFD_类型_RGBA,
16,
0, 0, 0, 0, 0, 0,
0,0,0,0, 0, 0, 0,
16,
0,
0,
PFD_主飞机,
0,
0, 0, 0 
};
/*这里我画了一个彩色立方体,在每一条边上画了一条黑线
对于立方体,我画了3条颜色线来显示x,y,z坐标
轴心*/
int-DrawGLScene(无效)
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-10.0f);
glRotatef(rquad[0],1.0f,0.0f,0.0f);
glRotatef(rquad[1],0.0f,1.0f,0.0f);
glRotatef(rquad[2],0.0f,0.0f,1.0f);
glBegin(GL_QUADS);
GL3F(0.0f,1.0f,0.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
glVertex3f(-1.0f,1.0f,1.0f);
glVertex3f(1.0f、1.0f、1.0f);
GL3F(1.0f,0.5f,0.0f);
glVertex3f(1.0f,-1.0f,1.0f);
glVertex3f(-1.0f,-1.0f,1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
GL3F(1.0f,0.0f,0.0f);
glVertex3f(1.0f、1.0f、1.0f);
glVertex3f(-1.0f,1.0f,1.0f);
glVertex3f(-1.0f,-1.0f,1.0f);
glVertex3f(1.0f,-1.0f,1.0f);
GL3F(1.0f,1.0f,0.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
glVertex3f(1.0f,1.0f,-1.0f);
GL3F(0.0f、0.0f、1.0f);
glVertex3f(-1.0f,1.0f,1.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,1.0f);
GL3F(1.0f,0.0f,1.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glVertex3f(1.0f、1.0f、1.0f);
glVertex3f(1.0f,-1.0f,1.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
格伦德();
glBegin(GL_行);
GL3F(1.0f,1.0f,1.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
glVertex3f(-1.0f,1.0f,1.0f);
glVertex3f(-1.0f,1.0f,1.0f);
glVertex3f(1.0f、1.0f、1.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glVertex3f(1.0f、1.0f、1.0f);
glVertex3f(1.0f,-1.0f,1.0f);
glVertex3f(-1.0f,-1.0f,1.0f);
glVertex3f(-1.0f,-1.0f,1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glVertex3f(1.0f,-1.0f,1.0f);
glVertex3f(1.0f、1.0f、1.0f);
glVertex3f(1.0f,-1.0f,1.0f);
glVertex3f(-1.0f,1.0f,1.0f);
glVertex3f(-1.0f,-1.0f,1.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
格伦德();
glBegin(GL_行);
GL3F(1.0f,0.0f,0.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(10.0f,0.0f,0.0f);
GL3F(1.0f,1.0f,0.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f、10.0f、0.0f);
GL3F(1.0f,0.0f,1.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f、0.0f、10.0f);
格伦德();
返回TRUE;
}
BOOL InitGL(void)//init opengl
{
glShadeModel(GL_平滑);//启用平滑着色
glClearColor(1.0f、0.0f、1.0f、0.5f);
glClearDepth(1.0f);glEnable(GLU深度测试);glDepthFunc(GLU勒夸尔);glHint(GLU透视图校正提示),
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;