一.简介

二.Direct3D类

1.创建D3D类

IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion);

//Direct3D类的创建

IDirect3D9* d3d9=0;
d3d9=Direct3DCreate9(D3D_SDK_VERSION);

2.获取设备类型

STDMETHOD(GetDeviceCaps)(

THIS_ UINT Adapter,             //设备显示器(显卡)

D3DDEVTYPE DeviceType,   //要获取的设备类型

D3DCAPS9* pCaps                //要获取的设备参数

) PURE;

  • Adapter

    D3DADAPTER_DEFAULT

  • DeviceType

    D3DDEVTYPE_HAL

    D3DDEVTYPE_REF

D3DCAPS9 caps;
D3DDEVTYPE deviceType;
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);

3.判断显卡是否支持硬件加速

D3DCAPS9是设备参数结构体,不仅可以用来获取设备类型还可以用来判断是否支持硬件加速

int vp=0;
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;

4.填充显示参数结构体

typedef struct _D3DPRESENT_PARAMETERS_{

UINT BackBufferWidth;                                      //后台缓冲区宽度

UINT BackBufferHeight;                                    //后台缓冲区高度

D3DFORMAT BackBufferFormat;                     //后台缓冲区像素格式

UINT BackBufferCount;                                     //后台缓冲区数量

D3DMULTISAMPLE_TYPE MultiSampleType;  //多重采样类型

DWORD MultiSampleQuality;                            //多重采样质量

D3DSWAPEFFECT SwapEffect;                       //缓冲区的交换方式

//Direct3D用交换链来交替两帧之间的过渡,用IDirect3DSwapChain接口来表示

HWND hDeviceWindow;                                    //窗口句柄

BOOL Windowed;                                              //全屏或者窗口

BOOL EnableAutoDepthStencil;                       //是否开启深度缓存和模板缓存

//深度缓存是一个表面,担不是存储图像数据而是用来记录像素深度信息,用来确定物体的前后关系正确绘制的z-buffering技术

D3DFORMAT AutoDepthStencilFormat;          //指定深度缓冲及模板缓冲区的格式

DWORD Flags;                                        //其他的附加特性标志(通常指定为0或NULL)

UINT FullScreen_RefreshRateInHz;        //指定屏幕的刷新频率

UINT PresentationInterval;                    //指定屏幕的翻转模式

}D3DPRESENT_PARAMETERS;

  • BackBufferFormat

    D3DFMT_UNKOWN:默认

    D3DFMT_R8G8B8:表示24为像素

    D3DFMT_X8R8G8B8:表示一个32为像素

  • Multisampling

    D3DMULTISAMPLE_NONE:不使用全屏抗锯齿

    D3DMULTISAMPLE_1_SAMPLE - D3DMULTISAMPLE_16_SAMPLE:设定1-16级

  • SwapEffect

    D3DSWAPEEFECT_COPY     :swap时,拷贝后缓冲区的内容到前缓冲区,后缓冲区的内容不变。

    D3DSWAPEEFECT_FLIP        :swap时,交换前后缓冲区指针,完成翻页,之后后缓冲区的内容是前缓冲区的内容

    D3DSWAPEEFECT_DISCARD:可能是COPY也可能是FLIP,由设备来确定最适合当前情况的方式。

    D3DSWAPEFFECT_DISCARD:清除后台缓存的内容

    D3DSWAPEEFECT_FLIP:保留后台缓存的内容。当缓存区>1时。

    D3DSWAPEFFECT_COPY: 保留后台缓存的内容,缓冲区=1时。

  • AutoDepthStencilFormat

    D3DFMT_D32:指定一个32位的深度缓冲区

    D3DFMT_D24S8:指定一个32位的深度/模板缓冲区,其中24位用于深度缓冲区,8位用于模板缓冲区

    D3DFMT_D24X8:指定一个32位的深度/模板缓冲区,其中24位用于的度缓冲区,8位空闲

    D3DFMT_D24X4S4:指定一个32位的深度/模板缓冲区,其中24位用于深度缓冲区,4位用于模板缓冲区,4位空闲

    D3DFMT_D16:指定一个16位的深度缓存区

    D3DFMT_D15S1:指定一个16位的深度/模板缓冲区,其中15位用于深度缓冲区,1位用于模板缓冲区

  • Flags

    D3DPRESENTFLAG_LOCKABLE_BACKBUFFER:表示后缓冲区可以被锁定,需要注意的是这样缓冲区会降低程序的运行效率。

    D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL:指定深度缓冲区和模板缓冲区在后一个缓冲区被渲染(即调用Present方法后)的时候将被释放

  • FullScreen_RefreshRateInHz

    在窗口模式下,必须指定为0或D3DPRESENT_RATE_DEFAULT(即默认的),表示使用与当前屏幕相同的刷新率)

    D3DPRESENT_RATE_DEFAULT:表示使用默认刷新率,即与屏幕刷新率相同。

    D3DPRESENT_RATE_UNLIMITED:表示图形绘制结束后立刻将内容复制到前台缓冲区。

  • PresentationInterval

    在窗口模式下,其取值为0,只能选用D3DPRESENT_INTERVAL_DEFAULT

    D3DPRESENT_INTERVAL_DEFAULT:D3D选择交换频率,通常等同于屏幕刷新率

    D3DPRESENT_INTERVAL_IMMEDIATE:立即显示更新(或立即交换),不推荐

    D3DPRESENT_INTERVAL_ONE:等待一个垂直扫描周期才更新,有助于减少剪断和撕裂效果(其实DEFAULT和ONE完全无区别)

    D3DPRESENT_INTERVAL_TWO~FOUR:分别对应等待相应个数周期才更新

