Tặng Hàm MsgBox Việt hóa font Unicode chỉnh nút lệnh theo ý muốn! (Phần 3)

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,720
Giới tính
Nam
Nếu như ở bài này:

http://www.giaiphapexcel.com/forum/showthread.php?109175-Tặng-Hàm-MsgBox-Việt-hóa-font-Unicode-tuyệt-đẹp!-(Phần-2-32bit-64bit)&p=682368#post682368

Ta đã có một hàm chuyển hóa Việt ngữ dùng cho cả 32 lẫn 64 bit, thì bài này tôi tiếp tục nâng cấp chúng gọn hơn với các thủ tục, đồng thời ta có thể thay đổi tên nút lệnh ngay tại câu lệnh của chúng ta!

Đây là toàn bộ code:

Mã:
Option Explicit
''------------------------------------------------------------------------
Private hHook As Long
Private priBttnArr, priChangeBttnArr
''------------------------------------------------------------------------
Private Const HCBT_ACTIVATE = 5
'******************************************************************************************************************************
#If VBA7 And Win64 Then 'Office 64-bit
    Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As Long
    Private Declare PtrSafe Function SetDlgItemText Lib "user32" Alias "SetDlgItemTextW" (ByVal hDlg As LongPtr, ByVal nIDDlgItem As LongPtr, ByVal lpString As String) As Long
    Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As LongPtr, ByVal lpfn As LongPtr, ByVal hmod As LongPtr, ByVal dwThreadId As LongPtr) As Long
    Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As LongPtr) As Long
#Else ' Office 32-bit
    Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
    Private Declare Function SetDlgItemText Lib "user32" Alias "SetDlgItemTextW" (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal lpString As String) As Long
    Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
#End If
'******************************************************************************************************************************
Public Enum ButtonType
    bttnOK = 0      ': OK
    bttnOC = 1      ': OKCancel
    bttnARI = 2     ': AbortRetryIgnore
    bttnYNC = 3     ': YesNoCancel
    bttnYN = 4      ': YesNo
    bttnRC = 5      ': RetryCancel
    bttnYANC = 6    ': YesAllNoCancel
End Enum

Public Enum IconType
    iconNoIcon = 0
    iconCritical = 1
    iconQuery = 2
    iconWarning = 3
    iconInfo = 4
End Enum

Public Enum DefaultType
    dfltFirst = 0
    dfltSecond = 1
    dfltThird = 2
    dfltFourth = 3
    dfltFifth = 4
End Enum
'******************************************************************************************************************************

Private Sub GetButtonString()
    If Not IsArray(priBttnArr) Then
        Dim OK As String, Cancel As String, Abort As String, Retry As String
        Dim Ignore As String, Yes As String, No As String, YesAll As String
        '-------------------------------------------------------------------
        OK = "Ch" & ChrW(7845) & "p nh" & ChrW(7853) & "n"       'Chap nhan
        Cancel = "&H" & ChrW$(7911) & "y b" & ChrW$(7887)        'Huy bo
        Abort = "&H" & ChrW$(7911) & "y ngang"                   'Huy ngang
        Retry = "&Th" & ChrW$(7917) & " l" & ChrW$(7841) & "i"   'Thu lai
        Ignore = "&B" & ChrW$(7887) & " qua"                     'Bo qua
        Yes = "&Có"                                              'Co
        No = "&Không"                                            'Khong
        YesAll = "Có &t" & ChrW$(7845) & "t c" & ChrW$(7843)     'Co tat ca
        '-------------------------------------------------------------------
        ReDim priBttnArr(1 To 8) As String
        '-------------------------------------------------------------------
        priBttnArr(1) = OK
        priBttnArr(2) = Cancel
        priBttnArr(3) = Abort
        priBttnArr(4) = Retry
        priBttnArr(5) = Ignore
        priBttnArr(6) = Yes
        priBttnArr(7) = No
        priBttnArr(8) = YesAll
        '-------------------------------------------------------------------
    End If
    priChangeBttnArr = priBttnArr
End Sub

