游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5936|回复: 10

为什么使用MFC框架,渲染不出来

[复制链接]

1

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2005-12-23 18:16:00 | 显示全部楼层 |阅读模式
您好
  我初学MFC,并想让其与Direct9相结合。
  今天我尝试了一次,失败了,非常沮丧……
  所以请教帮我指出错误.
  
  程序思路是在创造主窗口之后初始化Direct3D对像和设备, 并将窗口背景渲染成蓝色。
      以下是程序的主要片断.

// rack.cpp
.....
.....      
// 这个程序的主窗口类rackMainWnd及构造函数
rackMainWnd::rackMainWnd()
{
      Create( NULL, _T("The rack Application for Direct3D9"));

      BOOL res;
      if( !( res = InitDirect3D() ) ){
            ::AfxMessageBox( "Direct3D initalized faild" );
            return;
      }
      
      while( !m_quit)                 // 一直渲染直到按下光标左键, m_quit记录鼠标左键被按下
            Render();

}

BOOL rackMainWnd::InitDirect3D()
{
        pD3D = NULL;                 // 这是3D对像和设备, 之前在窗口类中申明
        pD3DDEVICE = NULL;

                // 创建对象, 并且检查是否成功
        if( NULL == ( pD3D = Direct3DCreate9(D3D_SDK_VERSION) ) )
                return FALSE;

        // 填充3D设备结构参数
                D3DPRESENT_PARAMETERS d3dpp;
        ::ZeroMemory( &d3dpp, sizeof(d3dpp));
        d3dpp.Windowed = TRUE;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
        d3dpp.BackBufferCount = 1;
        d3dpp.BackBufferWidth = 640;
        d3dpp.BackBufferHeight = 480;
        d3dpp.hDeviceWindow = this->GetSafeHwnd();   // 我不知道是不是这里出问题了[em23]
                //====================
                // rackMainWnd是从CFrameWnd派生的一个窗口类, 与普通的WIN32创造的窗口 在外观上的唯一区别是,它具有凹陷边框, 其他是一样的. 使用这个窗口类的句柄合不合适还没有验证过. 所以我只是怀疑.

        // 创建设备
                if( !( pD3D ->CreateDevice( D3DADAPTER_DEFAULT,
                                                       D3DDEVTYPE_REF,
                                                       this ->GetSafeHwnd(),
                                                       D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                                       &d3dpp,
                                                       &pD3DDEVICE ) ) )
                      return FALSE;

        return TRUE;
}

// 渲染函数
void rackMainWnd::Render()
{
        if( NULL == pD3DDEVICE)
              return;

        // 清除窗口内容, 并画成蓝色的背景
                pD3DDEVICE ->Clear( 0, NULL, D3DCLEAR_TARGET,
                                                   D3DCOLOR_XRGB( 0, 0, 255 ), 1.0f, 0);
                // 呈现
        pD3DDEVICE -&gtresent( NULL, NULL, NULL, NULL);
}

运行环境, winxp Direct 9.0c , Direct SDK 9, Visual Studio.net 2003.
到目前为, 程序运行状态是顺利的, 只是我却没有看到呈现出来的蓝色背景, 非常的郁闷.[em15]
到底是什么原因呢?
请教高手帮我分析, 指出不足和问题所在. 小弟先有礼了!

另外,最新的情况在 8 楼

32

主题

377

帖子

378

积分

中级会员

Rank: 3Rank: 3

积分
378
发表于 2005-12-23 19:05:00 | 显示全部楼层

Re:为什么使用MFC框架,渲染不出来

getsafeHwnd这个方法是没有问题的。
不过你在构造函数里面使用循环render
似乎是错误的。恐怕需要另外创建一个
线程。

1

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
 楼主| 发表于 2005-12-23 21:58:00 | 显示全部楼层

Re:为什么使用MFC框架,渲染不出来

噢, 那先谢过了
新建线程的方法目前对我来说有点奢侈了
楼下的高人可否指点一下. 谢谢

3

主题

186

帖子

190

积分

注册会员

Rank: 2

积分
190
发表于 2005-12-23 22:55:00 | 显示全部楼层

Re:为什么使用MFC框架,渲染不出来

      while( !m_quit)                 // 一直渲染直到按下光标左键, m_quit记录鼠标左键被按下
            Render();

