156 lines
3.1 KiB
C++
156 lines
3.1 KiB
C++
|
#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;
|
||
|
}
|