C++小项目:directx11图形程序(二):systemclass
先上代码:
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的更多相关文章
- C++小项目:directx11图形程序(一):主框架
最近在学习DIRECTX11,在学习过程中编写了一个程序,到现在发现这个程序也有几行代码了,结构还算整齐,就想把这个程序分享出来,其中涉及到了C++程序的架构,windows窗口程序编写,和Direc ...
- C++小项目:directx11图形程序(四):d3dclass
主菜终于来了.这个d3dclass主要做的工作是dx11图形程序的初始化工作,它将创建显示表面交换链,d3d设备,d3d设备上下文,渲染目标表面,深度模板缓存:设置视口,生成投影矩阵. D3D设备:可 ...
- 跟我一起用node-express搭建一个小项目(mongodb)[二]
我的小项目主要是会用到MongoDB. 呵呵,我也是现学现卖. 都说小公司十八般武艺样样稀疏,没有办法啊! 兵来兵挡,将来将挡!自己是个兵呢?还是一个将呢! 没有公司培养,就自己培养自己呗.差的远一点 ...
- C++小项目:directx11图形程序(九):总结
整篇文章中对于directx11的知识的介绍并不多,我也不知道怎么介绍,也应该说对于directx,它有它自己的部分,比如设备(device),设备上下文(devicecontext),顶点缓存,索引 ...
- C++小项目:directx11图形程序(三):graphicsclass
这是框架的第三层graphicsclass,这个类才真正可以说是整个程序的框架,因为它组织了后面所有的成员. 代码: graphicsclass.h #pragma once #include< ...
- C++小项目:directx11图形程序(八):particleSysclass
粒子系统类,粒子系统是游戏里细小元素的控制系统,虽然感觉上它对游戏的影响不大,但是其实有了它能给游戏增色不少.粒子系统控制着细小元素的生死,运动,纹理.对它的编写让我知道,游戏里的这一片从天空飘落的雪 ...
- C++小项目:directx11图形程序(七):modelclass
模型类是世界空间中的表示物体的类,那么他的所做的事就是加载模型,移动模型,渲染模型 modelclass.h #pragma once #include <d3d11.h> #includ ...
- C++小项目:directx11图形程序(六):cameraclass
cameraclass是一个相机类,它的作用是生成非常重要的观察矩阵.本小节涉及到一点数学知识,相对前面需要只是填充,调用,算是比较有趣的吧. cameraclass.h #pragma once # ...
- C++小项目:directx11图形程序(五):shadersclass
这个类是用来创建着色器并设置输入布局的. 这个类比较特殊,它创建的着色器与Effect文件有关,effect文件是用高级着色语言(hlsl)编写的. shadersclass.h #pragma on ...
随机推荐
- Object-C
#import <Foundation/Foundation.h> #pragma mark 狗类的声明 @interface Dog:NSObject { @public NSStrin ...
- 安装php-amqplib(RabbitMQ的phpAPI)
历史经验告诉我们,装逼没有好下场. 总结一下之前composer安装php-amqplib包失败的原因: composer安装的时候需要指定PHP执行文件的位置: PHP安装路径:/usr/local ...
- ueditor .net版本上传图片功能配置
1.官网下载 UEditor .Net最新版:官方网址:http://ueditor.baidu.com/website/download.html#ueditor UTF-8版 和GBK版选择疑 ...
- C# 只移除最后一个字符
string str = "|||"; Console.WriteLine(str.Substring(0, str.Length - 1)); Console.WriteLine ...
- jquery了解
jQuery 库 - 特性 jQuery 是一个 JavaScript 库. jQuery 是一个 JavaScript 函数库. jQuery 库包含以下特性: HTML 元素选取 HTML 元素操 ...
- 如何离线创建Ionic/cordova项目
在创建ionic项目的时候,需要联网下载许多东西,由于墙的缘故,我们在创建.添加android平台.编译过程中,失败的可能性非常高,为解决这个问题,我创建了一个空的Ionic1 tab项目,并完成了上 ...
- java面向对象的语言
对象:真实存在唯一的事物. 类: 实际就是对某种类型事物的共性属性与行为的抽取. 抽象的概念.... 车 我们从小的时候就不断的接触很多的对象,我们的大脑就会把 这些具备相同属性与行为的事物进行分类. ...
- jq checkbox 的全选并ajax传参
/全选按钮 $("#all").click(function(){ if(this.checked){ $(":checkbox").prop("ch ...
- Python_Day8_面向对象编程进阶
本节内容: 面向对象高级语法部分异常处理 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 Socket开发基础 经典类vs新式类 classical vs new style: 经典 ...
- centos7 升级内核到最新版本
centos7 从问世以来,官网提供的镜像始终是3.10 版本,该版本最大的一个问题是对硬件驱动(尤其是无线网卡)的支持不是很好,本人亲测>5种机型,无线网卡均无法正常使用,如果是非主流机型,手 ...