D3DPRESENT_PARAMETERS d3dpp;

d3dpp.BackBufferWidth            = width;
d3dpp.BackBufferHeight = height;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = windowed;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

5.创建D3D设备类

HRESULT CreateDevice(

UINT Adapter,                        //默认显示适配器(显卡)

D3DDEVTYPE DeviceType,  //设备类型

HWND hFocusWindow,         //窗口句柄

DWORD BehaviorFlags,       //是否支持硬件顶点处理的枚举值

D3DPRESENT_PARAMETERS *pPresentationParameters,  //显示参数结构体

IDirect3DDevice9** ppReturnedDeviceInterface                   //要创建的D3D设备类

);

//Direct3D设备类的创建

IDirect3DDevice9* Device=0;
HRESULT hr=d3d9->CreateDevice(
D3DADAPTER_DEFAULT,
deviceType,
hwnd,
vp,
&d3dpp,
device);

五.完整版示例

1.d3dUntility.h

//////////////////////////////////////////////////////////////////////////////////////////////////
//
// File: d3dUtility.h
//
// Author: Frank Luna (C) All Rights Reserved
//
// System: AMD Athlon 1800+ XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0
//
// Desc: Provides utility functions for simplifying common tasks.
//
////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef __d3dUtilityH__
#define __d3dUtilityH__ #include <d3dx9.h>
#include <string>
#include <tchar.h> #pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"d3dx9.lib") namespace d3d
{
bool InitD3D(
HINSTANCE hInstance, // [in] Application instance.
int width, int height, // [in] Backbuffer dimensions.
bool windowed, // [in] Windowed (true)or full screen (false).
D3DDEVTYPE deviceType, // [in] HAL or REF
IDirect3DDevice9** device);// [out]The created device. int EnterMsgLoop(
bool (*ptr_display)(float timeDelta)); LRESULT CALLBACK WndProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam); template<class T> void Release(T t)
{
if( t )
{
t->Release();
t = 0;
}
} template<class T> void Delete(T t)
{
if( t )
{
delete t;
t = 0;
}
}
} #endif // __d3dUtilityH__

2.d3dUntility.cpp

