|
|
#include "common.hpp"
CSelControlDlg::CSelControlDlg(CDeviceView &view, CDeviceControl &control, BOOL bReselect, DWORD dwOfs, const DIDEVICEINSTANCEW &didi) : m_bReselect(bReselect), m_dwOfs(dwOfs), m_didi(didi), m_view(view), m_control(control), m_bAssigned(FALSE), m_bNoItems(TRUE) { }
CSelControlDlg::~CSelControlDlg() { }
int CSelControlDlg::DoModal(HWND hParent) { return CFlexWnd::DoModal(hParent, IDD_SELCONTROLDLG, g_hModule); }
BOOL CALLBACK AddItem(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef) { if (pvRef == NULL || lpddoi == NULL) return DIENUM_CONTINUE; return ((CSelControlDlg *)pvRef)->AddItem(*lpddoi); }
BOOL CSelControlDlg::AddItem(const DIDEVICEOBJECTINSTANCE &doi) { if (m_hList == NULL || m_view.DoesCalloutOtherThanSpecifiedExistForOffset(&m_control, doi.dwType)) return DIENUM_CONTINUE;
LRESULT i = SendMessage(m_hList, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)doi.tszName); if (i == LB_ERR || i == LB_ERRSPACE) return DIENUM_CONTINUE;
m_bNoItems = FALSE;
i = SendMessage(m_hList, LB_SETITEMDATA, (WPARAM)i, (LPARAM)doi.dwType);
return DIENUM_CONTINUE; }
void CSelControlDlg::OnInit() { m_hList = GetDlgItem(m_hWnd, IDC_LIST); if (m_hList == NULL) return;
LPDIRECTINPUTDEVICE8 pDID = NULL; LPDIRECTINPUT8 pDI = NULL; DWORD dwVer = DIRECTINPUT_VERSION; HRESULT hr; if (FAILED(hr = DirectInput8Create(g_hModule, dwVer, IID_IDirectInput8, (LPVOID*)&pDI, NULL))) return;
if (FAILED(hr = pDI->CreateDevice(m_didi.guidInstance, &pDID, NULL))) { pDID = NULL; return; }
pDI->Release(); pDI = NULL;
if (FAILED(hr = pDID->EnumObjects(::AddItem, this, DIDFT_AXIS | DIDFT_BUTTON | DIDFT_POV))) return;
pDID->Release(); pDID = NULL;
if (m_bNoItems) { EndDialog(SCDR_NOFREE); return; }
// indicate callout offset assignment...
int i = -1;
if (m_control.IsOffsetAssigned()) { BOOL m_bAssigned = TRUE; m_dwOfs = m_control.GetOffset(); i = GetItemWithOffset(m_dwOfs); }
SendMessage(m_hList, LB_SETCURSEL, (WPARAM)i, 0); }
LRESULT CSelControlDlg::OnCommand(WORD wNotifyCode, WORD wID, HWND hWnd) { switch (wNotifyCode) { case LBN_SELCHANGE: { if (m_hList == NULL || m_hList != hWnd) break;
LRESULT lr = SendMessage(m_hList, LB_GETCURSEL, 0, 0); if (lr == LB_ERR) break;
lr = SendMessage(m_hList, LB_GETITEMDATA, (WPARAM)lr, 0); if (lr == LB_ERR) break;
m_dwOfs = (DWORD)lr; m_bAssigned = TRUE; break; }
case BN_CLICKED: switch (wID) { case IDOK: if (m_bAssigned) EndDialog(SCDR_OK); else MessageBox(m_hWnd, TEXT("You must either select a control for this callout or click cancel."), TEXT("Select a Control"), MB_OK); break;
case IDCANCEL: EndDialog(SCDR_CANCEL); break; } break; }
return 0; }
int CSelControlDlg::GetItemWithOffset(DWORD dwOfs) { if (m_hList == NULL) return -1;
LRESULT lr = SendMessage(m_hList, LB_GETCOUNT, 0, 0); if (lr == LB_ERR) return -1;
int n = int(lr);
if (n < 1) return -1;
for (int i = 0; i < n; i++) { lr = SendMessage(m_hList, LB_GETITEMDATA, (WPARAM)i, 0); if (lr == LB_ERR) continue;
if ((DWORD)lr == dwOfs) return i; } return -1; }
|