{步骤
1:注册窗口 RegisterClassEx
2:创建窗口 CreateWindowEx
3:更新显示窗口 ShowWindow
4:消息循环 PeekMessage/GetMessage
}
创建一个Win32项目(Visual C++ -->Win32项目) (本人用的是vc2012,这个系列的代码都是以vc2012为基础工具)
class WinApp{
public:
WinApp(HINSTANCE hInstance);
virtual~WinApp(void);
virtual LRESULT onEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK wndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
int main(int wWidth,int wHegith);
private:
HINSTANCE _hInstance; //实例句柄
HWND _hWnd;//窗口句柄
};
#include "WinApp.h"
WinApp::WinApp(HINSTANCE hInstance):_hInstance(hInstance){
WNDCLASSEX winClass;
winClass.lpszClassName = _T("CELLWinApp");//指向类名称的指针(窗口名字)
winClass.cbSize = sizeof(winClass);//WNDCLASSEX 的大小
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;//窗口风格
winClass.lpfnWndProc = wndProc;//窗口处理函数的指针
winClass.hInstance = hInstance;//本模块的实例句柄
winClass.hIcon = 0;//图标
winClass.hIconSm = 0;//和窗口类关联的小图标,如果该值为NULL,则把hIcon中的图标转换成大小合适的小图标
winClass.hCursor = LoadCursor(hInstance, IDC_ARROW);//鼠标句柄
winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);//背景画刷的句柄。
winClass.lpszMenuName = NULL;//指向菜单的指针
winClass.cbClsExtra = 0;
winClass.cbWndExtra = 0;
//1:注册窗口
//随后在调用Createwindow函数和CreatewindowEx函数中使用的窗口注册一个窗口类。
RegisterClassEx(&winClass);
}
LRESULT CALLBACK WinApp::wndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
//获取窗口属性
WinApp* pThis = (WinApp*)GetWindowLong(hWnd,GWL_USERDATA);
if (pThis) {
return pThis->onEvent(hWnd,msg,wParam,lParam);
}
if (WM_CREATE == msg){ //窗口创建完成时发来的消息
CREATESTRUCT* pCreate = (CREATESTRUCT*)lParam;
//获取当前对象(CreateWindowEx函数中最后一个参数)
DWORD_PTR pCreateParams = (DWORD_PTR)pCreate->lpCreateParams;
/**设置窗口属性
* @param HWND hWnd 窗口句柄
* @param int nlndex
* @param LONG dwNewLong
*/
SetWindowLong(hWnd,GWL_USERDATA,pCreateParams);
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
//事件函数
LRESULT WinApp::onEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
switch (msg){ //处理得到的消息
case WM_CLOSE://处理窗口关闭时的消息
case WM_DESTROY://销毁
{
::PostQuitMessage(0);
}
break;
case WM_LBUTTONDOWN: //鼠标左键被按下的消息
break;
case WM_RBUTTONDOWN://鼠标右键被按下的消息
break;
case WM_MOUSEMOVE://鼠标移动
break;
case WM_KEYDOWN://监听键盘按键
switch (wParam){
case VK_LEFT:
break;
default:
break;
}
break;
default:
return DefWindowProc( hWnd, msg, wParam, lParam );
}
return S_OK;
}
WinApp::~WinApp(void){
//注销一个窗口类,类释放所需的内存
UnregisterClass(_T("CELLWinApp"),_hInstance);
}
int WinApp::main(int wWidth,int wHegith){
//2:创建窗口
//创建一个具有扩展风格的层叠式窗口、弹出式窗口或子窗口,其他与CreateWindow函数相同。关于创建窗口和其他参数的内容,请参看CreateWindow。
/**创建一个具有扩展风格的层叠式窗口、弹出式窗口或子窗口
* @param DWORD dwExStyle 窗口的扩展风格
* @param LPCWSTR lpClassName 指向注册类名的指针
* @param LPCWSTR lpWindowName 指向窗口名称的指针
* @param DWORD dwStyle 窗口风格
* @param int X 窗口的水平位置
* @param int Y 窗口的垂直位置
* @param int nWidth 窗口的宽度
* @param int nHeight 窗口的高度
* @param HWND hWndParent 父窗口的句柄
* @param HMENU hMenu 菜单的句柄或是子窗口的标识符
* @param HINSTANCE hInstance 应用程序实例的句柄
* @param LPVOID lpParam 指向窗口的创建数据
*/
_hWnd = CreateWindowEx( NULL, _T("CELLWinApp"), _T("CELLWinApp"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, wWidth, wHegith, NULL, NULL, _hInstance,this );
if (_hWnd == 0) {
return -1;
}
//3:更新显示窗口
ShowWindow(_hWnd,SW_SHOW);//SW_MAXIMIZE 扩大窗口,SW_SHOW
//4:消息循环
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 调用
#include "WinApp.h"
/**
* @param {[type]} HINSTANCE hInstance 当前窗口实例句柄
* @param {[type]} HINSTANCE hPrevInstn
* @param {[type]} LPWSTR LpCtstr
* @param {[type]} int nShowCmd 指定程序窗口如何显示,例如最大化、最小化、隐藏等。
* @return {[type]} [description]
*/
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
//告诉编译器,已经使用了该变量,不必检测警告
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(hInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
UNREFERENCED_PARAMETER(nCmdShow);
WinApp app(hInstance);
app.main(800,600);
return 0;
}
本人学的OpenGL-ES 下面的这个网站
http://edu.youkuaiyun.com/lecturer/440 有需要的可以购买学习支持