//////////////////////////////////////////////////////////////////////////////////////////////////
//
// File: d3dUtility.cpp
//
// Author: Frank Luna (C) All Rights Reserved
//
// System: AMD Athlon 1800+ XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0
//
// Desc: Provides utility functions for simplifying common tasks.
//
////////////////////////////////////////////////////////////////////////////////////////////////// #include "d3dUnitility.h" bool d3d::InitD3D(
HINSTANCE hInstance,
int width, int height,
bool windowed,
D3DDEVTYPE deviceType,
IDirect3DDevice9** device)
{
//
// Create the main application window.
// WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)d3d::WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(0, IDI_APPLICATION);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = _T("Direct3D9App"); if( !RegisterClass(&wc) )
{
::MessageBoxA(0, "RegisterClass() - FAILED", 0, 0);
return false;
} HWND hwnd = 0;
hwnd = ::CreateWindow(_T("Direct3D9App"), _T("Direct3D9App"),
WS_EX_TOPMOST,
0, 0, width, height,
0 /*parent hwnd*/, 0 /* menu */, hInstance, 0 /*extra*/); if( !hwnd )
{
::MessageBoxA(0, "CreateWindow() - FAILED", 0, 0);
return false;
} ::ShowWindow(hwnd, SW_SHOW);
::UpdateWindow(hwnd); //
// Init D3D:
// HRESULT hr = 0; // Step 1: Create the IDirect3D9 object. IDirect3D9* d3d9 = 0;
d3d9 = Direct3DCreate9(D3D_SDK_VERSION); if( !d3d9 )
{
::MessageBoxA(0, "Direct3DCreate9() - FAILED", 0, 0);
return false;
} // Step 2: Check for hardware vp. D3DCAPS9 caps;
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps); int vp = 0;
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; // Step 3: Fill out the D3DPRESENT_PARAMETERS structure. D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = width;
d3dpp.BackBufferHeight = height;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = windowed;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // Step 4: Create the device. hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT, // primary adapter
deviceType, // device type
hwnd, // window associated with device
vp, // vertex processing
&d3dpp, // present parameters
device); // return created device if( FAILED(hr) )
{
// try again using a 16-bit depth buffer
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT,
deviceType,
hwnd,
vp,
&d3dpp,
device); if( FAILED(hr) )
{
d3d9->Release(); // done with d3d9 object
::MessageBoxA(0, "CreateDevice() - FAILED", 0, 0);
return false;
}
} d3d9->Release(); // done with d3d9 object return true;
} int d3d::EnterMsgLoop( bool (*ptr_display)(float timeDelta) )
{
MSG msg;
::ZeroMemory(&msg, sizeof(MSG)); static float lastTime = (float)timeGetTime(); while(msg.message != WM_QUIT)
{
if(::PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
else
{
float currTime = (float)timeGetTime();
float timeDelta = (currTime - lastTime)*0.001f; ptr_display(timeDelta); lastTime = currTime;
}
}
return msg.wParam;
}

3.d3dInit.cpp

//////////////////////////////////////////////////////////////////////////////////////////////////
//
// File: d3dinit.cpp
//
// Author: Frank Luna (C) All Rights Reserved
//
// System: AMD Athlon 1800+ XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0
//
// Desc: Demonstrates how to initialize Direct3D, how to use the book's framework
// functions, and how to clear the screen to black. Note that the Direct3D
// initialization code is in the d3dUtility.h/.cpp files.
//
////////////////////////////////////////////////////////////////////////////////////////////////// #include "d3dUnitility.h"
#include <windows.h> //
// Globals
// IDirect3DDevice9* Device = 0; //
// Framework Functions
// bool Setup()
{
// Nothing to setup in this sample. return true;
} void Cleanup()
{
// Nothing to cleanup in this sample.
} bool Display(float timeDelta)
{
if( Device ) // Only use Device methods if we have a valid device.
{
// Instruct the device to set each pixel on the back buffer black -
// D3DCLEAR_TARGET: 0x00000000 (black) - and to set each pixel on
// the depth buffer to a value of 1.0 - D3DCLEAR_ZBUFFER: 1.0f.
Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0); // Swap the back and front buffers.
Device->Present(0, 0, 0, 0);
}
return true;
} //
// WndProc
//
LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg )
{
case WM_DESTROY:
::PostQuitMessage(0);
break; case WM_KEYDOWN:
if( wParam == VK_ESCAPE )
::DestroyWindow(hwnd);
break;
}
return ::DefWindowProc(hwnd, msg, wParam, lParam);
} //
// WinMain
//
int WINAPI WinMain(HINSTANCE hinstance,
HINSTANCE prevInstance,
PSTR cmdLine,
int showCmd)
{
if(!d3d::InitD3D(hinstance,
640, 480, true, D3DDEVTYPE_HAL, &Device))
{
::MessageBox(0, "InitD3D() - FAILED", 0, 0);
return 0;
} if(!Setup())
{
::MessageBox(0, "Setup() - FAILED", 0, 0);
return 0;
} d3d::EnterMsgLoop( Display ); Cleanup(); Device->Release(); return 0;
}

