当前位置: > 其它软件 > VB教程 >

TextBox模拟拖曳选取文字

时间:2011-11-16 | 栏目:VB教程 | 点击:

我们知道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的位置。

另有一个取得textbox中第charindex个字元,在textbox中Mouse的位置(textbox的左上角为原点)

pos = SendMessage(hwnd, EM_POSFROMCHAR, charindex, 0)

my = pos \ 2 ^ 16 'Y座标

mx = pos Mod 2 ^ 16 'X座标

这个程式的重点便是上面所写的,其他是苦功

'以下在.Bas

'注:本程式之所以要用一个变数来存Caret是否被隐藏,原因是:当HideCaret()呼叫N次

'便得呼叫N次 ShowCaret()来复原,反之亦然,所以程式中,用一个变数来确认Hide/Show

'的动作只做一次

您可能感兴趣的文章:

相关文章