PDA

View Full Version : Có cách nào tô màu nền và màu chữ cho Msgbox không



thuyyeu99
08-07-10, 10:22 AM
Nhờ các anh chị trên diễn đàn hướng dẫn em cách tô màu nền và màu chữ cho Msgbox.

ndu96081631
08-07-10, 10:33 AM
Nhờ các anh chị trên diễn đàn hướng dẫn em cách tô màu nền và màu chữ cho Msgbox.
Vầy được không?

48454

thuyyeu99
08-07-10, 10:35 AM
Vầy được không?

48451

Dạ Msgbox trong Vba đó ạh chứ khong phải Sheets("Dialog1")

ndu96081631
08-07-10, 10:36 AM
Dạ Msgbox trong Vba đó ạh
MsgBox gì mà chẳng được! Miễn nó hiện lên như 1 MsgBox là được rồi
Còn cái MsgBox thông thường mà ta vẫn dùng thì... không có cửa đâu, trừ phi bạn dùng UserForm giả lập MsgBox

thuyyeu99
08-07-10, 10:41 AM
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

ndu96081631
08-07-10, 10:51 AM
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
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?
Vậy để thỏa mãn yêu cầu của bạn, chỉ có thể dùng Dialog Sheet (như bài số 2) ---> Vì các nút và Object của nó toàn thuộc thanh Forms... đẹp hơn ActiveX rất nhiều

PhanTuHuong
08-07-10, 11:24 AM
Có lẽ dùng API là được, cái này anh Tuân khá thạo.

ndu96081631
08-07-10, 11:38 AM
Có 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

Nguyễn Duy Tuân
08-07-10, 12:49 PM
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

Dùng hàm API hoàn toàn làm được việc này. Tất nhiên không được làm thay đổi màu hệ thống.
http://www.bluesofts.net/Products/ControlForOffice/Pics/MsgBox.jpg

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.

ndu96081631
08-07-10, 12:59 PM
Dù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.
http://www.bluesofts.net/Products/ControlForOffice/Pics/MsgBox.jpg

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ì

Nguyễn Duy Tuân
08-07-10, 01:38 PM
Đồ 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ì

Thì em đã khuyên chủ topic rồi mà


...
... nếu không ần thiết thì bỏ qua dùng giải pháp khác đi.

Làm cái MsgBox đơn giản theo ý mình thì dùng luôn cái Userform, cho màu chữ và nền là xong. Cũng chẳng cần Dialog Sheet làm gì, chỉ vì mấy cái nút bóng bẩy.

Nếu đã làm bắt trước kiểu MsgBox tác giả nhớ là làm đúng kiểu hàm nhé
MyMgsBox(Prompt, [Buttons As VbMsgBoxStyle = vbOKOnly], [Title]) As As VbMsgBoxResult

Nếu chủ topic thích cầu kỳ tôi sẽ viết tặng cái MsgBox có thuộc tính đổi màu chữ và màu nền, tấc nhiên vãn dùng hàm MsgBox của VBA.

thuyyeu99
08-07-10, 01:56 PM
Nếu chủ topic thích cầu kỳ tôi sẽ viết tặng cái MsgBox có thuộc tính đổi màu chữ và màu nền, tấc nhiên vãn dùng hàm MsgBox của VBA.
Trà nếu được vậy em cám ơn anh rất nhiều

HoangHacVT
08-07-10, 06:49 PM
Đồ 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ì

Ui chỉ mình các tạo dialog sheet đấy với,

Nguyễn Duy Tuân
08-07-10, 07:30 PM
Gửi bạn mã nguồn về hàm MsgBoxClr. Hàm này cách sử dụng như hàm MsgBox, nhưng nó có thêm 2 đối số ở cuối là BackColor và ForeColor để tô màu nền và màu chữ cho MsgBox.
Hàm MsgBox vẫn sử dụng hàm gốc của VBA là MsgBox. Trước khi gọi hàm MsgBox(), tôi dùng thủ 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 của Windows vẽ cửa sổ.

