VBAdvisor announcement: 终于解决获取某一行的unicode文本(GetTextLine),网上流传的方法都不行

VBAdvisor 2008-05-17 09:08:27
'本annocement只有高级VB程序员才明白其中的道理,才明白VB Unicode的重要性及难点之所在


Private Declare Function SendMessageLongA Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

Private Declare Function SendMessageLongW Lib "user32" Alias "SendMessageW" (ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Declare Function IsWindowUnicode Lib "user32.dll" (ByVal hwnd As Long) As Long

Public Property Get GetTextFromLine(Optional ByVal LineIndex As Long = -1&) As String

' returns the text for an entire line
' Passing -1 will retrieve the value for the line having the cursor (SelStart)
Dim lValue As Long, arrString() As Byte
Const EM_GETLINE As Long = &HC4

If LineIndex = -1 Then LineIndex = CurrentLine
lValue = SendMessage(m_hWndEB, EM_LINEINDEX, LineIndex, 0&)

If lValue > -1 Then
lValue = SendMessage(m_hWndEB, EM_LINELENGTH, lValue, 0&)
If lValue Then
If IsWindowUnicode(m_hWndEB) Then
GetTextFromLine = String$(lValue, 0)
CopyMemory ByVal StrPtr(GetTextFromLine), lValue, 4&
SendMessageLongW m_hWndEB, EM_GETLINE, LineIndex, StrPtr(GetTextFromLine)
If lValue = 1 Then GetTextFromLine = Left$(GetTextFromLine, 1)
Else
If lValue < 4 Then
ReDim arrString(0 To 3)
Else
ReDim arrString(0 To lValue - 1)
End If
CopyMemory arrString(0), lValue, 4&
SendMessageLongA m_hWndEB, EM_GETLINE, LineIndex, VarPtr(arrString(0))
If lValue < 4 Then ReDim Preserve arrString(0 To lValue - 1)
GetTextFromLine = StrConv(arrString, vbUnicode)
End If
End If
End If
End Property






'以前的方法在locale ID为英文是不能返回中文
Public Property Get GetLine(ByVal whichLine As Long) As String

Dim nLen As Long, bArr() As Byte, bArr2() As Byte, lReturn As Long

lReturn = SendMessage(m_hWndEB, EM_LINEINDEX, whichLine, ByVal 0&)
nLen = SendMessage(m_hWndEB, EM_LINELENGTH, lReturn, ByVal 0&)
If nLen > 0 Then
ReDim bArr(2 * nLen + 1) As Byte, bArr2(2 * nLen - 1) As Byte
Call CopyMemory(bArr(0), 2 * nLen, 2) '准备一个存储器,传递消息之前先在存储器的前两个字节填入存储器的长度

Call SendMessage(m_hWndEB, EM_GETLINE, whichLine, bArr(0))

Call CopyMemory(bArr2(0), bArr(0), 2 * nLen)

GetLine = String$(UBound(bArr2) + 1, vbNullChar)
CopyMemory ByVal GetLine, bArr2(0), UBound(bArr) + 1

Else
GetLine = vbNullString
End If

End Property

...全文
149 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
VBAdvisor 2008-05-17
  • 打赏
  • 举报
回复
大家看看VBAdvisor的blog

http://hi.baidu.com/vbadvisor/blog
VBAdvisor 2008-05-17
  • 打赏
  • 举报
回复


Public Property Get CurrentLine() As Long

CurrentLine = LineForCharacterIndex(SelStart)

End Property

Public Property Get LineForCharacterIndex(lindex As Long) As Long

LineForCharacterIndex = SendMessageLongA(m_hWndEB, EM_LINEFROMCHAR, lindex, 0)

End Property

Public Property Get SelStart() As Long

Dim lEnd As Long
Dim lStart As Long

If m_hWndEB Then
SendMessageLongA m_hWndEB, EM_GETSEL, VarPtr(SelStart), VarPtr(lEnd)
End If

End Property

内容概要:本文系统研究了在强弱电网适配场景下,构网型(GFM)与跟网型(GFL)逆变器并联系统的协同控制逻辑及其暂态动态行为,重点依托Simulink仿真平台构建混合并网系统模型,深入分析两类逆变器在不同电网强度条件下的交互特性、频率响应机制、稳定性表现及抗扰能力。研究涵盖分层控制架构设计、异构控制策略对比、频率扰动响应规律以及多工况暂态性能评估,探讨了GFM与GFL逆变器在功率支撑、电压频率调节和系统稳定性方面的互补性与协同机制,旨在提升高比例新能源接入背景下并网系统的适应性、鲁棒性与动态性能。; 适合人群:具备电力电子、新能源并网、自动控制或电力系统仿真等相关专业知识背景,从事新型电力系统控制、微电网运行、逆变器控制策略研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解构网型与跟网型逆变器在强弱电网中的协同工作机理与动态交互特性;②掌握异构逆变器并联系统的建模方法、协同控制策略设计与暂态仿真分析流程;③为高渗透率新能源系统的稳定性分析、控制优化及工程应用提供理论依据和技术参考。; 阅读建议:建议结合Simulink仿真实例进行动手实践,重点关注控制策略的实现细节、参数整定方法及多工况仿真结果的动态响应分析,同时可参考文中提及的相关博士论文复现案例以深化对理论机制的理解。

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