当前位置:C++技术网 > 资讯 > 俄罗斯方块客户端版软件开发详解

俄罗斯方块客户端版软件开发详解

更新时间:2015-06-27 01:30:53浏览次数:1+次

    因为这段时间要忙着开发新版C++技术网网站,同时白天也是忙公司工作,所以耽搁了。因为很多新手,对于MFC项目,不熟。只是给一个项目源码下载,也是看不懂,所以,我就抽时间,来总结这个开发过程。在后面的新版C++技术网中,将重点放在项目开发实践过程分析,帮助大家提高开发能力和经验,对我们的支持,也是对自己最大的回报。
    之前在网上弄来了一段js写的俄罗斯方块游戏,经过研究后,自己调整了逻辑和规则,让小伙伴们爽了一把。在C++技术网友链中进去,可以玩玩。
    而后,就将这个游戏搬到了MFC开发的客户端中。效果和网页的一样。因此,很多人也就好奇这是如何实现的。这里就详细介绍这个项目的实现过程。
    我使用的开发环境是VS2008。如果你使用更高版本,可以直接打开,然后程序会自动转换,完成即可。
    这个项目是基于HtmlDialog的程序。也就是说,这个程序的是与Html网页结合的技术。通过与网页技术融合,从而达到这个效果。程序的界面和网页的游戏的界面一模一样。而是用HTML网页技术可以灵活的布局和显示界面。通过js可以执行网页的前端功能,代替客户端的前端操作。
    先上图,看看实际效果。
    这是网页版的效果,地址:在线俄罗斯方块
    下面是客户端的截图:

俄罗斯方块客户端版
    现在开始做这个项目。
    1.创建项目,项目类型为“MFC应用程序”。在向导中,选择基类对话框为CDHtmlDialog。这样,基类就提供了对HTML网页的支持。其他的都默认。
    2.创建好后,在解决方案中,出现了一个.htm的文件。这个文件就是嵌入我们程序主窗口的文件。其实,原理就是,我们的窗口就是一个浏览器引擎了。可以显示网页的东西。生成的程序还是单个exe。也就是说,程序最后将html嵌入到了exe中了。在开发时,就是使用html文件来做界面和界面处理了。
    3.当然,html中还有一个.css文件来布局页面的。在VS中打开html,可以直接在VS中可视化编辑网页。可以Word一样。当然,具体的html网页技术,你的另外学习了。这个适合有网页开发经验的程序员哦。不过,你可以直接将一个写好的html网页文件,替换项目中的这个文件即可。你不用多处理。
    4.实际上,QQ每天弹出来的腾讯新闻小窗口,其实也是利用这个机制做的。界面只是显示一个特定的网页罢了。还有各种弹窗,QQ聊天界面底下的文字广告,都是利用这个原理。只不过,人家是比较完善的封装好的。实际上,MFC早就有这个机制了。
    5.将网页替换好就可以了。里面的什么规则,我们不用理会。如果你想进一步了解,请参考其他文章。或者你在资源视图中,在HTML资源类型下,打开这个网页资源文件。然后将已有的html网页的源码,复制粘贴到这里,替换自动生成的,全部替换哦。
    6.启动编译运行,就可以看到效果了。
    以上是基本的项目创建,总结来说就是,创建项目,替换HTML文件即可。
    下面说说需要处理的问题。
    1.因为显示的是网页,因此,右击后,弹出的是网页的快捷菜单,这样一下让你露馅了。因为html可以方便的把界面做的很漂亮。然而一个快捷菜单就出卖了你。上过网的童鞋,对于这个菜单非常熟悉。所以我们需要将这个菜单屏蔽掉。
    解决的方法,你肯定会在窗口上响应右击事件,那么生成的事件响应函数是:void CthtmDlg::OnRButtonDown(UINT nFlags, CPoint point) 。但是这个却不能正确的工作。因为显示的网页,其实类似于普通的控件窗口,在主窗口是无法拦截到这个消息的。不过这个单击消息,始终会发送到程序的,不管怎么样,都有一个途径过来。也是为了达到最好效果,只要是右击,全部拦截。那么我们就可以在消息分发预处理中拦截。这是主窗口类的虚函数提供的,名称为PreTranslateMessage。在主窗口类CXXXDlg,就是你创建的Dlg类中,类视图下,右击窗口类,查看“属性”,然后在属性对话框的“重写”按钮,找到这个函数,添加。然后就自动生成了一个重载函数。你在函数中,拦截右击事件,然后直接返回TRUE,表示不再让系统处理了。这样就屏蔽了右击。下面是代码:

BOOL CthtmDlg::PreTranslateMessage(MSG* pMsg)
{
    if ((pMsg->message == WM_RBUTTONDOWN)||(pMsg->message == WM_RBUTTONDBLCLK))
        return TRUE;
    return CDHtmlDialog::PreTranslateMessage(pMsg);
}

    CthtmDlg改成你的类名。这样就屏蔽了右击事件。
    2.另一个问题,就是因为html的js代码出错,导致程序经常弹出“前端脚本执行错误,提示是否继续执行”的提示,很容易弹出来。让你实际的效果很差。所以,需要屏蔽这个问题。只是因为js的语法不严谨,导致容易出问题,不过不影响,熟悉html的就知道。下面说说解决方法。
    在窗口的初始化时,即函数OnInitDialog(),在函数中添加一个代码,禁用js脚本错误提示,将所有的提示全部禁止了,程序运行时就不会再提示js错误提示了。
    js错误的提示为:“当前页面的脚本发生错误,是否要在此页面上继续运行脚本?”,截图如下:

当前页面的脚本发生错误,是否要在此页面上继续运行脚本
    禁用js脚本错误提示的代码如下:

m_pBrowserApp->put_Silent(VARIANT_TRUE);//禁止脚本错误提示 
    只需要将这个代码放入OnInitDialog()函数中,就可以了。
    这个程序,到此就完成了。程序的逻辑,就是html页面的逻辑,不需要在客户端完成。客户端只是提供一个容器而已。html页面的内容,请复制网页版的网页的源码即可。