当前位置:首页 >> 信息与通信 >>

第二章 基于WORD的手写批注技术的研究与实现


第二章 基于 WORD 的手写批注技术的研究与实现 2.1 WORD 软件的二次开发简介 2.1 1 VBA 是新一代 Microsoft Windows 应用软件通用的宏控制语言 许多年来,Microsoft 公司一直对新闻界及开发人员暗示,它的长远策略包括一种通用 的应用程序编程语言。 这种语言将用于微软的所有应用程序中, 它起源于应用得相当广泛的 计算机语言——VB。这种语

言将向高级用户及开发人员提供一种应用程序间通用的应用程 序语言(也就是宏语言),因而可以减少学习时间和支持费用。同时这种语言也会为开发人员 提供一种开发方法,用于开发集成多个应用程序的系统,即多个应用程序协调工作,以解决 实际应用问题。 这个期待已久的语言就是 Visual Basic for Application(简称 VBA),包括这种语言的第一 个微软产品就是 Excel5.0。VBA 为高级用户及开发人员提供了使用最通用的 Windows 编程 语言——Visual Basic 的能力,并可以将它应用到 Excel 和 Word 的问题中。它也使得用户可 以更容易控制其它 Microsoft 的应用程序。由于 VBA 是新一代 Microsoft Windows 应用软件 通用的宏控制语言, 不但语法简单而且能直接运用相关软件, Excel, Project, Power Point 如 等的各项强大功能。因此,一旦掌握 VBA,使用者就可以在为最终用户定制的应用软件中 直接运用上述各项软件的功能,而不必再费时去自行开发。 2.1.2 VBA 有效地解决了从定型软件应用程序到“软件构造模块”的转变 虽然 VBA 源于 VB,但它成为一个对应用程序几乎没有束缚的独立工具。VBA 不仅仅 作为一个宏语言挤进每个应用程序, 它还保留一个可以在应用程序间操作的开放编程工具来 作为一个结合层。 如在 Office 中的每个组件除各有专长或侧重点, 具有强大的用户定制和模 板功能外,对于比较复杂的重复性操作,用户还可以设置宏来代劳。借助 VBA,用户不仅 可以完全控制每个 Office 组件的工作方式,而且可以根据自己的需求制作出一个依托于 Office 套件,但又不属于任何组件的应用程序。用户自制的新应用程序不仅可以具有每个组 件所包含的字处理、电子表格等固有功能,还可以打破 Office 套件的界限,与 Microsoft 公 司的其它产品协同工作,从而形成一个组织计算环境的有机整体。 VBA 除了实用性特别强外,更重要的是它不但容易学习,而且还能以记录的方式直接 将使用者想要的操作记录成程序(其实更确切地说应是 VBA 程序代码)。所以,VBA 实际上 也具备了应用程序生成器的特色和功能。相信当您接触 VBA 后,很难不被它如此强大而便 利的功能所吸引。Excel5.0 率先采用 VBA 作为其标准的宏语言,随后 Word、Power Point 都一致采用相同的 VBA 语法,增加了不同应用程序之间的通用性。因此无论对程序设计者 还是对一般用户而言,有这样一个开放的综合性的应用环境,工作起来将会更加游刃有余。 2.1.3 VBA 承担了扩展 OLE 的任务 除了为不同的软件功能的综合应用提供更具体的方案,VBA 实际上还附带着一些高级 应用。当你在 Microsoft 中提到“集成”时,多数人可能认为你在说“OLE”——对象链接 和嵌入(Object Linking and Embedding),它是 Microsoft 处理一个应用程序包含另一个应用程 序的文档的长远标准。最基本的 OLE 提供了一种应用程序间交换数据的方法。VBA 承担了 扩展 OLE 的任务, 这样你将能像交换数据那样交换命令, 这些扩展被称为 OLE Automation, 并在 OLE2.0 中发布。Excel 是第一个完全采用 OLE Automation 的应用程序。有了 OLE Automation 的帮助,VBA 对于所有使用 Office 套件的用户来说,更是不可多得的好帮手。

