简单地学习了四个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. java匿名内部类练习

    interface Inter { void method(); } class Test { //补足代码.通过匿名内部类. /* static class Inner implements Int ...

  2. Tomcat上配置连接池{ connect error=Name [jdbc/OracleDB] is not bound in this Context. Unable to find [jdbc]}

    . 在学习期间,从未实践过在tomcat上配置连接池,今天终于实现一次,在tomcat玩了一把,不知道你是否现在有和我一样的困境.废话少说直接上代码   java  public static Con ...

  3. 重学C++ (1)

    写在开头的话:这学期没有写太多的代码,终于把中英文两篇论文弄完了,趁着中间的空隙,想想找工作的处境.自己也定了自己的方向.不管学什么语言吧,每个语言都有自己的优势和使用的群体.只要自己是良马,终会有伯 ...

  4. php安全设定

    nginx: 在配置文件nginx.conf的http段里加入  server_tokens off;  HTTPD.CONFTraceEnable Off <Directory ~ " ...

  5. php 生成器 入门理解

    概念太晦涩,看不懂,直接上例子: 问题:得到一个1-1000000的整数数组,然后用foreach遍历输出 如果没有生成器,这样做: $arr=range(1,1000000);//这个函数最终会返回 ...

  6. 解决 windows2012 下无法安装 sql2008R2

    Press the Windows logo key, type control panel, and then click the Control Panel icon. Note If you a ...

  7. 在emacs里用w3m浏览网页

    给w3m配置个~/.emacs老是暴错误,在配置里把这个注掉就OK了;(require 'mime-w3m) ;;支持w3m (add-to-list 'load-path "/usr/sh ...

  8. Beaglebone Back学习五(PWM测试)

    PWM测试 参考链接 1 Enable PWM on BeagleBone with Device Tree overlays 2Using PWM on the Beaglebone Black 3 ...

  9. 【BZOJ 1067】 [SCOI2007]降雨量

    Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2 ...

  10. centos apache 隐藏和伪装 版本信息

    1.隐藏Apache版本信息 测试默认 apache 的状态信息[root@1314it conf]# curl -Is localhostHTTP/1.1 200 OKDate: Tue, 16 N ...