先上代码:

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. 图解MySQL5.5详细安装与配置过程

    MySQL是一个开源的关系型数据库管理系统,原由瑞典MySQL AB公司开发,目前属于Oracle公司旗下.MySQL是目前世界上开源数据库中最受欢迎的产品之一,是应用最为广泛的开源数据库.MySQL ...

  2. centos升级glibc(升级到2.14版)

    1.下载源码包 到http://ftp.gnu.org/gnu/glibc/下载glibc-2.14.tar.xz 2.解压 tar glibc-2.14.tar.gz 3.创建build目录 cd ...

  3. AFNetworking的POST上传

    - (void)download { // 1.创建网络管理者 // AFHTTPSessionManager 基于NSURLSession AFHTTPSessionManager *manager ...

  4. 【树莓派】【转】利用USB网卡配置树莓派为无线热点

    由于Wifi很慢,基本不可用:树莓派有无线网卡,恰好看到有文章用树莓派来做无线热点,利用树莓派来共享无线网络.比较有用,转发后续尝试. 本文转自:https://www.embbnux.com/201 ...

  5. js 睡觉

    js睡觉 function sleep(numberMillis) { var now = new Date(); var exitTime = now.getTime() + numberMilli ...

  6. (原创)RS232串口信号定义

    好久没用动硬件了,串口更是好久没用用了. 曾经接口信号记得很清楚,久了,忘了. 今天,重新回顾,笔记记下. DB9接口分公头和母头,公头即插针头,电脑机箱上多少公头.母头即插孔座. 合理的硬件设计均以 ...

  7. ROS学习笔记(四)——环境变量配置

    1.查看环境变量配置情况,其实并没有什么卵用 $ export | grep ROS 或者用 $ printenv | grep ROS2.配置环境变量??$ source /opt/ros/indi ...

  8. BWT压缩算法(Burrows-Wheeler Transform)

    参考: BWT (Burrows–Wheeler_transform)数据转换算法 压缩技术主要的工作方式就是找到重复的模式,进行紧密的编码. BWT(Burrows–Wheeler_transfor ...

  9. 可靠UDP

    tcp为我们做了什么事情? 总得来说,tcp做了这几件事: 通过序列号和基于确认的超时重传机制,为上层提供了可靠的字节流服务: 通过滑动窗口.拥塞窗口提供了流量控制: 默认情况下,为了有效利用带宽,t ...

  10. centos中安装字体

    转载自:http://blog.csdn.net/wlwlwlwl015/article/details/51482065 在使用phantomjs做自动化网页截图时,发现截图都没有文字.最后好久才发 ...