这是因为 VBA 可以实现您的特殊需求,利用记录 VBA 程序代码的方式,可以迅速完成一 套应用系统,能直接运用 Excel 来生成数据分析图表,配合 Word 来编辑业务报告,再通过 PowerPoint 来设计出高品质的动态简报。 虽然 VB 及 VBA 都有一个“Basic” ,但是您可别只把它当成 Basic 语言的“Visual”版 来看。至于 VBA 与 VB 到底应当如何区分呢?您只要有这样一个概念:VB 是一种程序语言, 而 VBA 则不能被归类于程序语言,它虽具有十分完整的程序语言基本结构(与 VB 十分类 似),但事实上它提供的不单单是程序代码而是对 Microsoft Office 各种软件功能的一种综合 控制。因此,相对于 VB 而言,VBA 算是一种面向用户的控制语言。此外,VBA 还具有应 用程序生成器的特性。实际上,VBA 的强大开发功能与易用性相结合,实现了从定型软件 应用程序到“软件构造模块”的转变。开发人员可以用它们快速生成大量的用户解决方案, 将桌面系统和商业与工业领域的特定应用程序、 数据和解决方案集成在一起。 开发人员可以 定制并扩展这些应用程序的功能, 以便符合特定的业务需求, 而不需要从最低层开始开发应 用程序。VBA 使得 Office 不仅仅是一个桌面办公系统,还是一个易学易用的开发平台。 2.1.4 VBA 开发特点 1、Microsoft Office 对象模型 Visual Basic 是一种面向对象的开发语言。 VBA 将 Microsoft Office 中的每一个应用程序 都看成一个对象。每个应用程序都由各自的 Application 对象代表。 在 Word 中,Application 对象中包容了 Word 的菜单栏、工具栏、Word 命令等的相应对 象,以及文档对象等等。菜单栏对象中包容了所有的菜单及菜单命令。工具栏对象中包容了 各种命令按钮。文档对象中则包容了所有的文字、表格、图像等文档组成部分的相应对象。 文档对象是 Microsoft Word Visual Basic 中的主要对象。 在 Excel 中,Application 对象中包容了 Excel 的菜单栏、工具栏等的相应对象,以及工 作表对象和表对象等等。工作表对象和图表对象是 Microsoft Excel Visual Basic 中的主要对 象。 在 Access 中,Application 对象中包容了 Access 的菜单栏、工具栏等的相应对象,以及 报表对象和窗体对象等等。报表对象和窗体对象是 Microsoft Access Visual Basic 中的主要对 象。 在 PowerPoint 中,Application 对象中包容了 PowerPoint 的菜单栏、工具栏等的相应对 象,以及演示文档对象等等。演示文档对象是 Microsoft PowerPoint Visual Basic 中的主要对 象。 2、基于对象的开发 (1) 使用 Microsoft Office 对象 Office 已经具有了强大的功能, Office 的对象模型使得可以使用 Microsoft Office 中的对 象来完成自己的工作。程序员可以不必浪费时间开发自己的组件,只需充分地利用 Office 的功能。 Office 开发者可以在 Office 的基础上进行自己的开发, 而不必一切从头开始。 例如, Office 开发者可以使用 Word 的拼写检查器,而不必自己来开发一个拼写检查器。 (2) 用户创建对象 Office 开发者可以在 Office 对象中创建自己的对象:可以创建自己的菜单和工具栏,添 加到 Office 的对象集合中;可以创建一个窗体,并且在窗体中添加控件,等等。例如,在 Word 中,可以往自动更正的词库中添加自己的词条。

