Trang 1 trên 2

Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: CN 19/07/2009 4:39 pm
gửi bởi clarkkent
Thủ thuật: Tiêu đề tiếng Việt Unicode cho Form trong VB6
Tác giả: Nguyễn Trung Tín sưu tầm
Mô tả: Tiêu đề tiếng Việt Unicode cho Form trong VB6


viettitle.png

Tải về tool dùng để convert

hàm, sưu tầm chưa chỉnh sửa

Mã: Chọn hết

  1. Private Declare Function GetModuleHandleW Lib "kernel32" (ByVal lpModuleName As Long) As Long
  2. Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
  3. Private Declare Function GetWindowLongA Lib "user32" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
  4. Private Declare Function SetWindowLongA Lib "user32" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  5. Private Declare Function SetWindowLongW Lib "user32" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  6. Private Declare Function SetWindowTextW Lib "user32" (ByVal hWnd As Long, ByVal lpString As Long) As Long
  7.  
  8. Private Const GWL_WNDPROC = -4
  9.  
  10. Private m_Caption As String
  11.  
  12. Public Property Get CaptionW() As String
  13.     CaptionW = m_Caption
  14. End Property
  15. Public Property Let CaptionW(ByRef NewValue As String)
  16.     Static WndProc As Long, VBWndProc As Long
  17.     m_Caption = NewValue
  18.     ' get window procedures if we don't have them
  19.     If WndProc = 0 Then
  20.         ' the default Unicode window procedure
  21.         WndProc = GetProcAddress(GetModuleHandleW(StrPtr("user32")), "DefWindowProcW")
  22.         ' window procedure of this form
  23.         VBWndProc = GetWindowLongA(hWnd, GWL_WNDPROC)
  24.     End If
  25.     ' ensure we got them
  26.     If WndProc <> 0 Then
  27.         ' replace form's window procedure with the default Unicode one
  28.         SetWindowLongW hWnd, GWL_WNDPROC, WndProc
  29.         ' change form's caption
  30.         SetWindowTextW hWnd, StrPtr(m_Caption)
  31.         ' restore the original window procedure
  32.         SetWindowLongA hWnd, GWL_WNDPROC, VBWndProc
  33.     Else
  34.         ' no Unicode for us
  35.         Caption = m_Caption
  36.     End If
  37. End Property


Sử dụng, trong Form_Load

Mã: Chọn hết

  1. Private Sub Form_Load()
  2. CaptionW = "Tiêu " & ChrW(&H111) & "" & ChrW(&H1EC1) & " ti" & ChrW(&H1EBF) & "ng Vi" & ChrW(&H1EC7) & "t - s" & ChrW(&H1B0) & "u t" & ChrW(&H1EA7) & "m b" & ChrW(&H1EDF) & "i Nguy" & ChrW(&H1EC5) & "n Trung Tín"
  3. End Sub

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: CN 19/07/2009 8:38 pm
gửi bởi truongphu
Thấy code gọn quá, lại có hình minh họa tiếng Việt trên tiêu đề rõ ràng nên tôi khoái, chạy thử xem sao...
--------
Win XP SP2, giao diện Classic
Form1.Font = Arial

kết quả:

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: CN 19/07/2009 9:03 pm
gửi bởi skatervn
Mình cũng y như bác Phú. Thử nghiệm thì thấy lỗi ô vuông liền. Không biết tình hình máy bạn sao, chứ mình XP SP3.

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: T.Hai 20/07/2009 8:16 am
gửi bởi clarkkent
Ủa, Mới tét máy cty bình thường luôn mà
Hình ảnh
máy XP SP3, còn font của form là j không quan trọng

@bác Phú: bác đổi style thành XP xem

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: T.Hai 20/07/2009 8:40 am
gửi bởi anhtuyenbk
Nhìn mấy cái ChrW là hết muốn đọc rồi, nhớ trong VBLib có bày cách tạo title tiếng việt mà.

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: T.Hai 20/07/2009 8:44 am
gửi bởi clarkkent
anhtuyenbk đã viết:Nhìn mấy cái ChrW là hết muốn đọc rồi, nhớ trong VBLib có bày cách tạo title tiếng việt mà.

