{"id":1951,"date":"2024-10-22T16:09:33","date_gmt":"2024-10-22T08:09:33","guid":{"rendered":"https:\/\/www.wyrcad.com\/?p=1951"},"modified":"2024-10-22T16:12:44","modified_gmt":"2024-10-22T08:12:44","slug":"textbox-%e5%87%bd%e6%95%b0%e7%b3%bb%e5%88%97%e4%b9%8b%e4%b8%80","status":"publish","type":"post","link":"https:\/\/www.wyrcad.com\/?p=1951","title":{"rendered":"TextBox \u51fd\u6570\u7cfb\u5217\u4e4b\u4e00"},"content":{"rendered":"\n<p>Public Declare Function SendMessage Lib &#8220;user32&#8221; Alias &#8220;SendMessageA&#8221; (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long<br>Public Const EM_GETSEL = &amp;HB0<br>Public Const EM_LINEFROMCHAR = &amp;HC9<br>Public Const EM_LINEINDEX = &amp;HBB<\/p>\n\n\n\n<p>Public Function GetTextBoxRowText(ByVal oTextBox As TextBox, ByVal iLine As Integer) As String &#8216;\u83b7\u53d6 TextBox \u67d0\u884c\u6587\u5b57<br>On Error Resume Next<br>Dim TempArray As Variant<br>TempArray = Split(oTextBox.Text, vbCrLf, -1, vbTextCompare)<br>GetTextBoxRowText = TempArray(iLine &#8211; 1)<br>On Error GoTo 0<br>End Function<\/p>\n\n\n\n<p>Public Function GetTextBoxRowCount(ByVal oTextBox As TextBox) As Integer &#8216;\u83b7\u53d6 TextBox \u6587\u5b57\u884c\u6570<br>On Error Resume Next<br>GetTextBoxRowCount = 0<br>Dim TempArray As Variant<br>TempArray = Split(oTextBox.Text, vbCrLf, -1, vbTextCompare)<br>GetTextBoxRowCount = UBound(TempArray) &#8211; LBound(TempArray) + 1<br>On Error GoTo 0<br>End Function<\/p>\n\n\n\n<p>Public Function GetTextBoxColumnCount(ByVal oTextBox As TextBox) As Integer &#8216;\u83b7\u53d6 TextBox \u6587\u5b57\u6700\u5927\u5217\u6570<br>On Error Resume Next<br>Dim I As Integer, J As Integer<br>GetTextBoxColumnCount = 0<br>Dim TempArray As Variant<br>TempArray = Split(oTextBox.Text, vbCrLf, -1, vbTextCompare)<br>For I = LBound(TempArray) To UBound(TempArray)<br>&#8216;Debug.Print Len(TempArray(I)); I<br>If GetTextBoxColumnCount &lt; Len(TempArray(I)) Then GetTextBoxColumnCount = Len(TempArray(I))<br>Next I<br>On Error GoTo 0<br>End Function<\/p>\n\n\n\n<p>Public Function GetTextBoxColumnCountAtRow(ByVal oTextBox As TextBox, ByVal iRow As Integer) As Integer &#8216;\u83b7\u53d6 TextBox \u67d0\u884c\u6587\u5b57\u6700\u5927\u5217\u6570<br>On Error Resume Next<br>Dim I As Integer, J As Integer<br>GetTextBoxColumnCountAtRow = 0<br>Dim TempArray As Variant<br>TempArray = Split(oTextBox.Text, vbCrLf, -1, vbTextCompare)<br>Dim iCount As Integer<br>For I = LBound(TempArray) To UBound(TempArray)<br>&#8216;Debug.Print Len(TempArray(I)); I<br>iCount = iCount + 1<br>If iCount = iRow Then<br>GetTextBoxColumnCountAtRow = Len(TempArray(I))<br>Exit For<br>End If<br>Next I<br>On Error GoTo 0<br>End Function<\/p>\n\n\n\n<p>Public Function GetTextBoxCharCount(ByVal oTextBox As TextBox) As Long&#8217;\u83b7\u53d6 TextBox \u6587\u5b57\u6570<br>On Error Resume Next<br>GetTextBoxCharCount = 0<br>Dim lCount As Long, lRow As Long, lCol As Long<br>Dim lParam As Long, wParam As Long<br>&#8216;\u9996\u5148\u5411\u6587\u672c\u6846\u4f20\u9012EM_GETSEL\u6d88\u606f\u4ee5\u83b7\u53d6\u4ece\u8d77\u59cb\u4f4d\u7f6e\u5230\u5149\u6807\u6240\u5728\u4f4d\u7f6e\u7684\u5b57\u7b26\u6570<br>lRet = SendMessage(oTextBox.hwnd, EM_GETSEL, wParam, lParam)<br>lCount = lRet \/ 2 ^ 16<br>&#8216;\u518d\u5411\u6587\u672c\u6846\u4f20\u9012EM_LINEFROMCHAR\u6d88\u606f\u6839\u636e\u83b7\u5f97\u7684\u5b57\u7b26\u6570\u786e\u5b9a\u5149\u6807\u4ee5\u83b7\u53d6\u6240\u5728\u884c\u6570<br>lRow = SendMessage(oTextBox.hwnd, EM_LINEFROMCHAR, lCount, 0)<br>lRow = lRow + 1<br>&#8216;\u6263\u9664 VbCrlf<br>GetTextBoxCharCount = lCount &#8211; (lRow &#8211; 1) * 2<br>&#8216;\u5411\u6587\u672c\u6846\u4f20\u9012EM_LINEINDEX\u6d88\u606f\u4ee5\u83b7\u53d6\u6240\u5728\u5217\u6570<br>&#8216;lRet = SendMessage(oTextBox.hWnd, EM_LINEINDEX, -1, 0)<br>&#8216;lCol = lCount &#8211; lRet + 1<br>On Error GoTo 0<br>End Function<\/p>\n\n\n\n<p>Public Function GetTextBoxCursorRow(ByVal oTextBox As TextBox) As Long&#8217;\u83b7\u53d6 TextBox \u5149\u6807\u6240\u5728\u884c<br>On Error Resume Next<br>GetTextBoxCursorRow = 0<br>Dim lCount As Long, lRow As Long, lCol As Long<br>Dim lParam As Long, wParam As Long<br>&#8216;\u9996\u5148\u5411\u6587\u672c\u6846\u4f20\u9012EM_GETSEL\u6d88\u606f\u4ee5\u83b7\u53d6\u4ece\u8d77\u59cb\u4f4d\u7f6e\u5230\u5149\u6807\u6240\u5728\u4f4d\u7f6e\u7684\u5b57\u7b26\u6570<br>lRet = SendMessage(oTextBox.hwnd, EM_GETSEL, wParam, lParam)<br>lCount = lRet \/ 2 ^ 16<br>&#8216;\u518d\u5411\u6587\u672c\u6846\u4f20\u9012EM_LINEFROMCHAR\u6d88\u606f\u6839\u636e\u83b7\u5f97\u7684\u5b57\u7b26\u6570\u786e\u5b9a\u5149\u6807\u4ee5\u83b7\u53d6\u6240\u5728\u884c\u6570<br>lRow = SendMessage(oTextBox.hwnd, EM_LINEFROMCHAR, lCount, 0)<br>lRow = lRow + 1<br>GetTextBoxCursorRow = lRow<br>&#8216;\u5411\u6587\u672c\u6846\u4f20\u9012EM_LINEINDEX\u6d88\u606f\u4ee5\u83b7\u53d6\u6240\u5728\u5217\u6570<br>&#8216;lRet = SendMessage(oTextBox.hWnd, EM_LINEINDEX, -1, 0)<br>&#8216;lCol = lCount &#8211; lRet + 1<br>On Error GoTo 0<br>End Function<\/p>\n\n\n\n<p>Public Function GetTextBoxCursorColumn(ByVal oTextBox As TextBox) As Long&#8217;\u83b7\u53d6 TextBox \u5149\u6807\u6240\u5728\u5217<br>On Error Resume Next<br>GetTextBoxCursorColumn = 0<br>Dim lCount As Long, lRow As Long, lCol As Long<br>Dim lParam As Long, wParam As Long<br>&#8216;\u9996\u5148\u5411\u6587\u672c\u6846\u4f20\u9012EM_GETSEL\u6d88\u606f\u4ee5\u83b7\u53d6\u4ece\u8d77\u59cb\u4f4d\u7f6e\u5230\u5149\u6807\u6240\u5728\u4f4d\u7f6e\u7684\u5b57\u7b26\u6570<br>lRet = SendMessage(oTextBox.hwnd, EM_GETSEL, wParam, lParam)<br>lCount = lRet \/ 2 ^ 16<br>&#8216;\u518d\u5411\u6587\u672c\u6846\u4f20\u9012EM_LINEFROMCHAR\u6d88\u606f\u6839\u636e\u83b7\u5f97\u7684\u5b57\u7b26\u6570\u786e\u5b9a\u5149\u6807\u4ee5\u83b7\u53d6\u6240\u5728\u884c\u6570<br>lRow = SendMessage(oTextBox.hwnd, EM_LINEFROMCHAR, lCount, 0)<br>lRow = lRow + 1<br>&#8216;\u5411\u6587\u672c\u6846\u4f20\u9012EM_LINEINDEX\u6d88\u606f\u4ee5\u83b7\u53d6\u6240\u5728\u5217\u6570<br>lRet = SendMessage(oTextBox.hwnd, EM_LINEINDEX, -1, 0)<br>lCol = lCount &#8211; lRet + 1<br>GetTextBoxCursorColumn = lCol<br>On Error GoTo 0<br>End Function<\/p>\n\n\n\n<p>Public Sub TurnTextBoxCursor(ByVal oTextBox As TextBox, ByVal iRow As Integer, Optional ByVal iColumn As Integer = 1) &#8216;\u628a\u6587\u672c\u6587\u4ef6\u5149\u6807\u79fb\u5230\u67d0\u884c\u67d0\u5217<br>On Error Resume Next<br>Dim I As Integer, J As Integer<br>Dim oShell As Object<br>Set oShell = CreateObject(&#8220;WScript.Shell&#8221;)<br>oTextBox.SetFocus<br>Dim iCurRow As Integer, iCurColumn As Integer<br>iCurRow = GetTextBoxCursorRow(oTextBox) &#8216;\u5f53\u524d\u884c<br>iCurColumn = GetTextBoxCursorColumn(oTextBox) &#8216;\u5f53\u524d\u5217<br>&#8216;Debug.Print iCurRow; iCurColumn<br>If iCurRow &lt; iRow Then<br>For I = iCurRow To iRow &#8211; 1<br>oShell.SendKeys &#8220;{DOWN}&#8221;<br>Next I<br>Else<br>For I = iRow To iCurRow &#8211; 1<br>oShell.SendKeys &#8220;{UP}&#8221;<br>Next I<br>End If<br><a href=\"https:\/\/www.wyrcad.com\/?p=1244\">Wait 50<\/a><br>iCurRow = GetTextBoxCursorRow(oTextBox) &#8216;\u5f53\u524d\u884c<br>iCurColumn = GetTextBoxCursorColumn(oTextBox) &#8216;\u76ee\u6807\u884c\u7684\u5f53\u524d\u5217<br>&#8216;Debug.Print iCurRow; iCurColumn<br>If iCurColumn &lt; iColumn Then<br>For J = iCurColumn To iColumn &#8211; 1<br>oShell.SendKeys &#8220;{RIGHT}&#8221;<br>Next J<br>Else<br>For J = iColumn To iCurColumn &#8211; 1<br>oShell.SendKeys &#8220;{LEFT}&#8221;<br>Next J<br>End If<br>Wait 50<br>iCurRow = GetTextBoxCursorRow(oTextBox) &#8216;\u5f53\u524d\u884c<br>iCurColumn = GetTextBoxCursorColumn(oTextBox) &#8216;\u76ee\u6807\u884c\u7684\u5f53\u524d\u5217<br>&#8216;Debug.Print iCurRow; iCurColumn<br>ERR_NORUNNING:<br>On Error GoTo 0<br>End Sub<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Public Declare Function SendMessage Lib &#8220;user32&#038;# &hellip; <a href=\"https:\/\/www.wyrcad.com\/?p=1951\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb<span class=\"screen-reader-text\">\u201cTextBox \u51fd\u6570\u7cfb\u5217\u4e4b\u4e00\u201d<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[24,17],"class_list":["post-1951","post","type-post","status-publish","format-standard","hentry","category-bianchengyuandi","tag-vb","tag-biancheng"],"_links":{"self":[{"href":"https:\/\/www.wyrcad.com\/index.php?rest_route=\/wp\/v2\/posts\/1951","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wyrcad.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wyrcad.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wyrcad.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wyrcad.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1951"}],"version-history":[{"count":3,"href":"https:\/\/www.wyrcad.com\/index.php?rest_route=\/wp\/v2\/posts\/1951\/revisions"}],"predecessor-version":[{"id":1954,"href":"https:\/\/www.wyrcad.com\/index.php?rest_route=\/wp\/v2\/posts\/1951\/revisions\/1954"}],"wp:attachment":[{"href":"https:\/\/www.wyrcad.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1951"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wyrcad.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1951"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wyrcad.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1951"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}