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!
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?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").
Bạn đã đọc bài viết này chưa: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?
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?
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
Sub TestMsgBox()
MsgBoxPos "Hay dieu chinh vi tri cua toi cho hop ly nhe", vbOKOnly, "Vi tri cua MsgBox", 10, 10
End Sub
Mình đã chép code trên vào modun
Và Msg đã sửa như sau
Nhưng Msg vẫn không thay đổi vị tríMã:Sub Hienbox() MsgBox "Truong Nguyen Thuong Hien" & Chr(10) & "thanh pho Ho Chi Minh", , "Thong bao", 500, 500 End Sub
Nhờ các bạn xem giúp bị lỗi nơi nào
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ạnPhả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
Inra = MsgBox("Nhan Yes de in, Nhan No de xem qua, Nhan Cancel de huy lenh", vbYesNoCancel)
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])
Cảm ơn bạn
Cho hỏi thêm ví dụ trường hợp này thì xử lý sao?
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("Nhan Yes de in, Nhan No de xem qua, Nhan Cancel de huy lenh", vbYesNoCancel)
Chỗ màu đỏ mình thêmMã: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])
À cái này mình muốn áp dụng vào những File khác đó bạnTô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ó.
Cảm ơn bạn
Cho hỏi thêm ví dụ trường hợp này thì xử lý sao?
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("Nhan Yes de in, Nhan No de xem qua, Nhan Cancel de huy lenh", vbYesNoCancel)
Chỗ màu đỏ mình thêmMã: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])
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ảm ơn anhVì 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:
(câu lệnh của bạn bị thiếu đối số)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)
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: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?
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