HGE修改引擎适用于MFC的子窗口的修改

来源:互联网 发布:郭德纲 知乎 编辑:程序博客网 时间:2024/05/07 18:02

打开hge181/src/core/system.cpp

找到System_Initiate()函数,可以看见里面有段代码是用于创建窗口。

 

[cpp] view plaincopyprint?
  1. // Register window class  
  2.   
  3. winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;  
  4. winclass.lpfnWndProc    = WindowProc;  
  5. winclass.cbClsExtra     = 0;  
  6. winclass.cbWndExtra     = 0;  
  7. winclass.hInstance      = hInstance;  
  8. winclass.hCursor        = LoadCursor(NULL, IDC_ARROW);  
  9. winclass.hbrBackground  = (HBRUSH)GetStockObject(BLACK_BRUSH);  
  10. winclass.lpszMenuName   = NULL;   
  11. winclass.lpszClassName  = WINDOW_CLASS_NAME;  
  12. if(szIcon) winclass.hIcon = LoadIcon(hInstance, szIcon);  
  13. else winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);  
  14.   
  15. if (!RegisterClass(&winclass)) {  
  16.     _PostError("Can't register window class");  
  17.     return false;  
  18. }  
  19. // Create window  
  20. width=nScreenWidth + GetSystemMetrics(SM_CXFIXEDFRAME)*2;  
  21. height=nScreenHeight + GetSystemMetrics(SM_CYFIXEDFRAME)*2 + GetSystemMetrics(SM_CYCAPTION);  
  22. rectW.left=(GetSystemMetrics(SM_CXSCREEN)-width)/2;  
  23. rectW.top=(GetSystemMetrics(SM_CYSCREEN)-height)/2;  
  24. rectW.right=rectW.left+width;  
  25. rectW.bottom=rectW.top+height;  
  26. styleW=WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_VISIBLE; //WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX;  
  27. rectFS.left=0;  
  28. rectFS.top=0;  
  29. rectFS.right=nScreenWidth;  
  30. rectFS.bottom=nScreenHeight;  
  31. styleFS=WS_POPUP|WS_VISIBLE; //WS_POPUP  
  32. if(hwndParent)  
  33. {  
  34.     rectW.left=0;  
  35.     rectW.top=0;  
  36.     rectW.right=nScreenWidth;  
  37.     rectW.bottom=nScreenHeight;  
  38.     styleW=WS_CHILD|WS_VISIBLE;   
  39.     bWindowed=true;  
  40. }  
  41. if(bWindowed)  
  42.     hwnd = CreateWindowEx(0, WINDOW_CLASS_NAME, szWinTitle, styleW,  
  43.             rectW.left, rectW.top, rectW.right-rectW.left, rectW.bottom-rectW.top,  
  44.             hwndParent, NULL, hInstance, NULL);  
  45. else  
  46.     hwnd = CreateWindowEx(WS_EX_TOPMOST, WINDOW_CLASS_NAME, szWinTitle, styleFS,  
  47.             0, 0, 0, 0,  
  48.             NULL, NULL, hInstance, NULL);  
  49. if (!hwnd)  
  50. {  
  51.     _PostError("Can't create window");  
  52.     return false;  
  53. }  
  54. ShowWindow(hwnd, SW_SHOW);shi   

 

 

这段代码是创建窗口。

但因为我们是创建基于MFC窗口消息的图形,其窗口创建MFC已经帮其做好了。所以需要将其删除。

 

 

 

再找到SystemSetStatusHwnd函数,修改代码:

[cpp] view plaincopyprint?
  1. void CALL HGE_Impl::System_SetStateHwnd(hgeHwndState state, HWND value)  
  2. {  
  3.     switch(state)  
  4.     {  
  5.         case HGE_HWND:          if(!hwnd) hwnd = value; break;   
  6.         case HGE_HWNDPARENT:    if(!hwnd) hwndParent=value; break;  
  7.     }  
  8. }  

 

 

这样做是方便我们设置渲染的窗口。比如对话框之类的。

 

 

 

接下来在HGE_IMP.H文件中定义成员 

 

 

[cpp] view plaincopyprint?
  1. RECT    flipSrcRect;  
  2. RECT    flipDstRect;  
  3.    

 

 

并将其初始化为0.

打开hge181/src/core/graphics.cpp文件修改Gfx_EndScene函数修改代码如下:

 

[cpp] view plaincopyprint?
  1. void CALL HGE_Impl::Gfx_EndScene(bool use_fliRect /*= 0*/)  
  2. {  
  3.     _render_batch(true);  
  4.     pD3DDevice->EndScene();  
  5.     if(!pCurTarget)  
  6.     {  
  7.         if (!use_fliRect)  
  8.         {  
  9.             pD3DDevice->Present( NULL, NULL, NULL, NULL );  
  10.             return;  
  11.         }  
  12.         pD3DDevice->Present(&flipSrcRect, &flipDstRect, NULL,NULL);  
  13.     }  
  14. }  

 

 

