본문 바로가기

Programming/OpenGL

Basic OpenGL programming Full-Screen

시험 기간이라 공부겸 올리는 포스트가 늦어버렸군요! '-'!!(그렇다고 시험을 잘 본건 아니지만....)

이번에는 저번 코드를 바탕으로 전체화면 모드를 해보겠습니다. 그런대 결과를 보고 나니 좀 이상한게 많더라구요...ㅠㅠ 아직 잘 몰라서 그런걸 수도 있는데... 일단은 과정을 쓰고, 나아아아아아아중에 좀더 알게 되면 마저 추가 하려구요 :-]

잘 아시는 분 계시면 다른 참조사이트 알려주시거나 직접 알려주시면 매우 감사!

저번에까지는 윈도우를 생성하고, 그 안에 openGL 렌더링을 할 수 있는 거를 만들었었는데, 사실 그렇게 일일이 하나하나 코드를 넣는것은 제 성미가 아니고...(뭐 저뿐만은 아니겠지요..ㅋ) 일부 코드를 변수로 대체 하네요.    
  • 풀스크린 모드 플래그
  • 윈도우 외형의 위치를 표시하는 부분
  • 윈도우 스타일
  • 확장 윈도우 스타일
       
모두 다 메인함수(WinMain)에 넣게 됩니다. 나중에는 다른 상용게임 처럼 환경설정부분을 파일로 만들어서 불러오는 형태를 만들면 좋겠죠?ㅎ 이건 각자의 스타일에 맞춰서 만드는 게 좋을 거 같아서, 일단 여기서는 다 때려박았습니다. :-]
   
WNDCLASSEX	windowClass;	// window class
HWND		hwnd;			// window handle
MSG			msg;			// message
bool		done;			// flag saying when your app is complete

bool		fullScreen(true);	// start off in full-screen mode
DWORD		dwExStyle;		// Window Extended Style
DWORD		dwStyle;		// Window Style

// temp variables
int screenWidth(1600);
int screenHeight(900);
int bits(32);

   
이후에 진행되는 것은 윈도우를 등록한 뒤에, 실질적인 윈도우가 등록 되기 전에 진행하게 됩니다.(hwnd = CreateWindowExA(..) 前)
   
fullScreen 플래그는 기본값이 true 입니다. 하지만, 풀스크린을 할 수 없는 값 이라던지 다른 이유에 의해서 처리가 되지 않으면 실제로 풀스크린에 의한 설정은 적용되면 안되니까 그 부분을 먼저 처리 합니다.
   
WinGDI.h에 선언되어 있는 DEVMODE 라는 구조체를 사용 할 것인데, 이 구조체는 출력장치의 초기화와 환경에 관련한 정보를 가지고 있다고 해서 한번 쭉 선언된 거 읽어봤는데..... 솔직히 뭔 내용인지는 잘 모르겠구요(:-D) 세팅하는 부분에서 화면에 출력 되는 부분을 설정하는 것과 window관련 구조체인것을 감안해서 window자체적으로 그래픽 출력에 관한 변수들 설정하는 구조체? 정도로 이해 했어요ㅎ.
   
여기서 실제 윈도우와 DEVMODE에서 설정한 너비와 높이는 사이즈가 같아야 한다고 하네요. 그래서 앞서 변수 입력에 대해서 임의 변수로 화면 너비, 높이, 픽셀당 비트수를 두었습니다.(앞서 얘기했다시피 이런 부분은 나중에 파일로 빼 두는게 좋겠죠?:-D)
   
실제로 DEVMODE의 변수의 값을 정해주고 나서 디스플레이 세팅을 변경하는 것은 ChangeDisplaySettings(..) 라는 함수가 해주게 됩니다. 설정이 제대로 변경 되었다면 DISP_CHANGE_SUCCESSFUL을 반환하게 됩니다. 그게 아니면 설정이 제대로 된 것이 아니니까 full-screen mode를 주면 안되겠죠?ㅎ
   
