2016-09-20 2 views
3

양식을 화면의 왼쪽 상단에 배치하려고합니다.양식 위치 및 크기 동작

나는 윈도우가 (7,0)에 위치했지만 화면 상단에 있지만 왼쪽은 화면 가장자리에서 7 픽셀이다. 내가 테스트를 위해 새로운 윈폼 응용 프로그램을 만들어 만이 코드를 추가 :

private void Form1_Load(object sender, EventArgs e) 
{ 
    Point p = new Point(0, 0); 

    WindowState = FormWindowState.Maximized; 
    Debug.WriteLine("\nMaximized"); 
    Debug.WriteLine("Location: " + Location); 
    Debug.WriteLine("Size: " + Size); 
    Debug.WriteLine("PointToScreen(0,0): " + PointToScreen(p)); 

    WindowState = FormWindowState.Normal; 
    Location = p;    
    Debug.WriteLine("\nNormal"); 
    Debug.WriteLine("Location: " + Location); 
    Debug.WriteLine("Size: " + Size); 
    Debug.WriteLine("PointToScreen(0,0): " + PointToScreen(p)); 

    Debug.Write("\nScreen.PrimaryScreen.WorkingArea: "); 
    Debug.WriteLine(Screen.PrimaryScreen.WorkingArea); 
} 

출력은 다음과 같습니다

Maximized 
Location: {X=-8,Y=-8} 
Size: {Width=1936, Height=1056} 
PointToScreen(0,0): {X=0,Y=23} 

Normal 
Location: {X=0,Y=0} 
Size: {Width=300, Height=300} 
PointToScreen(0,0): {X=8,Y=31} 

Screen.PrimaryScreen.WorkingArea: {X=0,Y=0,Width=1920,Height=1040} 

Location = new Point(0,0) (0,0)에서 양식을 배치하지 않습니다? 내 시스템에 문제가 있습니까? Win10 및 VS2015 있습니다. 작업 표시 줄이 아래쪽에 있으며, 내 바탕 화면의 왼쪽에는 아무 것도 없습니다. (0,0)에 배치하려면 실제로 (-7,0)에 배치해야합니다. 또한 최대화 된 형태의보고 된 너비는 화면 너비보다 16 픽셀 더 큽니다. 윈도우 가장자리, 제목 표시 줄 등으로 인해 클라이언트 영역 크기와 양식 크기간에 차이가 있음을 이해합니다. 그러나 이것이 아닙니다. 양식이 최대화되면 왼쪽 및 오른쪽 가장자리 (클라이언트 영역 너비 = 바탕 화면 너비)는 없지만 양식 너비는 + 16px입니다. 폼의 4면 각각에 + 8px가 있지만 Y 위치는 OK입니다. Y 위치가 정상이고 X가 아닌 이유는 무엇입니까?

+0

위치를 '0,0'으로 설정하고'Debug.WriteLine'은 '위치 : {X = 0, Y = 0}'을 표시합니다. 문제가 뭐니? 또한 'PointToScreen (0,0) : {X = 8, Y = 31}'은 OK입니다. 이는 양식의 클라이언트 영역의 점 '0,0'의 화면 좌표입니다. –

+0

필자는 이전에 Win10 또는 8.1에서이 포지셔닝 문제를 발견하지 못했습니다. 추측해야한다면, 더 이상 비활성화 할 수없는 데스크톱 창 관리자 구성의 결과로 관찰 된 문제라고 말할 수 있습니다. 조사 할 새로운 것. 감사. :) – TnTinMn

+0

문제는, 내가 쓴 것처럼, 실제로 (즉, 볼 수있는) 윈도우의 위치는 오른쪽으로 7 픽셀입니다. 클라이언트 좌표 (8,31) - 윈도우 위치가 7이고 윈도우 가장자리가 1 픽셀이고 제목 막대 때문에 Y가 31이기 때문에 X는 8입니다. 그래서 위치를 (-7,0)으로 설정하면 창이 코너에 있습니다. 따라서 클라이언트 좌표는 OK입니다. 클라이언트 사각형 _really_는 (8,31)에서 시작합니다. 양식 좌표가 올바르지 않습니다. 서식 위치는 _really_ (7,0)이며 (0,0)은 아닙니다. – c4551u5

