MsgBox gì mà chẳng được! Miễn nó hiện lên như 1 MsgBox là được rồiDạ Msgbox trong Vba đó ạh
Các form có sẳn của Windows, nếu để ý kỹ sẽ thấy các Object trong đó dường như có dạng giống như object thuộc thanh Forms, đúng không?Em thử giả lập rồi nhưng thấy nút command nó xấu quá không giống như nút command msgbox zin
Dùng API có chăng là SetSysColors và GetSysColors ---> Tức chỉnh lại màu hệ thống ---> Điều này hoàn toàn KHÔNG NÊN LÀMCó lẽ dùng API là được, cái này anh Tuân khá thạo.
Dùng API có chăng là SetSysColors và GetSysColors ---> Tức chỉnh lại màu hệ thống ---> Điều này hoàn toàn KHÔNG NÊN LÀM
Đồ chơi của TuanVNUNI là món tổng hợp nhiều thứ! Chỉ dành cho người thật sự có nhu cầuDùng hàm API hoàn toàn làm được việc này. Tấc nhiên không được làm thay đổi màu hệ thống.
Cái MsgBox trên em viết hoàn toàn bằng API tác động vào MessageBox/MsgBox của Windows đấy.
Để viết được cái này tương đối phức tạp, nếu không ần thiết thì bỏ qua dùng giải pháp khác đi.
Đồ chơi của TuanVNUNI là món tổng hợp nhiều thứ! Chỉ dành cho người thật sự có nhu cầu
Nếu chỉ cần tô màu nền và chữ thì Dialog Sheet thừa sức làm được rồi còn gì
...
... nếu không ần thiết thì bỏ qua dùng giải pháp khác đi.
Đồ chơi của TuanVNUNI là món tổng hợp nhiều thứ! Chỉ dành cho người thật sự có nhu cầu
Nếu chỉ cần tô màu nền và chữ thì Dialog Sheet thừa sức làm được rồi còn gì
Function MsgBoxClr(ByVal Prompt As String, Optional ByVal Buttons As VbMsgBoxStyle = vbOKOnly, Optional ByVal Title As String = vbNullString, Optional HelpFile As String = vbNullString, Optional ByVal Context As Long, 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
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.ForeColor <> -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
[COLOR="SeaGreen"]'Test------------------------------------------------------------------------------------------------[/COLOR]
Sub TestMsgBox1()
MsgBoxClr "Created by: Nguyen Duy Tuan - www.bluesofts.net", , "MsgBox with color", , , vbYellow, vbRed
End Sub
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)
[COLOR="Red"]If MSG.ForeColor <> -1 Then Call SetBkColor(wParam, MSG.BackColor)[/COLOR]
[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
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)
[COLOR="Red"] If MSG.BackColor <> -1 Then Call SetBkColor(wParam, MSG.BackColor)[/COLOR]
[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
Tuyệt vời quá (nhưng Sao nút command nó cũng vuông vức vậy anh có cách nào làm cho nó bo tròn giống cái MSgbox của anh đưa không)