100165569.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 85 行
HTM
85 行
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
20.3 调试须知
</title></head>
<body>
<div class="area">
<div class="col1">
<div class="lineBlue">
</div>
<!-- title -->
<div class="arcTitle">
<h1>
<a href="../16">
C#高级编程(第3版)【全文连载】
</a>
</h1>
<div style="text-align: center; font-size: 15px">
<a href="100165569.htm">
20.3 调试须知
</a>
</div>
<div style="text-align: center; font-size: 15px">
<a class="url" href="../../default.htm">http://book.csdn.net/</a>
2006-10-13 14:41:00
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165569.htm'><font color='red'>20.3 调试须知</font></a></h1>
<div id="divRelateNode" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165566.htm'>20.2.2 Size和SizeF结构</a></div><div style='float:right;width:49%'>·<a href='100165567.htm'>20.2.3 Rectangle和RectangleF结构</a></div><div style='float:left;width:49%'>·<a href='100165568.htm'>20.2.4 Region</a></div><div style='float:right;width:49%'>·<a href='100165570.htm'>20.4 绘制可滚动的窗口</a></div><div style='float:left;width:49%'>·<a href='100165571.htm'>20.5 颜色</a></div><div style='float:right;width:49%'>·<a href='100165572.htm'>20.5.1 红绿蓝(RGB)值</a></div></div>
</div>
</div>
</div>
<!-- main -->
<div id="main">
<div id="text"> <link href="css.css" rel="stylesheet" type="text/css" /><h3 style="MARGIN-TOP: 11.4pt; MARGIN-LEFT: 0cm; MARGIN-RIGHT: 0cm; FTEL: 11.4pt"><a ftel="_Toc507815362"><span lang="EN-US">20.3 </span></a><span style="FONT-FAMILY: 楷体_GB2312">调试</span><span style="FONT-FAMILY: 楷体_GB2312">须知</span></h3>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">下面准备进行一些更高级的绘图工作。但首先介绍几个调试问题。如果在本章的示例中设置了断点,就会注意到调试图形例程不像调试其他程序那样简单。这是因为进入和退出调试程序常常会把</span><span lang="EN-US">Paint</span><span style="FONT-FAMILY: 宋体">信息传送给应用程序。结果是在</span><span lang="EN-US">OnPaint</span><span style="FONT-FAMILY: 宋体">重载方法上设置的断点会让应用程序一遍又一遍地绘制它本身,这样应用程序就不能完成任何工作。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">这是很典型的一种情形。要明白为什么应用程序没有正确显示,可以在</span><span lang="EN-US">OnPaint</span><span style="FONT-FAMILY: 宋体">上设置断点。应用程序会像期望的那样,遇到断点后,就会进入调试程序,此时在前景上会显示开发环境</span><span lang="EN-US">MDI</span><span style="FONT-FAMILY: 宋体">窗口。如果把开发环境设置为满屏显示,以便更易于观察所有的调试信息,就会完全隐藏目前正在调试的应用程序。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">接着,检查某些变量的值,希望找出某些有用的信息。然后按下</span><span lang="EN-US">F5</span><span style="FONT-FAMILY: 宋体">,告诉应用程序继续执行,完成某些处理后,看看应用程序在显示其他内容时会发生什么。但首先发生的是应用程序显示在前景中,</span><span lang="EN-US">Windows</span><span style="FONT-FAMILY: 宋体">检测到窗体再次可见,并提示给它发送了一个</span><span lang="EN-US">Paint</span><span style="FONT-FAMILY: 宋体">事件。当然这表示程序遇到了断点。如果这就是我们希望的结果,那就很好。但更常见的是,我们希望以后在应用程序绘制了某些有趣的内容后再遇到断点,例如在选择某些菜单项,读取一个文件或者以其他方式改变显示的内容之后再遇到断点。这听起来就是我们需要的结果。我们根本没有在</span><span lang="EN-US">OnPaint</span><span style="FONT-FAMILY: 宋体">中设置断点,应用程序也不会显示它在最初的启动窗口中显示的内容之外的其他内容。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">有两种方式可以解决这个问题。如果有足够大的屏幕,最简单的方式就是恢复开发环境窗口,而不是把它设置为最大化,使之远离应用程序窗口,这样应用程序就不会被挡住了。但在大多数情况下,这并不是一个有效的解决方案,因为这样会使开发环境窗口过小。另一个解决方案使用相同的规则,即把应用程序声明为在调试时放在最上层。方法是在</span><span lang="EN-US">Form</span><span style="FONT-FAMILY: 宋体">类中设置属性</span><span lang="EN-US">TopMost</span><span style="FONT-FAMILY: 宋体">,这很容易在</span><span lang="EN-US">InitializeComponent</span><span style="FONT-FAMILY: 宋体">方法中完成:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> private void InitializeComponent()</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> this.TopMost = true;</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">也可以在</span><span lang="EN-US">Visual Studio .NET</span><span style="FONT-FAMILY: 宋体">的属性窗口中设置这个属性。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">窗口设置为</span><span lang="EN-US">TopMost</span><span style="FONT-FAMILY: 宋体">表示应用程序不会被其他窗口挡住</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">除了其他放在最上层的窗口</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。它总是放在其他窗口的上面,甚至在另一个应用程序得到焦点时,也是这样。这是任务管理器的执行方式。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">利用这个技巧时必须小心,因为我们不能确定</span><span lang="EN-US">Windows</span><span style="FONT-FAMILY: 宋体">何时会决定应以某种原因引发</span><span lang="EN-US">Paint</span><span style="FONT-FAMILY: 宋体">事件。如果在某些特殊的情况下,</span><span lang="EN-US">OnPaint</span><span style="FONT-FAMILY: 宋体">出了问题</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">例如,应用程序在选择某个菜单项后绘图,但此时出了问题</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。最好的方式是在</span><span lang="EN-US">OnPaint</span><span style="FONT-FAMILY: 宋体">中编写一些虚拟代码,测试某些条件,这些条件只在特殊的情况下才为</span><span lang="EN-US">true</span><span style="FONT-FAMILY: 宋体">。然后在</span><span lang="EN-US">if</span><span style="FONT-FAMILY: 宋体">块中设置断点,如下所示。</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> protected override void OnPaint( PaintEventArgs e )</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> // Condition() evaluates to true when we want to break</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> if ( Condition() == true)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> int ii = 0; // <-- SET BREAKPOINT HERE!!!</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">上面的这段代码是设置条件断点的一种简捷方式。</span></p></div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100165568.htm">上一页</a> <a href="index.html">首页</a> <a href="100165570.htm">下一页</a>
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165569.htm'><font color='red'>20.3 调试须知</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165566.htm'>20.2.2 Size和SizeF结构</a></div><div style='float:right;width:49%'>·<a href='100165567.htm'>20.2.3 Rectangle和RectangleF结构</a></div><div style='float:left;width:49%'>·<a href='100165568.htm'>20.2.4 Region</a></div><div style='float:right;width:49%'>·<a href='100165570.htm'>20.4 绘制可滚动的窗口</a></div><div style='float:left;width:49%'>·<a href='100165571.htm'>20.5 颜色</a></div><div style='float:right;width:49%'>·<a href='100165572.htm'>20.5.1 红绿蓝(RGB)值</a></div></div>
</div>
</div>
</div>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?