답변

0

문제를 발견했습니다.

그냥

this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;

을 설정하고 결과를 테스트합니다. 나를 위해 이것은

Maximized 
Location: {X=0,Y=0} 
Size: {Width=1280, Height=800} 
PointToScreen(0,0): {X=0,Y=0} 

Normal 
Location: {X=0,Y=0} 
Size: {Width=477, Height=321} 
PointToScreen(0,0): {X=0,Y=0} 

모든 것입니다.

Look at this

+0

경계선없는 창을 원한다면 괜찮습니다. 그러나 일반 창은 필요합니다. – c4551u5

+0

다음 올바른 위치와 크기를 얻으려면 몇 가지 계산을 수행해야합니다.창 테두리는 항상 8 및 31 픽셀입니다. – MSL

+0

그들은 그 크기가 항상 문제가되는 것은 아닙니다. 다른 Windows 버전과 기본 설정을 제외하고 사용자는 이러한 설정을 사용자 정의 할 수 있습니다 ... 운좋게도 DWMWA_EXTENDED_FRAME_BOUNDS를 사용하여 실제 값을 얻을 수 있습니다. – c4551u5

2

Uwe Keim 덕분에 그의 오프셋 및 Windows 버전 (즉, 국경 크기)에 관계없이, 제대로 형태의 위치를 ​​설정 산출 그의 question, 제작 한 MoveForm 기능에 대한 자신의 answer :

0
void MoveForm(Point p) // Move form to point 'p' 
    { 
     this.WindowState = FormWindowState.Normal; 
     this.Location = new Point(0, 0); 
     Rectangle rec = WindowHelper.GetWindowRectangle(this.Handle); 
     p.Offset(-rec.Location.X, -rec.Location.Y); 
     this.Location = p; 
    } 

MoveForm 기능은 Uwe KeimWindowHelperpost에서 클래스를 사용

+1

해결 방법을 찾았 기 때문에 기쁩니다. 나는 비슷한 솔루션을 발견했다. (http://www.vbforums.com/showthread.php?824699-RESOLVED-Form-Placement-Considering-Aero-Borders&p=5019707&viewfull=1#post5019707) 'SubsystemVersion'을 6.0으로 설정하면 문제를 해결할 수 있지만 Win 8에서는 Vista에서만 작동합니다. HKEY_CURRENT_USER \ Control Panel \ Desktop \ WindowMetrics에서 'BorderWidth'및 'PaddedBorderWidth'설정의 결합 효과로 인한 오프셋의 대부분은 '레지스트리에서. 두 값을 모두 0으로 설정하면 여전히 1 픽셀 오프셋이 남습니다. – TnTinMn

+0

SubsystemVersion을 설정하는 유사한 솔루션을 보았습니다. 그러나이 솔루션은 이보다 더 '우아함'입니다. 여기서 SubsystemVersion은 변경되지 않지만 버전에 따라 실제 창 사각형을 측정하는 두 가지 다른 방법 중 하나가 선택됩니다. WindowMetric 레지스트리 정보를 보내 주셔서 감사합니다. – c4551u5

+1

조금 더 자세한 정보. 'Form.OnHandleCreated'를 오버라이드하고 [SetWindowTheme (this.Handle, "", "")] (http://pinvoke.net/default.aspx/uxtheme/SetWindowTheme.html)를 호출하면, 양식 그 자체. 이제 양식 주위에 전체 테두리가 그려집니다. 왼쪽 테두리에 오프셋으로 나타나는 것이 실제로는 투명 테두리 영역 인 것처럼 보입니다. – TnTinMn