by ゲスト » 2008年1月22日(火) 16:11
古いAB掲示板に有りました。
動作未確認です。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
[AB3] エディットボックスの選択範囲からの置換
日時: 2004/02/25 14:22
名前: AB掲示板
AB掲示板からの引用です。
投稿時間:2004/02/20(Fri) 04:27
投稿者名:高信期
Eメール:
URL :
タイトル:Re^2: タグで囲む方法
> 自分が考えているのは、選択されている文字列の、
> キャレット開始位置、キャレット終了位置を取得して、
> そこに、タグを挿入することで実現しようと思っています。
そんな関数を作ってみました。
EditBox1 というエディットボックスに対して
EditCircleSelText(GetDlgItem(hMainWnd, EditBox1), "<B>", "</B>")
とすると選択範囲を"<B>(選択範囲の文字列)</B>"と置換できます。
参考にしてください。
'ヘルパー関数群
'選択範囲の開始位置と終了位置の取得
Sub GetEditSelPos(ByVal hEdit As Long, ByRef StartPos As Long, ByRef EndPos As Long)
if hEdit <> 0 then _
SendMessage(hEdit, EM_GETSEL, VarPtr(StartPos), VarPtr(EndPos))
End Sub
'選択範囲の文字列の取得
'選択されていなければ空文字列を返す
Function GetEditSelText(ByVal hEdit As Long) As String
Dim StartPos As Long, EndPos As Long, SelLen As Long
StartPos = 0
EndPos = 0
GetEditSelPos(hEdit, StartPos, EndPos)
SelLen = EndPos - StartPos
'hEditが0であったり文字列が選択されていなければSelLenは0になる
GetEditSelText = ZeroString(SelLen)
If SelLen <> 0 then
'一旦エディットの文字列を選択範囲の終了位置まで読み込む
'選択範囲が複数行にまたがる場合も考えればこれが一番楽な方法
Dim Temp As String
Temp = ZeroString(EndPos)
SendMessage(hEdit, WM_GETTEXT, EndPos + 1, StrPtr(Temp))
memcpy(StrPtr(GetEditSelText), StrPtr(Temp) + StartPos, SelLen)
End If
End Function
'選択範囲の文字列の置換
Sub EditReplaceSel(ByVal hEdit As Long, ByVal Value As String)
if hEdit <> 0 then _
SendMessage(hEdit, EM_REPLACESEL, 1, StrPtr(Value));
End Sub
'メインの手続き
'選択された文字列をBeforeText, AfterTextで囲む。
'選択されていなければ何もしない
Sub EditCircleSelText(ByVal hEdit As Long, ByVal BeforeText As String, ByVal AfterText As String)
if hEdit = 0 then Exit Sub
Dim SelText As String
SelText = GetEditSelText(hEdit)
if Len(SelText) <> 0 then _
EditReplaceSel(hEdit, BeforeText + SelText + AfterText)
End Sub
同じ板なので問題無いと思いますが、勝手に転記して・・・・
管理者様 問題がありましたら削除願います。
古いAB掲示板に有りました。
動作未確認です。
[hide][code][AB3] エディットボックスの選択範囲からの置換
日時: 2004/02/25 14:22
名前: AB掲示板
AB掲示板からの引用です。
投稿時間:2004/02/20(Fri) 04:27
投稿者名:高信期
Eメール:
URL :
タイトル:Re^2: タグで囲む方法
> 自分が考えているのは、選択されている文字列の、
> キャレット開始位置、キャレット終了位置を取得して、
> そこに、タグを挿入することで実現しようと思っています。
そんな関数を作ってみました。
EditBox1 というエディットボックスに対して
EditCircleSelText(GetDlgItem(hMainWnd, EditBox1), "<B>", "</B>")
とすると選択範囲を"<B>(選択範囲の文字列)</B>"と置換できます。
参考にしてください。
'ヘルパー関数群
'選択範囲の開始位置と終了位置の取得
Sub GetEditSelPos(ByVal hEdit As Long, ByRef StartPos As Long, ByRef EndPos As Long)
if hEdit <> 0 then _
SendMessage(hEdit, EM_GETSEL, VarPtr(StartPos), VarPtr(EndPos))
End Sub
'選択範囲の文字列の取得
'選択されていなければ空文字列を返す
Function GetEditSelText(ByVal hEdit As Long) As String
Dim StartPos As Long, EndPos As Long, SelLen As Long
StartPos = 0
EndPos = 0
GetEditSelPos(hEdit, StartPos, EndPos)
SelLen = EndPos - StartPos
'hEditが0であったり文字列が選択されていなければSelLenは0になる
GetEditSelText = ZeroString(SelLen)
If SelLen <> 0 then
'一旦エディットの文字列を選択範囲の終了位置まで読み込む
'選択範囲が複数行にまたがる場合も考えればこれが一番楽な方法
Dim Temp As String
Temp = ZeroString(EndPos)
SendMessage(hEdit, WM_GETTEXT, EndPos + 1, StrPtr(Temp))
memcpy(StrPtr(GetEditSelText), StrPtr(Temp) + StartPos, SelLen)
End If
End Function
'選択範囲の文字列の置換
Sub EditReplaceSel(ByVal hEdit As Long, ByVal Value As String)
if hEdit <> 0 then _
SendMessage(hEdit, EM_REPLACESEL, 1, StrPtr(Value));
End Sub
'メインの手続き
'選択された文字列をBeforeText, AfterTextで囲む。
'選択されていなければ何もしない
Sub EditCircleSelText(ByVal hEdit As Long, ByVal BeforeText As String, ByVal AfterText As String)
if hEdit = 0 then Exit Sub
Dim SelText As String
SelText = GetEditSelText(hEdit)
if Len(SelText) <> 0 then _
EditReplaceSel(hEdit, BeforeText + SelText + AfterText)
End Sub
[/code][/hide]
同じ板なので問題無いと思いますが、勝手に転記して・・・・
管理者様 問題がありましたら削除願います。