// dfuitestdlg.cpp : implementation file // #include "stdafxdfuitest.h" #include "dfuitest.h" #include "dfuitestdlg.h" #include "ourguids.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDFUITestDlg dialog CDFUITestDlg::CDFUITestDlg(CWnd* pParent /*=NULL*/) : CDialog(CDFUITestDlg::IDD, pParent) { //{{AFX_DATA_INIT(CDFUITestDlg) m_nNumFormats = -1; m_nVia = -1; m_nDisplay = -1; m_bLayout = FALSE; m_strNames = _T(""); m_nMode = -1; m_nColorSet = -1; //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CDFUITestDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDFUITestDlg) DDX_Radio(pDX, IDC_1, m_nNumFormats); DDX_Radio(pDX, IDC_DI, m_nVia); DDX_Radio(pDX, IDC_GDI, m_nDisplay); DDX_Check(pDX, IDC_LAYOUT, m_bLayout); DDX_Text(pDX, IDC_NAMES, m_strNames); DDX_Radio(pDX, IDC_EDIT, m_nMode); DDX_Radio(pDX, IDC_DEFAULTCS, m_nColorSet); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDFUITestDlg, CDialog) //{{AFX_MSG_MAP(CDFUITestDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_RUN, OnRun) ON_BN_CLICKED(IDC_USER, OnUser) ON_BN_CLICKED(IDC_TEST, OnTest) ON_BN_CLICKED(IDC_NULL, OnNull) ON_BN_CLICKED(IDC_CUSTOMIZE, OnCustomize) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDFUITestDlg message handlers BOOL CDFUITestDlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon OnUser(); m_nVia = 0; m_nMode = 0; m_nDisplay = 0; m_nNumFormats = 0; m_nColorSet = 0; m_bLayout = TRUE; UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CDFUITestDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CDFUITestDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } LPCTSTR GetHResultMsg(HRESULT); TUI_VIA CDFUITestDlg::GetVia() { switch (m_nVia) { default: case 0: return TUI_VIA_DI; case 1: return TUI_VIA_CCI; } } TUI_DISPLAY CDFUITestDlg::GetDisplay() { switch (m_nDisplay) { default: case 0: return TUI_DISPLAY_GDI; case 1: return TUI_DISPLAY_DDRAW; case 2: return TUI_DISPLAY_D3D; } } TUI_CONFIGTYPE CDFUITestDlg::GetMode() { switch (m_nMode) { default: case 0: return TUI_CONFIGTYPE_EDIT; case 1: return TUI_CONFIGTYPE_VIEW; } } LPCWSTR CDFUITestDlg::GetUserNames() { if (m_strNames.IsEmpty()) return NULL; CString tstr = m_strNames + _T(",,"); LPWSTR wstr = AllocLPWSTR((LPCTSTR)tstr); if (wstr == NULL) return NULL; int l = wcslen(wstr); for (int i = 0; i < l; i++) if (wstr[i] == L',') wstr[i] = 0; return wstr; } void CDFUITestDlg::OnRun() { if (!UpdateData()) return; TESTCONFIGUIPARAMS p; BOOL bTCUIMsg = FALSE; HRESULT hres = S_OK; LPCTSTR title = _T("CoInitialize Result"); if (SUCCEEDED(hres = CoInitialize(NULL))) { title = _T("CoCreateInstance Result"); IDirectInputConfigUITest* pITest = NULL; hres = ::CoCreateInstance(CLSID_CDirectInputConfigUITest, NULL, CLSCTX_INPROC_SERVER, IID_IDirectInputConfigUITest, (LPVOID*)&pITest); if (SUCCEEDED(hres)) { title = _T("TestConfigUI Result"); p.dwSize = sizeof(TESTCONFIGUIPARAMS); p.eVia = GetVia(); p.eDisplay = GetDisplay(); p.eConfigType = GetMode(); p.nNumAcFors = m_nNumFormats + 1; p.nColorScheme = m_nColorSet; p.lpwszUserNames = GetUserNames(); p.bEditLayout = m_bLayout; CopyStr(p.wszErrorText, "", MAX_PATH); hres = pITest->TestConfigUI(&p); if (p.lpwszUserNames != NULL) free((LPVOID)p.lpwszUserNames); p.lpwszUserNames = NULL; bTCUIMsg = TRUE; pITest->Release(); } CoUninitialize(); } LPCTSTR msg = _T("Uknown Error."); switch (hres) { case S_OK: msg = _T("Success."); break; case REGDB_E_CLASSNOTREG: msg = _T("REGDB_E_CLASSNOTREG!"); break; case CLASS_E_NOAGGREGATION: msg = _T("CLASS_E_NOAGGREGATION"); break; default: msg = GetHResultMsg(hres); break; } if (FAILED(hres)) { if (bTCUIMsg) { TCHAR tmsg[2048]; LPTSTR tstr = AllocLPTSTR(p.wszErrorText); _stprintf(tmsg, _T("TestConfigUI() failed.\n\ntszErrorText =\n\t\"%s\"\n\n\nHRESULT...\n\n%s"), tstr, msg); free(tstr); MessageBox(tmsg, title, MB_OK); } else MessageBox(msg, title, MB_OK); } } LPCTSTR GetHResultMsg(HRESULT hr) { static TCHAR str[2048]; LPCTSTR tszhr = NULL, tszMeaning = NULL; switch (hr) { case E_PENDING: tszhr = _T("E_PENDING"); tszMeaning = _T("Data is not yet available."); break; case E_FAIL: tszhr = _T("E_FAIL"); tszMeaning = _T("General failure."); break; case E_INVALIDARG: tszhr = _T("E_INVALIDARG"); tszMeaning = _T("Invalid argument."); break; case E_NOTIMPL: tszhr = _T("E_NOTIMPL"); tszMeaning = _T("Not implemented."); break; default: _stprintf(str, _T("Unknown HRESULT (%08X)."), hr); return str; } _stprintf(str, _T("(%08X)\n%s:\n\n%s"), hr, tszhr, tszMeaning); return str; } void CDFUITestDlg::OnUser() { UpdateData(); TCHAR tszUser[MAX_PATH + 1]; tszUser[MAX_PATH] = 0; DWORD len = MAX_PATH; if (GetUserName(tszUser, &len)) m_strNames = tszUser; else m_strNames = _T("UserName1"); UpdateData(FALSE); } void CDFUITestDlg::OnTest() { UpdateData(); m_strNames = _T("Alpha,Beta,Epsilon,Theta"); UpdateData(FALSE); } void CDFUITestDlg::OnNull() { UpdateData(); m_strNames.Empty(); UpdateData(FALSE); } void CDFUITestDlg::OnCustomize() { // TODO: Add your control notification handler code here }