Tặng các bạn InputBox, MsgBox cho phép tô màu nền và màu chữ - Nhân dịp tôi đổi nick

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,772
Được thích
10,284
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Nhân việc bạn thuyyeu99 nhờ tại đề tài Có cách nào tô màu nền và màu chữ cho Msgbox không

Cũng là dịp tôi đổi nick mới trong GPE. Nhân sự kiện này viết tặng các bạn hai hàm InputBox và MsgBox cho phép to màu chữ và màu nền.

Mã nguồn được viết theo phương pháp lập trình Windows API (chỉ có cách này thôi), sử dụng kỹ thuật thuật hook của sổ, cấy vào nó một thủ tục "MsgBoxProc" để xử lý các thông điệp khi Windows vẽ cửa sổ InputBox và MsgBox.

Hai hàm InputBoxClrMsgBoxClr được viết để gọi lệnh hook của sổ và gọi hàm gốc trong VBA là InputBoxMsgBox. Các đối số sử dụng tương tự nhau, chỉ thêm hai đối số bổ sung là BackColor và ForeColor để tô màu nền và màu chữ.

MsgBoxTimer.jpg

InputBoxPass.jpg

Mã:
Function [B]MsgBoxClr[/B](ByVal Prompt As String, _
                    Optional ByVal Buttons As VbMsgBoxStyle = vbOKOnly, _
                    Optional ByVal Title As Variant, _
                    Optional HelpFile As Variant, _
                    Optional ByVal Context As Variant, _
                    Optional ByVal BackColor As Long = -1, _
                    Optional ByVal ForeColor As Long = -1) As VbMsgBoxResult
    Dim inst&
    inst = GetWindowLong(GetActiveWindow, GWL_HINSTANCE)
    With MSG
        .BackColor = BackColor
        .ForeColor = ForeColor
        [COLOR="SeaGreen"]'This is where you need to Hook the MsgBox[/COLOR]
        .HOOK = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf HookMsgBox, inst, GetCurrentThreadId)
        MsgBoxClr = MsgBox(Prompt, Buttons, Title, HelpFile, Context)
       [COLOR="SeaGreen"] 'Remove the Hook[/COLOR]
        Call UnhookWindowsHookEx(.HOOK)
        .PrevProc = 0
    End With
End Function
[COLOR="SeaGreen"]'-------------------------------------------------------------------------------------------------------[/COLOR]
Function [B]InputBoxClr[/B](ByVal Prompt As String, _
                    Optional ByVal Title As String = vbNullString, _
                    Optional ByVal Default As Variant, _
                    Optional ByVal XPos As Variant, _
                    Optional ByVal YPos As Variant, _
                    Optional HelpFile As Variant, _
                    Optional ByVal Context As Variant, _
                    Optional ByVal BackColor As Long = -1, _
                    Optional ByVal ForeColor As Long = -1) As String
    Dim inst&
    inst = GetWindowLong(GetActiveWindow, GWL_HINSTANCE)
    With MSG
        .BackColor = BackColor
        .ForeColor = ForeColor
        [COLOR="SeaGreen"]'This is where you need to Hook the InputBox[/COLOR]
        .HOOK = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf HookMsgBox, inst, GetCurrentThreadId)
        InputBoxClr = InputBox(Prompt, Title, Default, XPos, YPos, HelpFile, Context)
       [COLOR="SeaGreen"] 'Remove the Hook[/COLOR]
        Call UnhookWindowsHookEx(.HOOK)
        .PrevProc = 0
    End With
End Function
[COLOR="SeaGreen"]'-------------------------------------------------------------------------------------------------------[/COLOR]
Private Function MsgBoxProc(ByVal hwnd As Long, ByVal uMSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim tLB As LOGBRUSH
    Select Case uMSG
        Case WM_CTLCOLORDLG, WM_CTLCOLORSTATIC
            If MSG.ForeColor <> -1 Then Call SetTextColor(wParam, MSG.ForeColor)
            If MSG.BackColor <> -1 Then Call SetBkColor(wParam, MSG.BackColor)
            [COLOR="SeaGreen"]'Create a Solid Brush using that Color[/COLOR]
            If MSG.BackColor <> -1 Then
                tLB.lbColor = MSG.BackColor
                [COLOR="SeaGreen"]'Return the Handle to the Brush to Paint the MsgBox[/COLOR]
                MsgBoxProc = CreateBrushIndirect(tLB)
                Exit Function
            End If
        Case WM_DESTROY
            [COLOR="SeaGreen"]'Remove the MsgBox Subclassing[/COLOR]
            Call SetWindowLong(hwnd, GWL_WNDPROC, MSG.PrevProc)
    End Select
    MsgBoxProc = CallWindowProc(MSG.PrevProc, hwnd, uMSG, wParam, ByVal lParam)
End Function

Toàn bộ mã nguồn được gửi trong file đính kèm.
 

File đính kèm

Cho em hỏi them vấn đề này 1 chút ? làm cách nào mà mình disable được một nút command trên msgbox hay inputbox, hay nhấn vào nó không thực thi lệnh giống như nút trợ giúp của anh vậy
 
Upvote 0
Các bạn cho hỏi câu lệnh trả về path (địa chỉ) của file hiện hành (ghi vào một cell, hiển thị thông báo)
 
Upvote 0
Nhờ sự giúp đỡ của anh Nguyễn Duy Tuân em lam được Msgbox va inputbox thời gian.(Khi Pass không nhập thì không cho nhấn nút chấp nhận, thay đổi tên nút, nút nào được chọn khi hết thời gian thì tô đậm và muốn cho hiện giây hay không hiện, to đậm chữ trong prom )

View attachment 50009
 
Lần chỉnh sửa cuối:
Upvote 0
Chúc mừng Thầy Tuân đổi nick kèm quà tặng. Mong Thầy có nhiều thành công mới.
 
Upvote 0
Web KT

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

Back
Top Bottom