Làm sao để bảng thông báo Msgbox hiện ở góc phải dưới màn hình! (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

LienDong

Thành viên thường trực
Tham gia
22/11/12
Bài viết
218
Được thích
46
Nghề nghiệp
Ai nói đúng thì làm!
Chào các bạn!
Thông thường bảng thông báo Msgbox hiện ở giữa màn hình
Các bạn giúp mình làm sao để bảng thông báo Msgbox hiện ở góc phải dưới màn hình!
Cám ơn các bạn
 

File đính kèm

Lần chỉnh sửa cuối:
Chức năng của msgbox là cảnh báo, thông báo. Vậy nên, nó được thiết kế hiện lên ở nơi nào mà người dùng dễ thấy nhất ("đập vào mắt").
 
Upvote 0
Chức năng của msgbox là cảnh báo, thông báo. Vậy nên, nó được thiết kế hiện lên ở nơi nào mà người dùng dễ thấy nhất ("đập vào mắt").
Biết vậy, nhưng nó thường che nội dung, nên không biết cách nào để dời nó đi không bạn?
 
Upvote 0
Upvote 0
Chép code sau vào module:

Mã:
Option Explicit

Private Declare Function UnhookWindowsHookEx Lib "user32" _
    (ByVal hHook As Long) As Long
 
Private Declare Function GetCurrentThreadId Lib "kernel32" () 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 SetWindowPos Lib "user32" _
    (ByVal hwnd As Long, _
     ByVal hWndInsertAfter As Long, _
     ByVal x As Long, _
     ByVal y As Long, _
     ByVal cx As Long, _
     ByVal cy As Long, _
     ByVal wFlags As Long) As Long
 


Private hHook As Long
 
' Position
Private msgbox_x As Long
Private msgbox_y As Long
 
' Hook type
Private Const WH_CBT = 5
Private Const HCBT_ACTIVATE = 5
 
' SetWindowPos Flags
Private Const SWP_NOSIZE = &H1      ' Retains the current size
Private Const SWP_NOZORDER = &H4    ' Retains the current Z order




 
Public Sub MsgBoxPos(strPromt As String, _
              vbButtons As VbMsgBoxStyle, _
              strTitle As String, _
              xPos As Long, _
              yPos As Long)
 
    ' Store position
    msgbox_x = xPos
    msgbox_y = yPos
 
    ' Set Hook
    hHook = SetWindowsHookEx(WH_CBT, _
                              AddressOf MsgBoxHookProc, _
                              0, _
                              GetCurrentThreadId)
 
    ' Run MessageBox
    MsgBox strPromt, vbButtons, strTitle
End Sub
 
Private Function MsgBoxHookProc(ByVal lMsg As Long, _
                                ByVal wParam As Long, _
                                ByVal lParam As Long) As Long
    If lMsg = HCBT_ACTIVATE Then
        ' Change position
        SetWindowPos wParam, 0, msgbox_x, msgbox_y, _
                     0, 0, SWP_NOSIZE + SWP_NOZORDER
 
        ' Release the Hook
        UnhookWindowsHookEx hHook
    End If
 
    MsgBoxHookProc = False
End Function

Rồi test code sau thử nhé.

Mã:
Sub TestMsgBox()


    MsgBoxPos "Hay dieu chinh vi tri cua toi cho hop ly nhe", vbOKOnly, "Vi tri cua MsgBox", 10, 10
    
End Sub
 

File đính kèm

Upvote 0
Cảm ơn các bạn nhiều
 
Upvote 0
Mình đã chép code trên vào modun
Và Msg đã sửa như sau
Mã:
Sub Hienbox()
    MsgBox "Truong Nguyen Thuong Hien" & Chr(10) & "thanh pho Ho Chi Minh", , "Thong bao", 500, 500
End Sub
Nhưng Msg vẫn không thay đổi vị trí
Nhờ các bạn xem giúp bị lỗi nơi nào
 

File đính kèm

Upvote 0
Mình đã chép code trên vào modun
Và Msg đã sửa như sau
Mã:
Sub Hienbox()
    MsgBox "Truong Nguyen Thuong Hien" & Chr(10) & "thanh pho Ho Chi Minh", , "Thong bao", 500, 500
End Sub
Nhưng Msg vẫn không thay đổi vị trí
Nhờ các bạn xem giúp bị lỗi nơi nào

Phải như sau chứ bạn:

Mã:
Sub Hienbox()
    MsgBoxPos "Truong Nguyen Thuong Hien" & Chr(10) & "thanh pho Ho Chi Minh", vbOKOnly, "Thong bao", 500, 500
End Sub
 
Upvote 0
Phải như sau chứ bạn:

Mã:
Sub Hienbox()
    MsgBoxPos "Truong Nguyen Thuong Hien" & Chr(10) & "thanh pho Ho Chi Minh", vbOKOnly, "Thong bao", 500, 500
End Sub
Cảm ơn bạn
Cho hỏi thêm ví dụ trường hợp này thì xử lý sao?
Mã:
Inra = MsgBox("Nhan Yes de in,  Nhan No de xem qua,  Nhan Cancel de huy lenh", vbYesNoCancel)
Mình sửa thế này thì bị báo lỗi, vậy cho hỏi sửa như thế nào ạ?
Mã:
Inra = MsgBox[COLOR=#ff0000]Pos[/COLOR]("Nhan Yes de in,  Nhan No de xem qua,  Nhan Cancel de huy lenh", vbYesNoCancel[COLOR=#ff0000], 700, 700[/COLOR])
Chỗ màu đỏ mình thêm
 
Upvote 0
Cảm ơn bạn
Cho hỏi thêm ví dụ trường hợp này thì xử lý sao?
Mã:
Inra = MsgBox("Nhan Yes de in,  Nhan No de xem qua,  Nhan Cancel de huy lenh", vbYesNoCancel)
Mình sửa thế này thì bị báo lỗi, vậy cho hỏi sửa như thế nào ạ?
Mã:
Inra = MsgBox[COLOR=#ff0000]Pos[/COLOR]("Nhan Yes de in,  Nhan No de xem qua,  Nhan Cancel de huy lenh", vbYesNoCancel[COLOR=#ff0000], 700, 700[/COLOR])
Chỗ màu đỏ mình thêm

Tôi đã làm cho bạn file kia về cách dùng Dialog Sheet rồi, sao không dùng nó? Dialog Sheet nó có thể ghi nhớ vị trí mà trước đó bạn di chuyển nó.
 
Upvote 0
Cảm ơn bạn
Cho hỏi thêm ví dụ trường hợp này thì xử lý sao?
Mã:
Inra = MsgBox("Nhan Yes de in,  Nhan No de xem qua,  Nhan Cancel de huy lenh", vbYesNoCancel)
Mình sửa thế này thì bị báo lỗi, vậy cho hỏi sửa như thế nào ạ?
Mã:
Inra = MsgBox[COLOR=#ff0000]Pos[/COLOR]("Nhan Yes de in,  Nhan No de xem qua,  Nhan Cancel de huy lenh", vbYesNoCancel[COLOR=#ff0000], 700, 700[/COLOR])
Chỗ màu đỏ mình thêm

Vì MsgBoxPos là 1 SUB nên không thể "truyền" kiểu này được
Muốn thế, bạn sửa Public Sub MsgBoxPos thành Public Function MsgBoxPos... sau đó sửa câu lệnh của bạn thành:
Mã:
Inra = MsgBoxPos("Nhan Yes de in,  Nhan No de xem qua,  Nhan Cancel de huy lenh", vbYesNoCancel, [COLOR=#ff0000]"THÔNG BÁO"[/COLOR], 700, 700)
(câu lệnh của bạn bị thiếu đối số)
 
Upvote 0
Vì MsgBoxPos là 1 SUB nên không thể "truyền" kiểu này được
Muốn thế, bạn sửa Public Sub MsgBoxPos thành Public Function MsgBoxPos... sau đó sửa câu lệnh của bạn thành:
Mã:
Inra = MsgBoxPos("Nhan Yes de in,  Nhan No de xem qua,  Nhan Cancel de huy lenh", vbYesNoCancel, [COLOR=#ff0000]"THÔNG BÁO"[/COLOR], 700, 700)
(câu lệnh của bạn bị thiếu đối số)
Cảm ơn anh
Thay đổi theo cách của anh thì Msg có di dời nhưng khi bấm Yes hay Cancel thì nó đưa về chế độ PrintPreview
Em đạng thử trong file tạm
Cụ thể bấm F6 ở thư mời
Anh coi giúp em tại sao?
 

File đính kèm

Upvote 0
Cảm ơn anh
Thay đổi theo cách của anh thì Msg có di dời nhưng khi bấm Yes hay Cancel thì nó đưa về chế độ PrintPreview
Em đạng thử trong file tạm
Cụ thể bấm F6 ở thư mời
Anh coi giúp em tại sao?
Bởi có sửa Sub thành Function nhưng lại chưa ghi rõ hàm trả về kết quả gì. Giờ sửa thành vầy:
Mã:
Public Function MsgBoxPos(strPromt As String, _
              vbButtons As VbMsgBoxStyle, _
              strTitle As String, _
              xPos As Long, _
              yPos As Long)[COLOR=#ff0000] as VbMsgBoxResult 
[/COLOR]
 
    ' Store position
    msgbox_x = xPos
    msgbox_y = yPos
 
    ' Set Hook
    hHook = SetWindowsHookEx(WH_CBT, _
                              AddressOf MsgBoxHookProc, _
                              0, _
                              GetCurrentThreadId)
 
    ' Run MessageBox
    [COLOR=#ff0000]MsgBoxPos = MsgBox(strPromt, vbButtons, strTitle)[/COLOR]
End Function
 
Upvote 0
Em cảm ơn Thầy, các anh anh chị & các bạn đã giúp đỡ
 
Upvote 0
Web KT

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

Back
Top Bottom