#include<d3d9.h>

 #pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib") #define WINDOW_CLASS "UGPDX"
#define WINDOW_NAME "Blank D3D Window" // Function Prototypes...
bool InitializeD3D(HWND hWnd, bool fullscreen);
void RenderScene();
void Shutdown(); // Direct3D object and device.
LPDIRECT3D9 g_D3D = NULL;
LPDIRECT3DDEVICE9 g_D3DDevice = NULL; //==========================================================================================================
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage();
return ;
break; case WM_KEYUP:
if(wParam == VK_ESCAPE) PostQuitMessage();
break;
} return DefWindowProc(hWnd, msg, wParam, lParam);
}
//==========================================================================================================
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)
{
// Register the window class
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
WINDOW_CLASS, NULL };
RegisterClassEx(&wc); // Create the application's window
HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME, WS_OVERLAPPEDWINDOW,
, , , , GetDesktopWindow(), NULL,
wc.hInstance, NULL); // Initialize Direct3D
if(InitializeD3D(hWnd,false))
{
// Show the window
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd); // Enter the message loop
MSG msg;
ZeroMemory(&msg, sizeof(msg)); while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
RenderScene();
}
} // Release any and all resources.
Shutdown(); // Unregister our window.
UnregisterClass(WINDOW_CLASS, wc.hInstance);
return ;
}
//====================================================================================
//InitializeD3D函数的参数有窗口句柄hWnd,标识窗口是否全屏的标识符fullscreen
// (窗口句柄是在调用CreateWindows()函数创建窗口句柄时,返回给WinMain()函数的数值)
//1、Direct3DCreat9()函数将创建一个Direct3D接口对象,并返回该对象
//2、GetAdapterDisplayMode()将返回当前的显示信息,分辨率、显示格式、显示器的刷新频率等。该函数的参数包括正在查询的适配器以及保存信息的显示模式对象。将D3DADAPTER_DEFAULT发送给函数,详细说明代码,通过这些代码可以获取想要的主显卡信息。
// (D3DPRESENT_PARAMETERS结构用于定义Direct3D窗口的显示信息。这样可以设置正在创建窗口的期望宽度和高度,刷新率,显示模式为全屏或窗口,后天缓存数目等)
//3、CreateDevice()主要负责创建Direct3D设备对象,该对象用于向屏幕渲染图形
// (CreateDevice()函数中的1\Adapter。该参数用于指定正在使用的显卡。
// 2\DeviceType是一个标识符,用于指定Direct3D中的渲染方式。该参数的参数值可以是采用硬件渲染的D3DDEVTYPE_HAL、采用软件渲染的D3DDEVTYPE_REF、不需要软硬件支持的D3DDEVTYPE_NULLREF,或是采用要进行渲染工作的可插拔软件的D3DDEVTYPE_SW。软件渲染标识符允许运行Direct3D程序,它可以使用硬件不支持的特性。软件渲染存在的问题是渲染速度慢,尤其是在开发游戏时。
// 3\hFocusWindow是一个窗口句柄
// 4\BehaviorFlags是标识符组合,用于指定设备的运行方式
// 5\pPresentationParameter是一个指针,它指向该函数前面创建的D3DPRESENT_PARAMTERS结构
// 6\ppReturnedDeviceInterface是一个指针,它指向新创建的Direct3D设备对象。如果该对象为NULL(空),或是函数返回除D3D_OK以外的值,那么Direct3D设备的创建失败。
//一旦完成Direct3D的设置和创建,就可以随意渲染屏幕。初始化阶段的CreateDevice()函数中创建的设备对象可以完成Direct3D中的渲染工作。渲染屏幕开始先要清屏为指定的颜色,告知Direct3D将要开始绘制新场景,渲染想要渲染的物体,完成屏幕渲染,在屏幕上显示渲染结果。
//====================================================================================
bool InitializeD3D(HWND hWnd, bool fullscreen)
{
D3DDISPLAYMODE displayMode; // Create the D3D object. g_D3D = Direct3DCreate9(D3D_SDK_VERSION);
if(g_D3D == NULL) return false; // Get the desktop display mode.
if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))//
return false; // Set up the structure used to create the D3DDevice
D3DPRESENT_PARAMETERS d3dpp;//定义一个结构体用于定义Direct3D窗口的显示信息(具体见定义处)
ZeroMemory(&d3dpp, sizeof(d3dpp)); if(fullscreen)
{
d3dpp.Windowed = FALSE;//标识符用于指定创建的窗口是否是全屏窗口。
d3dpp.BackBufferWidth = ;//窗口宽
d3dpp.BackBufferHeight = ;
}
else
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//成员变量MultiSampleType、MultiSampleQuality和SwapEffect处理交换效果
d3dpp.BackBufferFormat = displayMode.Format; // Create the D3DDevice
if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice)))
{
return false;
} return true;
}
//==========================================================================================================
//Clear()函数的参数包括:
// 1\要清除的矩形数目(0代表清除整个屏幕)
// 2\定义想要清除的屏幕区域矩形链表(NULL代表整个屏幕)
// 3\标识要清除内容的标识符4\清除后的颜色5\要设定的深度值6\设定模板缓存值
// 对标识符参数而言,D3DCLEAR_DEFAULT清除所有的渲染目标,D3DCLEAR_STENCIL清除模板缓存,而D3DCLEAR_ZBUFFER清除深度缓存
//一旦完成清除工作,渲染函数将调用设备对象的BeginScene()函数,在Direct3D中启动一个新场景。
//在Direct3D中渲染任何图形前,都必须先调用BeginScene()函数。一旦渲染完要渲染的物体,就调用设备对象的EndScene()函数结束渲染。
// 记住:每个BeginScene()函数必须有一个与之对应的EndScene()函数。
//调用设备对象的Present()函数可以完成显示。就目前的学习而言,Present()函数的参数可以全部设为NULL(空)。
// 第一个参数是正在显示的原始矩形,如果不使用交换链,那么该值必须为NULL(空)。
// 第二个参数是一个指针,它指向要渲染的最终矩形。
// 第三个参数是正在显示的窗口的窗口句柄。另外,由于没有用到交换链,所以对正在使用的窗口句柄而言,该值设为NULL(空)。这个正在使用的窗口句柄是在Direct3D初始化过程中为D3DPRESENT_PARAMETERS对象设置的窗口句柄。
// 最后一个参数是缓存区域,它代表需要更新的最小区域。同样,该参数涉及到交换链,也可以设为NULL(空)。
//==========================================================================================================
void RenderScene()
{
// Clear the backbuffer.
g_D3DDevice->Clear(, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(,,), 1.0f, ); // Begin the scene. Start rendering.
g_D3DDevice->BeginScene(); // End the scene. Stop rendering.
g_D3DDevice->EndScene(); // Display the scene.
g_D3DDevice->Present(NULL, NULL, NULL, NULL);
} //==========================================================================================================
void Shutdown()
{
if(g_D3DDevice != NULL) g_D3DDevice->Release();
if(g_D3D != NULL) g_D3D->Release();
}
//==========================================================================================================