3、VBA 开发 Office 的功用 有人也许觉得 Office 的功能已经足够强大了,是否还有必要使用 VBA 来开发 Office。 的确,即使根本不用编写一句语句,Office 就可以完成用户所能遇到的各种任务。但是,人 们对效率的追求是永不满足的,这就是使用 VBA 来开发 Office 的原动力。 (1) VBA 可以使 Office 任务自动化 在使用 Office 的过程中, 往往要遇到一些重复性的系列工作, 特别是在处理大批量的文 档或数据时。通过录制宏或使用 Visual Basic 编写宏,使一系列的工作只需要一个指令便能 完成,这就成倍地提高了工作效率。 (2) VBA 可以定制 Office 满足自己的需要 Office 是一个功能异常庞杂的软件包,对某一用户来所说,许多命令可能一辈子也用不 着,而另外一些命令可能得经常使用。有时候,功能复杂反而显得多余。另外,Office 的外 观显得异常的繁杂,许多用户面对如此繁杂的界面往往手足无措。通过 VBA 可以设置自己 的界面, 把自己经常用到的菜单命令和工具栏放置到显眼的地方, 隐藏一些不常用的菜单或 工具栏,并且,可以把自己所编写的宏设置为菜单命令或设置为工具栏中的命令按钮,方便 了使用。并且,可以根据自己的需要来定制 Office 的功能,满足自己的需要。 (3) VBA 可以增强 Office 的功能 Office 的功能虽然强大,但它不可能考虑到所有情况,而且情况是千变万化的,各种情 况都有特定的要求。通过 VBA 可以增强 Office 的功能,以处理各种各样的任务。例如,可 以设置 Word 拼写检查的词库;可以往词库中添加新的词语;可以设置自动更正,设置自己 经常遇到的误拼等。 (4) VBA 可以增强 Office 与用户的交互 在 Office 中,可以利用 Visual Basic 创建窗体,并在窗体中添加控件等用户接口元素。 通过用户接口,应用程序可以得到用户的请求,并对其作出响应。 (5) VBA 可以集成 Office 的功能 Office 不是几个软件的简单组合,而成为一个有机的整体发挥巨大的作用。Visual Basic 提供了集成 Office 的功能的一种手段。 通过 OLE(对象的链接和嵌入)和 DDE(动态数据交换)技术的使用可以集成 Office 的功能。例如,利用 Visual Basic,可以在 Word 文档中链接 Excel 数据表,调用 Excel 来对 该数据进行处理。在 Excel 中处理该数据表,得到结果也要刷新 Word 文档中的数据表,保 持了数据的更新。这时的文档确切地说应该是一个复合文档。 OLE 自动化技术则提供了一种在应用程序中控制源文档的方法。 OLE 自动化的优点是, 在单一的环境中工作,同时可以使用其他应用程序的功能。 在 Microsoft Office 环境中,利用 Visual Basic 开发应用程序时,可以利用 OLE 自动化 组合 Microsoft Office 中的多个应用程序,建立自动化应用程序。Microsoft Office 提供了大 量的材料,只需把它们拼凑起来。 2.1.2 Microsoft Word VBA 对象结构图 Microsoft Word 提供给编程人员的资源非常丰富,其中最常用的是 Word 的各种对象, 下面给出 Word 的对象结构图。

2.2 屏幕手写技术的研究与屏幕手写方案设计 在公文系统中实现公文的批注以及会签主要涉及两个主要的技术难点,其一是如何实 现仿纸操作;其二是如何实现自由曲线。 2.2.1 为什么需要屏幕手写技术 随着各行业信息化程度的提高,办公自动化(OA)在政府机关、企事业单位的应用越 来越普及。但在群体办公条件下,对流转的公文进行保留痕迹的修改或批注,以往还缺少有 效的手段。 纸质文档无法从现实的办公自动化环境中退役, 秘书必须手持公文奔走于各部门 之间,从某种意义上讲,还是在降低着工作的效率。现在虽然许多单位都实施了无纸办公, 但是其中的 OA 系统却总不令人满意,结果换了又换,主要原因是 OA 系统提供的应用平台 不便于领导的使用,与事前预想的应用相差甚远。业内人士戏言:"只因少了一支笔,自动 化变成了白动化"。 各种现实条件要求我们开发出手写文档电子化解决方案, 即所使用的电子手写笔可以在 任何书写平面上书写,并且同步将您书写的信息传送到计算机中。也就是说,您可以用笔与 计算机对话。 "手写文档电子化"的技术包括三个流程: ? ? ? 首先, 用电子手写笔在普通纸或任何书写平面上, 按照原有的书写习惯手写批注和 签名。 然后,将电子手写笔输入的内容进行加工,捆绑在相关的电子文档上。 最后,使用不可逆转的文件格式,来确保电子文档的存储和发布的安全。