Qua ví dụ này các bạn thấy, có những thứ tưởng như rất khó nhưng với chút hiểu biết về lập trình Windows API chúng ta sẽ làm được!

Ta có thể đưa Progress, tô màu, unicode cho MsgBox, InputBox.

http://bluesofts.net/Products/BSAC/Help/Pics/MsgBoxTimer.jpg

http://bluesofts.net/Products/BSAC/Help/Pics/InputBoxPass.jpg


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
'This is where you need to Hook the MsgBox
.HOOK = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf HookMsgBox, inst, GetCurrentThreadId)
MsgBoxClr = MsgBox(Prompt, Buttons, Title, HelpFile, Context)
'Remove the Hook
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)
'Create a Solid Brush using that Color
If MSG.BackColor <> -1 Then
tLB.lbColor = MSG.BackColor
'Return the Handle to the Brush to Paint the MsgBox
MsgBoxProc = CreateBrushIndirect(tLB)
Exit Function
End If
Case WM_DESTROY
'Remove the MsgBox Subclassing
Call SetWindowLong(hwnd, GWL_WNDPROC, MSG.PrevProc)
End Select
MsgBoxProc = CallWindowProc(MSG.PrevProc, hwnd, uMSG, wParam, ByVal lParam)
End Function

'Test------------------------------------------------------------------------------------------------
Sub TestMsgBox1()
MsgBoxClr "Created by: Nguyen Duy Tuan - www.bluesofts.net", , "MsgBox with color", , , vbYellow, vbRed
End Sub



Các bạn có thể download file về xem mã nguồn.

Nguyễn Duy Tuân
09-07-10, 08:40 AM
Xin lỗi các bạn. Có một dòng code bị nhầm BackColor là ForeColor trong thủ tục MsgBoxProc.

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)
'Create a Solid Brush using that Color
If MSG.BackColor <> -1 Then
tLB.lbColor = MSG.BackColor
'Return the Handle to the Brush to Paint the MsgBox
MsgBoxProc = CreateBrushIndirect(tLB)
Exit Function
End If
Case WM_DESTROY
'Remove the MsgBox Subclassing
Call SetWindowLong(hwnd, GWL_WNDPROC, MSG.PrevProc)
End Select
MsgBoxProc = CallWindowProc(MSG.PrevProc, hwnd, uMSG, wParam, ByVal lParam)
End Function

Thay thành


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)
'Create a Solid Brush using that Color
If MSG.BackColor <> -1 Then
tLB.lbColor = MSG.BackColor
'Return the Handle to the Brush to Paint the MsgBox
MsgBoxProc = CreateBrushIndirect(tLB)
Exit Function
End If
Case WM_DESTROY
'Remove the MsgBox Subclassing
Call SetWindowLong(hwnd, GWL_WNDPROC, MSG.PrevProc)
End Select
MsgBoxProc = CallWindowProc(MSG.PrevProc, hwnd, uMSG, wParam, ByVal lParam)
End Function

thuyyeu99
09-07-10, 09:09 AM
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)

Nguyễn Duy Tuân
09-07-10, 09:27 AM
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)

Hình thù của nó tùy vào HĐH bạn đang chạy. MsgBox là hàm chuẩn MessageBox của Windows nên HĐH thay đổi nó cũng thay đổi theo. Hình anh chụp là trên Windows Vista.

thuyyeu99
09-07-10, 10:16 AM
Như vậy trên XP mình có thể làm cho nút command bo tròn cạnh được không anh

ndu96081631
09-07-10, 10:21 AM
Hình thù của nó tùy vào HĐH bạn đang chạy. MsgBox là hàm chuẩn MessageBox của Windows nên HĐH thay đổi nó cũng thay đổi theo. Hình anh chụp là trên Windows Vista.
Các nút của MsgBox chuẩn trên Windows XP cũng là dạng bo tròn mà Tuấn
Nó đây:

48504