Private Function MsgBoxHookProc(ByVal lMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If lMsg = HCBT_ACTIVATE Then
        ''------------------------------------------------------------------------
        Dim c As Byte
        For c = 1 To 8
            SetDlgItemText wParam, c, StrConv(priChangeBttnArr(c), vbUnicode)
        Next
        ''------------------------------------------------------------------------
        UnhookWindowsHookEx hHook
    End If
    MsgBoxHookProc = False
End Function
'******************************************************************************************************************************

Function MsgBoxVN(ByVal msgTitle As String, _
                  ByVal msgText As String, _
                  ByVal msgButton As ButtonType, _
                  ByVal msgIcon As IconType, _
                  ByVal msgDefault As DefaultType, _
                  ParamArray msgButtonChange()) As VbMsgBoxResult
    ''---------------------------------------------------------------------------------------------------
    ''  Cau truc: MsgBoxVN (TieuDe, NoiDung, KieuNutLenh, KieuIcon, KieuNutLenhMacDinh,
[*])
    ''  Voi
[*]:
    ''  1) KHONG GHI GI CA Neu de mac dinh kieu Nut lenh da ma hoa san.
    ''  2) Ma hoa nut lenh bang chuoi Unicode tuy thich theo cac thu tu cua nut lenh.
    ''---------------------------------------------------------------------------------------------------
    On Error Resume Next
    Call GetButtonString
    If Not IsMissing(msgButtonChange) Then
        Select Case msgButton
        Case bttnOK     ': OK
            priChangeBttnArr(1) = Trim(msgButtonChange(0))
        Case bttnOC     ': OKCancel
            priChangeBttnArr(1) = Trim(msgButtonChange(0))
            priChangeBttnArr(2) = Trim(msgButtonChange(1))
        Case bttnARI    ': AbortRetryIgnore
            priChangeBttnArr(3) = Trim(msgButtonChange(0))
            priChangeBttnArr(4) = Trim(msgButtonChange(1))
            priChangeBttnArr(5) = Trim(msgButtonChange(2))
        Case bttnYNC    ': YesNoCancel
            priChangeBttnArr(6) = Trim(msgButtonChange(0))
            priChangeBttnArr(7) = Trim(msgButtonChange(1))
            priChangeBttnArr(2) = Trim(msgButtonChange(2))
        Case bttnYN     ': YesNo
            priChangeBttnArr(6) = Trim(msgButtonChange(0))
            priChangeBttnArr(7) = Trim(msgButtonChange(1))
        Case bttnRC     ': RetryCancel
            priChangeBttnArr(4) = Trim(msgButtonChange(0))
            priChangeBttnArr(2) = Trim(msgButtonChange(1))
        Case bttnYANC   ': YesAllNoCancel
            priChangeBttnArr(6) = Trim(msgButtonChange(0))
            priChangeBttnArr(8) = Trim(msgButtonChange(1))
            priChangeBttnArr(7) = Trim(msgButtonChange(2))
            priChangeBttnArr(2) = Trim(msgButtonChange(3))
        End Select
    End If
    hHook = SetWindowsHookEx(HCBT_ACTIVATE, AddressOf MsgBoxHookProc, 0, GetCurrentThreadId)
    MsgBoxVN = Assistant.DoAlert(msgTitle, msgText, msgButton, msgIcon, msgDefault, msoAlertCancelDefault, False)
End Function
'******************************************************************************************************************************

Như vậy, nếu bạn vẫn sử dụng mặc định nút lệnh tương đối dịch sát nghĩa của từ gốc thì chỉ cần:

MsgBoxVN TieuDe, NoiDung, bttnOK, 20, dfltFirst

Với bttnOK là nút có dòng chữ: Chấp nhận.

Nhưng ở đây chúng ta không muốn Chấp nhận, ta muốn theo cái thủ tục mà ta đưa ra như: Nội dung: Chúng ta sẽ làm gì? thì Button ta ghi "Ăn nhậu", "Thể thao", "Lao động" v.v...

Vậy chúng ta sẽ làm gì?

Với lần cải tiến này, chúng ta chỉ việc ghi thêm:

Mã:
        NoiDung = "Chúng ta sẽ làm gì?"
        ButtonYes ="Ăn nhậu"
        ButtonNo = "Thể thao"
        ButtonCancel = "Lao động"
        MsgBoxVN TieuDe, NoiDung, bttnYNC, 101, dfltThird, ButtonYes, ButtonNo, ButtonCancel

Msg1.jpg

Thật tuyệt vời phải không các bạn?

Mã:
        NoiDung = "Thật tuyệt vời phải không các bạn?"
        ButtonYes ="Tuyệt thật"
        ButtonNo = "Hoàn hảo"
        MsgBoxVN TieuDe, NoiDung, bttnYN, 101, dfltThird, ButtonYes, ButtonNo

