作者:马宁
相信未来一段的业余时间,我都要和XNA为伍了。本来想向3D开发的纵深发展,但是遇到了一个实际的问题,就是如何在XNA下显示MessageBox和Software Input Panel。干脆先写出来吧,省得大家遇到这问题时抓狂。
按照为数不多的公开文档描述,XNA和Silverlight for Windows Phone应该是基于同一个.NET Compact Framework的CLR。但是,XNA并没有提供任何用户控件、MessageBox和软键盘等,也不能直接调用Silverlight for Windows Phone的类库。这样势必为XNA制造了很多人为的障碍。但调用MessageBox和Software Input Panel的后门,XNA还是给我们留下了,这就是Microsoft.Xna.Framework.GamerServices命名空间下的Guide类,类描述如下:
http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.gamerservices.guide.aspx
该类不但可以调用MessageBox和软键盘,还能够调用Marketplace、XBox Live等窗体。不过,值得注意的是,Guide类提供的方法都是异步调用,而非同步调用,这也好理解,游戏的处理过程是以时间驱动的,所以任何操作不应该阻塞住游戏主线程。
Guide类调用MessageBox和软键盘的描述在这里:
http://msdn.microsoft.com/en-us/library/ff827869.aspx
http://msdn.microsoft.com/en-us/library/ff827868.aspx
但MSDN文档还是有一些瑕疵,按上面提供的方法会产生Exception,所以我在下面给出修改后可以运行的方法。运行环境基于VS 2010 + Windows Phone 7 SDK RTW版。
调用MessageBox
创建Windows Phone 7中XNA 4.0的工程,然后,我们在Update方法里添加对于MessageBox的调用。当然,大家请不要认为把MessageBox加到Update里正确的,这样会造成MessageBox不断弹出。我只是为了简化代码,才这么做的。
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
Liststring> MBOPTIONS = new Liststring>();
MBOPTIONS.Add("OK");
MBOPTIONS.Add("CANCEL");
if (!Guide.IsVisible)
Guide.BeginShowMessageBox("test", "hello, XNA", MBOPTIONS, 0, MessageBoxIcon.Alert, new AsyncCallback(RespCallback), null);
base.Update(gameTime);
}
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
由于Microsoft.Xna.Framework.GamerServices是默认添加的组件,所以,我们可以直接使用Guide类。首先创建一个string类型的List,用于保存MessageBox中按钮的Text;然后通过List<string>的Add方法将需要显示的Button Text添加进去。
<p>接下来是Guide.IsVisible方法,由于MessageBox、SIP软键盘等公用一个绘制表面,必须保证没有其他UI显示时,才能够显示指定组件,如果不添加这句Guide.IsVisible的判断,将触发下面的异常。
</p>
<p><a href="http://hi.csdn.net/attachment/201009/20/0_12849729609lUy.gif"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://hi.csdn.net/attachment/201009/20/0_1284972967oOeZ.gif" width="645" height="290"></a>
</p>
<p>接下来就是调用的主体Guide.BeginShowMessageBox了,这是一个异步方法,调用后立刻返回。参数比较好理解,下面是函数的声明:</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">static</span> IAsyncResult BeginShowMessageBox (
<span class="kwrd">string</span> title,
<span class="kwrd">string</span> text,
IEnumerablestring> buttons,
<span class="kwrd">int</span> focusButton,
MessageBoxIcon icon,
AsyncCallback callback,
Object state
)
</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>第一个参数是标题,第二个参数是对话框内容,第三个是button上文字的列表,也表示有几个Button出现,第四个是焦点在第几个Button上,第五个是图标,我们设置为null,第六个是结束时调用的Callback函数对象,最后一个是用户自定义状态对象,可以传递自定义信息。其他参数都容易理解,AsyncCallback对象需要一个Callback函数RespCallback,我们实现如下:</p>
<pre class="csharpcode"> <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">void</span> RespCallback(IAsyncResult asynchronousResult)
{
<span class="kwrd">int</span>? b = Guide.EndShowMessageBox(asynchronousResult);
<span class="kwrd">if</span> (b > 0)
Debug.WriteLine(<span class="str">"Cancel"</span>);
<span class="kwrd">else</span>
Debug.WriteLine(<span class="str">"OK"</span>);
}
</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>Callback函数中最重要的工作是调用Guide.EndShowMessageBox函数,来关闭MessageBox。EndShowMessageBox需要传入一个IAsyncResult对象,来自Callback函数的参数。返回值是一个可为空的int,如果为空则表示没有返回值,如果不为空,返回值是Button的Index值,返回0表示点击了第一个按钮OK,返回1则表示点击了第二个按钮Cancel,以此类推。
</p>
<p>显示MessageBox的效果如下:
</p>
<p><a href="http://hi.csdn.net/attachment/201009/20/0_128497296802B8.gif"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image003" border="0" alt="clip_image003" src="http://hi.csdn.net/attachment/201009/20/0_1284972969l1Y0.gif" width="559" height="300"></a>
</p>
<h3>调用Software Input Panel</h3>
<p>接下来是调用SIP软键盘的代码,仍旧放到Update方法里,Callback函数也一并给出。</p>
<pre class="csharpcode"> <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Update(GameTime gameTime)
{
<span class="rem">// Allows the game to exit</span>
<span class="kwrd">if</span> (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
<span class="kwrd">this</span>.Exit();
<span class="kwrd">if</span> (!Guide.IsVisible)
Guide.BeginShowKeyboardInput(PlayerIndex.One,
<span class="str">"Here's your Keyboard"</span>, <span class="str">"Type something..."</span>,
<span class="str">"abc"</span>,
<span class="kwrd">new</span> AsyncCallback(GetTypedChars),
<span class="kwrd">null</span>);
<span class="kwrd">base</span>.Update(gameTime);
}
<span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">void</span> GetTypedChars(IAsyncResult asynchronousResult)
{
<span class="kwrd">string</span> output = Guide.EndShowKeyboardInput(asynchronousResult);
Debug.WriteLine(output);
}
</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>前边都解释过了,直接来看Guide.BeginShowKeyboardInput,第一个参数要传PlayerIndex进去,这个是针对Xbox的,在Windows和Windows Phone 7上只支持一个用户,所以直接传PlayerIndex.One就好了。接下来的三个参数是标题、描述和默认字符,然后是异步调用方法和自定义状态。还有最后一个可选参数,表示是否用Password方式显示字符。</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">static</span> IAsyncResult BeginShowKeyboardInput (
PlayerIndex player,
<span class="kwrd">string</span> title,
<span class="kwrd">string</span> description,
<span class="kwrd">string</span> defaultText,
AsyncCallback callback,
Object state,
<span class="kwrd">bool</span> usePasswordMode
)
</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>在异步调用方法中,Guide.EndShowKeyboardInput会返回一个字符串,该字符串为用户输入的字符串。为什么显示的是字符串呢,这和SIP的显示方式有关。在调用SIP函数后,会首先弹出第一个对话框,询问用户是否输入字符,如果用户点Cancel则关闭SIP,如果点OK则进入第二个界面,用户才能够使用SIP软键盘进行输入。
</p>
<p>下面就是SIP显示的状态:
</p>
<p><a href="http://hi.csdn.net/attachment/201009/20/0_1284972969R88R.gif"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image005" border="0" alt="clip_image005" src="http://hi.csdn.net/attachment/201009/20/0_1284972970Nok4.gif" width="602" height="325"></a>
</p>
<p><a href="http://hi.csdn.net/attachment/201009/20/0_1284972971prY3.gif"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image007" border="0" alt="clip_image007" src="http://hi.csdn.net/attachment/201009/20/0_1284972972AHAV.gif" width="603" height="323"></a>
</p>
<h3>写到最后</h3>
<p>今天的主角Guide类,还有很多有趣的函数调用,有兴趣的朋友按照这个方法调用就可以了。这次的代码量不多,所以就不给出单独Sample Code的下载了。再有就是,虚心接受批评,将文章里代码的格式弄好了。
</p>
<p>我最近还是很勤快的,Windows Phone 7的开发都写了三篇了,这是之前文章的链接:
</p>
<p>马宁的Windows Phone 7开发教程(1)——<a href="http://www.cnblogs.com/aawolf/archive/2010/08/28/1811438.html">Windows Phone开发工具初体验</a>
</p>
<p>马宁的Windows Phone 7开发教程(2)——<a href="http://www.cnblogs.com/aawolf/archive/2010/08/29/1811686.html">Windows Phone XNA 4.0 3D游戏开发</a></p>
<pre class="csharpcode"></pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style></string>
分享到:
相关推荐
包括《马宁的Windows Phone 7开发教程电子书和源代码(4)XNA显示中文字体》PDF文档和源代码。 我最近勤快地连自己都有些不可思议。昨天有朋友在上一篇文章里留言,批评Windows Phone 7暂时没有支持中文版的问题。...
- 开发环境:支持Windows 7操作系统,需要Visual Studio 2010 Express及以上版本。 - 编程语言:C++,C#,VB.NET - 主要功能: - 原始传感器流:直接访问设备的原始数据,如颜色、深度和骨骼信息。 - 骨骼追踪:...
Kinect是微软为XBOX 360推出的动作捕捉设备,但是广大的开发者嗅到了其中蕴含的巨大机会,于是Kinect SDK for Windows应运而生。作为有史以来销售最快的消费电子产品,Kinect很有可能成为计算机交互领域的新一次革命...
- 第二节课程:“Windows CE 下的开发概述” - 主讲人:何官键 - 内容简介:本课程重点介绍了基于 Windows Embedded CE 6.0 的嵌入式系统开发流程、涉及的工具和技术方案等,适合有一定基础的学习者深入学习。 ...
此外,还可以参考《微软 Kinect for Windows SDK 使用教程一 (NUI部分)》和《浅谈 Kinect for Windows SDK 之深度数据》这两篇文章,它们分别详细介绍了 SDK 的使用和深度数据的处理。 台湾地区的资料相对更为丰富...
培训的日程安排充实,第一天从早上9点开始,通过“开启移动美丽新世界”引出Windows Mobile平台的基础知识,接着探讨移动商业应用的需求和挑战,然后深入讲解开发工具的使用。下午的动手实验环节让学员亲自体验...
标题"数管221 马宁 趣旅行APP—基于大数据的景区人流监测平台(2)"表明这是一个关于“数管221”课程项目,由马宁同学主导,旨在开发一个名为“趣旅行APP”的应用。此应用的核心功能是利用大数据技术对旅游景区的人...
马宁-国家网络安全审查制度的法律塑造 安全对抗 业务风控 安全测试 渗透测试 系统安全
2021年09月16日
——调整了原来附录A和附录B的顺序,增加了附录C描述网络安全等级保护总体框架,并提出关键技术使用要求。 本标准由全国信息安全标准化技术委员会(SAC/TC260)提出并归口。 请注意本文件的某些内容可能涉及专利。本...
讲演者:马宁 Windows Mobile MVP 本次课程讲述SQL Server 2005 Mobile Edition和新的SQL Server 2005 Compact Edition在程序设计和性能优化方面的技巧和技术。本次课程包括SQL Mobile数据库在本地操作以及远程...
比赛将分为沙滩泳装、活力装和晚礼服三个篇章,每个篇章都有精心挑选的音乐和独特的氛围,让每位选手都能在最适合的舞台上,展现她们的美丽和自信。 在这激动人心的时刻,我们还将有幸欣赏到拉丁舞蹈组合和现代舞的...
开发过程中,需要参考相关文献,如马宁等人在《GPS和4G天线的开发设计》中提到的内容,这些资料能为设计人员提供技术指导和实践经验,确保天线性能满足汽车通信和导航的需求。 【总结】 GPS和4G天线在现代汽车中...
维纳通过他参与的一个具有划时代意义的工程挑战——为战时开发一种能够击落快速战机的防空炮——从而催生了这门学科。维纳和他的同事们应对这个工程挑战,创造了信息反馈系统的新科学领域,维纳将其命名为“控制论”...
讲演者:马宁 Windows Mobile MVP <br>本次课程讲述SQL Server 2005 Mobile Edition和新的SQL Server 2005 Compact Edition在程序设计和性能优化方面的技巧和技术。本次课程包括SQL Mobile数据库在本地操作以及...
电子海图是基于地理信息系统(Geographic Information System, GIS)技术开发的数字海图,它能够提供比传统纸质海图更丰富的信息,并支持多种高级功能,如航线规划、导航预警等。为了确保电子海图的质量和互操作性,...
7. **第7章(丛伟)**: 丛伟老师的另一章节可能涉及工程制图的标准化,包括国际和行业的标准规定,确保制图的规范性和通用性。 8. **大作业(白)**: 这部分可能包含一系列实践性的大作业,目的是让学生将所学知识...
该文档由软件工程专业的学生组成的研究小组编写,包括组长XX苗和组员X丹、魏婷、申丽娜、X俊廷、满宗鹏,于2015年12月7日在指导教师付伟、X明宇、马宁的指导下完成。 1. 引言 引言部分主要明确了文档的编写目的,即...
在雪堰中心小学的活动中,殷素玉和马宁两位老师展示了不同的教学风格,引发了对语文阅读教学有效性的深入讨论。 5. **阅读教学的有效性**:有效阅读教学不仅关注学生对文本的理解,还关注教学方法的选择和难点的...