trong vblib cũng xài ChrW thôi, mà lại dài nữa, với lại có tool convert rồi :D

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: T.Hai 20/07/2009 9:14 am
gửi bởi skatervn
Mod đừng nói tớ giới thiệu hàng nha, nhưng có bài tớ mới viết về các bộ công cụ nên có của lập trình viên VB. Có nói về tool convert từ chuỗi nhập CP1258 qua ChrW và quan trọng là nó ở trong menu chuột phải(rất tiện lợi chỉ cần gõ chuỗi ở dạng Cp1258 bất kỳ và chuột phải chọn vậy là xong). Nhưng cái style XP thì đúng là ko chú ý để test lại xem. Mà như vậy thì cái khoản này cũng hơi hạn chế rồi.

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: T.Hai 20/07/2009 9:42 am
gửi bởi clarkkent
skatervn đã viết:Mod đừng nói tớ giới thiệu hàng nha, nhưng có bài tớ mới viết về các bộ công cụ nên có của lập trình viên VB. Có nói về tool convert từ chuỗi nhập CP1258 qua ChrW và quan trọng là nó ở trong menu chuột phải(rất tiện lợi chỉ cần gõ chuỗi ở dạng Cp1258 bất kỳ và chuột phải chọn vậy là xong). Nhưng cái style XP thì đúng là ko chú ý để test lại xem. Mà như vậy thì cái khoản này cũng hơi hạn chế rồi.

ko có j? :D

- Mà cái tool mình gởi là xài unicode trực tiếp luôn, CP 1258 cũng ít người xài
- Hình như lỗi không hiển thị được là do theme không hỗ trợ unicode, với lại IE, hay Firefox (ở mấy máy cui :-/ ) cùng không hiển thị được unicode trên thanh tiêu đề mà, có lẽ vấn đề là ở theme không hổ trợ...

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: T.Hai 20/07/2009 10:41 am
gửi bởi NoBi
Sao cái tool gì đó ở trên anh chạy kg dc, báo lỗi Unexpected error. Mấy cái này cần gì tool, trên forum có source của tool rồi mà :D

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: T.Hai 20/07/2009 11:10 am
gửi bởi clarkkent
NoBi đã viết:Sao cái tool gì đó ở trên anh chạy kg dc, báo lỗi Unexpected error. Mấy cái này cần gì tool, trên forum có source của tool rồi mà :D

em biết là có mà không biết tìm ở đâu :D

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: T.Hai 20/07/2009 12:16 pm
gửi bởi NoBi
Đây nè:

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: T.Hai 20/07/2009 1:10 pm
gửi bởi vietteiv
nếu dùng theme XP nhưng font tiêu đề khác với font unicode chuẩn thì vẫn ko thể hiện được. xem hình test :D
test.JPG


có thể dùng hàm đổi vni sang unicode cho dễ dùng thì sử dụng hàm DefWindowProc làm tiêu đề tiếng việt cũng được

