简单地学习了四个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. Libcurl笔记二

    一: multi与easy接口的不同处The multi interface offers several abilities that the easy interface doesn't. The ...

  2. 《java编程思想》--多线程基础--Runnable

    一.简单说下Runnable是什么 1.它是一个接口 2.只提供了run方法 3.这个接口提供了一个协议:实现这个接口的类是active的(不必成为Thread的子类) 4.run方法没有返回值 /* ...

  3. RestFul && HATEOAS && Spring-Data-Rest介绍

    1.什么是RestFul 经常上网的同学会发现,现代软件的一个重要趋势就是互联网化,几乎没有一款软件是纯粹的单机版了.通常的情况下,软件管理着服务器的资源以及这些资源的状态变化,用户通过在浏览器输入h ...

  4. 窗体位置设置StartPosition属性

    有如下选项,分别含义如下: CenterParent                    窗体在其父窗体中居中.      CenterScreen                    窗体在当前 ...

  5. centos 7 lNMP 安装之php 篇

    1.准备工作 安装依赖包 yum install -y gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype ...

  6. Django Tutorial 学习笔记

    实际操作了Django入门教程中的范例,对一些细节有了更清晰的掌握.感觉只看文档不动手是不行的,只看文档没法真正掌握其中要素之间的关系,看了很多遍也不行,必须动手做了才能掌握.同时,这次练习在Ecli ...

  7. EditorLineEnds.ttr 受影响的D版本 Delphi 8-2010

    http://stackoverflow.com/questions/25295980/delphi-2006-2010-error-cannot-create-file-c-users-admin- ...

  8. Android UI学习1:控件和基本事件的响应

    在任何一个 GUI 系统中,控制界面上的控件(通常称为控件)都是一个基本的内容.对于 Android 应用程序,控件称为 View. 在 Android 中,在处理 UI 中的各种元素的时候,两个程序 ...

  9. 【转】FTP自动上传文件的perl脚本以及配置文件

    这个perl文件将执行的任务是, 按照指定的文件夹目录,自动将该文件夹下的所有文件上传到指定ftp站点的指定目录下 本应用程序设计的几个基本理念是:工具箱再利用:尽可能利用已有的工具:简化运行步骤:不 ...

  10. 【git】借助github学习成果

    1.创建分支 git branch dev   //创建分支 git checkout dev  //切换分支 或者用一句  git checkout -b dev 删除一个分支  git check ...