能否使用MessageBox直接开始下一局
void mousePressMsg(ExMessage* msg)
{
//如果是鼠标左键,就下棋
if (msg->message == WM_LBUTTONDOWN)
{
map[pos.row][pos.col] = pos.player;
//判断输赢
if (judge(pos.row, pos.col))
{
MessageBox(GetHWnd(), " win", "胜负已分", MB_RETRYCANCEL);
exit(666);
}
//切换棋手
pos.player = (pos.player == Black ? White : Black);
}
}
if (MessageBox(GetHWnd(), "win,是否下一局", "胜负已分", MB_RETRYCANCEL) == IDRETRY)
...
我们来看下他的代码,很简单完全没有问题是不是
但是在实际运行中,其中的一个方法Foo
抛出了一个异常。
而作为代码书写者,为了确保软件的正常运行
,将这个方法的所有异常都吞掉了。
此时导致的结果就是,用户端看到软件运行正常
,但是没有期望的输出
public MainWindow()
{
InitializeComponent();
Loaded += (sender, args) =>
{
MessageBox.Show("黄腾霄好瘦哟");
};
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o5y2PeVV-1582074964316)(…/media/1563249113514.png)]
我们稍稍做一些改动,让messagebox延迟一点点出现。然后我们在主窗口显示后立刻点击其他程序窗口
public MainWindow()
{
InitializeComponent();
Loaded += async (sender, args) =>
{
await Task.Delay(3000);
MessageBox.Show("黄腾霄好瘦哟");
};
}
惊这个messagebox掉下去了。
解决方案:
在 C++ 中使用 MessageBox 函数需要包含 Windows.h 头文件,因此在程序开头加入 #include 语句。
MessageBox 函数的格式如下:
int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
其中,第一个参数 hWnd 表示消息框所属的窗口句柄,输入 NULL 表示消息框没有指定父窗口;第二个参数 lpText 表示消息框中的文本内容,是一个字符串型变量;第三个参数 lpCaption 表示消息框的标题,同样是一个字符串型变量;第四个参数 uType 表示消息框的类型,可以是如下值(其中最常用的是 MB_OK 和 MB_YESNO):
MB_OK:只有一个“确定”按钮的消息框
MB_YESNO:有“是”、“否”两个按钮的消息框
MB_ICONINFORMATION:使用信息图标的消息框
MB_ICONQUESTION:使用问号图标的消息框
MB_ICONWARNING:使用警告图标的消息框
MB_ICONERROR:使用错误图标的消息框
在五子棋游戏中,当玩家获胜或者平局时,需要弹出一个含有“开始新游戏”和“退出游戏”两个按钮的消息框,并根据玩家的选择进行操作。假设定义了下面的两个变量:
bool m_bGameOver = false; // 标识游戏是否结束 bool m_bNewGame = false; // 标识玩家是否选择开始新游戏
则可以在程序中使用如下代码段来实现该功能:
if (m_bGameOver) { // 如果游戏结束,弹出消息框 int iRet = MessageBox(NULL, "游戏结束,是否开始新游戏?", "提示", MB_YESNO); if (iRet == IDYES) { // 如果玩家选择开始新游戏,将标志位置为 true,并在下一轮循环中重新开始游戏 m_bNewGame = true; m_bGameOver = false; } else { // 如果玩家选择退出游戏,将标志位置为 true,并在下一轮循环中退出游戏 m_bNewGame = false; m_bGameOver = true; } }
在该代码中,首先判断游戏是否结束,如果结束则弹出消息框,通过 iRet 变量获取玩家的选择,如果玩家选择开始新游戏,则将 m_bNewGame 标志位置为 true,将 m_bGameOver 标志位置为 false,即在下一轮循环中重新开始游戏;如果玩家选择退出游戏,则将 m_bNewGame 标志位置为 false,将 m_bGameOver 标志位置为 true,即在下一轮循环中退出游戏。
完整的代码示例:
using namespace std;
bool m_bGameOver = false; // 标识游戏是否结束 bool m_bNewGame = false; // 标识玩家是否选择开始新游戏
int main() { while (true) { if (m_bGameOver) { // 如果游戏结束,弹出消息框 int iRet = MessageBox(NULL, "游戏结束,是否开始新游戏?", "提示", MB_YESNO); if (iRet == IDYES) { // 如果玩家选择开始新游戏,将标志位置为 true,并在下一轮循环中重新开始游戏 m_bNewGame = true; m_bGameOver = false; } else { // 如果玩家选择退出游戏,将标志位置为 true,并在下一轮循环中退出游戏 m_bNewGame = false; m_bGameOver = true; } } else { // 如果游戏没有结束,进行游戏操作 // ... }
if (!m_bNewGame)
{
// 如果玩家选择退出游戏,退出程序
break;
}
}
return 0; }