| 在很多的编辑软件中有这样一个功能,即当用户在编辑区中输入字符或者按动鼠标使得光标的位置改变时,在编辑软件下方的状态栏中就能显示出光标所在位置的行和列的值。下面就介绍如何用VB编程实现在文本框中的这一功能。 首先,在Form中添加一个文本框(TextBox),将其MultiLine属性设置为True,以便输入多行文本;再在Form中添加两个标题栏(Label),以便显示光标位置;然后,在Form的代码窗口中添加程序中的代码。 OptionExplici ConstEM_GETSEL=&HB0 ConstEM_LINEFROMCHAR=&HC9 ConstEM_LINEINDEX=&HBB PrivateDeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong PublicSubGetCaretPos(ByValTextHwndAsLong,LineNoAsLong,ColNoAsLong) DimIAsLong,jAsLong DimlParamAsLong,wParamAsLong DimkAsLong '首先向文本框传递EM_GETSEL消息以获取从起始位置到 '光标所在位置的字符数 I=SendMessage(TextHwnd,EM_GETSEL,wParam,lParam) j=I/2^16 '再向文本框传递EM_LINEFROMCHAR消息根据获得的字符 '数确定光标以获取所在行数 LineNo=SendMessage(TextHwnd,EM_LINEFROMCHAR,j,0) LineNo=LineNo 1 '向文本框传递EM_LINEINDEX消息以获取所在列数 k=SendMessage(TextHwnd,EM_LINEINDEX,-1,0) ColNo=j-k 1 EndSub PrivateSubForm_Load() DimLineNoAsLong,ColNoAsLong CallGetCaretPos(Text1.hwnd,LineNo,ColNo) Label1.Caption=LineNo Label2.Caption=ColNo EndSub PrivateSubForm_Resize() Text1.Width=Me.ScaleWidth EndSub PrivateSubText1_KeyUp(KeyCodeAsInteger,ShiftAsInteger) DimLineNoAsLong,ColNoAsLong CallGetCaretPos(Text1.hwnd,LineNo,ColNo) Label1.Caption=LineNo Label2.Caption=ColNo EndSub PrivateSubText1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle) DimLineNoAsLong,ColNoAsLong CallGetCaretPos(Text1.hwnd,LineNo,ColNo) Label1.Caption=LineNo Label2.Caption=ColNo EndSub (程序) 运行上面的程序,在TextBox中输入字符或者按控制键来移动光标时,你可以看到屏幕下面的Label中就能显示出的光标所在的位置。以上程序在Win95,VB5.0下运行通过。 ->
|