Mã: Chọn hết

  1. '// viết trong module
  2. Option Explicit
  3. Private Const sANSI = "a1,a2,a3,a4,a5,a8,a81,a82,a83,a84,a85,a6,a61,a62,a63,a64,a65,e1,e2,e3,e4,e5,e6,e61,e62,e63,e64,e65,i1,i2,i3,i4,i5,o1,o2,o3,o4,o5,o6,o61,o62,o63,o64,o65,o7,o71,o72,o73,o74,o75,u1,u2,u3,u4,u5,u7,u71,u72,u73,u74,u75,y1,y2,y3,y4,y5,d9,A1,A2,A3,A4,A5,A8,A81,A82,A83,A84,A85,A6,A61,A62,A63,A64,A65,E1,E2,E3,E4,E5,E6,E61,E62,E63,E64,E65,I1,I2,I3,I4,I5,O1,O2,O3,O4,O5,O6,O61,O62,O63,O64,O65,O7,O71,O72,O73,O74,O75,U1,U2,U3,U4,U5,U7,U71,U72,U73,U74,U75,Y1,Y2,Y3,Y4,Y5,D9"
  4. Private Const sUNICODE = "00E1,00E0,1EA3,00E3,1EA1,0103,1EAF,1EB1,1EB3,1EB5,1EB7,00E2,1EA5,1EA7,1EA9,1EAB,1EAD,00E9,00E8,1EBB,1EBD,1EB9,00EA,1EBF,1EC1,1EC3,1EC5,1EC7,00ED,00EC,1EC9,0129,1ECB,00F3,00F2,1ECF,00F5,1ECD,00F4,1ED1,1ED3,1ED5,1ED7,1ED9,01A1,1EDB,1EDD,1EDF,1EE1,1EE3,00FA,00F9,1EE7,0169,1EE5,01B0,1EE9,1EEB,1EED,1EEF,1EF1,00FD,1EF3,1EF7,1EF9,1EF5,0111,00C1,00C0,1EA2,00C3,1EA0,0102,1EAE,1EB0,1EB2,1EB4,1EB6,00C2,1EA4,1EA6,1EA8,1EAA,1EAC,00C9,00C8,1EBA,1EBC,1EB8,00CA,1EBE,1EC0,1EC2,1EC4,1EC6,00CD,00CC,1EC8,0128,1ECA,00D3,00D2,1ECE,00D5,1ECC,00D4,1ED0,1ED2,1ED4,1ED6,1ED8,01A0,1EDA,1EDC,1EDE,1EE0,1EE2,00DA,00D9,1EE6,0168,1EE4,01AF,1EE8,1EEA,1EEC,1EEE,1EF0,00DD,1EF2,1EF6,1EF8,1EF4,0110"
  5. Private ArrFromCode() As String
  6. Private ArrToCode() As String
  7.  
  8. Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcW" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  9. Private Const WM_SETTEXT = &HC
  10.  
  11. Public Function ToUni(ByRef sString As String) As String
  12.     Dim sTam As String
  13.     Dim i As Long, ArrChuoiXuLy() As String
  14.     Dim K As Long, j As Long
  15.     Dim sKyTu1 As String, sKyTu2 As String, sKyTu3 As String, sKyTu4 As String
  16.     Dim sChuoiBenPhai As String, sKhoangTrang As String
  17.     Dim iVitri As Integer
  18.        
  19.         If Trim$(sString) = "" Then ToUni = sString:    Exit Function
  20.        
  21.         ArrFromCode = Split(sANSI, ",")
  22.         ArrToCode = Split(sUNICODE, ",")
  23.         ArrChuoiXuLy = Split(sString, " ")
  24.         For i = 0 To UBound(ArrChuoiXuLy)
  25.             j = HaveNumber(ArrChuoiXuLy(i))
  26.             If (j > 1) And (Not IsNumeric(ArrChuoiXuLy(i))) Then
  27.                 If j > 2 Then sTam = sTam & Left$(ArrChuoiXuLy(i), j - 2)
  28.                 sKyTu1 = Mid$(ArrChuoiXuLy(i), j - 1, 1)
  29.                 sKyTu2 = Mid$(ArrChuoiXuLy(i), j, 1)
  30.                 For K = j To Len(ArrChuoiXuLy(i))
  31.                     If IsNumeric(Mid$(ArrChuoiXuLy(i), K + 1, 1)) And sChuoiBenPhai = "" Then
  32.                         sKyTu3 = sKyTu3 & Mid$(ArrChuoiXuLy(i), K + 1, 1)
  33.                     Else
  34.                         sChuoiBenPhai = sChuoiBenPhai & Mid$(ArrChuoiXuLy(i), K + 1, 1)
  35.                     End If
  36.                 Next
  37.                 If Trim$(sChuoiBenPhai) <> "" Then If HaveNumber(sChuoiBenPhai) > 0 Then sChuoiBenPhai = Trim$(ToUni(sChuoiBenPhai))
  38.                 sKyTu4 = sKyTu1 & sKyTu2 & sKyTu3
  39.                 sTam = sTam & ChangeString(sKyTu4)
  40.             Else
  41.                 sTam = sTam & ArrChuoiXuLy(i) & " "
  42.                 GoTo TT
  43.             End If
  44.             sTam = sTam & sChuoiBenPhai & " "
  45. TT:
  46.             sKyTu1 = "":    sKyTu2 = "":    sKyTu3 = "":    sChuoiBenPhai = ""
  47.         Next
  48.         ToUni = IIf(Right$(sTam, 1) = " ", Left$(sTam, Len(sTam) - 1), sTam)
  49. End Function
  50.  
  51. Private Function HaveNumber(sString As String) As Long
  52.     Dim i As Long
  53.     Dim sKytu As String
  54.    
  55.         For i = 1 To Len(sString)
  56.             sKytu = Mid(sString, i, 1)
  57.             If IsNumeric(sKytu) Then HaveNumber = i
  58.             If HaveNumber > 0 Then Exit Function
  59.         Next
  60. End Function
  61.  
  62. Private Function ChangeString(sString As String) As String
  63.     Dim K As Long, bThayDoi As Boolean
  64.  
  65.         For K = 0 To UBound(ArrToCode)
  66.             If sString = ArrFromCode(K) Then
  67.                 ChangeString = ChangeString & ChrW$(CLng("&H" & ArrToCode(K)))
  68.                 bThayDoi = True
  69.                 Exit For
  70.             End If
  71.         Next
  72.         If bThayDoi = False Then ChangeString = ChangeString & sString
  73. End Function
  74.  
  75. Public Sub UniTitle(hwnd As Long, sTitle As String)
  76.     DefWindowProc hwnd, WM_SETTEXT, 0, ByVal StrPtr(ToUni(sTitle))
  77. End Sub
  78.  
  79. '// viết trong form load
  80. Private Sub MDIForm_Load()
  81.     Call UniTitle(Me.hwnd, "Tie61ng vie65t tre6n MDIForm ne2 - Ca6u la5c bo65 vb")
  82. End Sub

