简单地学习了四个API:

 HRESULT CreateOffscreenPlainSurface(
[in] UINT Width, // 宽度
[in] UINT Height, // 高度
[in] D3DFORMAT Format, // 像素格式
[in] D3DPOOL Pool, // 内存池类型
[out, retval] IDirect3DSurface9 **ppSurface, // 返回的表面的指针
[in] HANDLE *pSharedHandle // 一般为NULL
);
 HRESULT GetBackBuffer(
[in] UINT iSwapChain, // 交换链索引,0为默认的交换链
[in] UINT BackBuffer, // 后备缓冲索引,从0开始,指定要得到的后备缓冲
[in] D3DBACKBUFFER_TYPE Type, // DX只支持D3DBACKBUFFER_TYPE_MONO
[out, retval] IDirect3DSurface9 **ppBackBuffer// 返回的指针
);
 HRESULT ColorFill(
[in] IDirect3DSurface9 *pSurface, // 要填充的表面
[in] const RECT *pRect, // 填充的矩形
[in] D3DCOLOR color // 填充的颜色
);
 HRESULT StretchRect(
[in] IDirect3DSurface9 *pSourceSurface, // 源表面
[in] const RECT *pSourceRect, // 源表面的矩形
[in] IDirect3DSurface9 *pDestSurface, // 目的表面
[in] const RECT *pDestRect, // 目的表面的矩形
[in] D3DTEXTUREFILTERTYPE Filter // 过滤
);
 #include <windows.h>