// first check to DEVMODE setting clear
if(fullScreen)
{
	DEVMODE devModeScreen;
	memset(&devModeScreen, 0, sizeof(devModeScreen));	// clear the DEVMODE structure
	devModeScreen.dmSize = sizeof(devModeScreen);		// size of the sturcture
	devModeScreen.dmPelsWidth = screenWidth;			// set the width
	devModeScreen.dmPelsHeight = screenHeight;			// set the height
	devModeScreen.dmBitsPerPel = bits;					// set the bits per pixel
	devModeScreen.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL;

	if(ChangeDisplaySettingsA(&devModeScreen, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
	{
		// chage has failed, you'll run in windowed mode
		fullScreen = false;
		MessageBox(NULL, "fullscreen mode failed", NULL, MB_OK);
	}
}

 
   
이후에 설정을 성공했으면 fullScreen 변수는 계속 true 값이겠죠? 실질적인 윈도우 스타일이 변경되야 하니까 앞서 선언한 DWORD 변수들의 설정을 만져주면 됩니다.
if(fullScreen)
{
	dwExStyle	= WS_EX_APPWINDOW;	// hide top level windows
	dwStyle	= WS_POPUP;			// no border on your window

	windowRect.top = 0;
	windowRect.left = 0;
	windowRect.bottom = screenHeight;
	windowRect.right = screenWidth;

	ShowCursor(FALSE);				// hide the cursor
}
else
{
	dwExStyle	= NULL;				// same as earlier example
	dwStyle	= WS_OVERLAPPEDWINDOW | WS_VISIBLE |
				WS_SYSMENU | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;

	windowRect.top = 100;
	windowRect.left = 100;
	windowRect.bottom = 500;
	windowRect.right = 500;

}

 
   
윈도우 자체에 대한 변수값 설정을 모두 마쳤으니까, 이제 적용을 시켜야 겠죠? 그 역할을 하는 함수가 AdjustWindowRECTEx(..) 입니다.
AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle);

 
   
변경된 전체 코드 입니다.
그런데 실제로 실행을 해보면서 잘 되지 않는 부분이...
  • 마우스 가두기 : 코드상에서는 cursor를 hidden 시켰기 때문에 보이지 않지만 저는 듀얼 모니터를 사용하고 있는데, 마우스를 실행된 화면 밖으로 이동하게 끔 하면 마우스가 나타나게 되더군요.
  • 실제 Active window 체크 : 앞서 있는 부분과 어느정도 일맥상통하는 부분이긴 한데, 마우스 넘어가서 다른 윈도우가 실제 active 이게 되어도 프로그램은 계속 돌아가고, 시작줄이 전체화면 된 창을 뒤덮더라구요 아래 처럼...._ _+

       
뭐.. 첫술에 배부르겠습니다만, 여기까지 한거도 토닥토닥 이네요 :-D
천천히 하면 되죠.

기본적인 openGL in windows 플밍이 끝났네요... 챕터2가 무지 길게 느껴졌네요ㅎ 하지만 이제 모두 졸려할만한 3D 그래픽 이론을...ㅋㅋㅋ 할 계획이어요. 이 부분은 포스팅 하는 카테고리가 다르니까 나중에 와서 한번 보시어요(gcland>Theory>Graphic). 여기 카테고리에 포스팅이 언제 될지는 모르겠지만, 앞으로 적는건 이론부분을 아신다는 전재하에 진행 할 예정입니다. 뭐 잠깐 잠깐 설명 정도는 적어 놓을 테지만;ㅋ

'Programming > OpenGL' 카테고리의 다른 글

OpenGL primitives_1  (0) 2011.12.22
OpenGL states  (0) 2011.12.22
Basic OpenGL programming in Windows_2  (0) 2011.12.01
Basic OpenGL programming in Windows_1  (0) 2011.11.30
OpenGL 설치하기(windows)  (2) 2011.11.29