Render不应该在这里调用,应该在窗口的wm_paint消息里,或是窗口消息处理循环那里进行RENDER,加上一个计时器在wm_timer里也是可以的

182

主题

445

帖子

459

积分

中级会员

Rank: 3Rank: 3

积分
459
QQ
发表于 2005-12-24 12:23:00 | 显示全部楼层

Re:为什么使用MFC框架,渲染不出来

呵呵,楼上说的是正道.不必建立线程.
其实也不必循环.
用定时器调READNER函数就行了

1

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
 楼主| 发表于 2005-12-24 23:07:00 | 显示全部楼层

Re: 为什么使用MFC框架,渲染不出来

今天是平安夜, 先祝大家圣诞快乐!

根据我的调试, 终于找到了毛病
问题是出在创建设备时失败了, 我在窗口创建之前将m_hWnd传给了3D设备创建函数, 导致了失败的结果, 所以无论如何Render()自然也无法呈现.

[em17]可是新问题出现了.....
当一切都创建成功后, 窗口却无法显示了, 调试过程中:
ShowWindow() 函数工作不正常...
为什么会这样, 为什么啊……
难道MFC真的不能承载Direct么?
我回头翻了老半天书, 全是E文的, 还是没有吃透, 也没有找到解决办法
  [em10]
不甘心啊, 各位大哥快帮我一把!

32

主题

377

帖子

378

积分

中级会员

Rank: 3Rank: 3

积分
378
发表于 2005-12-25 12:20:00 | 显示全部楼层

Re:为什么使用MFC框架,渲染不出来

我虽然水平不高。不过就我对mfc窗口
使用dx的经验来看,比较好的办法是新
建立线程。如果重载onPaint似乎会影响
到窗口的刷新。另外一个办法是在画面
做出改变的时候才调用render函数。也
就是重载一些事件,这个方法太笨了点。

总之,如果做游戏就不要用mfc了,因
为到头来,你可能还得重载消息处理函
数来获得按键等事件,过于麻烦。

1

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
 楼主| 发表于 2005-12-27 13:55:00 | 显示全部楼层

Re:为什么使用MFC框架,渲染不出来

多谢Fromhell
小弟受教育了,呵呵

  确实用MFC来做游戏不是最好的办法。但是用MFC承载Dirext却是一个聪明和懒惰的办法,并且将来的应用不只是游戏!
  我听说Photoshop使用的图像引擎就是DirectX,所以我想将MFC与DirectX结合后,肯定有很多MFC程序员会喜欢,他们也可以轻松做3D程序了。
  至少我是这么想的,所以我才决定这样尝试,如果说MFC太慢了,那硬件的升级速度可以很快弥补。事实上MFC比WIN32 STL具有很多优势, 很多力气活都省下了, 比如消息事件代理引擎也可以不用了. 比如说一个WINDOWS的"Hello world"程序, MFC只需要26行代码. 呵呵
      话归正题还是
      现在最新的问题是, 创建了3D对象和设备之后, 无法显示窗口了,在调试过程中
      rackApp::InitInstance()出了差子
      {
         m_pMainWnd = new rackMainWnd;
         // 就是下面这一句无法执行, 语法和编译链接都没有问题, 不晓得如何是好
         m_pMainWnd ->ShowWindow(m_nCmdShow);
         m_pMainWnd ->UpdateWindow();

         return TRUE;
      }

32

主题

377

帖子

378

积分

中级会员

Rank: 3Rank: 3

积分
378
发表于 2005-12-28 10:52:00 | 显示全部楼层

Re: 为什么使用MFC框架,渲染不出来

我的一点经验能够对你有用很高兴。
我很奇怪你上面的实例;要知道,
mfc的主窗口类是不需要实例化的,
因为对主窗口的实例化实际上是封
装在一个你看不见的WinMain函数里
进行的。
我给你写个简单的例子,你瞧瞧吧。
使用的是CDialog。

sf_20051228105144.rar

28.77 KB, 下载次数:

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2005-12-28 15:48:00 | 显示全部楼层

Re:为什么使用MFC框架,渲染不出来

DXSDK里的工具dxtex和EffectEdit都是MFC的,有源码,可以看看.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-23 05:16

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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