游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7299|回复: 6

OLE控件在Direct3D中的渲染方法

[复制链接]

14

主题

345

帖子

376

积分

中级会员

Rank: 3Rank: 3

积分
376
QQ
发表于 2008-3-15 21:10:00 | 显示全部楼层 |阅读模式
原文链接:
http://blog.csdn.net/xoyojank/archive/2008/03/15/2185829.aspx

Windows上的图形绘制是基于GDI的, 而Direct3D并不是, 所以, 要在3D窗口中显示一些Windows中的控件会有很多问题

那么, 有什么办法让GDI绘制的内容在3D中显示出来?反正都是图像, 总有办法实现的嘛!

前段时间在研究浏览器在游戏中的嵌入, 基本的思路就是在后台打开一个浏览窗口, 然后把它显示的内容拷贝到一张纹理上, 再把纹理在D3D中绘制出来, 至于事件处理就要另做文章了.

所以, 其它的Windows里的GDI绘制的东西都可以这样来实现!
最初我是GetDC, 然后GetPixel逐像素拷贝, 慢得我想死.....
后来发现了BitBlt这一速度很快的复制方法, 才有了实用价值:

1. 取得控件的DC: GetDC(hWnd)
2. 取得Texture的DC: IDirect3DSurface9::GetDC
3. 用BitBlt拷贝过去

BOOL BitBlt(
  HDC hdcDest, // handle to destination DC
  int nXDest,  // x-coord of destination upper-left corner
  int nYDest,  // y-coord of destination upper-left corner
  int nWidth,  // width of destination rectangle
  int nHeight, // height of destination rectangle
  HDC hdcSrc,  // handle to source DC
  int nXSrc,   // x-coordinate of source upper-left corner
  int nYSrc,   // y-coordinate of source upper-left corner
  DWORD dwRop  // raster operation code
);


如果是OLE控件那就更简单啦:
WINOLEAPI OleDraw(
  IUnknown * pUnk,    //Pointer to the view object to be drawn
  DWORD dwAspect,     //How the object is to be represented
  HDC hdcDraw,        //Device context on which to draw
  LPCRECT lprcBounds  //Pointer to the rectangle in which the object
                      // is drawn
);

比如我有一个IWebBrowser2的指针, 想把它显示的内容拷贝到纹理上, 可以这么干:

  1.     IDirect3DSurface9* pSurface = NULL;
  2.     this->mTexture->GetSurfaceLevel(0, &pSurface);
  3.     if (NULL != pSurface)
  4.     {
  5.         HDC hdcTexture;
  6.         HRESULT hr = pSurface->GetDC(&hdcTexture);
  7.         if(FAILED(hr)) return;
  8.         ::SetMapMode(hdcTexture, MM_TEXT);
  9.         ::OleDraw(pBrowser, DVASPECT_CONTENT, hdcTexture, &rect);
  10.         pSurface->ReleaseDC(hdcTexture);
  11.         pSurface->Release();
  12.     }
复制代码

Show一下:

不光是浏览器啦, 任何OLE控件都可以, 可以发挥你的想像力:

7

主题

87

帖子

124

积分

注册会员

Rank: 2

积分
124
发表于 2008-3-19 13:20:00 | 显示全部楼层

Re:OLE控件在Direct3D中的渲染方法

小强++的帖子,友情帮顶。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-3-19 16:16:00 | 显示全部楼层

Re:OLE控件在Direct3D中的渲染方法

使用mfc,添加控件,然后设置剪裁区。

42

主题

245

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2008-3-22 15:47:00 | 显示全部楼层

Re:OLE控件在Direct3D中的渲染方法

那把能够操作吗?还只是一个显示啊?

19

主题

37

帖子

92

积分

注册会员

Rank: 2

积分
92
发表于 2008-3-23 02:26:00 | 显示全部楼层

Re:OLE控件在Direct3D中的渲染方法

请问使用CShockwaveFlash类 OleDraw 中的 pUnk 该如何获得?

4

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2008-3-23 20:07:00 | 显示全部楼层

Re: OLE控件在Direct3D中的渲染方法

请问可以把这个例子的代码和资源发我一份吗?谢谢@
monnar@hotmail.com

14

主题

345

帖子

376

积分

中级会员

Rank: 3Rank: 3

积分
376
QQ
 楼主| 发表于 2008-3-23 23:18:00 | 显示全部楼层

Re:OLE控件在Direct3D中的渲染方法

IShockwaveFlash继承自IUnknown
关于操作, 冒似要自己进行事件处理
不知道有谁可以把事件跨窗口转发响应的方法?请指教
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 15:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表