> Spreadコントロール(表形式入力OCX)で、セルを文字型に、 > さらに複数行入力を可にします。そして、複数行入力するのですが、 > カーソルのある行番号を取得したいのです。 > SendMessage(Spread.hWnd, EM_LINEFROMCHAR, -1&, ByVal 0&) > では、ゼロしか帰ってきません。(当然?) まず、Spread.hWndがまずいでしょうね。 Spreadがどういう作りをしているかはわかりませんが、 テキスト入力の部分は内部的なTextBoxを使っていると 思うので、そのTextBoxのhWndを渡さないといけないと思います。 おそらくそんなhWndを返すプロパティが用意されていれば、 いいのですが、おそらく無いように思います。 何らかの方法でhWndを取得できればいいのですが、 それが出来ないと、BOCの言うとおりかもしれません。
で、とりあえず、BOCからDLして、試してみました。 バージョンはかかれていなかったので、SPREAD Ver.3.0J トライアル版で。
'標準モジュール側〜〜〜〜〜〜〜〜〜〜〜 Option Explicit
Public Const EM_LINEFROMCHAR = &HC9 Public Const EM_GETSEL = &HB0
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _ ByVal hWnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ lParam As Any _ ) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _ ByVal hWnd1 As Long, _ ByVal hWnd2 As Long, _ ByVal lpsz1 As String, _ ByVal lpsz2 As String _ ) As Long
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" ( _ ByVal hWnd As Long, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long _ ) As Long
Public Function GetLineFromCurrent(hWnd As Long) As Long Dim nCharIndex As Long Call SendMessage(hWnd, EM_GETSEL, 0, nCharIndex) GetLineFromCurrent = SendMessage(hWnd, EM_LINEFROMCHAR, nCharIndex, 0) + 1 End Function
'Form側〜〜〜〜〜〜〜〜〜〜〜〜 Option Explicit
Private Sub Timer1_Timer() Dim hWnd As Long Dim sName As String On Error Resume Next Text2.Text = "" hWnd = FindWindowEx(vaSpread1.hWnd, 0, ByVal vbNullString, ByVal vbNullString) While hWnd <> 0 sName = Space(255) Call GetClassName(hWnd, sName, 255) Text2.Text = Text2.Text & vbCrLf & hWnd & "-" & sName If Left$(sName, 20) = "SPRJ32X30EditHScroll" Then Text3.Text = hWnd Text1.Text = GetLineFromCurrent(hWnd) & "行目" End If hWnd = FindWindowEx(vaSpread1.hWnd, hWnd, ByVal vbNullString, ByVal vbNullString) Wend End Sub
これで、なんとなくやり方がわかるでしょう。 ただし、このままではいくつか問題があるので、 いろいろ細工が必要です。
問題点 1.複数行と単行のセルが混じってると、SPRJ32X30EditHScroll が2つ現れる。(その他の属性によっても、複数表れるかも?) どこで何が現れるか、どれを使われるのか、管理する必要がある。 2.タイマーを使っているので、理想的でない。
あまりいいやり方ではありませんが、何らかのヒントになれば 幸いです。
|