先上代码:

systemclass.h

 #pragma once
#include"graphicsclass.h"
const bool FULLSCREEN = true;
class systemclass
{
public:
systemclass();
~systemclass();
bool Initialize();
void Run();
void Shutdown();
private:
graphicsclass *m_graphics;
HWND m_hwnd;
bool InitializeWindow(int screenwidth=, int screenheight=);
static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
};

从这个类头文件里可以看到,这个类有:

  • 3个公有方法:前面mian.cpp里都调用了它们
  • 1个私有方法:这是用来初始化窗口的函数,在公有方法Initialize()里调用
  • 1个静态私有方法:这是windows窗口的消息回掉函数,只是windows程序规定要有的,其实没有做任何事
  • 2个数据成员,一个graphicsclass对象,一个窗口句柄

systemclass.cpp

 #include "systemclass.h"

 systemclass::systemclass()
{
} systemclass::~systemclass()
{
}
bool systemclass::Initialize()
{
int screenwidth, screenheight;
screenheight = ;
screenwidth = ;
InitializeWindow(); m_graphics = new graphicsclass; if (!m_graphics)
{
return false;
}
bool result = m_graphics->Initialize(m_hwnd);
if (!result)
{
MessageBox(m_hwnd, L"graphics initialize failed!", , MB_OK);
} return true;
}
void systemclass::Run()
{
MSG msg;
bool flag = true;
while (flag)
{
if (PeekMessage(&msg, NULL, , , PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} if (msg.message == WM_QUIT)
{
flag = false;
}
flag=m_graphics->Frame();
}
}
void systemclass::Shutdown()
{
if (m_graphics)
{
m_graphics->Shutdown();
delete m_graphics;
m_graphics = ;
}
if (m_hwnd)
{
m_hwnd = ;
}
}
bool systemclass::InitializeWindow(int screenwidth, int screenheight)
{
WNDCLASSEX wc; int posX, posY;
posX = ;
posY = ;
int screenWidth = screenwidth;
int screenHeight = screenheight; HINSTANCE hinstance = GetModuleHandle(NULL); LPCWSTR applicationName = L"Engine"; wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = ;
wc.cbWndExtra = ;
wc.hInstance = hinstance;
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.hIconSm = wc.hIcon;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = applicationName;
wc.cbSize = sizeof(WNDCLASSEX); RegisterClassEx(&wc);
if (FULLSCREEN==true)
{
screenWidth = GetSystemMetrics(SM_CXSCREEN);
screenHeight = GetSystemMetrics(SM_CYSCREEN);
} m_hwnd = CreateWindowEx(WS_EX_APPWINDOW, applicationName, applicationName,
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_POPUP,
posX, posY, screenWidth, screenHeight, NULL, NULL, hinstance, NULL); ShowWindow(m_hwnd, SW_SHOW); return true;
}
LRESULT CALLBACK systemclass::WndProc(HWND hwnd, UINT umessage, WPARAM wparam, LPARAM lparam)
{
switch (umessage)
{
case WM_DESTROY:
{
PostQuitMessage();
return ;
}
case WM_CLOSE:
{
PostQuitMessage();
return ;
}
default:
return DefWindowProc(hwnd, umessage, wparam, lparam);
}
return ;
}

Public: 

Initialize()函数:调用了InitializeWindow()函数,生成了graphicsclass对象,调用了graphics类的Initialize()方法

Run()函数:windows消息循环,循环里调用了graphics类的Frame()方法,只要该方法的返回值不为false就一直循环。这其实是经典windows窗口程序有的一部分,本来peekMessage()部分是很重要的一部分,但是在本程序中它并没有作用,如果读者还有疑问,可以参考windows窗口程序相关资料。这里只要知道它是不断循环调用graphics类的Frame()方法就好了。

Shutdown()函数:清理生成的graphicsclass对象。相当于是虚析构函数。

private:

InitialilzeWindow()函数:这是systemclass所做的比较实质性的工作,生成一个windows窗口,我们来看它的流程:

  • 声明一个WNDCLASS数据结构wc,这是描述你要生成的窗口的数据结构
  • 获取当前程序的实例句柄hinstance,它是程序的一个标识,在这个程序中使用它的地方不多,我就不详细介绍它了
  • 填充wc数据结构,重要的部分有style:窗口风格;lpfnWndProc,消息回掉函数;hInstance,程序实例句柄;lpszClassName,窗口类名字;cbSize,wndclass数据结构的大小
  • 注册窗口
  • 调用windowsAPI:CreateWindowEx()创建窗口,获得一个窗口句柄
  • 显示窗口

WndProc()函数:这是消息回掉函数,响应操作系统通知的消息,没有实质性作用

我们可以看到,systemclass主要工作就是创建一个窗口并添加消息循环,另外就是生成一个graphicsclass对象,调用graphicsclass对象的Initialize方法和Frame方法。 我们可以猜到,涉及到图形渲染的工作的部分还藏在graphicclass里。

C++小项目:directx11图形程序(二):systemclass的更多相关文章

  1. C++小项目:directx11图形程序(一):主框架

    最近在学习DIRECTX11,在学习过程中编写了一个程序,到现在发现这个程序也有几行代码了,结构还算整齐,就想把这个程序分享出来,其中涉及到了C++程序的架构,windows窗口程序编写,和Direc ...

  2. C++小项目:directx11图形程序(四):d3dclass

    主菜终于来了.这个d3dclass主要做的工作是dx11图形程序的初始化工作,它将创建显示表面交换链,d3d设备,d3d设备上下文,渲染目标表面,深度模板缓存:设置视口,生成投影矩阵. D3D设备:可 ...

  3. 跟我一起用node-express搭建一个小项目(mongodb)[二]

    我的小项目主要是会用到MongoDB. 呵呵,我也是现学现卖. 都说小公司十八般武艺样样稀疏,没有办法啊! 兵来兵挡,将来将挡!自己是个兵呢?还是一个将呢! 没有公司培养,就自己培养自己呗.差的远一点 ...

  4. C++小项目:directx11图形程序(九):总结

    整篇文章中对于directx11的知识的介绍并不多,我也不知道怎么介绍,也应该说对于directx,它有它自己的部分,比如设备(device),设备上下文(devicecontext),顶点缓存,索引 ...

  5. C++小项目:directx11图形程序(三):graphicsclass

    这是框架的第三层graphicsclass,这个类才真正可以说是整个程序的框架,因为它组织了后面所有的成员. 代码: graphicsclass.h #pragma once #include< ...

  6. C++小项目:directx11图形程序(八):particleSysclass

    粒子系统类,粒子系统是游戏里细小元素的控制系统,虽然感觉上它对游戏的影响不大,但是其实有了它能给游戏增色不少.粒子系统控制着细小元素的生死,运动,纹理.对它的编写让我知道,游戏里的这一片从天空飘落的雪 ...

  7. C++小项目:directx11图形程序(七):modelclass

    模型类是世界空间中的表示物体的类,那么他的所做的事就是加载模型,移动模型,渲染模型 modelclass.h #pragma once #include <d3d11.h> #includ ...

  8. C++小项目:directx11图形程序(六):cameraclass

    cameraclass是一个相机类,它的作用是生成非常重要的观察矩阵.本小节涉及到一点数学知识,相对前面需要只是填充,调用,算是比较有趣的吧. cameraclass.h #pragma once # ...

  9. C++小项目:directx11图形程序(五):shadersclass

    这个类是用来创建着色器并设置输入布局的. 这个类比较特殊,它创建的着色器与Effect文件有关,effect文件是用高级着色语言(hlsl)编写的. shadersclass.h #pragma on ...

随机推荐

  1. ElasticSearch5中文分词(IK)

    ElasticSearch安装 官网:https://www.elastic.co 1.ElasticSearch安装 1.1.下载安装公共密钥 rpm --import https://artifa ...

  2. Kanzi Q&A

    Q:为什么我的kanzi studio安装完后无法编译apk? A:请安装jdk,并设置环境变量,并更新thirdpartsdk. Q:为什么使用路径无法读取到列表listbox内的列表项? A:列表 ...

  3. maven 使用tomcat插件 自动化部署war

    1.相关环境变量 idea tomcat8 maven3 2.增加tomcat user, 修改 $CATALINA_HOME/conf/tomcat-users.xml <tomcat-use ...

  4. RealSense开发-Session和SenseManager的几种创建方法

    从Intel RealSense 的SDK文档对其架构(如图1所示)的始描述可知,Session是SDK应用的主控模块,必须在所有模块操作之前创建,并且在所有模块注销后最后注销.SenseManage ...

  5. ie6、7 下input的边框问题 ?

    input的border设置为none,ie8及以上border都兼容,ie6和7的border还继续存在,将border设为0时所有浏览器上都不存在了,但是border为0时还是会继续的渲染. 将i ...

  6. 基于ubuntu 14搭建nginx+php+mysql环境

    基于最新的Ubuntu 14.04(2014年9月)搭建nginx.php.mysql环境, 以下全部命令行操作: 1 由于需要大量的权限操作,方便起见临时提升权限,使用root账号 sudo su ...

  7. replace和replaceAll

    replace():不可以正则 replaceAll()参数十一正则 replaceFirst()参数是一个正则,匹配第一次出现的 package entity; public class Test2 ...

  8. JS 之JSON

    JSON是Javascript中的对象,其简单理解为下:

  9. ajax post 请求415\ 400 错误

    今天用ajax 向后台发送 post请求时,出现了两个问题: 1, 发送请求后,控制台 返回  Unsupported media type-415(不支持的媒体类型),这时突然想起来,post 请求 ...

  10. jq checkbox 的全选并ajax传参

    /全选按钮 $("#all").click(function(){ if(this.checked){ $(":checkbox").prop("ch ...