从零开始系列,用C#做软件产品:私人日记(七)调试入门

上一节我们实现了树控件的右键菜单。

有细心的网友指出了项目存在的问题:一旦新建了一个节点以后,树控件就默认选中了这个节点,这时就没办法再创建根节点了。

这应该是我们遇到的第一个Bug了:),先来搞定它!有两种解决办法:

1)在右键菜单中再增加一个新建根节点的菜单项,专门用来新增根节点;现有的“新建”菜单名称改成“新建子节点”;

2)在鼠标左键点击其他区域时,取消树控件的选择状态,这样再新建就是根节点了;

两种方法都可行,只是如果采用第一种方法就没有新的知识点了,所以我决定采用第二个办法。

方案有了就去实现。鼠标左键点击树控件的其他区域时,有MouseDown和MouseUp两个事件可用,我放在选择MouseUp事件中来实现。

我们要实现的功能是:当鼠标点击的那一刻,判断鼠标位置是否在选择节点上,如果在就清掉选中节点的状态。代码如下:

从零开始系列,用C#做软件产品:私人日记(七)调试入门

上面的两行if语句逻辑比较简单,不多说了。红框内又有新知识点了,需要讲解一下:

先看最下面,清掉选中节点的状态用语句:tvCategory.SelectedNode = null; 来实现,那现在关键就是怎么判断鼠标在节点上呢?其实这是一个简单的几何问题,选择的节点构成了一个矩形,鼠标位置是一个点,这个点如果在矩形中,就说明鼠标在节点上。

.net框架中,鼠标位置用MousePosition表示;选中节点的矩形用SelectedNode.Bounds表示,判断一个点是否在矩形中,Bounds直接提供了Contains方法,传入的参数就是这个点的坐标,一切看起来都那么完美,但是如果你用tvCategory.SelectedNode.Bounds.Contains(MousePosition)来判断时,你可能永远都无法得到正确的结果。

这是因为MousePosition的值是相对于整个桌面的屏幕坐标系,而SelectedNode.Bounds的值是相对于当前窗体的坐标系,所以需要把鼠标的屏幕坐标转换成窗体坐标。

讲到这里可能初学者会有点懵,我简单做了一个示意图:

从零开始系列,用C#做软件产品:私人日记(七)调试入门

如上图,大家注意观察鼠标位置和蓝色、红色的框。蓝色框的右下角代表的就是鼠标在屏幕坐标系的位置,也就是MousePosition的值;红色框的右下角代表的就是鼠标在窗体坐标系的位置,我们需要把MousePosition的值转换成变成红色框的右下角对应的值。我刚开始学的时候也是懵的,后来反复试验就理解了。

理解虽然有点困难,实现起来超容易。.net框架已经封装好一个函数供我们使用,就是代码中的PointToClient,传入屏幕坐标系的值,直接输出窗体坐标系的值,就是这么简单粗暴。

代码运行效果如下:

从零开始系列,用C#做软件产品:私人日记(七)调试入门

如果同学们有举一反三的能力,也可以尝试下把客户端坐标转换成屏幕坐标,方法也是类似的。

在上面程序的实现过程中,如果我们单凭阅读代码、每次运行看结果,代码写起来还是比较累的,尤其是对于初学者。比如上面的坐标判断,需要根据鼠标具体坐标位置和节点矩形的具体位置和尺寸,才能判断出来每个过程是否正确。如果我们能在程序的执行过程中一步一步地看到每个变量的值,看到程序逻辑是如何走向的,那就可以帮助我们快速定位问题。那么VS能帮我们实现吗?

当然是必须可以的,不然我怎么会一直用C#开发,就是因为跟VS强强联手,让开发变得很容易:)我大概介绍下我常用的功能:

一、添加断点

什么是断点?你可以理解为乘地铁做安检,原本行色匆匆赶路的你,现在被要求停下来浑身一顿摸,你身上都带了什么东西被看得一清二楚。把安检的地方放在程序里,就是我们在一条语句上设置一个检查点,让程序运行到这里时停下来,然后我们看看这个程序的各个变量值都是什么,这个检查点就被称为断点。

