2011-09-02 2 views
0

Windows Forms (C#)를 사용하고 있습니다. 나는 다음과 같은 속성을 사용하여, 내 양식의 Closing 이벤트 디스크에 내 방 창문의 위치와 크기를 저장합니다이상한 행동 저장 응용 프로그램 위치 및 크기

(int) Width, Height -> using the Form.Size property 
(int) LocationX, LocationY -> using the Form.Location property 
(bool) Maximized -> using the Form.WindowState property 

형태가 응용 프로그램의 주요 형태이다. 응용 프로그램이로드되면 해당 속성을 양식에 설정합니다. 간단 해.

글쎄, 대부분의 경우 완벽하게 작동하지만 때로는 때로는 응용 프로그램이 거의 보이지 않습니다. 내가 디버그 정보를 추가 한 이들은 형태가 반환 된 값입니다 : 내가 사용하기 때문에,

2011-09-01 20:02:44,334 DEBUG 9884 MainFormSettings - Width -> 160 
2011-09-01 20:02:44,334 DEBUG 9884 MainFormSettings - Height -> 27 
2011-09-01 20:02:44,334 DEBUG 9884 MainFormSettings - LocationX -> -32000 
2011-09-01 20:02:44,334 DEBUG 9884 MainFormSettings - LocationY -> -32000 
2011-09-01 20:02:44,334 DEBUG 9884 MainFormSettings - Maximized -> False 

내 창에 해당 크기 (160, 27)의 아니라는 것을 확신도 위치가 -32000 아니었다 하나의 모니터 만.

이것은 응용 프로그램이 오랜 시간 동안 열렸을 때 발생하지만 확실하지 않은 것 같습니다.

  • 가끔씩 이상한 값이있는 이유를 알고 있습니까?
  • 동일한 결과로 Closing 이벤트에서 스토어에 영향을 미칠 수 있습니다 (또한 Closed 이벤트에서 시도 했음). 사전에

감사는 당신이보고있는 좌표

+0

당신이 저장된 설정을 적용 할로드되는 후 형태 중 어떤 경우에? 표시 또는로드? – Zenwalker

+0

또한 2.0 이후 Closing 이벤트가 사용되지 않으므로 FormClosing 이벤트를 사용해야합니다. – TrymBeast

+1

OnResize()를 재정의하고 변수에 저장 한 마지막 것으로 알려진 것과 WindowState를 비교해야합니다. 창 상태가 보통이 아닌 경우 크기를 저장하지 마십시오. –

답변

3

는 닫을 때 응용 프로그램이 최소화된다는 사실에 기인한다. Windows는 좌표를 실제로 엄청나게 큰 음의 X, Y 좌표로 이동하여 양식을 "숨 깁니다". 프로그램

검증 : Vista에서 양식 응용 프로그램에서

출력 :

현재 좌표 X : 184 Y : -32000 Y : 184 * 기본 위치 현재는 X 좌표 -32000 * 최소화 위치

코드에서 :

System.Diagnostics.Debug.WriteLine ("현재 좌표 X :"+ Location.X + "Y :"+ Location.Y);

이 문제를 해결하려면 앱을 닫고 실제로 파일에 저장하지 않을 때 이러한 값을 확인하기 만하면됩니다.

임의의 좌표 값에 대해 수학을 수행하는 것을 원하지 않는다면 WindowState를 확인할 수도 있습니다.

위의 답변은 이전 SO 게시물에서 발견되었습니다.

http://msdn.microsoft.com/en-us/library/system.windows.forms.formwindowstate.aspx

+0

)을 사용하고 있습니다. 이전 SO 게시물에 대한 링크를 붙여 넣을 수 있습니까? –

+0

http://stackoverflow.com/questions/ 1478765/위치 - 좌표 - 컴퓨터 - 표시 - x - 32000 - y - 32000 – MStp

2

당신은 폼이 최소화 될 때 창 크기 + 위치를 얻을 수있는 양식의 RestoreBounds 속성을 사용할 수 있습니다. 예를 들어

:

private void Form_Closing(object sender, FormClosingEventArgs e) 
{ 
     Location locationToSave = this.WindowState == FormWindowState.Minimized ? this.RestoreBounds.Location : this.Location; 
     Size sizeToSave = this.WindowState == FormWindowState.Minimized ? this.RestoreBounds.Size : this.Size; 
     WindowState windowStateToSave = this.WindowState; 

     // ... save your state 
}