科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件如何用C#编写文本编辑器(6)

如何用C#编写文本编辑器(6)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

当鼠标在控制点上进行拖拽操作就应当可以动态的修改对象的大小,以前我是如此实现的

来源:soft6 2008年5月16日

关键字: 编辑器 文本 C# Windows

  • 评论
  • 分享微博
  • 分享邮件

当鼠标在控制点上进行拖拽操作就应当可以动态的修改对象的大小,以前我是如此实现的

◆在鼠标按键按下事件处理(HandleMouseDown)中,若鼠标光标在某个控制点上则设置一个鼠标按键按下标记变量,并记下鼠标光标位置,然后退出事件处理

◆在鼠标移动事件中(HandleMouseMove),若设置了鼠标按键按下标记变量,则根据当前鼠标光标位置和上一次鼠标光标的位置之差就是鼠标光标移动的距离,该距离的水平分量和垂直分量就是对象宽度和高度的改变量,此时可以使用库函数System.Windows.Forms.ControlPaint.DrawReversibleFrame在界面上绘制一个虚线框,当鼠标移动时不断的调用该库函数,这样实现了所谓的“橡皮筋”操作

◆在鼠标按键松开事件(HandleMouseDown)处理中,根据鼠标光标的当前位置和以前记下的鼠标按键按下时的鼠标光标位置计算两者之差,这样就是整个鼠标拖拽操作中鼠标光标移动的距离,程序就可以依据该距离来改变对象的大小

经过一些编程实践,发现该操作比较麻烦,需要编写不少代码,而且代码分散在3个事件处理过程中,多了一些全局变量,很难写出一个通用例程到处调用,经过分析,将这种处理模式改掉了。其实一般的程序正在进行鼠标拖拽操作时,用户是不可能同时进行其他操作(不如边鼠标拖拽边打字),而且进行”橡皮筋“操作时程序用户界面无需重新绘制,这样可以认为进行鼠标拖拽时应用程序应用程序只处理鼠标移动消息和鼠标松开消息而不进行任何其他操作,为了编程简单,甚至连重绘界面的操作也不处理了,因此可以编一个通用例程来处理整个的鼠标拖拽来实现“橡皮筋”操作,该函数处理过程为

◆在鼠标按键按下事件处理(HandleMouseDown)中就调用该例程

◆进入例程中,首先记下鼠标光标的当前位置,然后进入一个死循环

◆该死循环首先调用Win32API函数 WaitMessage等待Windows消息,若没有任何Windows消息则退出该循环

◆调用Win32API函数PeekMessage来获得当前Windows消息

◆若当前消息为鼠标按键松开消息则退出循环

◆若当前消息为鼠标移动消息则则获得当前鼠标光标位置,根据开始脱拽的鼠标光标位置来绘制橡皮筋矩形

◆调用Win32API函数GetMessage将当前Windows消息给“吃”掉,然后进入下一次循环

◆例程退出该循环后就将当前鼠标光标位置和拖拽操作前的鼠标光标位置之差,也就是鼠标光标在整个拖拽操作中移动的距离作为返回值返回给主调函数(HandleMouseDown)

◆主调函数接受返回的鼠标光标移动的距离,然后根据该距离来进行其他的处理,在这里就是修改对象的大小

在此插上一段,其实.NET框架还是比较适合Win32的API编程,System.Windows.Form.Control的Handle属性就是窗体的句柄,可以被其他Win32API作为参数调用,CreateParams属性实际上就是CreateWindowEx的参数,重载它就可以设置控件创建时的样式;WndProc就是控件处理所有的Windows消息的默认过程,也可以重载它自己来处理底层的Windows消息。System.Windows.Forms.Application的静态函数AddMessageFilter和RemoveMessageFilter就可以很方便的为整个应用程序添加或删除"钩子"程序。C#语言可以使用System.Runtime.InteropServices.DllImport来导入声明DLL文件中的API函数。

光标的控制

光标就是文本编辑器在获得输入焦点时在当前插入点闪烁显示的一个小方块,当文本编辑器没有获得输入焦点时就不会显示光标。Windows操作系统已经提供了一套处理光标的API函数,包括创建光标CreateCaret,设置光标位置SetCaretPos,显示光标ShowCaret和隐藏光标HideCaret。使用API创建和显示光标后,操作系统会自动的让光标闪烁。文本编辑器要提供处理光标的例程供其他程序模块调用。文本编辑器首先根据当前插入点的位置计算光标在文档视图区域中的位置,还需要根据文档处理插入模式还是修改模式计算光标的大小。若光标所在位置在用户界面上没有显示出来则还需要滚动文本编辑器已保证光标所在区域处于可视区域。然后调用API来创建和显示光标。文本编辑器还重载OnGotFocus过程来显示光标,重载OnLostFocus过程隐藏光标。注意重载这两个过程时需要在最后必须调用base.OnGotFocus和base.OnLostFocus,若不这样则文本编辑器嵌入在网页中运行会发生无法获得输入焦点的错误。光标控制还涉及到输入法的控制,我们中国人使用文本编辑器会使用到各种中文输入法。Windows操作系统也提供了一套API来控制输入法。在本文本编辑器中重载onKeyPress方法来获得用户输入的字符,此时的字符可以是键盘直接输入的ASCI字符,也可以是使用某种输入法输入的汉字。这些操作系统都已经实现了,为什么还要控制输入法。原因是使用默认处理时输入法的浮动窗口会显示在屏幕中间而不会随着插入点的位置而移动。一般的中文输入法的用户界面为一个浮动窗口,各种建议输入的中文字符显示在这个浮动窗口中供人选择。想想看,当插入点在屏幕的某个边角中,而输入法的浮动窗口在屏幕中央,这样输入中文比较累。但若输入的浮动窗体随着插入点的移动而移动,浮动窗体和插入点紧密的靠在一起,这样输入中文就不是很累了。Win32API函数ImmSetCompositionWindow能对指定的窗体控制输入法浮动窗体的显示位置,当插入点改变时调用该API函数就能让输入法浮动窗体随着插入点跑了。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章