#include <d3dx9.h> #define SCREEN_W 800
#define SCREEN_H 600
#define APPNAME "myGame"
#define CLASSNAME "wndClass" IDirect3D9 *pD3D = NULL;
IDirect3DDevice9 *pD3DDev = NULL;
IDirect3DSurface9* pSur = NULL;
IDirect3DSurface9* pBackSur = NULL; #define SAFE_RELEASE(p) \
if (p) { \
p->Release(); \
p = NULL; \
} LRESULT WINAPI WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
switch (msg)
{
// case WM_PAINT:
// {
// BeginPaint(hWnd,&ps);
// EndPaint(hWnd,&ps);
// return 0;
// }
case WM_DESTROY:
{
PostQuitMessage();
return ;
}
} return DefWindowProc(hWnd,msg,wParam,lParam);
}
void initWndClass(HINSTANCE hInstance,WNDCLASSEX &wndClass)
{
wndClass.cbSize = sizeof(WNDCLASSEX);
wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = WndProc;
wndClass.cbClsExtra = ;
wndClass.cbWndExtra = ;
wndClass.hInstance = hInstance;
wndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wndClass.lpszClassName = TEXT(CLASSNAME);
wndClass.lpszMenuName = NULL;
wndClass.hIconSm = LoadIcon(NULL,IDI_WINLOGO);
} bool initD3D(HWND hWnd)
{ // 主要目的是获取设备,为调用下面的函数做很多准备。
// 比如 获取IDirect3D9 ,获取支持的顶点处理,填充后备缓冲相关参数等。 // IDirect3D9::CreateDevice(
//UINT Adapter,
//D3DDEVTYPE DeviceType,
//HWND hFocusWindow,
//DWORD BehaviorFlags,
//D3DPRESENT_PARAMETERS *pPresentationParameters,
//IDirect3DDevice9 ** ppReturnDeviceInterface
//); // 第一步 获取 IDirect3D9 接口
// Direct3DCreate9(D3D_SDK_VERSION);
pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if (NULL == pD3D)
{
MessageBox(NULL,TEXT("NULL == pD3D"),NULL,MB_OK);
return false;
}
// 第二步 确定显卡是否支持顶点转换和光照
// 通过获取设备性能,里面包含顶点处理,纹理,shader等信息。
// pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps)
// caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT
D3DCAPS9 caps;
pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps); int vp = ;
if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else
{
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
} // 第三步 填充显示参数,主要是和后备缓冲相关的设置。
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.BackBufferCount = ;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferHeight = SCREEN_H;
d3dpp.BackBufferWidth = SCREEN_W;
d3dpp.EnableAutoDepthStencil = true;
//d3dpp.FullScreen_RefreshRateInHz = 0; // 屏幕刷新频率,默认值即可
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; // 屏幕刷新频率,默认值即可
d3dpp.Windowed = true;
d3dpp.hDeviceWindow = hWnd; // 窗口句柄。
d3dpp.MultiSampleQuality = ;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
//d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
// D3DPRESENT_INTERVAL_IMMEDIATE 图形绘制完后立即显示,实时的,可以提高帧率,但过快会产生图形撕裂。
// D3DPRESENT_INTERVAL_DEFAULT 则需等待屏幕刷新完后绘制
d3dpp.Flags = ; // 附加特性一般为0. // d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 这个一定要赋值(即使初始化为0),枚举值从1开始
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY; // 这个一定要赋值(即使初始化为0),枚举值从1开始
//d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP; // 这个一定要赋值(即使初始化为0),枚举值从1开始
// 使用FLIP 屏幕有很强的抖动,难道是交换链的切换和显示不同步所致??。
// // 第四步 创建设备。 // IDirect3D9::CreateDevice(
//UINT Adapter,
//D3DDEVTYPE DeviceType,
//HWND hFocusWindow,
//DWORD BehaviorFlags,
//D3DPRESENT_PARAMETERS *pPresentationParameters,
//IDirect3DDevice9 ** ppReturnDeviceInterface
//); pD3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
vp,
&d3dpp,
&pD3DDev
); if (NULL == pD3DDev)
{
MessageBox(NULL,TEXT("NULL == pD3DDev"),NULL,MB_OK);
return false;
} return true;
} void Release()
{
SAFE_RELEASE(pD3D);
SAFE_RELEASE(pD3DDev);
SAFE_RELEASE(pSur);
SAFE_RELEASE(pBackSur);
} void initSurface()
{
if (pD3DDev)
{
pD3DDev->CreateOffscreenPlainSurface(
,,D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT,
&pSur,
NULL);
pD3DDev->GetBackBuffer(,,D3DBACKBUFFER_TYPE_MONO,&pBackSur);
// GetBackBuffer()得到的是后备缓冲表面的指针。
pD3DDev->Clear(,,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_ARGB(,,,),1.0, );
}
}
void Render()
{
if (pD3DDev)
{
//pD3DDev->Clear(0,0,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_ARGB(0,0,0,0),1.0,0 ); pD3DDev->ColorFill(pSur,NULL,D3DCOLOR_ARGB(,rand() % ,rand() % ,rand() % )); // 目的表面随机一个矩形
RECT rect;
rect.left = rand() % SCREEN_W;
rect.top = rand() % SCREEN_H;
rect.right = rect.left + rand() % (SCREEN_W - rect.left);
rect.bottom = rect.top + rand() % (SCREEN_H - rect.top); pD3DDev->BeginScene(); if (pSur && pBackSur)
{
pD3DDev->StretchRect(pSur,NULL,pBackSur,&rect,D3DTEXF_NONE);
// StretchRect()
// 它要求源和目的表面的内存池类型为D3DPOOL_DEFAULT。
// 并且不能再同一表面操作:。
} pD3DDev->EndScene();
pD3DDev->Present(,,,);
}
} int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
HWND hWnd; WNDCLASSEX wndClass;
initWndClass(hInstance,wndClass); RegisterClassEx(&wndClass); hWnd = CreateWindow(
TEXT(CLASSNAME),
TEXT(APPNAME),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
SCREEN_W,
SCREEN_H,
NULL,
NULL,
hInstance,
NULL
); if (NULL == hWnd)
{
MessageBox(NULL,TEXT("NULL == hWnd"),NULL,MB_OK);
return ;
} if (!initD3D(hWnd))
{
MessageBox(NULL,TEXT("initD3D"),NULL,MB_OK);
Release();
return ;
} initSurface(); UpdateWindow(hWnd);
ShowWindow(hWnd,nShowCmd);
MSG msg;
while (true)
{
if ( PeekMessage(&msg,NULL,,,PM_REMOVE) )
{
if (WM_QUIT == msg.message)
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render();
}
}
Release();
return msg.lParam;
}

