更新:
问题解决了!该解决方案的灵感来源于评论中的一项建议:
我刚刚更新了图形驱动程序,现在我所有的代码都正常工作了。有关信息,上述驱动程序是“Interinter(R) UHD Graphics 620”,我将其更新到25.20.10.6472 (10/12/2018)版本。
非常抱歉给您带来不便,谢谢您的支持。
使用ScreenToGif (感谢“奋斗太阳”)这里是这样的:主窗口(OpenGL)是某种宇宙飞船的外部视图(带有彩色助推器),右下角的(GDI)窗口是AI领航员的视图,后者正在学习吃绿色牙龈并避免使用红色牙龈)。

如果你,StackOverflow先生,认为这种杂乱无章是不合适的,请删除它.
下面,最初的问题:
我在windows下有一个OpenGl代码的小示例,它可以很好地工作在windows 7+ visual 2010中。但是在我的带有windows 10 + visual studio 2017的新PC上,OpenGL呈现窗口没有显示。编译正常,在执行过程中不返回错误。
因此,为了在这里发布它而不需要大量的内容,我编写了一个简短的代码摘录。它只使用标准win API (gl.h/gl.h)提供的基本原生gdi+opengl函数,而不使用任何附加库(如glew/glut/freeglut/.)。
使用Windows7+VS2010,我有3个窗口: GDI呈现、OpenGL呈现和控制台。
对于Windows10+VS2017,OpenGL窗口是不可见的。我玩alt键的时候连鬼都没看见。
我想API里有些东西变了,但我不知道.
这是我的密码:
#include <windows.h>
#include <cstdio>
#include <GL/GLU.h>
static LRESULT CALLBACK win32callback ( HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam )
{
return DefWindowProcA( hWnd,message,wParam,lParam ) ;
}
HWND create_window ( BOOL & ok , int x )
{
WNDCLASSEXA wcx ;
memset( &wcx,0,sizeof( wcx )) ;
wcx.cbSize = sizeof( wcx ) ;
wcx.lpfnWndProc = win32callback ;
wcx.lpszClassName = "spam" ;
RegisterClassExA( &wcx ) ;
HWND hwnd = CreateWindowExA( 0,"spam",NULL,WS_POPUP,x+10,10,500,500,NULL,NULL,NULL,NULL ) ;
ok = ok && SetWindowPos( hwnd,HWND_TOPMOST,x+10,10,500,500,SWP_NOOWNERZORDER|SWP_SHOWWINDOW ) ;
ok = ok && ShowWindow( hwnd,SW_SHOWNORMAL ) ;
return hwnd ;
}
void play_opengl ( HWND hwnd , BOOL & ok )
{
HDC dc = GetWindowDC( hwnd ) ;
PIXELFORMATDESCRIPTOR pfd ;
memset( &pfd,0,sizeof( PIXELFORMATDESCRIPTOR )) ;
pfd.nSize = sizeof( PIXELFORMATDESCRIPTOR ) ;
pfd.nVersion = 1 ;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER ;
pfd.iPixelType = PFD_TYPE_RGBA ;
pfd.cColorBits = 24 ;
pfd.cDepthBits = 32 ;
pfd.iLayerType = PFD_MAIN_PLANE ;
int PixFormat = ChoosePixelFormat( dc,&pfd ) ;
ok = ok && SetPixelFormat( dc,PixFormat,&pfd ) ;
HGLRC glrc = wglCreateContext( dc ) ;
ok = ok && wglMakeCurrent( dc,glrc ) ;
glViewport( 0,0,500,500 ) ;
glEnable( GL_COLOR_MATERIAL ) ;
glMatrixMode( GL_PROJECTION ) ;
gluPerspective( 70,1,0.1,1000 ) ;
glMatrixMode( GL_MODELVIEW ) ;
glLoadIdentity() ;
glColor3b( 100,50,120 ) ;
glTranslated( 0,0,-20 ) ;
glBegin( GL_TRIANGLES ) ;
glVertex3d( 0,0,0 ) ;
glVertex3d( 5,5,0 ) ;
glVertex3d( 0,5,0 ) ;
glEnd() ;
ok = ok && SwapBuffers( dc ) ;
}
void play_gdi ( HWND hwnd , BOOL & ok )
{
HDC windc = GetWindowDC( hwnd ) ;
HDC dc = CreateCompatibleDC( windc ) ;
HBITMAP bitmap = CreateCompatibleBitmap( windc,500,500 ) ;
HPEN pen = CreatePen( PS_SOLID,1,0xffaa55 ) ;
ok = ok && (SelectObject( dc,bitmap ) != NULL) ;
ok = ok && (SelectObject( dc,pen ) != NULL) ;
for ( int i = 0 ; i < 100 ; i++ )
ok = ok && LineTo( dc,(i&1?i:100-i)*4,(i&1)*400 ) ;
BitBlt( windc,0,0,500,500,dc,0,0,SRCCOPY ) ;
}
void main ()
{
BOOL ok = TRUE ;
HWND hwnd1 = create_window( ok,0 ) ;
HWND hwnd2 = create_window( ok,600 ) ;
play_gdi( hwnd1,ok ) ;
play_opengl( hwnd2,ok ) ;
// sorry I don't clean up anything...
if (ok) printf("\n all correct!\n") ;
printf("\n\n press ENTER") ;
getchar() ;
}发布于 2019-06-25 09:11:55
你要说的是鬼窗口是由下面的代码创建的。
for ( int z = -n ; z <= n ; z++ )
for ( int y = -n ; y <= n ; y++ )
for ( int x = -n ; x <= n ; x++ )
{
printf(" %d,%d,%d%s",x,y,z,x?"":"\n") ;
SwapBuffers( dc ) ;
glTranslated( x,y,z ) ;
gluSphere( quadric,4,5,5 ) ;
glTranslated( -x,-y,-z ) ;
}我不知道你想用这个代码呈现哪个窗口,但情况就是这样。您的for循环一直在球面矩阵周围循环。
为了测试目的,我正在尝试用我的代码替换你的一些代码。
#include <windows.h>
#include <cstdio>
#include <math.h>
#include <GL/GLU.h>
#pragma comment (lib,"Glu32.lib")
#pragma comment (lib,"Opengl32.lib")
void draw();
int width, height; // the desired width and height of the CLIENT AREA
HDC dc;
static LRESULT CALLBACK win32callback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hWnd, message, wParam, lParam);
}
void main()
{
WNDCLASSEXA wcx;
memset(&wcx, 0, sizeof(wcx));
wcx.cbSize = sizeof(wcx);
wcx.lpfnWndProc = win32callback;
wcx.lpszClassName = "spam";
RegisterClassExA(&wcx);
HWND hwnd = CreateWindowExA(0, "spam", NULL, WS_POPUP, 10, 10, 500, 500, NULL, NULL, NULL, NULL);
SetWindowPos(hwnd, HWND_TOPMOST, 10, 10, 800, 500, SWP_NOOWNERZORDER | SWP_SHOWWINDOW);
ShowWindow(hwnd, TRUE);
SetFocus(hwnd);
dc = GetWindowDC(hwnd);
RECT rect;
SetRect(&rect, 50, // left
50, // top
850, // right
650); // bottom
// Save width and height off.
width = rect.right - rect.left;
height = rect.bottom - rect.top;
PIXELFORMATDESCRIPTOR pfd;
memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
pfd.cDepthBits = 24;
int PixFormat = ChoosePixelFormat(dc, &pfd);
PIXELFORMATDESCRIPTOR bestMatch_pfd;
DescribePixelFormat(dc, PixFormat, sizeof(pfd), &bestMatch_pfd);
SetPixelFormat(dc, PixFormat, &pfd);
HGLRC glrc = wglCreateContext(dc);
wglMakeCurrent(dc, glrc);
while (1)
{
draw();
}
DestroyWindow(hwnd);
wglMakeCurrent(0, 0);
wglDeleteContext(glrc);
}
void draw()
{
// 1. set up the viewport
glViewport(0, 0, g.width, g.height); // set viewport
// 2. projection matrix
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (float)g.width / (float)g.height, 1, 1000);
// 3. viewing transformation
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, 10,
0, 0, 0,
0, 1, 0);
// 4. modelling transformation and drawing
glClearColor(0.5, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
static float i = 0.01f;
i += 0.001f; // increase i by 0.001 from its
// it had on the LAST FUNCTION CALL to the draw() function
float c = cos(i);
float s = sin(i);
glBegin(GL_TRIANGLES);
glColor3f(c, 0, 0); // red
glVertex3f(1 + c, 0 + s, 0);
glColor3f(c, s, 0); // yellow
glVertex3f(0 + c, 1 + s, 0);
glColor3f(s, 0.1f, s); // magenta
glVertex3f(-1 + c, 0 + s, 0);
glEnd();
//7. SWAP BUFFERS.
SwapBuffers(dc);
}

您可以看到它运行得很好,我的环境配置: 10 2017窗口10
更新:

试着连接"Glu32.lib“和"Opengl32.lib”
更新:
尝试以下两种方法:
OpenGL版本,下载珠穆朗玛峰终极版后,依次点击显示设备> OpenGL,检查其是否支持相关信息,如果不支持,只能更换图形卡或用支持的OpenGL版本来解决问题。https://stackoverflow.com/questions/56741521
复制相似问题