이장에서는 다이얼로그 박스로 윈도우 모드나 풀 모드를 선택한후 해상도를 선택할수 있도록 하자.

선택할할수 있는 조건은 아래와 같다.
      -window or full screen
      -윈도의 크기 
      -해상도    
      -칼라의의 수 
      -풀스크린에서 리프레시 비율

원하는 모드를 선택하기 위해서 다이얼로그 박스를 띄우는 코드를 AppInit()함수에 추가한다.
	if(!DialogBox (hInst, MAKEINTRESOURCE(IDD_STARTUP), 0 , (DLGPROC) SelectVideoModeDlg)) 
		return false;
 
g_bIsFullScreen 변수가 true이면 풀화면으로 false이면 윈도우 모드로 셋팅한다.

bool g_bIsFullScreen = false;	    // is our app Full screen or not
int g_iScreenX = 0, g_iScreenY = 0;	// use this if 'not'
D3DDISPLAYMODE *g_pd3ddm;	        // use this if 'yes'
int g_iModeNum = 0;			        // using this D3DDISPLAYMODE

코드를 이해 하는데 별다른 어려움은 없을것이다.
다이렉트 X의 풀 모드를 얻어오는 부분만 설명할것이다.

LPDIRECT3D8    p_d3dt =  Direct3DCreate8 (D3D_SDK_VERSION);
D3DDISPLAYMODE d3ddm2;
int allVideoModes = p_d3dt->GetAdapterModeCount(D3DADAPTER_DEFAULT);

			//아래 코드는 SelectVideoModeDlg()에 있다.
			LPDIRECT3D8 p_d3d = Direct3DCreate8 (D3D_SDK_VERSION);
			int allVideoModes = p_d3d->GetAdapterModeCount (D3DADAPTER_DEFAULT);
			g_pd3ddm = new D3DDISPLAYMODE[allVideoModes];
			for (int i=0; i < allVideoModes; i++)
			{
				p_d3d->EnumAdapterModes (D3DADAPTER_DEFAULT, i, &g_pd3ddm[i]);
				char str[30];
				int bpp=0;
				if(g_pd3ddm[i].Format == D3DFMT_X1R5G5B5) bpp=16;
				if(g_pd3ddm[i].Format == D3DFMT_R5G6B5) bpp=16;
				if(g_pd3ddm[i].Format == D3DFMT_A1R5G5B5) bpp=16;
				if(g_pd3ddm[i].Format == D3DFMT_A4R4G4B4) bpp=16;
				if(g_pd3ddm[i].Format == D3DFMT_X4R4G4B4) bpp=16;
				if(g_pd3ddm[i].Format == D3DFMT_R8G8B8) bpp=24;
				if(g_pd3ddm[i].Format == D3DFMT_X8R8G8B8) bpp=32;
				if(g_pd3ddm[i].Format == D3DFMT_A8R8G8B8) bpp=32;
				sprintf(str, "%dx%dx%d _ %dhz", g_pd3ddm[i].Width, 
									g_pd3ddm[i].Height, bpp, g_pd3ddm[i].RefreshRate);
				ComboBox_AddString (hFSMlist, str);
			};

			_RELEASE_ (p_d3d);

비디오 모드를 알아내기 위해 임시적으로 D3D 인터페이스를 만든다(Direct3DCreate8 (D3D_SDK_VERSION)).
p_d3d->GetAdapterModeCount(D3DADAPTER_DEFAULT)를 사용하여 비디오 모드의 사용 가능한 갯수를 구한다.
p_d3d->EnumAdapterModes (D3DADAPTER_DEFAULT, i, &g_pd3ddm[i])를 통하여 칼라수를 구한다.
그리고 나머지 윈도우의 높이와 폭 리프레시 비율을 구할수 있다.

HRESULT InitD3D(HWND hWnd)
{
	ZeroMemory (&g_d3dpp, sizeof(g_d3dpp));

    if( NULL == ( g_d3d = Direct3DCreate8( D3D_SDK_VERSION ) ) )
        return E_FAIL;

	if(g_bIsFullScreen)
	{
		g_d3dpp.BackBufferWidth = g_pd3ddm[g_iModeNum].Width;
		g_d3dpp.BackBufferHeight = g_pd3ddm[g_iModeNum].Height;
		g_d3dpp.BackBufferCount = 1;
		g_d3dpp.FullScreen_RefreshRateInHz = g_pd3ddm[g_iModeNum].RefreshRate; //D3DPRESENT_RATE_DEFAULT
		g_d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_ONE;
	}
	else
	{
		if( FAILED( g_d3d->GetAdapterDisplayMode (D3DADAPTER_DEFAULT, &g_pd3ddm[g_iModeNum])))
			return E_FAIL;
	}

    g_d3dpp.Windowed = !g_bIsFullScreen;
    g_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    g_d3dpp.BackBufferFormat = g_pd3ddm[g_iModeNum].Format;

    if(FAILED(g_d3d->CreateDevice (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, 
								   D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
								   &g_d3dpp, &g_d3d_Device)))
	{
		return E_FAIL;
	}

	return S_OK;
}

위의 코드는 실제적으로 화면을 셋팅하는것이다.
-첫째 디바이스의 width와 Height를 대입한다.
-백버퍼의 갯수를 넣는다.
-스크린의 리프레시 비율을 대입한다.

-윈도우 모드로 사용할것인지 체크한다 (g_d3dpp.Windowed = !g_bIsFullScreen)
-포맷을 셋팅한다.
-스크린의 업그레이드를 방법을 셋팅한다.

void DestroyDirect3D8()
{
	_RELEASE_ (g_VertexBuffer);
	_RELEASE_ (g_d3d_Device);
	_RELEASE_ (g_d3d);
	if(g_pd3ddm)
	{
		delete [] g_pd3ddm;
		g_pd3ddm = NULL;
	}
}

마지막으로 할당된 디스플레이 모드들을 해제 시킨다.