test1.JPG
test1.JPG (7.67 KiB) Đã xem 7970 lần

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: T.Hai 20/07/2009 1:20 pm
gửi bởi clarkkent
ra là thế 8-}
trước giờ cũng xài DefWindowProcW mà hok biết nó có thể set unicode cho title :">

Mã: Chọn hết

  1. Private Declare Function DefWindowProcW Lib "user32" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  2. Public Sub SetUniText(ByVal hwnd As Long, ByVal sUniText As String)
  3.     DefWindowProcW hwnd, &HC, &H0&, StrPtr(sUniText)
  4. End Sub
  5.  
  6. Private Sub Form_Load()
  7. SetUniText Me.hwnd, "Ti" & ChrW(&H1EBF) & "ng Vi" & ChrW(&H1EC7) & "t trên thanh tiêu " & ChrW(&H111) & "" & ChrW(&H1EC1) & " - Nguy" & ChrW(&H1EC5) & "n Trung Tín"
  8. End Sub

Ghi chú:
đoạn

Mã: Chọn hết

  1. "Ti" & ChrW(&H1EBF) & "ng Vi" & ChrW(&H1EC7) & "t trên thanh tiêu " & ChrW(&H111) & "" & ChrW(&H1EC1) & " - Nguy" & ChrW(&H1EC5) & "n Trung Tín"

có thể thay bằng 1 hàm nào đó dùng để chuyển sang Unicode cũng được chẳng hạng VNI2UNI, TCVN32UNI, ... (:|

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: T.Hai 20/07/2009 1:33 pm
gửi bởi vietteiv
Hình nhu VBLib thiê'u hàm DefwindowProcW.Cái này tui chôm bên AllAPI :D

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: T.Hai 20/07/2009 8:50 pm
gửi bởi tindl88
đã có rồi anh vietteiv, có trong vblib lâu rồi.
chỉ có điều là chỉ hiển thị tiếng Việt ở ThemxP

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: T.Hai 20/07/2009 9:37 pm
gửi bởi NoBi
Code trên bài viết đầu tiên có cái lạ, còn mấy code dưới có sẳn từ lâu trong forum cũ hết rồi (và trong VBLib). Nhớ coi chừng trong máy có cài vietkey bị nó thay font hệ thống thành font của nó đó (mà font của nó là font TCVN) -> test cho kết quả khác.

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: T.Ba 21/07/2009 9:16 am
gửi bởi 111111
thêm classis không hiển thị TV được.
tôi thấy firefox 3.5 hiển thị TV rất tốt trên tiêu đề theme classic.
có thể làm giống firefox được không?

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: T.Ba 21/07/2009 9:37 am
gửi bởi clarkkent
111111 đã viết:thêm classis không hiển thị TV được.
tôi thấy firefox 3.5 hiển thị TV rất tốt trên tiêu đề theme classic.
có thể làm giống firefox được không?

bạn đã thử cách này chưa
viewtopic.php?f=19&t=8334#p52265

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: T.Tư 22/07/2009 2:09 pm
gửi bởi DQHung
Nếu dùng cách của clarkkent thì phải cài Font unicode asian vào đối với windowsxp (vào Regional And Languages Options, check vào "Install files for East Asian Languages", đưa đĩa Windows XP vào cài) còn với Windows Vista trở lên thì dùng cách này vô tư.

Re: Tiêu đề tiếng Việt Unicode cho Form trong VB6

Đã gửi: T.Tư 22/07/2009 8:43 pm
gửi bởi skatervn
Theo mình thử rồi thì thế này? Lúc đầu đúng là mình không hiển thị được nhưng sau đó theo gợi ý của anh Nobi thì mình đã làm được. Đúng là phần set font hệ thống phần Tilte không phải font unicode nên không thể hiển thị đúng đc, chỉ cần chuyển qua đúng là ổn. Không cần phải cài gói languege Asia chi cho mệt!