2013-04-09 5 views
5

서브 클래 싱이나 후킹없이 MessageBox를 가운데에 정렬 할 수있는 방법이 있습니까?MessageBox를 양식 중앙에 표시

VB.NET 코드를 찾고 있습니다.

+0

[부모 형태의 가운데 MessageBox] 가능한 중복 (http://stackoverflow.com/questions/1732443/center-messagebox-in-parent-form) – harriyott

+0

해당 게시물에 대한 조언과 정보를 주셔서 감사합니다. 내 대답이 중복되지 않도록 편집했습니다. – ElektroStudios

+0

http://stackoverflow.com/questions/2576156/winforms-how-can-i-make-messagebox-appear-centered-on-mainform –

답변

6

VB.NET 용 용액 :

이 코드 @Hans 김에의 asnwer 찍은 번역된다 Winforms-How can I make MessageBox appear centered on MainForm?

Centered_MessageBox.vb

Imports System.Text 
Imports System.Drawing 
Imports System.Windows.Forms 
Imports System.Runtime.InteropServices 

Class Centered_MessageBox 
    Implements IDisposable 
    Private mTries As Integer = 0 
    Private mOwner As Form 

    Public Sub New(owner As Form) 
     mOwner = owner 
     owner.BeginInvoke(New MethodInvoker(AddressOf findDialog)) 
    End Sub 

    Private Sub findDialog() 
     ' Enumerate windows to find the message box 
     If mTries < 0 Then 
      Return 
     End If 
     Dim callback As New EnumThreadWndProc(AddressOf checkWindow) 
     If EnumThreadWindows(GetCurrentThreadId(), callback, IntPtr.Zero) Then 
      If System.Threading.Interlocked.Increment(mTries) < 10 Then 
       mOwner.BeginInvoke(New MethodInvoker(AddressOf findDialog)) 
      End If 
     End If 
    End Sub 
    Private Function checkWindow(hWnd As IntPtr, lp As IntPtr) As Boolean 
     ' Checks if <hWnd> is a dialog 
     Dim sb As New StringBuilder(260) 
     GetClassName(hWnd, sb, sb.Capacity) 
     If sb.ToString() <> "#32770" Then 
      Return True 
     End If 
     ' Got it 
     Dim frmRect As New Rectangle(mOwner.Location, mOwner.Size) 
     Dim dlgRect As RECT 
     GetWindowRect(hWnd, dlgRect) 
     MoveWindow(hWnd, frmRect.Left + (frmRect.Width - dlgRect.Right + dlgRect.Left) \ 2, frmRect.Top + (frmRect.Height - dlgRect.Bottom + dlgRect.Top) \ 2, dlgRect.Right - dlgRect.Left, dlgRect.Bottom - dlgRect.Top, True) 
     Return False 
    End Function 
    Public Sub Dispose() Implements IDisposable.Dispose 
     mTries = -1 
    End Sub 

    ' P/Invoke declarations 
    Private Delegate Function EnumThreadWndProc(hWnd As IntPtr, lp As IntPtr) As Boolean 
    <DllImport("user32.dll")> _ 
    Private Shared Function EnumThreadWindows(tid As Integer, callback As EnumThreadWndProc, lp As IntPtr) As Boolean 
    End Function 
    <DllImport("kernel32.dll")> _ 
    Private Shared Function GetCurrentThreadId() As Integer 
    End Function 
    <DllImport("user32.dll")> _ 
    Private Shared Function GetClassName(hWnd As IntPtr, buffer As StringBuilder, buflen As Integer) As Integer 
    End Function 
    <DllImport("user32.dll")> _ 
    Private Shared Function GetWindowRect(hWnd As IntPtr, ByRef rc As RECT) As Boolean 
    End Function 
    <DllImport("user32.dll")> _ 
    Private Shared Function MoveWindow(hWnd As IntPtr, x As Integer, y As Integer, w As Integer, h As Integer, repaint As Boolean) As Boolean 
    End Function 
    Private Structure RECT 
     Public Left As Integer 
     Public Top As Integer 
     Public Right As Integer 
     Public Bottom As Integer 
    End Structure 
End Class 

용도 :

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Using New Centered_MessageBox(Me) 
     MessageBox.Show("Test Text", "Test Title", MessageBoxButtons.OK) 
    End Using 
End Sub 
+0

[Telerik Code Converter] (http://converter.telerik.com/)를 사용하여 변환 했으므로 내기를 걸었습니다. – mbomb007

1

슬프게도 MessageBox을 부모와 센터링 할 방법이 없습니다. 기본적으로 화면 중앙에 위치하므로 변경할 수 없습니다.

관련 문제