三.简化版示例

因为完整版代码比较多理解有点难,所以有些不必要的可以去掉,这样我们写些例子的时候,也可以精简一些

我们用一个.cpp和一个.hpp就可以实现了,它把窗口的创建和显示图像隔离开

1.d3dInit_k5.cpp

#include "d3dInit_k5.hpp"

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
//函数开始 int WINAPI/*基本调用_stdcall*/ WinMain(HINSTANCE hInstance,/*当前运行程序的实例句柄*/
HINSTANCE hPrevInstance,/*前一个句柄,一般都是NULL*/
LPSTR lpCmdLine,/*命令行参数,以空终止的字符串*/
int nCmdShow /*显示方式*/)
{
//声明一个窗口类结构体
WNDCLASS wc = { 0 }; //WNDCLASSEX比WNDCLASS多两个参数
//wc.cbSize = sizeof(PWNDCLASSEX);//表示该结构体的字节数大小
wc.style = CS_HREDRAW | CS_VREDRAW; // 窗口的风格样式 水平大小或垂直大小变化发生重绘
wc.lpfnWndProc = WndProc;//窗口的回调函数,响应事件的系统触发函数
wc.cbClsExtra = 0; //窗口类附加内存
wc.cbWndExtra = 0; //窗口的附加内存
wc.hInstance = hInstance; //指定包含窗口过程的程序的实例句柄
wc.hIcon = LoadIcon(0,/*程序句柄加载系统图标第一个参数为NULL,加载用户图标第一个参数为实例句柄*/
IDI_APPLICATION/*系统图标,或用户图标路径字符串*/);//窗口类的图标资源句柄
wc.hCursor = LoadCursor(0, IDC_ARROW);//箭头光标用法同上
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//背景画刷句柄
wc.lpszMenuName = 0; //指定菜单资源的名字,字符串形式
wc.lpszClassName = "Direct3D9App";//自定义的窗口类名字
//wc.hIconSm = 0;//托盘中应用程序的小图标 if (!RegisterClass(&wc))
{
::MessageBox(0, TEXT("RegisterClass() - FAILED"), 0, 0);
return 0;
} HWND hwnd = 0;
hwnd = CreateWindow("Direct3D9App",//对应窗口类的名称
"K5窗口", //指定创建的窗口名字
WS_MAXIMIZEBOX, //创建窗口的样式
CW_USEDEFAULT, //水平位置
CW_USEDEFAULT, //竖直位置
width, //宽
height, //高
0 /*父窗口的句柄*/,
0 /* 菜单资源句柄 */,
hInstance, //程序实例句柄
0 /*WM_CREATE消息lParam数据指针*/); if (!hwnd)
{
::MessageBox(0, TEXT("CreateWindow() - FAILED"), 0, 0);
return 0;
} ::ShowWindow(hwnd, SW_SHOW);
::UpdateWindow(hwnd); Cd3d d3d;
d3d.InitD3D(hwnd); //消息循环
MSG msg = { 0 };
float lastTime = (float)timeGetTime();
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
float curTime = (float)timeGetTime();
float timeDelta = (curTime - lastTime)*0.001f;
if (Device)
{
d3d.RenderD3D();
}
lastTime = curTime;
}
}
UnregisterClass("Direct3D9App",wc.hInstance);
return 0;
} LRESULT CALLBACK WndProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
::PostQuitMessage(0);
break; case WM_KEYDOWN:
if (wParam == VK_ESCAPE)
::DestroyWindow(hwnd);
break;
}
return ::DefWindowProc(hwnd, msg, wParam, lParam);
}

