openGL学习 第一步 创建窗体
2009-08-09 17:09
309 查看
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
.....
WNDCLASSEX windowClass;
RECT windowRect;
windowRect.left = 0;
windowRect.right = WINDOW_WIDTH;
windowRect.top = 0;
windowRect.bottom = WINDOW_HEIGHT;
memset(&windowClass, 0, sizeof(WNDCLASSEX));
windowClass.cbSize = sizeof(WNDCLASSEX);
windowClass.style = CS_HREDRAW | CS_VREDRAW;
windowClass.lpfnWndProc = WndProc; //msg process function
windowClass.hInstance = hInstance;
windowClass.lpszClassName = L"TESTGL"; //与CreateWindowEx中类名称一致,必须有
windowClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TESTOPENGL));
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
//The RegisterClassEx function registers a window class for subsequent use in calls to the CreateWindow or CreateWindowEx function.
if (!RegisterClassEx(&windowClass))
{
return NULL;
}
DWORD dwExStyle;
DWORD dwStyle;
BOOL bFullScreen = TRUE;
if (bFullScreen) //全屏窗口的创建方式
{
HWND hDTWND = GetDesktopWindow();
HDC hDTDC = GetDC(hDTWND);
DEVMODE dmScreenSetting;
memset(&dmScreenSetting, 0, sizeof(DEVMODE));
dmScreenSetting.dmSize = sizeof(DEVMODE);
dmScreenSetting.dmPelsWidth = GetDeviceCaps( hDTDC, HORZRES); //通过GetDeviceCaps获取系统的分辨率设置
dmScreenSetting.dmPanningHeight = GetDeviceCaps(hDTDC, VERTRES);
dmScreenSetting.dmBitsPerPel = GetDeviceCaps(hDTDC, BITSPIXEL);
dmScreenSetting.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
//ChangeDisplaySettings把缺省显示设备的设置改变为由lpDevMode设定的图形模式,要改变一个特定显示设备的设置,请使用ChangeDisplaySettingEx函数。
long lRet = ChangeDisplaySettingsW(&dmScreenSetting, CDS_FULLSCREEN);
if (lRet != DISP_CHANGE_SUCCESSFUL)
{
bFullScreen = FALSE;
}
windowRect.right = dmScreenSetting.dmPelsWidth;
windowRect.bottom = dmScreenSetting.dmPanningHeight;
}
if (bFullScreen)
{
dwExStyle = WS_EX_APPWINDOW;
dwStyle = WS_POPUP;
ShowCursor(FALSE);
}
else
{
dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
dwStyle = WS_OVERLAPPEDWINDOW;
}
AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle);
HWND hwnd = CreateWindowEx(NULL,
_T("TESTGL"),
_T("JYY TEST"),
dwStyle | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
0, 0,
windowRect.right - windowRect.left,
windowRect.bottom - windowRect.top,
NULL, NULL, hInstance, NULL);
hDC = GetDC(hwnd);
if (!hwnd)
{
return NULL;
}
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
......
}
消息处理函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_CREATE:
{
hDC = GetDC(hWnd);
SetupPixelFormat(hDC);
hGLrc = wglCreateContext(hDC);
wglMakeCurrent(hDC, hGLrc);
break;
}
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
case WM_CLOSE:
case WM_QUIT:
wglMakeCurrent(hDC, NULL);
wglDeleteContext(hGLrc);
hGLrc = NULL;
PostQuitMessage(0);
break;
case WM_SIZE:
{
int height = HIWORD(lParam);
int width = LOWORD(lParam);
g_hOpenGL->SetupProjection(height, width);
break;
}
case WM_KEYDOWN:
{
int nKey;
LPARAM keyData;
nKey = (int) wParam;
keyData = lParam;
switch (nKey)
{
case VK_ESCAPE:
{
PostQuitMessage(0);
break;
}
default:
{
break;
}
}
break;
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
.....
WNDCLASSEX windowClass;
RECT windowRect;
windowRect.left = 0;
windowRect.right = WINDOW_WIDTH;
windowRect.top = 0;
windowRect.bottom = WINDOW_HEIGHT;
memset(&windowClass, 0, sizeof(WNDCLASSEX));
windowClass.cbSize = sizeof(WNDCLASSEX);
windowClass.style = CS_HREDRAW | CS_VREDRAW;
windowClass.lpfnWndProc = WndProc; //msg process function
windowClass.hInstance = hInstance;
windowClass.lpszClassName = L"TESTGL"; //与CreateWindowEx中类名称一致,必须有
windowClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TESTOPENGL));
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
//The RegisterClassEx function registers a window class for subsequent use in calls to the CreateWindow or CreateWindowEx function.
if (!RegisterClassEx(&windowClass))
{
return NULL;
}
DWORD dwExStyle;
DWORD dwStyle;
BOOL bFullScreen = TRUE;
if (bFullScreen) //全屏窗口的创建方式
{
HWND hDTWND = GetDesktopWindow();
HDC hDTDC = GetDC(hDTWND);
DEVMODE dmScreenSetting;
memset(&dmScreenSetting, 0, sizeof(DEVMODE));
dmScreenSetting.dmSize = sizeof(DEVMODE);
dmScreenSetting.dmPelsWidth = GetDeviceCaps( hDTDC, HORZRES); //通过GetDeviceCaps获取系统的分辨率设置
dmScreenSetting.dmPanningHeight = GetDeviceCaps(hDTDC, VERTRES);
dmScreenSetting.dmBitsPerPel = GetDeviceCaps(hDTDC, BITSPIXEL);
dmScreenSetting.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
//ChangeDisplaySettings把缺省显示设备的设置改变为由lpDevMode设定的图形模式,要改变一个特定显示设备的设置,请使用ChangeDisplaySettingEx函数。
long lRet = ChangeDisplaySettingsW(&dmScreenSetting, CDS_FULLSCREEN);
if (lRet != DISP_CHANGE_SUCCESSFUL)
{
bFullScreen = FALSE;
}
windowRect.right = dmScreenSetting.dmPelsWidth;
windowRect.bottom = dmScreenSetting.dmPanningHeight;
}
if (bFullScreen)
{
dwExStyle = WS_EX_APPWINDOW;
dwStyle = WS_POPUP;
ShowCursor(FALSE);
}
else
{
dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
dwStyle = WS_OVERLAPPEDWINDOW;
}
AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle);
HWND hwnd = CreateWindowEx(NULL,
_T("TESTGL"),
_T("JYY TEST"),
dwStyle | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
0, 0,
windowRect.right - windowRect.left,
windowRect.bottom - windowRect.top,
NULL, NULL, hInstance, NULL);
hDC = GetDC(hwnd);
if (!hwnd)
{
return NULL;
}
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
......
}
消息处理函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_CREATE:
{
hDC = GetDC(hWnd);
SetupPixelFormat(hDC);
hGLrc = wglCreateContext(hDC);
wglMakeCurrent(hDC, hGLrc);
break;
}
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
case WM_CLOSE:
case WM_QUIT:
wglMakeCurrent(hDC, NULL);
wglDeleteContext(hGLrc);
hGLrc = NULL;
PostQuitMessage(0);
break;
case WM_SIZE:
{
int height = HIWORD(lParam);
int width = LOWORD(lParam);
g_hOpenGL->SetupProjection(height, width);
break;
}
case WM_KEYDOWN:
{
int nKey;
LPARAM keyData;
nKey = (int) wParam;
keyData = lParam;
switch (nKey)
{
case VK_ESCAPE:
{
PostQuitMessage(0);
break;
}
default:
{
break;
}
}
break;
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
相关文章推荐
- delphi学习点滴——窗体创建和释放
- [置顶] OpenGL学习笔记之创建窗口
- OpenGL_Qt学习笔记之_01(创建一个OpenGL窗口)
- Dll学习一_Dll 创建并动态引用窗体且释放窗体Demo
- OpenGL: Ubuntu创建窗体
- OpenGL实例(1)-创建窗体
- OpenGL学习笔记(七):创建第一个Qt5.9.3 OpenGL工程模版(与平台无关)
- OpenGL 学习笔记(2)创建第一个图形
- opengl学习笔记——着色器创建
- 【学习OpenGL】(一)——创建窗口的基本原理
- EXT 学习(-)---新窗体的创建
- Dll学习一_Dll 创建并动态引用窗体且释放窗体Demo
- OpenGL学习笔记(五):创建OpenGL工程模板前的所有准备工作
- LearnOpenGL学习笔记1:创建窗口
- Dll学习二_Dll 窗体中动态创建数据并使用Demo
- OpenGL_Qt学习笔记之_01(创建一个OpenGL窗口)
- 我的Go语言学习之旅七:创建一个GUI窗体
- OpenGL 学习笔记(1)初始化窗体
- Dll学习二_Dll 窗体中动态创建数据并使用Demo
- opengl学习笔记1:vs2013 nehe教程第一课 创建窗口