在VS中如何添加断点呢?一步就可以,看下图:

从零开始系列,用C#做软件产品:私人日记(七)调试入门

只需要在代码视图最左边灰色条处点一下鼠标左键,就会出现一个红色的圆点,这样断点就加上了。断点可以每行都加,鼠标左键再点一下断点就会取消断点。当然具体加到哪行要看你自己的需要,下面我以上面的代码演示下:

从零开始系列,用C#做软件产品:私人日记(七)调试入门

我把断点加到Point ptMouse = PointToClient(MousePosition);的下面,当我未选中任何树结点的时候,我点鼠标不会中断程序,当我选中节点后,再点鼠标左键,程序就会中断,切换到代码视图,此刻把鼠标移到ptMouse变量上,发现它的值都可以显示出来了。

二、查看变量值

我们加断点的主要目的就是查看变量值。以上面的断点为例,我们演示下如何查看:

从零开始系列,用C#做软件产品:私人日记(七)调试入门

程序中断后,鼠标移动到想要查看的变量,会自动弹出该变量的显示窗口。其下的变量前面如果带个小三角号,说明可以展开。比如上图我们就是以tvCategory为例,可以展开Nodes变量,然后这个树下面的一级节点就都显示出来了。

三、添加监视

上面查看变量的方式只能同时查看一个变量。有的时候经过层层展开,终于找到了那个想要看的值,结果不小心把鼠标点在别地方,窗口就消失了。添加监视可以解决这类问题,看下面的演示:

从零开始系列,用C#做软件产品:私人日记(七)调试入门

使用监视窗口,不仅不用担心窗口消失问题,可以同时查看多个变量,还可以对比值的变化。

如下图,在我切换不同的鼠标位置后,ptMouse的值会变成红色,说明发生了改变。

从零开始系列,用C#做软件产品:私人日记(七)调试入门

四、单步调试、结束调试

有的时候我们需要一步一步运行代码,看下程序是如何走向的。还是看演示吧,代码行变成黄色就说明程序运行到了当前行的位置:

从零开始系列,用C#做软件产品:私人日记(七)调试入门

程序进入调试模式下,以下几个快捷键大家尽量记住:

以上仅仅是我比较常用的调试功能,还有些其他的功能,用得不多就不一一介绍了,大家有兴趣也可以自行尝试下。

原计划这节是实现分类管理界面,但是随着教程内容的不断深入,我们的代码量开始增多。如果大家不能尽快掌握调试功能,就很难快速发现代码中的错误,后面的自学可能会遇到一定的困难。

在软件开发的全部过程中,纯粹写代码的时间或许只占程序员全部工作时间的20%,相当多的时间是用在修复Bug上,要解决Bug的前提就是要通过调试查找原因,有时候遇到变态的Bug调试几天都没有结果,所以灵活运用调试技能是每个程序员都必须要掌握的。

今天的内容就到这里,下节开始分类管理界面。

近期事情比较多,尽量保证1-2天一更。

如教程有帮助请大家帮忙关注、转发、扩散,能不能开专栏还需要你们的支持!

----------------------------------------------------

本教程已作为开源项目加入到Git,代码内容会随教程实时更新,大家有兴趣的话可以关注我,以获得最及时的更新。私信:私人日记 可以来获取Git的链接。

C#基本语法大家在头条搜索“菜鸟c#”,个人感觉这个网站还可以。

大家阅读过程中有哪些看不懂或未尽兴的地方,可以在评论区留言,我会先记下来在后续的教程中找机会再说。

展开阅读全文

页面更新:2024-05-17

标签:坐标系   矩形   窗体   断点   节点   软件产品   坐标   控件   变量   入门   屏幕   私人   红色   位置   代码   功能   程序   教程   日记   系列

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top