修改_GfxInit()在 pD3D=Direct3DCreate8(120); // D3D_SDK_VERSION这句代码前面添加如下代码:

[cpp] view plaincopyprint?
  1. if( bWindowed )  
  2. {  
  3.     int width=nScreenWidth + GetSystemMetrics(SM_CXFIXEDFRAME)*2;  
  4.     int height=nScreenHeight + GetSystemMetrics(SM_CYFIXEDFRAME)*2 + GetSystemMetrics(SM_CYCAPTION);  
  5.     rectW.left=(GetSystemMetrics(SM_CXSCREEN)-width)/2;  
  6.     rectW.top=(GetSystemMetrics(SM_CYSCREEN)-height)/2;  
  7.     rectW.right=rectW.left+width;  
  8.     rectW.bottom=rectW.top+height;  
  9.     if(!hwnd)  
  10.     {  
  11.         _PostError("hwnd is NULL");  
  12.         return false;  
  13.     }  
  14.     styleW=GetWindowLong(hwnd,GWL_STYLE);  
  15. }  
  16. else  
  17. {  
  18.     rectFS.left=0;  
  19.     rectFS.top=0;  
  20.     rectFS.right=nScreenWidth;  
  21.     rectFS.bottom=nScreenHeight;  
  22.     styleFS = WS_POPUP|WS_VISIBLE;  
  23. }  

 

 

rectW和rectFS顾名思义分别设置渲染子窗口区域,渲染整个屏幕区域。

 

 

并添加一个接口

 

[cpp] view plaincopyprint?
  1. void CALL HGE_Impl::Gfx_SetFlipRect(int top, int left, int right, int bottom)  
  2. {  
  3.     flipSrcRect.top = top;  
  4.     flipSrcRect.left = left;  
  5.     flipSrcRect.right =right;  
  6.     flipSrcRect.bottom = bottom;  
  7.     flipDstRect.top = top;  
  8.     flipDstRect.left = left;  
  9.     flipDstRect.right =right;  
  10.     flipDstRect.bottom = bottom;  
  11. }  

 

这几句代码的作用是为了兼容MFC绘制模式。我们在这里的pD3DDevice->Present(&flipSrcRect, &flipDstRect, NULL,NULL);函数的作用是为了绘制到指定的我们的渲染区域。

 

 

 

调用过程如下。创建对话框,在初始化对话框上面初始化Render

具体代码如下:


[cpp] view plaincopyprint?
  1. CRect rect;  
  2. HWND hwnd = GetDlgItem(IDC_STATIC_RENDER)->GetSafeHwnd();  
  3. GetDlgItem(IDC_STATIC_RENDER)->GetClientRect(&rect);  
  4. hge = hgeCreate(HGE_VERSION);  
  5. hge->System_SetState(HGE_SCREENWIDTH, rect.Width());  
  6. hge->System_SetState(HGE_SCREENHEIGHT, rect.Height());  
  7. hge->System_SetState(HGE_WINDOWED, true);  
  8. //hge->System_SetState(HGE_HWNDPARENT, GetSafeHwnd());  
  9. hge->System_SetState(HGE_HWND,hwnd);  
  10. hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);  
  11. hge->System_SetState(HGE_FPS,60);  
  12. hge->System_SetState(HGE_DONTSUSPEND, true);  
  13. hge->System_SetState(HGE_TEXTUREFILTER, false);  
  14. hge->System_SetState(HGE_SCREENBPP, 32);  
  15. hge->System_SetState(HGE_LOGFILE, "log.txt");  
  16. hge->System_Initiate();  
  17. hge->Gfx_SetFlipRect(25, 25, rect.Width()-50, rect.Height()-50);  
  18. m_htexture = hge->Texture_Load("minimap.dds");  
  19. m_pic = new hgeSprite(hge, m_htexture);//这里的接口稍稍做一点变动,涉及到后面四个参数的操作可以屏蔽掉  
  20. //因为这步就可以重新设置图片大小  
  21. m_pic->SetTextureRect( 0, 0, hge->Texture_GetWidth(m_htexture), hge->Texture_GetHeight(m_htexture) );  

 

 

 后面创建图片并具体渲染,我们可以模仿hgeSprite这种方式创建。然后在OnTimer里面进行渲染。

 

[cpp] view plaincopyprint?
  1. void CDxTestDlg::OnPaint()  
  2. {  
  3.     /// render to target  
  4.     m_render->Gfx_Clear(0);  
  5.     m_render->Gfx_BeginScene();  
  6.     m_pic->RenderEx(100, 100, 0.0f, 0.5, 0.5);  
  7.     m_render->Gfx_EndScene(true);  
  8. }  

 

 

原创粉丝点击