Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Windows中创建OpenGL上下文_C++_Windows_Winapi_Opengl - Fatal编程技术网

C++ 在Windows中创建OpenGL上下文

C++ 在Windows中创建OpenGL上下文,c++,windows,winapi,opengl,C++,Windows,Winapi,Opengl,这是我的密码。我不想要用于设备上下文/rc创建的库 什么都不会吸引人。也许我设置的DC或RC设置错误 我想从头开始做一个游戏引擎 #pragma一次 #包括 #包括 #包括 #pragma注释(lib,“opengl32.lib”) #包括 使用名称空间std; 类阴影 { 公众: HWND s_Window=NULL; int uu cdecl Init(常量字符*,int,int); 私人: }; LRESULT\uu stdcall s\u WindowEvent(HWND HWND、无符

这是我的密码。我不想要用于设备上下文/rc创建的库

什么都不会吸引人。也许我设置的DC或RC设置错误

我想从头开始做一个游戏引擎

#pragma一次
#包括
#包括
#包括
#pragma注释(lib,“opengl32.lib”)
#包括
使用名称空间std;
类阴影
{
公众:
HWND s_Window=NULL;
int uu cdecl Init(常量字符*,int,int);
私人:
};
LRESULT\uu stdcall s\u WindowEvent(HWND HWND、无符号整数消息、无符号整数wParam、长LPRAM)
{
开关(信息)
{
违约:
返回DefWindowProc(hWnd、message、wParam、lParam);
};
};
int shadoeGE::Init(常量字符*标题,int x,int y)
{
MSG={0};
WNDCLASS wc={0};
wc.lpfnWndProc=s_WindowEvent;
wc.hInstance=GetModuleHandle(NULL);
wc.hbrBackground=(HBRUSH)(彩色背景);
wc.lpszClassName=“sWindowClass”;
wc.style=CS_OWNDC;
如果(!注册表类(&wc))
{
返回0;
};
此->s_Window=CreateWindowA(wc.lpszClassName,title,WS_OVERLAPPEDWINDOW | WS_VISIBLE,0,0,x,y,0,0,GetModuleHandle(NULL),0);
while(GetMessage(&msg,NULL,0,0)>0)
{
发送消息(&msg);
}; 
像素描述符pfd=
{
sizeof(像素格式描述符),
1.
PFD|U DRAW|U TO|U窗口| PFD|U支持| OPENGL | PFD|U DOUBLEBUFFER,
PFD_类型_RGBA,
32,                   
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
24,                   
8.
0,                   
PFD_主飞机,
0,
0, 0, 0
};
HDC deviceContextHandle=GetDC(此->s_窗口);
int windowsselected=ChoosePixelFormat(deviceContextHandle和pfd);
SetPixelFormat(deviceContextHandle、WindowsSelected和pfd);
HGLRC ourOpenGLRenderingContext=wglCreateContext(deviceContextHandle);
wglMakeCurrent(deviceContextHandle,我们的OpenGLRenderingContext);
glViewport(0,060480);
glEnable(GL_混合物);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glBegin(GL_三角形);
GL3F(0.1,0.2,0.3);
glVertex3f(0,0,0);
glVertex3f(1,0,0);
glVertex3f(0,1,0);
格伦德();
SwapBuffers(deviceContextHandle);
返回1;
};

您必须实现一个消息循环:

MSG;
while(::GetMessage(&msg,0,0,0))
::发送消息(&msg);
发送消息时,必须在消息循环中绘制场景:

LRESULT回调shadoeGE::s_WindowEvent(HWND HWND,unsigned int msg,WPARAM WPARAM,LPARAM LPARAM)
{
开关(msg)
{
// [...]
案例WM_油漆:
wnd.Display();
打破
}
返回DefWindowProc(hWnd、msg、wparam、lparam);
}
请参见示例:

