개발자 블로그

윈폼 NONE 스타일 창 최대화하는 경우 작업표시줄 가리지 않게하기 본문

프로그래밍/Windows

윈폼 NONE 스타일 창 최대화하는 경우 작업표시줄 가리지 않게하기

로이드.Roid 2016. 2. 19. 22:54

C# Winform의 FormBorderStyle을 None으로 설정한 경우(또는 CreateParams를 통해서 WS_CAPTION 스타일 속성을 제거한 경우) 창을 최대화하게 되면 작업표시줄까지 덮어버리는 문제가 생긴다. 

최대화 버튼을 클릭했을 때, 아래 코드를 사용해서 창을 최대화 시키면 이러한 문제가 발생하는데 

Form.WindowState = FormWindowState.Maximized;

대략 두 가지 해결 방법이있다.


1. 직접 사이즈를 설정

말 그대로 폼의 사이즈를 직접 입력한다. 시스템속성을 통해서 WorkingArea를 조회 한 뒤에 해당 크기로 폼의 크기를 설정한다. 예제 코드는 아래 링크를 참조. 

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNo=8&no=41511&ref=41508



2. MaximizedBounds 프로퍼티 사용

최대화 할 때 창의크기를 설정 할 수 있는 프로퍼티를 이용하는 방법이다. Form.MaximizedBounds를 WorkingArea로 설정해주면 된다. 

this.MaximizedBounds = Screen.FromHandle(this.Handle).WorkingArea;
this.WindowState = FormWindowState.Maximized;

다만, 윈도우10에서는 약간의 문제가있다. (윈도우7, 윈도우8에서는 테스트 안해봐서 모름.) WorkingArea 조사한 값으로 설정을 해도 화면에 꽉차지 않고 약간의 여백이 생긴다. 보이지 않는 테두리 영역이 있는 것 같은데.. "칼무리" 같은 캡처 프로그램을 이용해서 활성창을 캡처해보면 무슨 말인지 알 수 있을거다. 

그래서 MaximizedBounds 영역을 조금 수정해줘야 된다. 아래는 그 코드

Rectangle bounds = Screen.FromHandle(this.Handle).WorkingArea;
int x_offset = SystemInformation.HorizontalResizeBorderThickness + SystemInformation.FixedFrameBorderSize.Width;
int y_offset = SystemInformation.VerticalResizeBorderThickness   + SystemInformation.FixedFrameBorderSize.Height;

bounds.X -= x_offset;
bounds.Width += (x_offset * 2);
bounds.Height += y_offset;
				
//this.MaximizedBounds = Screen.FromHandle(this.Handle).WorkingArea;
this.MaximizedBounds = bounds;
			
// 창 크기 최대화 처리
this.WindowState = FormWindowState.Maximized;


참고사이트
 1) http://stackoverflow.com/questions/6415099/full-screen-mode-but-dont-cover-the-taskbar
 2) http://stackoverflow.com/questions/35259756/wpf-and-windows-10-invisible-border-around-windows


Comments