Msg2.jpg
 

File đính kèm

Lần chỉnh sửa cuối:
Các bạn có thử dùng bản này chưa và cho biết nó hiển thị thế nào? Máy tôi hiển thị chính xác unicode 100%.
 
Upvote 0
Kakakaka, bó tay với cha nội này! Thánh spam luôn! }}}}}
không ai nói gì thì anh í "nhắc nhở"
Các bạn có thử dùng bản này chưa và cho biết nó hiển thị thế nào? Máy tôi hiển thị chính xác unicode 100%.

có người vào nhận xét thì anh í biểu là SPAM . Huynh đài thiệt là hư cấu wá đi
 
Upvote 0
không ai nói gì thì anh í "nhắc nhở"


có người vào nhận xét thì anh í biểu là SPAM . Huynh đài thiệt là hư cấu wá đi

Nói chung rất đẹp, rất tuyệt, thật không thể tin được (câu này của Quảng Nổ).
Và thấy toàn là MsgBox "Tự Sướng" Anh ấy quá đẹp trai phải không?,Biệt danh: Nghĩa đẹp trai!, Anh ấy rất chai mặt,... đại loại vậy. hí hí :-=:-=:-=

Mấy thánh ơi, ở đây người ta hỏi là chữ tiếng Việt có hiện lên có đầy đủ hay không, có bị cắt xén hay không hoặc mất dấu hay không thôi, bởi một số máy sẽ bị như thế.
 
Upvote 0
attachment.php


Thật tuyệt vời phải không các bạn?

Mã:
        NoiDung = "Thật tuyệt vời phải không các bạn?"
        ButtonYes ="Tuyệt thật"
        ButtonNo = "Hoàn hảo"
