之所以說“徒勞”,實因十多年來,從未有人成功在簡體中文版Windows本地代碼頁的系統環境下,讓mscomctl.ocx中的Treeview控制元件正確顯示阿拉伯文或韓文等等Unicode字符。
這意味著:此控制元件的Unicode支持,理論上,至少有99.9%的概率無法實作;甚至可能連“一線希望”也不存在。
究其本質原因,可能由于MSComctl.ocx中的Treeview控制元件視窗,初始化時以CreateWindowExA()來創建,比較方便支持ANSI;若打算完美支持Unicode,最好以CreateWindowExW()來創建。此外,控制元件在封裝時,可能自動忽略了“4415”號訊息,無論怎么SendMessage過去,也是白搭!當然,我無源代碼,僅僅是無端猜測。呵呵。
這是抽取的VB代碼:
***********************************
Private Type TVITEMW
Mask As Long
hItem As Long
State As Long
stateMask As Long
pszText As Long
cchTextMax As Long
iImage As Long
iSelectedImage As Long
cChildren As Long
lParam As Long
End Type
Private Const TVIF_TEXT As Long = &H1
Private Const TV_FIRST As Long = &H1100
Private Const TVM_SETITEMW As Long = (TV_FIRST + 63)
Private Sub SetNodeText(ByVal lNode As Long, ByVal sText As String)
Dim uTVW As TVITEMW
sText = sText & Chr$(0)
With uTVW
.hItem = lNode
.Mask = TVIF_TEXT
.pszText = StrPtr(sText)
.cchTextMax = LenB(sText)
End With
SendMessageW m_lTVHwnd, TVM_SETITEMW, 0&, uTVW
End Sub
***********************************
*以下相應的VFP代碼,其實修改自張洪舉老師《專家門診——Visual FoxPro開發答疑160問》 之“第56問”的Treeview示例代碼。
* 可惜最后一步SendMessageW()永遠提示出錯:“資料型別不匹配”。
* 不知狐友們有無辦法讓這一行正確運行?
***********************************
PUBLIC oform1
oform1=NEWOBJECT("form1")
oform1.Show
RETURN
**************************************************
*-- Form: form1 (e:\treeview\form1.scx)
*-- ParentClass: form
*-- BaseClass: form
*-- 時間戳: 06/13/20 08:18:04 PM
*
DEFINE CLASS form1 AS form
Top = 0
Left = 0
Height = 253
Width = 367
DoCreate = .T.
Caption = "簡單的TreeView控制元件示例"
Name = "Form1"
ADD OBJECT olecontrol1 AS olecontrol WITH ;
Top = 18, ;
Left = 18, ;
Height = 199, ;
Width = 252, ;
Name = "Olecontrol1"
ADD OBJECT label1 AS label WITH ;
Caption = "Label1", ;
Height = 19, ;
Left = 12, ;
Top = 222, ;
Width = 312, ;
Name = "Label1"
ADD OBJECT command1 AS commandbutton WITH ;
Top = 18, ;
Left = 276, ;
Height = 24, ;
Width = 84, ;
Caption = "移除節點", ;
Name = "Command1"
PROCEDURE unitext
* UniText方法:呼叫API顯示Unicode字符
lpara lNode, UniStr
TVIF_TEXT = 0x1
TV_FIRST = 0x1100
TVM_SETITEMW = TV_FIRST + 63
cUnicodeStr = UniStr + Chr(0) + Chr(0)
* 這里傳送的相當于 vb 中 StrPtr( cUnicodeStr )
pBStr = SysAllocString( cUnicodeStr )
cchTextMax = len(cUnicodeStr)
pNode = SYS(3095, lNode)
* 構造顯示文本的結構TVITEMW,共4*10=40位元組
uTVW1 = BinToC(TVIF_TEXT, 'rs')
uTVW2 = BinToC(pNode, 'rs')
uTVW3 = Replicate(Chr(0), 8)
uTVW4 = BinToC(pBStr, 'rs')
uTVW5 = BinToC(cchTextMax, 'rs')
uTVW6 = Replicate(Chr(0), 16)
uTVW = uTVW1 + uTVW2 + uTVW3 + uTVW4 + uTVW5 + uTVW6
= SendMessageW( This.Olecontrol1.hWnd, TVM_SETITEMW, 0, @ uTVW )
SysFreeString( pBStr) && 釋放這個 BSTR
ENDPROC
PROCEDURE Load
DECLARE Long SendMessageW IN WIN32API AS SendMessageW Long nHandle, Long nMessage, Long nParameter, Long uParameter
Declare Long SysAllocString In Oleaut32 String sz
Declare Long SysFreeString In Oleaut32 String bstr
ENDPROC
PROCEDURE olecontrol1.Collapse
*** ActiveX Control Event ***
LPARAMETERS node
Thisform.Label1.Caption="您對"+Node.Text+"進行了折疊操作"
ENDPROC
PROCEDURE olecontrol1.Expand
*** ActiveX Control Event ***
LPARAMETERS node
Thisform.Label1.Caption="您對"+Node.Text+"進行了展開操作"
ENDPROC
PROCEDURE olecontrol1.NodeClick
*** ActiveX Control Event ***
LPARAMETERS node
Thisform.Label1.Caption="您單擊了"+Node.Text+"節點"
ENDPROC
PROCEDURE olecontrol1.Init
=COMPROP(this,'UTF8',1)
This.Font.Name = "Microsoft YaHei"
This.Font.Size = 12
loNode = Null
This.LineStyle= 1 && tvwRootLines
This.Style= 7 && tvwTreelinesPlusMinusPictureText
This.Nodes.Add(,,"Sport","體育")
This.Nodes.Add("Sport",4,"Ball","球類")
This.Nodes.Add("Ball",4,,"足球")
This.Nodes.Add("Ball",4,,"籃球")
This.Nodes.Add("Ball",4,,"排球")
This.Nodes.Add("Sport",4,"Swim","游泳")
This.Nodes.Add("Swim",4,,"蛙泳")
This.Nodes.Add("Swim",4,,"自由泳")
This.Nodes.Add(,,"Army","軍事")
This.Nodes.Add("Army",4,"Kinds","軍種")
This.Nodes.Add("Kinds",4,,"海軍")
This.Nodes.Add("Kinds",4,,"陸軍")
This.Nodes.Add("Kinds",4,,"空軍")
This.Nodes.Add("Army",4,"Weapon","武器")
This.Nodes.Add("Weapon",4,,"槍")
loNode = This.Nodes.Add("Weapon",4,,"大炮")
* 試圖將最后1個Node.Text修改為VFP不支持的Unicode字符:B14D B24D B34D B44D
lcUnicode = CHR(0xB1)+ CHR(0x4D)+ CHR(0xB2)+ CHR(0x4D)+ CHR(0xB3)+ CHR(0x4D)+ CHR(0xB4)+ CHR(0x4D)
thisForm.uniText(loNode, lcUnicode)
ENDPROC
PROCEDURE command1.Click
IF Thisform.Olecontrol1.Nodes.Count#0
Thisform.Label1.Caption="您移除了"+Thisform.Olecontrol1.SelectedItem.Text+"節點"
Thisform.Olecontrol1.Nodes.Remove(Thisform.Olecontrol1.SelectedItem.Index)
ENDIF
ENDPROC
ENDDEFINE
*
*-- EndDefine: form1
**************************************************
uj5u.com熱心網友回復:
說實話,VB6我不太在行,連蒙帶猜地“翻譯”為VFP代碼。VB6大致思路,好像是用SendMessageW()發送一條訊息,引數分別為:
(oTree.hWnd, 4415, 0, 【具體顯示內容的Type結構】)
其中,VB代碼中的lNode引數,我不太確定是指Node的記憶體地址指標,還是Node.index。不過兩者我都試過,都不行。
而10個Long型構成的Type...EndType結構,因VFP沒有對應的結構,只能用40位元組的字串來模擬。就是這個結構體,我一直弄不好。
熱切期待都市夜貓、wwwwb、十豆三……等API高手指點!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/14992.html
標籤:VFP