Nguyễn Duy Tuân
09-07-10, 07:31 PM
Các nút của MsgBox chuẩn trên Windows XP cũng là dạng bo tròn mà Tuấn
Nó đây:

48504

Nếu cái MsgBox trong VBA mà bo tròn thì cái MsgBoxClr cũng là vậy vì nó dùng MsgBox trong VBA mà.

Việc các nút bấm cũng như các controls óng mượt trên Windows XP/Vista/7 là do theme của nó. Các ứng dụng lập trình chạy độc lập hiện lên được theme cùng Windows là phải cấy file manifest vào, hoặc tạo file kiểu "application.exe.manifest" rồi đặt chúng nằm chung trong cùng thư mục của ứng dụng.
Ví dụ đặt file "EXCEL.exe.manifest" trong thư mục chứa file Excel.exe thì các điều khiển dùng trong VBA sẽ nhận được theme theo Windows. Để tạo file application.exe.manifest như thế nào các bác tìm trên google nhé.
"application" là tên file chạy ứng dụng.

Nói về Excel. Dù không cần EXCEL.exe.manifest thì Excel vẫn lên được theme, nhưng chỉ là theme riêng nó quản lý. Với Office từ 2007 trở đi nếu không có EXCEL.exe.manifest là ứng dụng không chạy. File manifest gốc của Office, trong VBA không lên được đúng theme của Windows.

Các bạn muốn lên được theme trong VBA như ngoài Windows với các controls, MsgBox,... (ngoại trừ các controls thuộc Userform - FM20.DLL) thì cài BSAC hoặc A-Tools hoặc A-Excel sẽ được giao diện như vậy.
Tôi đã kỳ công nghiên cứu và tạo ra file EXCEL.exe.manifest cho Excel và cặt đặt cho các sản phẩm của mình. Các bạn có thể lấy file này để làm cài đặt cho ứng dụng của mình.

nncb2008
10-07-10, 05:59 AM
Vầy được không?

48454
Anh ơi cái thằng "Dialog1" nó nằm chỗ nào vậy?

ndu96081631
10-07-10, 12:03 PM
Anh ơi cái thằng "Dialog1" nó nằm chỗ nào vậy?
Giấu mất rồi chứ đâu!
Giờ show ra nè

thuyyeu99
12-07-10, 03:22 PM
Gửi bạn mã nguồn về hàm MsgBoxClr. Hàm này cách sử dụng như hàm MsgBox, nhưng nó có thêm 2 đối số ở cuối là BackColor và ForeColor để tô màu nền và màu chữ cho MsgBox.
Hàm MsgBox vẫn sử dụng hàm gốc của VBA là MsgBox. Trước khi gọi hàm MsgBox(), tôi dùng thủ 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 của Windows vẽ cửa sổ.

Qua ví dụ này các bạn thấy, có những thứ tưởng như rất khó nhưng với chút hiểu biết về lập trình Windows API chúng ta sẽ làm được!

Ta có thể đưa Progress, tô màu, unicode cho MsgBox, InputBox.



http://bluesofts.net/Products/BSAC/Help/Pics/InputBoxPass.jpg

[/CODE]Các bạn có thể download file về xem mã nguồn.

Anh có thể chỉ thêm cho em cách tô màu cho inputbox được không anh ?

Nguyễn Duy Tuân
12-07-10, 05:16 PM
Anh có thể chỉ thêm cho em cách tô màu cho inputbox được không anh ?

Tôi vừa gửi tại bài này:
http://www.giaiphapexcel.com/forum/showthread.php?38168-T%E1%BA%B7ng-c%C3%A1c-b%E1%BA%A1n-InputBox-MsgBox-cho-ph%C3%A9p-t%C3%B4-m%C3%A0u-n%E1%BB%81n-v%C3%A0-m%C3%A0u-ch%E1%BB%AF-Nh%C3%A2n-d%E1%BB%8Bp-t%C3%B4i-%C4%91%E1%BB%95i-nick&p=253483#post253483