2.d3dInit_k5.hpp

#include <Windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib") //声明
const int width = 800;
const int height = 600;
IDirect3DDevice9* Device = 0;
D3DDEVTYPE deviceType = D3DDEVTYPE_HAL; class Cd3d{ public:
bool InitD3D(HWND hwnd);
void RenderD3D();
}; bool Cd3d::InitD3D(HWND hwnd){ //初始化DirectX
HRESULT hr = 0;
IDirect3D9* d3d9 = 0;
d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
if (!d3d9)
{
::MessageBox(0, TEXT("Direct3DCreate9() - FAILED"), 0, 0);
return false;
} D3DCAPS9 caps;
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);
int vp = 0;
if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = width;//后备缓冲表面的宽度
d3dpp.BackBufferHeight = height;//后备缓冲表面的高度
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;//后备缓冲表面的像素格式
d3dpp.BackBufferCount = 1;//后备缓冲表面的数量
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;//全屏抗锯齿的类型
d3dpp.MultiSampleQuality = 0;//全屏抗锯齿的质量等级
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//指定表面在交换链中是如何被交换
d3dpp.hDeviceWindow = hwnd;//与设备相关的窗口句柄,想在哪个窗口绘制就写那个窗口的句柄
d3dpp.Windowed = true;//true为窗口模式,false则为全屏模式
d3dpp.EnableAutoDepthStencil = true;//设为true,D3D将自动创建深度/模板缓冲
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;//深度/模板缓冲的格式
d3dpp.Flags = 0; //一些附加特性,设为0或者D3DPRESENTFLAG类型的一个成员,一个表面能够被锁定,降低程序的性能,一个深度/模板缓冲调用present后会被删除,提升程序性能
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;//刷新频率
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;//交换方式(D3DPRESENT_INTERVAL_IMMEDIATE立即交换,D3DPRESENT_INTERVAL_DEFAULT 等于刷新频率) hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT, // 指定对象要表示的物理显示设备
deviceType, // 设备类型
hwnd, // 设备的窗口句柄
vp, // 采用硬件顶点处理或者软件顶点处理
&d3dpp, // 初始化好的D3DPRESENT_PARAMETERS实例
&Device); // 返回创建的设备
if (FAILED(hr))
{
// try again using a 16-bit depth buffer
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT,
deviceType,
hwnd,
vp,
&d3dpp,
&Device); if (FAILED(hr))
{
d3d9->Release(); // done with d3d9 object
::MessageBox(0, TEXT("CreateDevice() - FAILED"), 0, 0);
return 0;
}
}
else{
//开始设置参数
} d3d9->Release(); // done with d3d9 object return true;
} void Cd3d::RenderD3D(){ Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffff0000, 1.0f, 0);
//开始显示
Device->Present(0, 0, 0, 0);
}