[direct-X] direct-X最小框架的更多相关文章

  1. 03、NetCore2.0下Web应用之搭建最小框架

    03.NetCore2.0下Web应用之搭建最小框架 这里我们不使用VS2017或者CLI命令的方式创建Asp.Net Core 2.0网页应用程序,而是完全手工的一点点搭建一个Web框架,以便更好的 ...

  2. [stm32] GPIO及最小框架

    1.GPIO硬件结构图: 2.GPIO程序结构: 3.框架介绍: 这里的ASM是固定启动文件夹,startup_stm32f10x_hd.s表示当前stm32类型为高容量设备,当然还有md.s等. C ...

  3. Django Web最小框架

    1:环境 MAC+Pycharm 2:Web框架搭建 新建py工程: 工程右键->Open in terminal: django-admin startproject mysite cd my ...

  4. [游戏模版1] MFC最小框架(base function including)

    >_<:Here are the template of mini-MFC include: CPen,CBrush,Front,Paint Line and some other gra ...

  5. [游戏模版2] Win32最小框架

    >_<:Just the minimum Win32  frame don't have any other special function. //{{NO_DEPENDENCIES}} ...

  6. RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较(转)

    RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储 RabbitMQ提供了四种Exchange:fanout,direct, ...

  7. Tomcat 9内存溢出:"http-apr-8080-Acceptor-0" java.lang.OutOfMemoryError: Direct buffer memory

    Tomcat开启了APR模式,而APR模式会使用堆外内存,关于堆内存可从如下链接了解一下:http://blog.csdn.net/zhouhl_cn/article/details/6573213. ...

  8. CI框架整合微信公共平台接口

    #CI框架控制器 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /*** CI框架整合微信 ...

  9. 深入剖析 RabbitMQ —— Spring 框架下实现 AMQP 高级消息队列协议

    前言 消息队列在现今数据量超大,并发量超高的系统中是十分常用的.本文将会对现时最常用到的几款消息队列框架 ActiveMQ.RabbitMQ.Kafka 进行分析对比.详细介绍 RabbitMQ 在 ...

