牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

HGE in a child window

Running HGE in a child window hosted by a Windows application may be useful to create authoring tools and ActiveX controls or to integrate HGE into a third party IDE. Here follow the guidelines how to do that.

Creating HGE window as a child

To run HGE in a child window mode you should just specify the parent window handle. To do this set HGE_HWNDPARENT system state before calling to System_Initiate:

hge->System_SetState(HGE_HWNDPARENT, hwnd);

Mouse cursor

You may prefer HGE to use standard Windows cursor while in child window mode. This can be done by setting HGE_HIDEMOUSE system state to false:

hge->System_SetState(HGE_HIDEMOUSE, false);

Dispatching application's messages and running Frame Function

To provide additional flexibility System_Start behaves a bit differently in child window mode. First, it returns after just one call to user's frame function regardless of the value returned by it. Second, it doesn't dispatch window messages. So you should set up your own message processing loop. Here's the simpliest loop enough to run HGE properly:

for(;;)
{
  if(hge->System_GetState(HGE_HWND))
    hge->System_Start();

  if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  { 
    if(msg.message == WM_QUIT) break;
    DispatchMessage(&msg);
  }
}

Moving and resizing HGE window

You can move and resize HGE window with WinAPI functions like MoveWindow. When it's window resized, HGE will reinitiate DirectX to meet new window dimensions:

MoveWindow(hge->System_GetState(HGE_HWND),
           x, y, width, height, true);

Destroying HGE window

HGE has lots of resources associated with it's window. So you should use System_Shutdown call to free them, don't rely on just destroying the window. The good place to do this is WM_DESTROY handler of the parent window:

case WM_DESTROY:
    FreeLoadedHGEResources();
    hge->System_Shutdown();
    PostQuitMessage(0);
    return FALSE;

Child window mode limitations

1. To accept keyboard events in child window mode HGE window must have input focus. It gains focus automatically when you click somewhere inside. Use the following call to set the focus explicitly:

SetFocus(hge->System_GetState(HGE_HWND));

2. Switching into fullscreen is unavailable when running in child window mode. Regardless of HGE_WINDOWED system state HGE will run in a window.

posted on 2007-03-08 13:25 杨粼波 阅读(379) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理