[B]        MsgBoxVN TieuDe, NoiDung, [COLOR=#FF0000]bttnYN[/COLOR], 101, dfltThird,[COLOR=#0000FF] ButtonYes, ButtonNo[/COLOR][/B]

attachment.php
[/QUOTE]
Nói chung mình thích mấy cái MsgBox này, nhưng cả đống code thì chỉ để tham khảo, không dám dùng hết . Mình chỉ dám dùng tý.. tý thôi!
 
Upvote 0
. .
 

File đính kèm

  • QQ图片20151103182951.png
    QQ图片20151103182951.png
    18.2 KB · Đọc: 69
  • QQ图片20151103183033.png
    QQ图片20151103183033.png
    15.6 KB · Đọc: 50
Upvote 0
Instead of:

Private Declare FunctionSetDlgItemText Lib"user32"Alias"SetDlgItemTextW"(ByValhDlg AsLong, ByValnIDDlgItem AsLong, ByVallpString As Long) AsLong

You should do this:

Private Declare FunctionSetDlgItemText Lib"user32"Alias"SetDlgItemTextW"(ByValhDlg AsLong, ByValnIDDlgItem AsLong, ByVallpString As String) AsLong

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau
 
Lần chỉnh sửa cuối:
Upvote 0
Ta đâu biết chi đến người viết như thế nào đâu, chỉ cần 1 dòng lệnh là có thể sử dụng được rồi. Việc ta cần là Copy cái code vào module và xài. Nhưng nên sử dụng vào các chương trình tổng hợp thường xuyên gặp thông báo, chứ không thì chỉ xem qua cho vui.
Mình lại thấy nó hay ở khia cạnh khác ! Lần trước mình đã chuyển nó thành ADD-INS và điều đặc biệt là không những nó hiện được tiếng việt mà hiện được ngôn ngữ bất kỳ . Trong file đính kèm mình mới thử ở 2 sheet và hiện 4 thứ tiếng, Nga, Nhật, Trung, Lào ...Tất nhiên mình chả biết tý ngoại ngữ nào nhưng cứ copy và thử xem nó có giữ nguyên bản loại chữ cần không ? Và mình nghĩ nó hiện được mọi thứ tiếng . Mình gửi file Demo và ADD-Ins để ai thích text thử ... Mình chưa text nhiều nên không phát hiện có lỗi không ? Không muốn "múa rìu qua mắt thợ", mình mày mò để dùng, Nhưng có thể ai đó cần...Khi sử dụng ADD-Ins , bạn chỉ cần nhập nội dung cần hiện vào ô IV1 hoặc IV2 của sheet hiện hành , khi muốn hiện Nội dung tại IV1, bạn dùng lệnh :
Application.Run "Test"
Khi muốn hiện nội dung tại IV2 thì bạn dùng lệnh :
Application.Run "Test2"

TB: Xin lỗi bạn 南宫飘雪 vì dùng tên bạn trong Msgbox hiện tiếng Trung Quốc
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình lại thấy nó hay ở khia cạnh khác ! Lần trước mình đã chuyển nó thành ADD-INS và điều đặc biệt là không những nó hiện được tiếng việt mà hiện được ngôn ngữ bất kỳ . Trong file đính kèm mình mới thử ở 2 sheet và hiện 4 thứ tiếng, Nga, Nhật, Trung, Lào ...Tất nhiên mình chả biết tý ngoại ngữ nào nhưng cứ copy và thử xem nó có giữ nguyên bản loại chữ cần không ? Và mình nghĩ nó hiện được mọi thứ tiếng . Mình gửi file Demo và ADD-Ins để ai thích text thử ... Mình chưa text nhiều nên không phát hiện có lỗi không ? Không muốn "múa rìu qua mắt thợ", mình mày mò để dùng, Nhưng có thể ai đó cần...Khi sử dụng ADD-Ins , bạn chỉ cần nhập nội dung cần hiện vào ô IV1 hoặc IV2 của sheet hiện hành , khi muốn hiện Nội dung tại IV1, bạn dùng lệnh :
Application.Run "Test"
Khi muốn hiện nội dung tại IV2 thì bạn dùng lệnh :
Application.Run "Test2"

TB: Xin lỗi bạn 南宫飘雪 vì dùng tên bạn trong Msgbox hiện tiếng Trung Quốc
Ngắn gọn mà hay mình mới thử chữ Kiều Mạnh cũng ok
PHP:
MsgText = "Ki" & ChrW(7873) & "u M" & ChrW(7841) & "nh"
 
Lần chỉnh sửa cuối:
Upvote 0
Ngắn gọn mà hay mình mới thử chữ Kiều Mạnh cũng ok
PHP:
MsgText = "Ki" & ChrW(7873) & "u M" & ChrW(7841) & "nh"
Không biết bạn thử trên file Demo hay Add-Ins ? Tai ô IV1 Bạn gõ thế nào Msgbox sẽ hiện nguyên văn nội dung của bạn ( không cần phải gõ code) . Kể cả một đoạn văn bất cứ ngôn ngữ nào . Bạn xem thử file đính kèm ( Bấm ctr+shift+z). Nó hiện luôn cả tiếng ta , tiếng tàu luôn...
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn phải nhập nội dung cần hiện trên MsgBox vào ô IV1, Hoặc IV2 mà .
Ý hpkhuong hỏi dạng như vầy
PHP:
Sub Test_OK()
Dim Anser Anser = MsgBox("Luu Chon Yes,  Khong Chon No", 
_ vbDefaultButton1 + vbQuestion + vbYesNo, "Kieu Manh")
 If Anser = vbYes Then
        MsgBox "Yes"
    ElseIf Anser = vbNo Then
        MsgBox "No" 
End If
End Sub
 
Upvote 0
Ý hpkhuong hỏi dạng như vầy
PHP:
Sub Test_OK()
Dim Anser Anser = MsgBox("Luu Chon Yes,  Khong Chon No", 
_ vbDefaultButton1 + vbQuestion + vbYesNo, "Kieu Manh")
 If Anser = vbYes Then
        MsgBox "Yes"
    ElseIf Anser = vbNo Then
        MsgBox "No" 
End If
End Sub
Nói thực, mình xem code trong file của Hoàng trọng Nghĩa , mình "choáng" luôn, Mình đã nói chỉ dám học tý...tý mà ...
 
Upvote 0
Instead of:

Private Declare FunctionSetDlgItemText Lib"user32"Alias"SetDlgItemTextW"(ByValhDlg AsLong, ByValnIDDlgItem AsLong, ByVallpString As Long) AsLong

You should do this:

Private Declare FunctionSetDlgItemText Lib"user32"Alias"SetDlgItemTextW"(ByValhDlg AsLong, ByValnIDDlgItem AsLong, ByVallpString As String) AsLong

In normal circumstances, the pair highlighted in blue above are used for answering questions. Because they imply an act of instruction.

In the context of suggestion and/or pointing out errors, which is what you are doing, the following pair would be much more appreciated:

Shouldn't it be:
...
Rather than:
...
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom