贪吃蛇&泡泡堂编辑器Tips

用 MFC 写贪吃蛇和泡泡堂地图编辑器的作业的时候发现的问题:

1) MFC 对话框无法截取到 WM_KEYDOWN 和 WM_KEYUP 消息,原因是???(我不知道=___=),要截获按键消息可重载 PreTranslateMessage 函数,使用方法如下:

BOOL CSnakeDlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 在此添加专用代码和/或调用基类
	if (!(pMsg->lParam & 0x40000000))
	{
		switch(pMsg->wParam)
		{
		case VK_DOWN:
			break;
		default:
			break;
		}
	}
	return CDialog::PreTranslateMessage(pMsg);
}

其中 (pMsg->lParam & 0x40000000)  这个条件是为了确认在按下键或抬起的时候进行消息处理,否则每次按键会处理两次,一次是按下一次是抬起.写的时候贪吃蛇的行为很奇怪找了好久才发现是这个问题=___=.

随时监测某个键是否按下的方法:

#define KeyDown(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)

我使用这个方法来处理泡泡堂人物的走动.在每一帧监测一次并更新数据.缺点是帧数低的时候可能会漏掉按键消息.

2)按下回车键对话框就自动关闭了…..这个解决方法简单,初始化对话框时加上如下函数调用:

SetDefID(-1);

另外要设置对话框的大小位置:

::SetWindowPos(this->m_hWnd, HWND_BOTTOM, left, top, width, height, SWP_NOZORDER);

3)打开和保存文件:

//第一个参数true是打开对话框,false为另存为对话框
CFileDialog fd( true, "xx", NULL, OFN_HIDEREADONLY ¦ OFN_OVERWRITEPROMPT,"xx文件( *.xx )¦*.xx¦¦", this );
if(  fd.DoModal()  == IDCANCEL  )
	return;
CString name(  fd.GetPathName()  ); //得到选择的文件路径名

4)给对话框加上菜单:

建好菜单资源后,把菜单ID添加到对话框资源的”Menu”属性中.

5) memset(arrName, 0, sizeof(int) * n);

将一块内存区域快速清0,最后一个参数是以字节为单位的内存区大小.

ASSERT(x);

老师推荐用的东西…如果x为假就会弹出对话框”Debug Assertion Failed”显示报错信息,否则程序可能只是崩掉…但是报错信息没写什么地方出的错,这个宏大概是用来缩小查错范围的吧…

 

最后抱怨一下,VS2003真心难用啊,各种问题…不知道老师干嘛要让我们用这个老古董=___=!