DXUT编程指南(三):通过DXUT使用程序窗口

通过DXUT使用程序窗口
你的应用程序可以处理大多数的窗口管理任务,如果你使用较少的DXUT函数的话。
创建一个窗口
使用你自己的窗口

创建一个窗口
为Direct3D应用程序创建一个窗口包含以下几步:
1.定义一个响应适当的窗口消息(Defining a to respond to the proper window messages.)
2.建立(Setting up the.)
3.使用(Using .)
4.使用(Using .) //这几处有点奇怪哦^_^,原版就是这样

这些步骤不正确可能会导致Bugs。尽管对于Direct3D程序员来说这不是令人激动的,但它们是每个应用程序必须的。框架用DXUTCreateWindow函数简化了这个步骤:
HRESULT DXUTCreateWindow(
    const WCHAR *strWindowTitle = L"Direct3D Window",
    HINSTANCE hInstance         = NULL,
    HICON hIcon                 = NULL,
    HMENU hMenu                 = NULL,
    INT x                       = CW_USEDEFAULT,
    INT y                       = CW_USEDEFAULT
);
所有的参数都是可选的:
strWindowTitle 就是窗口的标题,同时也显示在任务栏。他通常是项目的标题。
hInstance是应用程序实例的句柄。典型的,他被大多数程序置为NULL。
hIcon是应用程序图标的句柄。如果为NULL,嵌入应用程序可执行文件的第一个图标将被使用。所以NULL也能很好的工作。
hMenu是菜单的句柄,如果想要可以设置它。大多数游戏并不使用标准的菜单,而是创建它们自己的游戏界面。
最后两个参数描述了窗口的位置。如果是全屏模式,它们将被忽略。
最简单的一个例子,应用程序可以像这样调用DXUTCreateWindow函数:
DXUTCreateWindow(L"My New Game");
只传入第一个参数strWindowTitle来调用这个函数,框架会自动的创建窗口并处理窗口消息。窗口句柄可以通过调用DXUTGetHWND得到,如果你需要的话。
如果应用程序要响应窗口消息,它可以使用DXUTSetCallbackMsgProc来设置回调函数:
void DXUTSetCallbackMsgProc( LPDXUTCALLBACKMSGPROC pCallbackMsgProc,
      void* pUserContext = NULL );
参数pCallbackMsgProc是一个 LPDXUTCALLBACKMSGPROC回调函数,他有下面的语法:
LRESULT CALLBACK FUNCTION MsgProc(
    HWND   hWnd,
    UINT   uMsg,
    WPARAM wParam,
    LPARAM lParam,
    BOOL*  pbNoFurtherProcessing,
    void*  pUserContext
    )
{
    return 0;
}
在这个回调函数中,应用程序不需要响应任何消息,因为所有的重要消息仍然由框架来处理。要防止框架处理消息,应用程序可以将*pbNoFurtherProcessing设为TRUE。(请参考LPDXUTCALLBACKMSGPROC)然而,使用这个设置时要小心,因为它可能导致框架不能正确的工作。

使用你自己的窗口
如果你希望应用程序创建并使用他自己的窗口而不是让DXUT处理窗口操作。你可以创建一个窗口,并使用DXUTSetWindow函数:
HRESULT DXUTSetWindow(
    HWND hWndFocus,
    HWND hWndDeviceFullScreen,
    HWND hWndDeviceWindowed,
    BOOL bHandleMessages = TRUE
);
这个函数需要3个窗口句柄,通常它们是一样的,除非窗口化的程序使用和全屏程序不同的窗口。焦点窗口句柄用来告诉Direct3D何时应用程序被切换到后台(通过ALT+TAB,鼠标点击,或者其它的用户输入)。应用程序通常需要传入焦点窗口句柄,不管创建了多少个Direct3D设备。
除了用一个窗口初始化框架以外,应用程序需要通知框架关于接受到的窗口消息,以使框架正常的工作。如果由框架创建窗口,窗口消息将被自动的处理。另外,应用程序可以在窗口的WindowProc回调函数中向框架传递消息,这可以通过DXUTStaticWndProc函数实现,他的定义如下:
 LRESULT CALLBACK DXUTStaticWndProc(
    HWND hWnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
);
如果你不想应用程序使用DXUTStaticWndProc你可以交替的复制函数中的功能。但不推荐你这样做。(you can alternately duplicate the functionality found in the function if you do not want the application to use DXUTStaticWndProc.)

                                                                                                                                                                       回主目录

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值