先来创建一个黑色的窗口吧,作为GL的容器。
Light3dWinAPP 这个类来处理窗口的创建和销毁以及分发 系统事件。
/********************** *File:Light3dWinAPP.h; *Author:chenpeng *Data:2015/07/21; */ #include<Windows.h> #include<tchar.h> namespace Light3d { class Light3dWinAPP { public : HINSTANCE m_hInstance; //实例句柄; HWND m_hWnd; //窗口句柄; int m_width; //宽度; int m_height; //高度; public: Light3dWinAPP(HINSTANCE hInstance) :m_hInstance(hInstance) { //想要建立一个窗口,必须有一个窗口类; WNDCLASSEX winClass; //窗口类名; winClass.lpszClassName = _T("Light3dWinAPP"); winClass.cbSize = sizeof(winClass); //当H 水平方向,V 竖直方向 大小变化或移动时,重绘窗口, //为该类中的每一个窗口分配一个唯一的设备上下文; winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; //指向函数的长指针lp,处理窗口的消息循环; winClass.lpfnWndProc = wndProc; //实例句柄; winClass.hInstance = hInstance; //窗口最小化图标; winClass.hIcon = 0; winClass.hIconSm = 0; //鼠标光标; winClass.hCursor = LoadCursor(hInstance, IDC_ARROW); //窗口背景色; winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); //窗口菜单; winClass.lpszMenuName = nullptr; winClass.cbClsExtra = 0; winClass.cbWndExtra = 0; RegisterClassEx(&winClass); } virtual ~Light3dWinAPP() { UnregisterClass(_T("CELLWinAPP"), m_hInstance); } protected: static LRESULT CALLBACK wndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { Light3dWinAPP* pThis = (Light3dWinAPP*)GetWindowLong(hWnd, GWL_USERDATA); if (pThis) { return pThis->onEvent(hWnd, msg, wParam, lParam); } if (WM_CREATE == msg) { CREATESTRUCT* pCreate = (CREATESTRUCT*)lParam; SetWindowLong(hWnd, GWL_USERDATA,(DWORD_PTR)pCreate->lpCreateParams); } return DefWindowProc(hWnd, msg, wParam, lParam); } public: //窗口事件; virtual LRESULT onEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CLOSE: case WM_DESTROY: { ::PostQuitMessage(0); } break; case WM_MOUSEMOVE: break; case WM_LBUTTONDOWN: break; case WM_LBUTTONUP: break; case WM_RBUTTONDOWN: break; case WM_RBUTTONUP: break; case WM_KEYDOWN: { switch (wParam) { case VK_LEFT: { } break; case VK_RIGHT: break; case VK_UP: break; default: break; } } break; case WM_KEYUP: break; default: return DefWindowProc(hWnd, msg, wParam, lParam); } return S_OK; } //主函数; int main(int width, int height) { //创建窗口; m_hWnd = CreateWindowEx(NULL, _T("Light3dWinAPP"), _T("Light3D"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, width, height, NULL, NULL, m_hInstance, this ); if (m_hWnd == 0) { return -1; } ShowWindow(m_hWnd, SW_SHOW); MSG msg = { 0 }; while (msg.message!=WM_QUIT) { if (msg.message == WM_DESTROY || msg.message == WM_CLOSE) { //跳出,退出; break; } //有消息的时候处理消息,没有消息的时候进行渲染绘制; if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { //渲染; Sleep(1); } } return 0; } }; }
main.cpp 中处理Win的入口函数
/********************** *File:main.cpp; *Author:chenpeng *Data:2015/07/21; */ #include "Light3dWinAPP.h" int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hInstance); UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); UNREFERENCED_PARAMETER(nCmdShow); Light3d::Light3dWinAPP app(hInstance); app.main(800, 600); }
示例下载:
http://pan.baidu.com/s/1c0EtfR6
版权声明:本文转自http://blog.csdn.net/huutu 转载请带上 http://www.thisisgame.com.cn
时间: 2024-12-04 12:44:38