VOID RefreshDisplayAdapter() { /*! save configured display adapter */ { DWORD dwOld = g_XBVideo->GetDisplayAdapter(); DWORD dwDisplayAdapter = (DWORD)SendMessage(g_hDisplayAdapter, CB_GETCURSEL, 0, 0); if(dwDisplayAdapter != dwOld) { g_bHasChanges = TRUE; g_XBVideo->SetDisplayAdapter(dwDisplayAdapter); } } /*! generate list of device types */ { /*! device types */ static const XTL::D3DDEVTYPE devType[2] = { XTL::D3DDEVTYPE_HAL, XTL::D3DDEVTYPE_REF }; /*! human readable device types */ static const char *szDevType[2] = { "Direct3D HAL (Hardware Accelerated)", "Direct3D REF (Software)" }; /*! clear device listbox */ SendMessage(g_hDirect3DDevice, CB_RESETCONTENT, 0, 0); /*! step through devices types */ for(uint32 d=0;d<2;d++) { #ifndef D3D9 XTL::D3DCAPS8 Caps; #else XTL::D3DCAPS9 Caps; #endif /*! verify device is available */ if(g_pD3D8->GetDeviceCaps(g_XBVideo->GetDisplayAdapter(), devType[d], &Caps) == D3D_OK) { /*! add device to list */ SendMessage(g_hDirect3DDevice, CB_ADDSTRING, 0, (LPARAM)szDevType[d]); } } } /*! activate configured device */ SendMessage(g_hDirect3DDevice, CB_SETCURSEL, g_XBVideo->GetDirect3DDevice(), 0); /*! refresh based on new device selection */ RefreshDirect3DDevice(); return; }
INT_PTR CALLBACK DlgVideoConfigProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_INITDIALOG: { g_hDisplayAdapter = GetDlgItem(hWndDlg, IDC_VC_DISPLAY_ADAPTER); g_hDirect3DDevice = GetDlgItem(hWndDlg, IDC_VC_D3D_DEVICE); g_hVideoResolution = GetDlgItem(hWndDlg, IDC_VC_VIDEO_RESOLUTION); /*! set window icon */ SetClassLong(hWndDlg, GCL_HICON, (LONG)LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_CXBX))); /*! enumerate display adapters */ { SendMessage(g_hDisplayAdapter, CB_RESETCONTENT, 0, 0); for(uint32 v=0;v<g_dwAdapterCount;v++) { XTL::D3DADAPTER_IDENTIFIER8 adapterIdentifier; g_pD3D8->GetAdapterIdentifier(v, D3DENUM_NO_WHQL_LEVEL, &adapterIdentifier); if(v == 0) { SendMessage(g_hDisplayAdapter, CB_ADDSTRING, 0, (LPARAM)"Primary Display Adapter"); } else { SendMessage(g_hDisplayAdapter, CB_ADDSTRING, 0, (LPARAM)adapterIdentifier.Description); } } } /*! activate configured display adapter */ SendMessage(g_hDisplayAdapter, CB_SETCURSEL, g_XBVideo.GetDisplayAdapter(), 0); /*! refresh UI based on currently selected display adapter */ RefreshDisplayAdapter(); /*! check appropriate options */ { SendMessage(GetDlgItem(hWndDlg, IDC_CV_FULLSCREEN), BM_SETCHECK, (WPARAM)g_XBVideo.GetFullscreen(), 0); SendMessage(GetDlgItem(hWndDlg, IDC_CV_VSYNC), BM_SETCHECK, (WPARAM)g_XBVideo.GetVSync(), 0); } } break; case WM_CLOSE: { /*! if changes have been made, check if the user wants to save them */ if(g_bHasChanges) { int ret = MessageBox(hWndDlg, "Do you wish to apply your changes?", "Cxbx", MB_ICONQUESTION | MB_YESNOCANCEL); switch(ret) { case IDYES: PostMessage(hWndDlg, WM_COMMAND, IDC_VC_ACCEPT, 0); break; case IDNO: PostMessage(hWndDlg, WM_COMMAND, IDC_VC_CANCEL, 0); break; } break; } PostMessage(hWndDlg, WM_COMMAND, IDC_VC_CANCEL, 0); } break; case WM_COMMAND: { HWND hWndButton = GetDlgItem(hWndDlg, LOWORD(wParam)); switch(LOWORD(wParam)) { case IDC_VC_CANCEL: EndDialog(hWndDlg, wParam); break; case IDC_VC_ACCEPT: { /*! save video resolution configuration */ { HWND hVideoResolution = GetDlgItem(hWndDlg, IDC_VC_VIDEO_RESOLUTION); LRESULT lRet = SendMessage(hVideoResolution, CB_GETCURSEL, 0, 0); char szBuffer[128]; lRet = SendMessage(hVideoResolution, CB_GETLBTEXT, (WPARAM)lRet, (LPARAM)szBuffer); g_XBVideo.SetVideoResolution(szBuffer); } /*! save fullscreen/vsync options */ { LRESULT lRet = SendMessage(GetDlgItem(hWndDlg, IDC_CV_FULLSCREEN), BM_GETCHECK, 0, 0); g_XBVideo.SetFullscreen(lRet == BST_CHECKED); lRet = SendMessage(GetDlgItem(hWndDlg, IDC_CV_VSYNC), BM_GETCHECK, 0, 0); g_XBVideo.SetVSync(lRet == BST_CHECKED); } /*! save video configuration */ g_EmuShared->SetXBVideo(&g_XBVideo); EndDialog(hWndDlg, wParam); } break; case IDC_VC_DISPLAY_ADAPTER: { if(HIWORD(wParam) == CBN_SELCHANGE) { RefreshDisplayAdapter(); break; } } break; case IDC_VC_D3D_DEVICE: { if(HIWORD(wParam) == CBN_SELCHANGE) { RefreshDirect3DDevice(); break; } } break; } } break; } return FALSE; }