#包括
#包括
#包括
#包括
类阴影
{
公众:
静态LRESULT回调s_WindowEvent(HWND HWND、unsigned int msg、WPARAM WPARAM、LPARAM LPARAM);
HWND Init(整数宽度、整数高度);
无效窗口(void);
void消息循环(void);
作废显示(作废);
私人:
HWND hOGLWnd=NULL;
HGLRC hOGLRenderContext=NULL;
};
std::wstring wnd_类(L“my_wnd_类”);
沙多吉;
int main()
{
int w=800;
int h=600;
HWND HWND=wnd.Init(w,h);
如果(hWnd==0)
抛出std::runtime_错误(“初始化窗口错误”);
wnd.MessageLoop();
wnd.window();
返回0;
}
HWND shadoeGE::Init(整数宽度,整数高度)
{
//获取模块句柄
HMODULE HMODULE=::GetModuleHandle(0);
if(!hModule)
返回NULL;
//创建窗口类
WNDCLASSEX wndClassData;
memset(&wndClassData,0,sizeof(WNDCLASSEX));
wndClassData.cbSize=sizeof(WNDCLASSEX);
wndClassData.style=CS_DBLCLKS;
wndClassData.lpfnWndProc=s_WindowEvent;
wndClassData.cbClsExtra=0;
wndClassData.cbWndExtra=0;
wndClassData.hInstance=hModule;
wndClassData.hIcon=::加载图标(0,IDI_应用程序);
wndClassData.hCursor=::加载光标(0,IDC_箭头);
wndClassData.hbrBackground=::CreateSolidBrush(颜色窗口+1);
wndClassData.lpszMenuame=0;
wndClassData.lpszClassName=wnd_class.c_str();
wndClassData.hIconSm=0;
if(!::RegisterClassEx(&wndClassData))
返回false;
//斜窗
hOGLWnd=::CreateWindow(wnd_class.c_str(),NULL,WS_OVERLAPPEDWINDOW,0,0,width,height,NULL,NULL,NULL,hModule,NULL);
if(hOGLWnd==NULL)
返回NULL;
//获取设备上下文
HDC-HDC=::GetDC(hOGLWnd);
//创建OpenGL上下文
DWORD pixelFormatFlags=PFD_支持| OPENGL | PFD_支持|合成| PFD_通用|加速| PFD_绘制|到|窗口| PFD|双缓冲区;
像素描述符pfd=
{
sizeof(像素格式描述符),
1.
pixelFormatFlags,//标志
PFD_TYPE_RGBA,//帧缓冲区的类型。RGBA或调色板。
32,//帧缓冲区的颜色深度。
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
24,//深度缓冲区的位数
8,//模具缓冲区的位数
0,//帧缓冲区中的辅助缓冲区数。
PFD_主飞机,
0,
0, 0, 0
};
int pixelFormat=::选择像素格式(hDC和pfd);
::SetPixelFormat(hDC、pixelFormat和pfd);
hOGLRenderContext=::wglCreateContext(hDC);
//使OpenGL上下文成为当前上下文
::wglMakeCurrent(hDC、hOGLRenderContext);
//释放设备上下文
::释放DC(霍格尔文德,hDC);
//显示窗口
::ShowWindow(hOGLWnd、SW_SHOWDEFAULT);
返回猪圈;
}
void shadoeGE::MessageLoop(void)
{
味精;
while(::GetMessage(&msg,0,0,0))
::发送消息(&msg);
}
void shadoeGE::DestroyWindow(void)
{
::销毁窗口(霍格尔文德);
::wglM
void shadoeGE::Display( void )
{
  RECT clientRect;
  ::GetClientRect( hOGLWnd, &clientRect );

  glViewport( 0, 0, clientRect.right-clientRect.left, clientRect.bottom-clientRect.top );
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);    

  // [...]

  HDC hDC = ::GetDC( hOGLWnd );
  ::SwapBuffers( hDC );
  ::ReleaseDC( hOGLWnd, hDC );
}