HGE吸附MFC窗口,棋牌开发增强

 

目前很多棋牌游戏使用各类界面引擎,以达到界面美观,HGE固然好,但它也只是一个界面引擎,没有控件,最让人不能接受的是它会把MFC的控件盖在下面,它在MFC控件就不能在,鱼与熊掌不可兼得。

这个都很好的东西为什么不能一起用呢,怎么才能同时用呢?

MFC对话框有一个Popup属性,可以置顶,那就围绕这个属性大做文章,首先创建一个这样的对话框,依附在HGE界面上,这样这个对话框可以在HGE界面之上,解决了开头的那个问题。然后呢就是这个对话框不能对着窗口移动,这也是这个属性的特点,俗话说,说什么呢,就是没有十全十美的意思。这就要在HGE界面的那个窗口响应一下ON_WM_MOVING(),在OnMoving(UINT fwSide, LPRECT pRect)里面大做文章,下面贴代码:

 if (!(m_Point.x ==-2000 && m_Point.y == -2000))
 {
  m_MsgBox->MoveWindowEx(pRect->left-m_Point.x,pRect->top-m_Point.y);
 }
 m_Point.x = pRect->left;//1
 m_Point.y = pRect->top;//2

 

注释:CPoint  m_Point;//这个是记录窗口当前的位置,每次移动都要记录最后的位置 1和2 处

           pRect->left-m_Point.x;//左右偏移值

           pRect->top-m_Point.y;//上下偏移值

 

//这个是封装了一个对话框移动的函数,只需要移动左上角坐标就可以了

void CMsgBox::MoveWindowEx(int x, int y)
{
 CRect rtClient,rtNewClient;
 GetWindowRect(&rtClient);
 rtNewClient.left = x+rtClient.left;
 rtNewClient.right = x+rtClient.right;
 rtNewClient.top = y+rtClient.top;
 rtNewClient.bottom = y+rtClient.bottom;
 MoveWindow(rtNewClient);
}

 

 

 

下面代码是限制窗口不能移出屏幕的代码

#define DETASTEP 8

BOOL AdjustPos(CRect* lpRect)
{//自动靠边
 int iSX=GetSystemMetrics(SM_CXFULLSCREEN);
 int iSY=GetSystemMetrics(SM_CYFULLSCREEN);
 RECT rWorkArea;
 BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, 
  sizeof(RECT),
  &rWorkArea,
  0);   
 CRect rcWA;
 if(!bResult)
 {//如果调用不成功就利用GetSystemMetrics获取屏幕面积
  rcWA=CRect(0,0,iSX,iSY);
 }
 else
  rcWA=rWorkArea;

 int iX=lpRect->left;
 int iY=lpRect->top;

 if(iX < rcWA.left + DETASTEP && iX!=rcWA.left)
 {//调整左
  //pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE);
  lpRect->OffsetRect(rcWA.left-iX,0);
  AdjustPos(lpRect);
  return TRUE;
 }
 if(iY < rcWA.top + DETASTEP && iY!=rcWA.top)
 {//调整上
  //pWnd->SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSIZE);
  lpRect->OffsetRect(0,rcWA.top-iY);
  AdjustPos(lpRect);
  return TRUE;
 }
 if(iX + lpRect->Width() > rcWA.right - DETASTEP && iX !=rcWA.right-lpRect->Width())
 {//调整右
  //pWnd->SetWindowPos(NULL ,rcWA.right-rcW.Width(),iY,0,0,SWP_NOSIZE);
  lpRect->OffsetRect(rcWA.right-lpRect->right,0);
  AdjustPos(lpRect);
  return TRUE;
 }
 if(iY + lpRect->Height() > rcWA.bottom - DETASTEP && iY !=rcWA.bottom-lpRect->Height())
 {//调整下
  //pWnd->SetWindowPos(NULL ,iX,rcWA.bottom-rcW.Height(),0,0,SWP_NOSIZE);
  lpRect->OffsetRect(0,rcWA.bottom-lpRect->bottom);
  return TRUE;
 }
 return FALSE;
}

 

 

调用也在OmMove函数里:

  CRect r=*pRect;
  AdjustPos(&r);
  *pRect=(RECT)r;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值