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

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的指针, 想把它显示的内容拷贝到纹理上, 可以这么干:

    IDirect3DSurface9* pSurface = NULL;
    this->mTexture->GetSurfaceLevel(0, &pSurface);
    if (NULL != pSurface)
    {
        HDC hdcTexture;
        HRESULT hr = pSurface->GetDC(&hdcTexture);
        if(FAILED(hr)) return;
        ::SetMapMode(hdcTexture, MM_TEXT);
        ::OleDraw(pBrowser, DVASPECT_CONTENT, hdcTexture, &rect);
        pSurface->ReleaseDC(hdcTexture);
        pSurface->Release();
    }

Show一下:

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

 
 

【转载】OLE控件在Direct3D中的渲染方法的更多相关文章

  1. GridView控件RowDataBound事件中获取列字段值的几种途径

    前台: <asp:TemplateField HeaderText="充值总额|账号余额"> <ItemTemplate> <asp:Label ID ...

  2. IOS中tableView每组的头部控件、通过tableView的代理方法控制某一行的cell能否达到高亮选中状态

    一.tableView每组的头部控件 1.控件宽度默认就是tableView的宽度 2.控件高度由下面的代理方法决定 - (CGFloat)tableView:(UITableView *)table ...

  3. iOS控件——UIView的viewWithTag:(int)findTag方法描述

    UIView拥有一个viewWithTag:(int)findTag方法,调用方式为[MyView viewWithTag:整形数字]该方法返回tag == findTag的控件.ios控件中允许多个 ...

  4. Delphi maskedit控件的掩码含义及用法方法

    Delphi maskedit控件的掩码含义及用法方法   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 ...

  5. WPF编程,通过KeyFrame 类型制作控件线性动画的一种方法。

    原文:WPF编程,通过KeyFrame 类型制作控件线性动画的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/articl ...

  6. [工作札记]02: .Net Winform控件TreeView最简递归绑定方法

    前言:Treeview控件是我们在WinForm.WebForm开发中经常使用的控件,需要从数据库动态加载数据,然后递归绑定每一个节点:同样,递归的思路在其他程序中也经常运用,包括.Net MVC等. ...

  7. jquery easyui datebox 时间控件默认显示当前日期的实现方法

    jquery easyui datebox 时间控件默认显示当前日期的实现方法 直接class easyui-datebox后添加一个value="true"就可以

  8. android中ListView控件&&onItemClick事件中获取listView传递的数据

    http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...

  9. Android获得控件在屏幕中的绝对坐标

    int[] location = new int[2] ; view.getLocationInWindow(location); //获取在当前窗口内的绝对坐标 view.getLocationOn ...

随机推荐

  1. iOS绘图事务的运行验证

    结合WWDC,以我们的call stack为例,来说明这四个过程分别大概都做了什么. layout过程 从上面layout的过程可以看出,其所做的主要任务就是将图层调用代理(也就是视图)实现整个视图层 ...

  2. servlet的生命周期详解

    一.servlet生命周期原理解析 1.Servlet生命周期分为三个阶段: (1)初始化阶段  调用init()方法 (2)响应客户请求阶段 调用service()方法 (3)终止阶段 调用dest ...

  3. python之获取文件夹下文件的绝对路径

    #!/usr/bin/python #-*-conding:utf-8-*- #获取目录下文件的绝对路径 import os def getabsroute(path): listdir = os.l ...

  4. Spring(十三)之SQL存储过程

    SimpleJdbcCall 类可以被用于调用一个包含 IN 和 OUT 参数的存储过程.你可以在处理任何一个 RDBMS 时使用这个方法,就像 Apache Derby, DB2, MySQL, M ...

  5. 将form表单元素的值序列化成对象

    /**jQuery * 将form表单元素的值序列化成对象 * @returns object */ var serializeObject = function(form) { var o = {} ...

  6. linux性能指标及分析工具

    一.CPU 1.良好状态指标 CPU利用率:User Time <= 70%,System Time <= 35%,User Time + System Time <= 70%. 上 ...

  7. 在 S5PV210 的 开发板上 点亮 一个 LED 灯

    参考学习教程:周立功嵌入式Linux开发教程-(上册) 材料:首先 准备一个 安装好 Linux 的 开发板 使用  xshell 工具 连接 开发板  ,winscp 工具 连接 开发板  ,  准 ...

  8. Struts2学习总结——文件上传与下载

    Struts2文件上传与下载 1.1.1新建一个Maven项目(demo02) 在此添加Web构面以及 struts2 构面 1.2.1配置Maven依赖(pom.xml 文件) <?xml v ...

  9. 8. DBNEWID 工具(使用nid命令修改db name及dbid)

    以下参考自:https://www.2cto.com/database/201305/207860.html Oralce官网:https://docs.oracle.com/cd/E11882_01 ...

  10. Oracle 11g R2 RAC with ASM存储迁移--Rman copy&ASM Rebalance(一)

    ASM GROUP-Rman copy迁移 0x00--环境介绍 VMware版本:VMware12pro 主机操作系统:RHEL6.5_64 共享存储使用VMWARE创建共享磁盘文件 数据库版本:O ...