OpenGLES---Windows窗口

本文介绍如何在Windows环境下,利用Visual C++ 2012创建一个Win32项目,并集成OpenGLES进行图形渲染。通过学习OpenGL-ES的相关教程,可以深入理解在Windows平台上使用OpenGLES进行图形编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

{步骤
    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  有需要的可以购买学习支持


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值