2.2.2 解决方案的提出 "手写文档电子化"的第一部就是要实现在计算机屏幕上的屏幕书写技术, 为了能够保留 屏幕上的修改和批注的痕迹,必须要做到以下两点: 首先必须在计算机屏幕上提供给批示人一个可以进行手写批注的平面, 这个平面必须是 位于要批注的文档之上,同时批示人又能够透过该平面看到需要批示的文件内容。 其次因为每个汉字是由很多的比划构成,而每一个笔划各异,无规律可循,不能用某一 种规则的图形来表示。 因此只有通过自由曲线来表示汉字中的比划。 所以必须要实现在前面

提到的屏幕上绘制自由曲线。 基于以上两点要求,我设计了以下解决方案: 1、 首先在一个窗体打开需要批示的文件; 2、 创建另一个窗体,设置这个新创建的窗口的父窗口句柄为打开文件的窗口,同时通 过重载此子窗体的 Form Create 事件处理函数,实现该窗体的透明。这就保证了次 子窗体能够随父窗体的移动而移动,同时批示人可以通过这个子窗体看到需要批示 的文件的内容; 3、 当批示人使用手写笔接触到手写板时或者按下鼠标时,开始纪录下批示人移动手写 笔(鼠标)的轨迹,同时在第二步创建的窗体上绘制出手写笔的移动轨迹,直到批 示人使手写笔(鼠标)离开手写板为止。这样就记录下了批示人批示的一个笔划的 自由曲线所有坐标; 4、 当批示人使手写笔离开手写板的时候,取出第三步记录下的一笔的坐标轨迹,将该 笔批示通过 Word 中绘制自由曲线的宏添加到 Word 文件中。因为第三步记录下的 一笔的轨迹坐标是基于第二步中创建的透明子窗体的,为了在 Word 中绘制自由曲 线是保证笔划位置的正确,所以必须把它转化为基于第一步中的打开文件的窗体下 的坐标; 5、 重复 3、4 两个步骤,直到批示结束。 为了实现以上的方案,需要解决三个技术问题,分别是绘制透明窗体,在 WORD 中绘 制自由曲线以及批示窗体与文件窗体的坐标转化。下面分别介绍这三个技术问题的解决。 2.3 透明窗体的绘制 实现绘制透明窗体的方法很多, 每一种方法都有各自的优点与弊端, 在不同的应用环境 下,需要选择不同的方法实现。 2.3.1 常见的一种方法 常见的方法是通过在一个窗体上放置一个位图控件, 并让改位图控件占满整个窗体, 在 创建窗体之前把当前屏幕上的内容扑捉到一副位图中保存起来, 在创建窗体时将前面扑捉到 的位图绘制到窗体的位图控件中, 实现该窗体的内容与创建前桌面上的内容完全一致。 这种 方法在屏幕截图软件中经常用到。 方法的实现: (1)定义一个获取屏幕位图的函数,函数定义如下: function GetScreen(): TBitMap; var ScreenPic: TBitMap; Begin ScreenPic := TBitMap.Create; BitMap.FreeImage; BitMap.Width := GetSystemMetrics(SM_CXSCREEN); {Screen.Width} BitMap.Height := GetSystemMetrics(SM_CYSCREEN); {Screen.Height} BitBlt(BitMap.Canvas.handle, 0, 0, BitMap.Width, BitMap.Height, GetDc(0), 0, 0, SRCCOPY); Result := ScreenPic;

