先上代码:

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. android应用内存使用情况

    单个应用程序最大内存限制,超过这个值会产生OOM(内存溢出) 命令:adb shell ->dalvik.vm.heapgrowthlimit 应用启动后分配的初始内存 命令:adb shell ...

  2. OpenLayers图形与列表互动

    项目上遇到这样一种需求:查询数据库后得到结果(带地理位置的)列表,每个结果在地图上都是一个四边形,四边形之间有交叉,有重叠,需要实现地图上的四边形和结果列表的互动.抛开其他逻辑功能,互动需求可以表示为 ...

  3. iStylePDF安全电子文档解决方案之电子合同在线订立

    交易是商业世界不可或缺的一部分,而签名是交易的凭证.可是,尽管互联网和IT技术已经很发达,但每逢遇到签名,还是得用最原始的方法——握笔写字.与如今走到哪都能听到“互联网+”相比有点不合潮流,通过电子签 ...

  4. Http referer origin

    为了防止CSRF的攻击,我们建议修改浏览器在发送POST请求的时候加上一个Origin字段,这个Origin字段主要是用来标识出最初请求是从哪里发起的.如果浏览器不能确定源在哪里,那么在发送的请求里面 ...

  5. Deep Learning 23:dropout理解_之读论文“Improving neural networks by preventing co-adaptation of feature detectors”

    理论知识:Deep learning:四十一(Dropout简单理解).深度学习(二十二)Dropout浅层理解与实现.“Improving neural networks by preventing ...

  6. 金融IC卡 ARQC和ARPC计算方法和实例(转)

    假设发卡行的IC卡应用密钥如下:   PBOC_IMK_AC               F0C34A8124CEE0A91A0B034AA97D6EAC PBOC_IMK_ENC           ...

  7. Evolutionary Computing: 5. Evolutionary Strategies(2)

    Resource: Introduction to Evolutionary Computing, A.E.Eliben Outline recombination parent selection ...

  8. unity自带寻路Navmesh入门教程(二)

    上一节简单介绍了NavMesh寻路的基本用法,这次来介绍一下稍微复杂一点点的高低落差以及跳跃的做法,首先来看看这次的目标:   由于博客相册上传GIF有限制,所以我把整个过程切开了2部分上传,第一部分 ...

  9. Spring IOC/DI- 3 different types

    理论: IOC(Inversion of Control控制反转) DI(依赖注入) (Dependency Injection)   它不是一种技术而是一种思想.当初IOC理论的提出就是为了解决对象 ...

  10. centos6.8服务器部署svn

    1. 安装svn yum list svn* yum install subversion 2. 测试svn安装是否成功 svnserve –version 3. 创建代码仓库 mkdir /usr/ ...