游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1740|回复: 4

游戏中 如何设计 MessageBox ?

[复制链接]

17

主题

201

帖子

242

积分

中级会员

Rank: 3Rank: 3

积分
242
QQ
发表于 2005-2-1 17:56:00 | 显示全部楼层 |阅读模式
  我一直被一个函数 困扰,就是 MessageBox ,
他是怎么设计的呢?
  我猜想,可能是有钩子什么的.
  但是怎么自己设计一个呢?
  
  我们经常这样写..
  
  if ( MessageBox(NULL,"你要退出?","系统提示",MB_OKCANCEL)== MB_OK) {... ...}

  可是,MessageBox 是弹出一个窗口,他是受消息驱动的窗口啊!
  怎么又能够返回 到 调用他的函数呢??
  如果调用着也在一个窗口的函数中,那么这个窗口不就什么也不能处理了,甚至不能显示.
  
  MessageBox 中到底有什么机制,促使他能够有始有终???

各位 ... 谈谈吧 ...

37

主题

727

帖子

740

积分

高级会员

Rank: 4

积分
740
发表于 2005-2-1 18:14:00 | 显示全部楼层

Re:游戏中 如何设计 MessageBox ?

MB_OKCANCEL就是确定和取消嘛
键被激活后,就返回撒
例如 if(BUTTONNAMEDMB_OK)
          return MB_OK;  //大概思路,具体肯定不是这样

应该这样
我猜的。。。。

8

主题

111

帖子

163

积分

注册会员

Rank: 2

积分
163
发表于 2005-2-1 18:35:00 | 显示全部楼层

Re:游戏中 如何设计 MessageBox ?

以前我们游戏里面用到的结构,应该和Windows的不一样,不过用起来满方便:

vector<DialogBox*>g_vecDialogs;
mainloop()
{
    if (g_vecDialogs.size()>0)
       g_vecDialogs[g_vecDialogs.size()-1]->ResponseUserOperate();
    else
       ResponseUserOperate();//check DirectInput,响应用户的各种操作
  
    Draw();
    int i;
    for (i=0;i<g_vecDialogs.size();i++)
       g_vecDialogs->Draw();
}

void ResponseUserOperate()
{
    if (某种条件满足)
    {
        DialogBox *pDlg=new DialogBox;
        pDlg->DoModal();
        delete pDlg;
    }
}

void DialogBox:oModal()
{
        g_vecDialogs.push_back(pDlg);//push
        m_bEnd=FALSE;
        
        while(!m_bEnd)
              mainloop();
        int sz;
        sz=g_vecDialogs.size();
        g_vecDialogs.erase(g_vecDialogs.begin()+sz-1);//pop up
}

void DialogBox::ResponseUserOperate()
{
       //做DialogBox的响应用户操作的事情
       //...
       if (用户按了退出)
             m_bEnd=TRUE;
}

void DialogBox::Draw()
{
       //画DialogBox
       //...
}

17

主题

201

帖子

242

积分

中级会员

Rank: 3Rank: 3

积分
242
QQ
 楼主| 发表于 2005-2-2 09:40:00 | 显示全部楼层

Re:游戏中 如何设计 MessageBox ?

ixnehc :
    能够解释一下么?

8

主题

111

帖子

163

积分

注册会员

Rank: 2

积分
163
发表于 2005-2-2 10:33:00 | 显示全部楼层

Re:游戏中 如何设计 MessageBox ?

sorry,有点错误,改了一下

这个是一个游戏环境里弹出一个模式对话框的流程
mainloop可以看作主窗口,DialogBox类是一个对话框,相当于你的messagebox. 主窗口做两件事情:画和响应用户操作,当有对话框弹出时,就只调用弹出的那个DialogBox的ResponseUserOperate().但仍然会绘制自己.
DialogBox在它的DoModal()函数里会嵌套的调用主窗口的更新函数,也就是mainloop(),直到用户关闭这个对话框(按了确定/取消,m_bEnd=TRUE),然后DoModal()结束,回到外层的mainloop()

当然这不是消息驱动的结构.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-24 06:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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