随机推荐

  1. .NET高级工程师面试题之SQL篇

    1 题目 这确实是一个真实的面试题,琢磨一下吧!知识不用,就会丢掉,我太依赖各种框架和dll了,已经忘记了最基本的东西.有多久没有写过SQL了,我已经不记得了. 已知表信息如下: Department ...

  2. lnmp重置mysql密码

    第一种方法:用军哥的一键修改LNMP环境下MYSQL数据库密码脚本一键脚本肯定是非常方便.具体执行以下命令: wget http://soft.vpser.net/lnmp/ext/reset_mys ...

  3. S2 第二本书 深入.NET平台和C#编程 总结 by天命

    第一章 深入.NET框架 .NET框架 包含 CLR公共语言运行时 FCL框架类库 CLR(Common Language Runtime)公共语言运行时 CLS(Common Language Sp ...

  4. bzoj 2152聪聪可可

    2152: 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MB Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰 ...

  5. Selenium2+python自动化5-操作浏览器基本方法

    前言 前面已经把环境搭建好了,这从这篇开始,正式学习selenium的webdriver框架.我们平常说的 selenium自动化,其实它并不是类似于QTP之类的有GUI界面的可视化工具,我们要学的是 ...

  6. LightOJ 1094 - Farthest Nodes in a Tree(树的直径)

    http://acm.hust.edu.cn/vjudge/contest/121398#problem/H 不是特别理解,今天第一次碰到这种问题.给个链接看大神的解释吧 http://www.cnb ...

  7. instr函数

    在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置. 语法如下:instr( string1, string2 [, start_position [, nth_appe ...

  8. 交换机和VLAN

    交换机 交换机的两个作用:一是维护CAM表,CAM表是计算机的MAC地址和交换机端口的映射表:另一个是根据CAM来进行数据的转发. 以太网交换机转发数据帧有三种方式: 1.存储转发:即先存储后转发的方 ...

  9. Oracle primary,unique,foreign 区别,Hibernate 关联映射

    Oracle primary,unique,foreign 区别 转:http://www.cnblogs.com/henw/archive/2012/08/15/2639510.html NOT N ...

  10. Jfinal 使用 JsonKit 转换不了问题

    使用bootStrap+jfinal开发一个管理系统,遇到了前台ajax获取数据,使用了jfinal的Jsonkit,将一个继承了model的vo进行转换,却一直没有将vo的属性值转换为json格式, ...