DX 绘制位图的更多相关文章

  1. Delphi GDI对象之绘制位图

    http://www.cnblogs.com/pchmonster/archive/2012/07/06/2579334.html 绘制位图(Drawing Bitmaps) 绘制位图听起来似乎很难, ...

  2. DX笔记之五------游戏画面绘图之绘制位图

    本系列文章由zhmxy555编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7335103 共四步 步骤一:加载位图 步骤二:建立与 ...

  3. Win10系列:VC++绘制位图图片

    在使用Direct2D绘制图片的过程中,通过IWICImagingFactory工厂接口来得到绘制图片所需要的资源.本小节将介绍如何通过IWICImagingFactory工厂接口得到这些资源,并使用 ...

  4. 【emWin】例程八:绘制位图

    实验指导书及代码包下载: 链接:http://pan.baidu.com/s/1bpeMYpp 密码:wgtp 实验现象:

  5. 使用DX绘制3D物体时新手常犯错误,看不见物体时可以一一排查

    1.镜头不对: 物体不在镜头范围内,检查视图矩阵,世界矩阵,投影矩阵. 2.颜色全黑: 打开光照情况下,MATERIAL全为0, 或,在没有打开光照情况下,颜色值为0,造成全黑.检查当前Materia ...

  6. 如何将内存中的位图数据绘制在DC上

    假如你定义了一个位图类,里面包含位图头,位图信息头,调色板,位图数据.然后你按照位图的格式将位图文件读入你的类中,现在你知道了位图的全部信息了.主要信息包含在位图信息头里面,数据则在位图数据缓冲里面. ...

  7. UWP 手绘视频创作工具技术分享系列 - 位图的绘制

    前面我们针对 SVG 的解析和绘制做了介绍,SVG 是图片的一种形式,而另一种很重要的图片是:位图,包括 png.jpeg.bmp 等格式.位图的基本规则是,组成的基本元素是像素点,由宽度 * 高度个 ...

  8. SharpDX之Direct2D教程II——加载位图文件和保存位图文件

    本系列文章目录: SharpDX之Direct2D教程I——简单示例和Color(颜色) 绘制位图是绘制操作的不可缺少的一部分.在Direct2D中绘制位图,必须先利用WIC组件将位图加载到内存中,再 ...

  9. UWP开发细节记录:加载图像文件到D2D位图和D3D纹理

    在UWP中加载文件一般先创建 StorageFile 对象,然后调用StorageFile.OpenReadAsync 方法得到一个IRandomAccessStream 接口用来读取数据: Stor ...

随机推荐

  1. easyui知识累计.递增.

    (001) 偶然发现 easyui 1.4.4 版本以下在使用easyloader时的一个bug(声明:只有在使用easyloader加载模块时有此问题) : (只测试过1.4.2, 1.4.3, 1 ...

  2. 关于进程间通信的总结(IPC)

    一:三个问题 进程间通信简单的说有三个问题.第一个问题是一个进程如何把信息传递给另一个.第二个要处理的问题是是,要确保两个或更多的的进程在关键互动中不会出现交叉(即是进程互斥的问题),第三个问题是与正 ...

  3. web项目嵌入Jetty运行的两种方式(Jetty插件和自制Jetty服务器)

    在开发Java web项目时候,可以在项目中嵌入Jetty服务的方式来运行web程序. 由于最近开发web项目,自己使用的是比较旧的eclipse不支持导入tomcat来运行项目,于是就学习了下使用项 ...

  4. JAVA_SE复习(basic)

    一.数据类型 1.基本数据类型 Ps:有效标识符:_.字母.$开头  之后可有数字 整型:byte 1 short 2 int 4 long 8  (字节) 取值范围:其范围是从负2 的该数据类型位数 ...

  5. ajax返回的json内容进行排序

    关键方法:sort()用于对数组的元素进行排序. return a.num-b.num是升序: return b.num-a.num;是降序 writeln在输出后面加\n,在文档里是换行,在html ...

  6. 【Winform】无法嵌入互操作类型

    在使用Interop.SQLDMO进行数据库还原操作时,在vs2010编译时出现:无法嵌入互操作类型“……”,请改用适用的接口的解决方法 解决方案: 选中项目中引入的dll,鼠标右键,选择属性,把“嵌 ...

  7. [OpenXml] Generate excel in memory and dump to file

    public static void GenerateExcelFromStream() { using (MemoryStream memoryStream = new MemoryStream() ...

  8. AngularJs--过滤器(filter)

    过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果.主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等.ng内置了一些过滤器,它们 ...

  9. 【转】【C#】无边框窗体移动的三种方法

    1. 重写WndProc protected override void WndProc(ref Message m) { const int WM_NCHITTEST = 0x84; const i ...

  10. ubuntu安装oracle java

    通常UBUNTU源中带有openjava,但在使用eclipse与android studio时经常会有莫名奇妙的问题,所以个人觉得还是用oracle java,省点心. 安装步骤如下: sudo a ...