2013-08-25 17 views
5

Próbuję uzyskać absolutną pozycję kontrolki na ekranie. Używam dwóch monitorów, a wyniki nie są tak wspaniałe ...C# bezwzględna pozycja kontroli na ekranie

Co robię, to otwieranie innej formy do przechwytywania obrazu, a następnie przekazywanie tego obrazu do głównej postaci i zamykanie formularza przechwytywania. Następnie chcę, aby główny formularz pojawił się w tym samym miejscu, w którym zdjęcie zostało przechwycone. Aby zrozumieć, co próbuję zrobić jako przykład, otwórz narzędzie do wycinania w systemie Windows i przechwyć wycinek. Okno pojawi się w miejscu, w którym zdjęcie zostało zrobione.

ten jest obecny kod używam w tym celu:

Location = new Point(Cursor.Position.X - CaptureBox.Width - CapturePanel.Location.X - CaptureBox.Location.X - 8, Cursor.Position.Y - CaptureBox.Height - CapturePanel.Location.Y - CaptureBox.Location.Y - 30); 

CapturePanel zawiera kontrolę CaptureBox która przechowuje obraz. Biorę również 8 z lokalizacji X i 30 z tej lokalizacji Y, aby zrekompensować obramowanie i pasek tytułu formularza, ale jedynym problemem jest to, że niektóre komputery będą używać innego stylu okna, a te liczby się zmienią.

Jeśli istnieje metoda, która może posłużyć do pobrania granicy i szerokości/wysokości okna, byłoby świetnie.

EDIT

Rozwiązaniem tego problemu byłoby:

Location = new Point(
    Cursor.Position.X - 
    CaptureBox.Width - 
    CapturePanel.Location.X - 
    CaptureBox.Location.X - 
    SystemInformation.HorizontalResizeBorderThickness, 
    Cursor.Position.Y - 
    CaptureBox.Height - 
    CapturePanel.Location.Y - 
    CaptureBox.Location.Y - 
    SystemInformation.CaptionHeight - 
    SystemInformation.VerticalResizeBorderThickness 
); 

Z pomocą King King wskazując Informacje systemowe do mnie.

Odpowiedz

5

Aby uzyskać Height twoich Window caption, można spróbować to:

int captionHeight = yourForm.PointToScreen(Point.Empty).Y - yourForm.Top;  

Aby uzyskać Width granicy formy, można spróbować to:

int borderWidth = yourForm.PointToScreen(Point.Empty).X - yourForm.Left; 

Również może chcesz spójrz na domyślną wysokość napisów pod numerem SystemInformation.CaptionHeight.

Jeśli chcesz uzyskać lokalizację CaptureBox we współrzędnych ekranu, można użyć metody PointToScreen:

Point loc = CaptureBox.PointToScreen(Point.Empty); 
+0

Pierwsza metoda działa, SystemInformation.CaptionHeight była mniejsza niż powinna być. A co z rozmiarem okna? – Dragonphase

+0

@Dragonphase, jeśli chcesz uzyskać lokalizację 'CaptureBox', zobacz moją zaktualizowaną odpowiedź, nie ma potrzeby obliczania" rozmiaru granicy ". –

+0

To nie zadziała, ponieważ nie przekazuję lokalizacji przechwyconego obrazu do głównego formularza. Jeśli to zrobię, spowoduje to, że pozycja bezwzględna (na przykład 1440) zostanie dodana do lokalizacji aktualnie zaznaczonego formularza na monitorze głównym. Wpadłem jednak na rozwiązanie w moim głównym poście. – Dragonphase

Powiązane problemy