windows-nt/Source/XPSP1/NT/multimedia/directx/dinput/diconfig/selcontroldlg.cpp
2020-09-26 16:20:57 +08:00

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;
}