您的位置:首页 > 运维架构

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: