TextBox模拟拖曳选取文字

http://tech.ddvip.com   2006年07月26日    社区交流

本文详细介绍TextBox模拟拖曳选取文字

  我们知道Rich text或Word 或VB的程式撰写环境,可以将Mouse移到Select起来的文字按Mouse左键做拖曳移动的功能,後来想,TextBox能不能做呢?这可真的吃了不少苦头 ,这个程式模拟其做法,但主要的精神是在於对TextBox的了解。

  首先,TextBox中当选取一段文字之後,我们只要按Mosue,便使Select的区域失效,且可能进入另外的一个Select域,故第一件事是如何在有Select的区域时,使这动作失效的作法是在MouseUp时Check一下有没有选取文字,如果有,就使用SubClass的技术,拦截Mouse的左键,所以当我们按左键时,不会再有选取文字又不见了的情况。

  第二,我们没有按下Mouse,那如何得知Mouse所在的地方到底是TextBox的哪个字呢,所幸有EM_CHARFROMPOS这个讯息可Send给textBox,其传回值的HiWord 得该字元是在第几行 0为base,LowWord是该字元在TextBox中的位置(含换行与LineFeed),因而我们可以单

  由MouseMove便得知何时Mouse要是箭号,何时是内定I形的Mouse。当然想得知Mouse所在可以透过Mouse Event的X, Y座标,但是它们是以Twips为单位,而另外也可以用GetCursorPos() 来得知Mouse的位置,但这是相对於萤幕者,EMCHARFROMPOS的讯息需要的是相对於TextBox

  的座标,有许多种方法可以完成这转换,但我选ScreenToClient()这个API,比较直接。

  第叁,Caret如何隐藏呢?使用HideCaret可完成,但这个Function只能呼叫一次,以便下回 ShowCaret()时可以将Caret Show出来,这是因为呼叫2次的HideCaret时,也要呼叫2次的ShowCaret才能使Caret出现。另设定Caret的SetCaretPos() API只是令Caret出现在什麽地,但如果您KeyIn任何字时,仍出现在原来之地方,而不是方才设定之处,而要用EM_SETSEL的Message才能设定KeyIn的位置是Caret的位置。

责编:豆豆技术应用

正在加载评论...