DirectX9:基础篇 第一章 初始化Direct3D的更多相关文章

  1. 《DirectX 9.0 3D游戏开发编程基础》 第一章 初始化Direct3D 读书笔记

    REF设备 参考光栅设备,他能以软件计算方式完全支持Direct3D Api.借助Ref设备,可以在代码中使用那些不为当前硬件所支持的特性,并对这此特性进行测试. D3DDEVTYPE 在程序代码中, ...

  2. Java语言程序设计(基础篇)第一章

    第一章 计算机.程序和Java概述 1.1 引言 什么是程序设计呢? 程序设计就是创建(或者开发)软件,软件也称为程序. 1.2 什么是计算机 计算机是存储和处理数据的电子设备,计算机包括硬件(har ...

  3. DirectX9:第一章 初始化Direct3D

    一.Direct3D概述 Direct3D是一套底层图形API,可以被视为应用程序与图形设备交互的中介. 应用程序.Direct3D以及硬件之间的交互关系: 在Direct3D和图形设备之间有一个环节 ...

  4. 顶级c程序员之路 基础篇 - 第一章 关键字的深度理解 number-1

    c语言有32个关键字,每个关键字你都理解吗? 今天出场的是: auto ,  register,  static,   extern 为什么他们会一起呢,说到这里不得不谈到c语言对变量的描述. c给每 ...

  5. Java编程基础篇第一章

    计算机语言 人与计算机交流的方式. 计算机语言有很多种如:C语言,c++,Java等 人机交互 软件的出现实现了人与计算机之间的更好的交流(交互) 交互方式 图形化界面:便于交互,容易操作,简单直观, ...

  6. OpenGL完全教程 第一章 初始化OpenGL

    第一章 初始化OpenGL 无论是什么东西,要使用它,就必须对它进行初始化.如果你之前使用过GDI,你应该也多多少少了解到GDI在绘制图形之前要为之创建渲染环境.OpenGL也一样.本章给出的代码,大 ...

  7. 村田噪声抑制基础教程-第一章 需要EMI静噪滤波器的原因

    1-1. 简介 EMI静噪滤波器 (EMIFIL®) 是为电子设备提供电磁噪声抑制的电子元件,配合屏蔽罩和其他保护装置一起使用.这种滤波器仅从通过连线传导的电流中提取并移除引起电磁噪声的元件.第1章说 ...

  8. 从零开始的程序逆向之路基础篇 第二章——用OllyDbg(OD)分析一个简单的软件

    作者:Crazyman_Army 原文来自:https://bbs.ichunqiu.com/thread-43469-1-1.html 0x00知识回顾 (由于笔者省事,没开XP虚拟机,而且没关闭A ...

  9. ASP.NET自定义控件组件开发 第一章 第三篇 第一章的完结篇

    ASP.NET自定义控件组件开发 第一章 第三篇   第三篇:第一章的完结篇 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ...

随机推荐

  1. 针对媒体不实报道误导大众--抹黑C#工资垫底

    最近注意到一些媒体故意抹黑C# 工资垫底,参见 https://www.toutiao.com/i6741889572931633668/: 通过搜索引擎搜索<编程语言薪酬排行:Python薪资 ...

  2. mybatis #{}和${}的区别是什么?

    #{}是预编译处理,${}是字符串替换.mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值,最后注入进去是带引号的:mybatis在 ...

  3. QT两个窗口相互切换

    信号(signals)与槽(slots)是QT重要机制,例子使用了C++11 lambda表达式进行了信号与槽的连接. 实现两个窗口通过点击按钮完成互相切换,注意子窗口只能发送信号,不能处理,所有信号 ...

  4. Java 文章链接

    Java表单验证封装类 https://www.cnblogs.com/linjiqin/archive/2013/11/18/3429424.html 微信企业号接入JDK6和JDK7及JDK8加解 ...

  5. js 指定分隔符连接数组元素join()

    示例:<script type="text/javascript"> var myarr = new Array(3); myarr[0] = "I" ...

  6. Rxjs 操作符

    1. javascript解决异步编程方案 解决javascript异步编程方案有两种,一种是promise对象形式,还有一种是是Rxjs库形式,Rxjs相对于Promise来说,有好多Promise ...

  7. 为什么要学习go语言

    终于等到你!Go语言--让你用写Python代码的开发效率编写C语言代码. 为什么互联网世界需要Go语言 世界上已经有太多太多的编程语言了,为什么又出来一个Go语言? 硬件限制:摩尔定律已然失效 摩尔 ...

  8. shell检测网站地址是否存活

    #!/bin/bash . /etc/init.d/functions url_list=(www.baidu.com) ChkCurl(){ i=0 while [ $i -lt 2 ] do cu ...

  9. Vue/React圆环进度条

    数据展示,一直是各行各业乐此不疲的需求,具体到前端开发行业,则是各种各种图表数据展示,各种表格数据展示,烦不胜烦(繁不胜繁)! 前几天刚做了折线图.柱状图.饼状图之类的图表数据展示效果,今天又碰到了类 ...

  10. 从键盘录入输入3 个数num1,num2,num3,按从大到小进行输出

    本题分别使用嵌套分支语句以及三目运算符来实现,两种方法,可以对比看看. import java.util.Scanner; /** * 从键盘录入输入3 个数a,b,c,按从大到小进行输出 * @au ...