创建Windows窗口

//-----------------------------------【头文件包含部分】---------------------------------------
//	描述:包含程序所依赖的头文件
//------------------------------------------------------------------------------------------------
#include <windows.h>

//-----------------------------------【宏定义部分】--------------------------------------------
//	描述:定义一些辅助宏
//------------------------------------------------------------------------------------------------
#define WINDOW_WIDTH	800							//为窗口宽度定义的宏,以方便在此处修改窗口宽度
#define WINDOW_HEIGHT	600							//为窗口高度定义的宏,以方便在此处修改窗口高度
#define WINDOW_TITLE	L"【致我们永不熄灭的游戏开发梦想】程序核心框架"		//为窗口标题定义的宏


//-----------------------------------【全局函数声明部分】-------------------------------------
//	描述:全局函数声明,防止“未声明的标识”系列错误
//------------------------------------------------------------------------------------------------
LRESULT CALLBACK	WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );  //窗口过程函数


//-----------------------------------【WinMain( )函数】--------------------------------------
//	描述:Windows应用程序的入口函数,我们的程序从这里开始

int WINAPI WinMain(  HINSTANCE hInstance,  HINSTANCE hPrevInstance,  LPSTR lpCmdLine,  int nShowCmd )
	{WNDCLASSEX windClass = {0};   //定义一个窗口类
	  windClass.cbSize = sizeof(WNDCLASSEX);//设置结构体的字节数大小
	  windClass.style = CS_HREDRAW | CS_VREDRAW; //设置窗口的样式
	  windClass.lpfnWndProc = WndProc;  //设置指向窗口的指针
	  windClass.cbClsExtra = 0;//窗口的附加内存
	  windClass.cbWndExtra = 0;//同上
	  windClass.hInstance = hInstance; //指定包含窗口过程的程序的实力句柄
	  windClass.hIcon = (HICON)::LoadImage(NULL,L"icon.ico",IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); //本地加载自定义ico
	  windClass.hCursor = LoadCursor(NULL, IDC_ARROW) ; //指定窗口类的光标句柄
	  windClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);//为hbrBackground成员指定一个灰色画刷句柄
	  windClass.lpszMenuName = NULL;						//用一个以空终止的字符串,指定菜单资源的名字。
	  windClass.lpszClassName = L"ForTheDreamOfGameDevelop";		//用一个以空终止的字符串,指定窗口类的名字。
	//【2】注册窗口类
	  if(!RegisterClassEx(& windClass))   //设计完窗口后,需要对窗口类进行注册,这样才能创建该类型的窗口
		  return -1;
	 //【3】正式创建窗口
	  HWND hwnd = CreateWindow(L"ForTheDreamOfGameDevelop"
								,WINDOW_TITLE
								,WS_OVERLAPPEDWINDOW     //窗口样式,层叠型
								,CW_USEDEFAULT, CW_USEDEFAULT //窗口水平垂直样式
								,WINDOW_WIDTH, WINDOW_HEIGHT  //窗口的宽度和高度
								,NULL
								,NULL
								,hInstance
								,NULL);
	  //【4】窗口的移动、显示与更新
	  MoveWindow(hwnd
				 ,250,80//使窗口位于左上角(250,80)
				 ,WINDOW_WIDTH, WINDOW_HEIGHT
				 ,true //指定窗口是否要重画
				 );
	  ShowWindow(hwnd, nShowCmd);//显示窗口
	  UpdateWindow(hwnd);        //对窗口进行更新

	  //【5】消息循环过程
	  MSG msg = { 0 }; //初始化消息类
	  while(msg.message != WM_QUIT)   //使用while循环,如果消息不是WM_QUIT消息,就继续循环
	  {
		  if ( PeekMessage( &msg, 0 , 0, 0,PM_REMOVE))
		  {
			  TranslateMessage( &msg); //	将虚拟键消息转化为字符消息
				DispatchMessage( &msg);//分发一个消息给窗口程序

		  }
	  }
	  //【6】窗口类注销
	  UnregisterClass(L"ForTheDreamOfGameDevelop", windClass.hInstance);  //程序准备结束,注销窗口类
	return 0;

}

//-----------------------------------【WndProc( )函数--回调函数】--------------------------------------
//	描述:窗口过程函数WndProc,对窗口消息进行处理
LRESULT CALLBACK WndProc( HWND hwnd           //需要处理消息的窗口句柄
						  ,UINT message       //消息的类型
	                      ,WPARAM wParam	  //表示附加消息
						  , LPARAM lParam	  //同上
						  )
{
	switch (message)
	{
	case WM_PAINT:                //若是客户区重绘消息
		ValidateRect(hwnd, NULL);		// 更新客户区的显示
		break;	//跳出该switch语句
	case WM_KEYDOWN:                // 若是键盘按下消息
		if (wParam == VK_ESCAPE)    // 如果被按下的键是ESC
			DestroyWindow(hwnd);		// 销毁窗口, 并发送一条WM_DESTROY消息
		break;									//跳出该switch语句

	case WM_DESTROY:				//若是窗口销毁消息
		PostQuitMessage( 0 );		//向系统表明有个线程有终止请求。用来响应WM_DESTROY消息
		break;								//跳出该switch语句

	default:									//若上述case条件都不符合,则执行该default语句
		return DefWindowProc( hwnd, message, wParam, lParam );		//调用缺省的窗口过程
	}
	return 0;
}
以上内容转自《逐梦旅程  WINDOWS游戏编程之从零开始》 一书的第三章节
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值