end; (2)在需要设置位透明的窗体内放置一个 TImage 的控件,并把该窗体与该控件扩展 至全屏,然后在创建窗体时调用第一步中的 GetScreen 函数,将该函数的返回值赋给窗体上 的 TImage 控件,实现代码如下: GetScreen(ScreenPic); FormPic.ImagePic.Picture.Bitmap.Assign(ScreenPic); with FormTransParent do begin BorderStyle := bsNone; WindowState := wsMaximized; Position := poScreenCenter; Visible := True; end; 这种方法的缺点是程序运行期间, 需要在内存中保存一副位图, 这样占用的内存空间比 较大,对程序的性能有影响。 2.3.2 优化的方法 在 windows2000 下增加了一些新的 API 函数,可以轻易的实现透明或者半透明的窗体, 利用这些 API 函数生成透明窗体的方法既简单又能够节约系统资源,提高程序的运行效率, 比第一种方法有很大改进。实现透明窗体的函数主要包括: LONG GetWindowLong( HWND hWnd, // handle of window int nIndex // offset of value to retrieve ); LONG SetWindowLong( HWND hWnd, // handle of window int nIndex, // offset of value to set LONG dwNewLong // new value ); BOOL SetLayeredWindowAttributes( HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags ); 利用上面三个函数,通过重写需要透明的窗口的 Form Create 函数就可以实现窗体的透 明,代码如下: procedure TFormTransParent.FormCreate(Sender: TObject); var OldStyle: LongInt; begin OldStyle := GetWindowLong(Handle, GWL_EXSTYLE); OldStyle := OldStyle Or WS_EX_LAYERED;

SetWindowLong (handle, GWL_EXSTYLE, OldStyle); SetLayeredWindowAttributes (handle, 0, 180, LWA_ALPHA); end; SetLayeredWindowAttributes 的第二个和第三个参数是指定透明颜色的参数,当第二 个参数为 0 时,设置第四个参数的值(alpha 值) ,从 0 到 255 表示需要窗体透明的程度, 将第四个参数设置为 255 表示窗体不透明, 设置为 0 表示完全透明, 设置为 0 到 255 之间的 值表示部分透明。 2.4 通过 VBA 在 WORD 中绘制自由曲线 利用 VBA 在 WORD 中绘制自由曲线主要是通过三个方法来实现,下面对这三个方法 的功能、参数和返回值进行详细的几介绍。 (1) BuildFreeform 方法, 此方法建立一个任意多边形对象。 返回一个 FreeformBuilder 对 象, 该对象代表正在建立的任意多边形。 AddNodes 方法向任意多边形添加线段。 用 当您向任意多边形中添加了至少一条线段后,就可以用 ConvertToShape 方法将 FreeformBuilder 对象转化成 Shape 对象, 此对象具有 FreeformBuilder 中定义的几 何描述特性。 方法的说明如下: expression.BuildFreeform(EditingType, X1, Y1) 参数与返回值说明: expression 必需。表示该表达式返回一个 Shapes 对象。 EditingType 必需。表示第一个节点的编辑属性。 EditingType 可以是下列 MsoEditingType 常量之 一: msoEditingAuto msoEditingCorner X1,Y1 Single 类型,必需。表示任意多边形第一个顶点相对于文档左上角的位置。 (2) AddNodes 方法, 本方法将新线段插入到正在创建的任意多边形的尾部, 并添加顶点 以定义此线段。如果需要,可反复使用此方法将顶点添加至正在创建的任意多边形。 添完顶点后可用 ConvertToShape 方法来创建刚才定义的任意多边形。若要为已创 建完的任意多边形添加顶点,请用 ShapeNodes 集合的 Insert 方法。 此方法的说明如下: expression.AddNodes(SegmentType, EditingType, X1, Y1, X2, Y2, X3, Y3) 参数与返回值说明: expression SegmentType 必需。该表达式返回一个 FreeformBuilder 对象。 必需。表示要添加的线段的类型。 可以是下列 MsoSegmentType 常量之一:

SegmentType

msoSegmentLine msoSegmentCurve EditingType 必需。顶点的编辑属性。如果 SegmentType 属性为 msoSegmentLine,则 EditingType 属性必须为 msoEditingAuto。

EditingType

可以是下列 MsoEditingType 常量之一:

msoEditingAuto msoEditingCorner X1 Single 类型,必需。如果新线段的 EditingType 属性为 msoEditingAuto,则此参 数指定从文档左上角到新线段终点的水平距离(以磅为单位) 如果新顶点的 。 EditingType 属性为 msoEditingCorner,则此参数指定文档左上角到新线段第一个控制 点的水平距离(以磅为单位) 。 Y1 Single 类型,必需。如果新线段的 EditingType 属性为 msoEditingAuto,则此参 数指定从文档左上角到新线段终点的垂直距离(以磅为单位) 如果新顶点的 。 EditingType 属性为 msoEditingCorner,则此参数指定文档从左上角到新线段第一个控 制点的垂直距离(以磅为单位) 。 X2 Single 类型,可选。如果新线段的 EditingType 属性为 msoEditingCorner,则此 参数指定从文档左上角到新线段第二个控制点的水平距离(以磅为单位) 。如果新线段 的 EditingType 属性为 msoEditingAuto,则可忽略此参数。 Y2 Single 类型,可选。如果新线段的 EditingType 属性为 msoEditingCorner,则此 参数指定从文档左上角到新线段第二个控点的垂直距离(以磅为单位) 。如果新线段的 EditingType 属性为 msoEditingAuto,则可忽略此参数。 X3 Single 类型,可选。如果新线段的 EditingType 属性为 msoEditingCorner,则此 参数指定从文档左上角到新线段终点的水平距离(以磅为单位) 。如果新线段的 EditingType 属性为 msoEditingAuto,则可忽略此参数。 Y3 Single 类型,可选。如果新线段的 EditingType 属性为 msoEditingCorner,则此 参数指定从文档左上角到新线段终点的垂直距离(以磅为单位) 。如果新线段的 EditingType 属性为 msoEditingAuto,则可忽略此参数。

(3) ConvertToShape 方法,创建一个图形,该图形具有指定对象的几何图形特征。返回 一个 Shape 对象,该对象代表新图形。 方法的说明如下: expression.ConvertToShape(Anchor) expression 必需。表示该表达式返回的一个 FreeformBuilder 对象。 Anchor Variant 类型,可选。Range 对象,代表与图形绑定在一起的文本。如果指定 Anchor, 锁定位置位于锁定区域第一段的段首。 如果省略此参数, 将自动选定锁定区域, 此图形也将定位于页面的上边界和左边界的相对位置。 2.5 基于 WORD 的手写批注技术的实现 掌握了以上技术就可以实现 WORD 中的手写批注功能,首先在上面提到的方案中的当 批使人将手写笔接触手写板时开始记录手写笔在移动过程中的坐标, 并保存到一个动态数组 中,在手写笔离开手写板时将刚才纪录下的手写笔的坐标集合利用 WORD 中的 VBA 绘制 成 WORD 中的自由曲线。下面介绍程序的详细实现。 变量的定义: TPointAry = Array of TPoint; //定义存放鼠标坐标轨迹的动态数组的数据类型

Var PAry: TPointAry; //定义记录鼠标的轨迹的数组的全局变量 Len: Int64 = 0; //用于设定记录鼠标的轨迹的数组的长度 lbDown: Boolean; //用于记录鼠标左键是否被按下(手写笔是否接触手写板) sPoint: TPoint; //用于绘图的起点坐标 shpLine, shpLineL: Variant;//用来制定线条的颜色和宽度 pLeft,pTop,pWidth,pHeight:Integer;//用于计算 Word 中坐标和屏幕坐标的偏移 在批示窗口显示的时候计算 Word 中坐标和屏幕坐标的偏移量: procedure TFormNote.FormShow(Sender: TObject); begin //计算 Word 中坐标和屏幕坐标的偏移的代码 shpLine := WordDoc.Shapes.AddLine(0,0,0,0); WordApp.ActiveWindow.GetPoint(pLeft,pTop,pWidth,pHeight,shpLine); shpLine.Delete; end; 当鼠标左键按下时(也就是手写笔接触手写板时) ,设置 lbDown 为 True,记录下第一 个点的坐标: procedure TFormNote.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin lbDown := not lbDown; sPoint.X := X; sPoint.Y := Y; //将第一个点存如数组 Len := 1; SetLength(PAry,Len); PAry[Len-1] := sPoint; end; 当手写笔移动的时候, 记录下手写笔移动的全部轨迹坐标, 同时在批示的透明窗口中绘 制出手写笔批示的轨迹图形: procedure TFormPic.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if lbDown = True then begin with Canvas do begin MoveTo(sPoint.X,sPoint.Y); LineTo(X,Y); end; sPoint.X := X;

sPoint.Y := Y; //将手写笔移动时的点存入数组 Len := Len + 1; SetLength(PAry,Len); PAry[Len-1] := sPoint; end; end; 当手写笔离开手写板时,将刚才记录下来的手写笔的移动的轨迹坐标利用 VBA 绘制成 WORD 中的自由曲线,实现手写批注功能: procedure TFormPic.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var i:LongInt; begin lbDown := not lbDown; if Len > 1 then begin shpLine := WordDoc.Shapes.BuildFreeform(1,(pAry[0].X pLeft) * 0.75,(pAry[0].Y - pTop) * 0.75); for i:=1 to Len-1 Do begin shpLine.AddNodes(1,1,(pAry[i].X - pLeft) * 0.75,(pAry[i].Y - pTop) * 0.75); end; try shpLineL := shpLine.ConvertToShape; shpLineL.Line.Weight := FormNote.CBLine.ItemIndex * 12 / 9; shpLineL.Line.ForeColor.RGB := FormNote.ColorGrid.ForegroundColor; shpLineL.Line.Visible := True; shpLineL.Line.Style := 1; //msoLineSingle except //扑捉异常 MessageBox(GetActiveWindow,' 所 做 的 操 作 无 效 , 请 重 新 操 作 !',' 提 示 ',MB_OK+MB_ICONINFORMATION); end; end; //释放动态数组 Len := 0; SetLength(pAry,Len); end; 因为手写笔在使用的时候所触发的操作系统的事件与鼠标所触发的事件是一致的, 所以 内本节所介绍的方法是利用鼠标的按下、移动、放开事件,模拟手写笔接触手写板、手写笔

移动、手写笔离开手写板的事件进行编程来实现手写批注,经过试验这样做是完全正确的。


相关文章:
第一章 前言
第二章 基于WORD的手写批... 第四章 电子图章与数字水...1/2 相关文档推荐...基于手写技术的电子公文系统能够实现办公文件真正的手写批注、 批示, 保证每位批示...
基于HTML5的文档在线评阅及批注的实现
此外,用户如果在 Word 文档中嵌入一些脚本,还可能导致安全问题出现。 为此,本文提出一种基于 HTML5 技术的在线评阅及批注功能的实现,支持手写、文本、 圈注等批注...
刘琳word批注与修订教学设计
Word 帮我改作文”教学设计 ———批注与修订 一、教材分析 本节内容选自辽宁师范大学出版社《信息技术》七年级(下)第二单元第三课, 批注与订是 Word 2003 ...
Java开发调用PageOffice提供的Word手写批注接口
中在线打开要签字的电子版文件,然后通 过手写批注接口实现在线批阅文件并签名。 ...第二章 基于WORD的手写批... 11页 1下载券 JS调用PageOffice接口,删... 暂...
使用word批注与修订
批注Word 的审阅功能之一(另一功能就是修订)。当文档审阅者只评论文档,而...1 教育技术水平考试_批注与修订 张家港市南沙中学 (3)单击批注条中的【插入...
基于手写批注的图书管理办公系统
系统有效地利 用了手写批注的时序连续性和局部相关性[7],实现批注笔画的流畅。...第二章 基于WORD的手写批... 1012人阅读 11页 1下载券 基于ActiveX技术手写...
Word 2007教程:处理文档的修订与批注完整版
Word 2007教程:处理文档的修订与批注完整版_IT/计算机_专业资料。很好很强Word...上,可插 入声音批注或手写批注。 键入批注 1、选择要对其进行批注的文本或项目...
Word文档批注的插入
word 文档批注的插入、修改与删除方法 您可将批注 ...上,可插入声音批注或手写批注。 键入批注 1、选择...黑果枸杞苗木快速繁育及建园技术文档贡献者 lwlx_2004...
JAVA调用PageOffice在线打开、编辑Word文档
第二步:修改 WEB 项目的配置文件,将如下代码添加...添加手写批注、加盖电子印章、Word 文档到 PDF 文档...很好地解决了开发 OA 系 统的程序员的一大技术难题...
PageOffice实现最简单的Java导出Word中的数据
()方法的第二个参数OpenModeType的类型设置为 doc...添加手写批注、加盖电子印章、Word 文档到 PDF 文档...很好地解决了开发 OA 系统的 程序员的一大技术难题...
更多相关标签: