Paint.Net学习笔记——四、窗体粘靠

本节介绍在Windows应用程序中出现的“控件粘靠”效果的实现。

之前一直用Winamp播放音乐,直到现在使用千千静听和酷狗,这几款音频播放软件界面一脉相承,并 都具有“控件粘靠”效果,现在让我们一起来看看PDN里这种效果是如何实现的。

在PDN中,实现该效果的是由SnapManager类和SnapObstacle(下称障碍物)抽象类实现的,当然还有 一些辅助类,譬如SnapDescription(下称粘靠定义)类。

SnapManager顾名思义是粘靠效果的管理类,负责各障碍物的定位、判断是否需要粘靠、保存加载效 果、生成粘靠定义对象等工作。

SnapObstacle是一个抽象类,定义了作为“可粘靠”的控件的必要属性,包括障碍物轮廓,粘靠距离 ,粘靠事件等。

接下来看看它们是怎样在一起工作的。

“粘靠”效果主要应用在浮动窗口(工具栏、历史、颜色和图层)。从上篇文章中,我们已经了解了 这几个窗体的继承关系和各自实现的接口,在这里简单复习一下:

PdnBaseForm为所有窗体的父类,实现了ISnapManagerHost接口,所有浮动窗口继承自 FloatingToolForm,实现了ISnapObstacleHost接口。所有“粘靠”效果就是由这两个接口提供的。

这两个接口相当简单,各自只提供了一个属性,该属性分别是SnapManager和SnapObstacle。

我们先看看SnapManager类,上面已经解释了该类的主要作用,不再罗嗦,接下来细致看看那里面的 代码:

SnapManager字段

 1private Dictionary<SnapObstacle, SnapDescription> obstacles =new Dictionary<SnapObstacle, SnapDescription>();
  2private const string isSnappedValueName = "IsSnapped";
  3private const string leftValueName = "Left";
  4private const string topValueName = "Top";
  5private const string widthValueName = "Width";
  6private const string heightValueName = "Height";
  7private const string nullName = "";
  8
  9private const string snappedToValueName = "SnappedTo";
10private const string horizontalEdgeValueName = "HorizontalEdge";
11private const string verticalEdgeValueName = "VerticalEdge";
12private const string xOffsetValueName = "XOffset";
13private const string yOffsetValueName = "YOffset";

时间: 2016-08-20

Paint.Net学习笔记——四、窗体粘靠的相关文章

kvm虚拟化学习笔记(四)之kvm虚拟机日常管理与配置

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1290269 KVM虚拟化学习笔记系列文章列表 ---------------------------------------- kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51cto.com/703525/1288795 kvm虚拟化学习笔记(二)之linux kvm虚拟机安装 h

Paint.Net学习笔记——三、窗体(下)

近1个月没有更新了,不能再懒了,继续更新PDN的学习笔记!本节将说明PDN中窗体的继承关系,实 现过程等. 如上图所示,在PDN中,所有窗体都继承自PdnBaseForm类,该类继承自Form类与ISnapManagerHost接 口,该接口定义了SnapManager的get方法,SnapManager是管理界面窗口"粘靠"效果的,该实现方法之 后文章中讲述. 现在快速地过一下各个窗体的作用及特点. BaseForm: 所有PDN里窗体的基类,主要提供常用窗体方法及注册.卸载热键.

Sqlite学习笔记(四)&amp;&amp;SQLite-WAL原理(转)

Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是什么       WAL(Write ahead logging)是一种日志模式,它是一种思想,普遍应用于关系型数据库.每个事务执行变更时,修改数据页,同时会产生日志,这样在事务提交后,不需要将修改的脏页刷盘,只需要将事务产生的日志落盘即可返回.WAL保证日志一定先于对应的脏页落盘,就是所谓的WAL.SQLI

Caliburn.Micro学习笔记(四)----IHandle&lt;T&gt;实现多语言功能

Caliburn.Micro学习笔记目录 说一下IHandle<T>实现多语言功能 因为Caliburn.Micro是基于MvvM的UI与codebehind分离, binding可以是双向的所以我们想动态的实现多语言切换很是方便今天我做一个小demo给大家提供一个思路 先看一下效果                                           点击英文  变成英文状态点chinese就会变成中文                         源码的下载地址在文章的最下

Paint.Net学习笔记——二、窗体(上)

在PDN顺利执行了启动逻辑后,就进入Application.Run(new MainForm(arg))了,接下来我们一起来 看看Main里面有什么奥秘. 进入MainForm类,发现该类继承自PdnBaseForm类,而这个基类的注释里,说明了该基类用于修复 Form类中透明度不能为1.0的bug,那么我们之后再看,还是先看看MainForm(string[])构造函数. 在该构造函数中,一进来先是检查启动参数.(如何使用启动参数启动PDN?这里提供一个比较简单 的方法:进入CMD(命令行模式

JSP学习笔记(四)-----JSP动作的使用

js|笔记 1. 该实例主要告诉我们怎么样在JSP代码中使用JSP动作,例如<jsp:forward >2. 该实例需要四个文件:login.jsp,test.jsp,ok.htm,no.htm3. 首先看一下login.jsp<html><center><form method=get action="http://127.0.0.1:8000/test.jsp">username<input type=text name=use

Paint.Net学习笔记——一、启动

把从http://www.afterdawn.com/software/source_codes/paint.net.cfm下载到的PDN3.05源码下载 下来后,解压出来src目录下就是PDN的解决方案目录了,可以使用VS2005或VS2008打开解决方案. 在所有工程中,核心的工程为 Data\Effects\Paintdotnet\PdnLib\SystemLayer.而其中 Paintdotnet是启动项目,程序从Startup.cs启动. 现在我们就来看看PDN的启动有什么奥秘吧. S

PL/SQL学习笔记(四)

这部分主要讲述在PL/SQL中如何访问oracle (一)检索单行数据 在PL/SQL嵌入select语句,使用方法: SELECT select_list INTO variable_name1,variable_name2,variable_name3... FROM TABLE WHRE condition 例:   DECLARE   v_sal  NUMBER ( 6 , 2 );  v_id  NUMBER ; BEGIN   v_id: = ' &id ' ;   SELECT  

extjs 学习笔记 四 带分页的grid_extjs

因此,现在几乎所有的grid控件都会支持分页功能.extjs也不例外,它对分页也提供了强大而方便的支持,使得我们在分页处理上可以得心应手. 在extjs中,类Ext.PagingToolbar封装了关于分页的操作,该类从Toolbar继承而来,单从名字上看,我们也猜得出这是一个能够处理分页的工具栏.好吧,那我们就来看看如何构造这样一个工具栏吧.PagingToolbar类的构造函数需要一个json对象来进行配置,在js中,使用json对象来提供所需参数非常方便,这样使得我们可以只填写感兴趣的参数