DINPUT.C
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:16k
源码类别:
Windows编程
开发平台:
Visual C++
- /****************************************************************************
- Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
- PROGRAM: dinput.c
- PURPOSE: DirectX Device Viewer - DirectInput module
- FUNCTIONS:
- COMMENTS:
- ****************************************************************************/
- #include "dxview.h"
- #define DICAPDEF(name,val,flag) {name, FIELD_OFFSET(DIDEVCAPS,val), flag}
- #define DIVALDEF(name,val) {name, FIELD_OFFSET(DIDEVCAPS,val), 0}
- /****************************************************************************
- *
- * DI_CreateDI
- *
- * Create a DirectInput pointer. Try the current DirectInput version
- * first; if that doesn't work, try version 3.0.
- *
- ****************************************************************************/
- LPDIRECTINPUT
- DI_CreateDI(void)
- {
- LPDIRECTINPUT pdi;
- if (SUCCEEDED(DirectInputCreate(g_hInstance, DIRECTINPUT_VERSION,
- &pdi, NULL))) {
- } else
- if (SUCCEEDED(DirectInputCreate(g_hInstance, 0x0300,
- &pdi, NULL))) {
- } else {
- pdi = 0;
- }
- return pdi;
- }
- /****************************************************************************
- *
- * DI_CreateDevice
- *
- * Create a device with the specified instance GUID.
- *
- ****************************************************************************/
- LPDIRECTINPUTDEVICE
- DI_CreateDevice(LPCGUID pguid)
- {
- LPDIRECTINPUT pdi;
- LPDIRECTINPUTDEVICE pdev;
- pdi = DI_CreateDI();
- if (pdi) {
- if (SUCCEEDED(IDirectInput_CreateDevice(pdi, pguid, &pdev, NULL))) {
- } else {
- pdev = 0;
- }
- IDirectInput_Release(pdi);
- } else {
- pdev = 0;
- }
- return pdev;
- }
- /****************************************************************************
- *
- * DI3Info
- *
- * Structure that describes the caps maintained by DIDEVCAPS
- * that existed in DirectX 3.
- *
- ****************************************************************************/
- CAPDEF DI3Info[] =
- {
- DIVALDEF("Axes", dwAxes),
- DIVALDEF("Buttons", dwButtons),
- DIVALDEF("POVs", dwPOVs),
- DICAPDEF("ATTACHED", dwFlags, DIDC_ATTACHED),
- DICAPDEF("POLLEDDEVICE", dwFlags, DIDC_POLLEDDEVICE),
- DICAPDEF("EMULATED", dwFlags, DIDC_EMULATED),
- {"", 0, 0}
- };
- /****************************************************************************
- *
- * DI5Info
- *
- * Structure that describes the caps maintained by DIDEVCAPS
- * that exist in DirectX 5 and were't in DirectX 3.
- *
- ****************************************************************************/
- CAPDEF DI5Info[] =
- {
- DICAPDEF("FORCEFEEDBACK", dwFlags, DIDC_FORCEFEEDBACK),
- DICAPDEF("FFATTACK", dwFlags, DIDC_FFATTACK),
- DICAPDEF("FFFADE", dwFlags, DIDC_FFFADE),
- DICAPDEF("SATURATION", dwFlags, DIDC_SATURATION),
- DICAPDEF("POSNEGCOEFFICIENTS", dwFlags, DIDC_POSNEGCOEFFICIENTS),
- DICAPDEF("POSNEGSATURATION", dwFlags, DIDC_POSNEGSATURATION),
- DIVALDEF("FFSamplePeriod", dwFFSamplePeriod),
- DIVALDEF("FFMinTimeResolution", dwFFMinTimeResolution),
- {"", 0, 0}
- };
- /****************************************************************************
- *
- * DISubTypeList
- *
- * List of various DirectInput device subtypes and their names.
- *
- ****************************************************************************/
- typedef struct SUBTYPEINFO {
- DWORD dwDevType;
- LPCTSTR pszName;
- } SUBTYPEINFO;
- #define SUBTYPE(type, subtype, name)
- { MAKEWORD(DIDEVTYPE_##type,
- DIDEVTYPE##type##_##subtype),
- TEXT("%d - ") TEXT(name) }
- SUBTYPEINFO DISubTypes[] = {
- SUBTYPE(MOUSE, UNKNOWN, "Unknown"),
- SUBTYPE(MOUSE, TRADITIONAL, "Traditional"),
- SUBTYPE(MOUSE, FINGERSTICK, "Fingerstick"),
- SUBTYPE(MOUSE, TOUCHPAD, "Touchpad"),
- SUBTYPE(MOUSE, TRACKBALL, "Trackball"),
- SUBTYPE(KEYBOARD, UNKNOWN, "Unknown"),
- SUBTYPE(KEYBOARD, PCXT, "XT"),
- SUBTYPE(KEYBOARD, OLIVETTI, "Olivetti"),
- SUBTYPE(KEYBOARD, PCAT, "AT"),
- SUBTYPE(KEYBOARD, PCENH, "Enhanced"),
- SUBTYPE(KEYBOARD, NOKIA1050, "Nokia 1050"),
- SUBTYPE(KEYBOARD, NOKIA9140, "Nokia 9140"),
- SUBTYPE(KEYBOARD, NEC98, "NEC98"),
- SUBTYPE(KEYBOARD, NEC98LAPTOP, "NEC98 Laptop"),
- SUBTYPE(KEYBOARD, NEC98106, "NEC98 106"),
- SUBTYPE(KEYBOARD, JAPAN106, "Japan 106"),
- SUBTYPE(KEYBOARD, JAPANAX, "Japan AX"),
- SUBTYPE(KEYBOARD, J3100, "J3100"),
- SUBTYPE(JOYSTICK, UNKNOWN, "Unknown"),
- SUBTYPE(JOYSTICK, TRADITIONAL, "Traditional"),
- SUBTYPE(JOYSTICK, FLIGHTSTICK, "Flightstick"),
- SUBTYPE(JOYSTICK, GAMEPAD, "Gamepad"),
- SUBTYPE(JOYSTICK, RUDDER, "Rudder"),
- SUBTYPE(JOYSTICK, WHEEL, "Wheel"),
- SUBTYPE(JOYSTICK, HEADTRACKER, "Head tracker"),
- { 0, 0 },
- };
- /****************************************************************************
- *
- * DIAddRow
- *
- * Add a row to the growing two-column listview or printer.
- *
- * lpInfo = print context or NULL if adding to listview
- * pszName = name of cap
- * pszFormat = wsprintf-style format string
- * ... = inserts for wsprintf
- *
- ****************************************************************************/
- BOOL __cdecl
- DIAddRow(PRINTCBINFO *lpInfo, LPCTSTR pszName, LPCTSTR pszFormat, ...)
- {
- BOOL fRc;
- TCHAR szBuf[1024];
- int cch;
- va_list ap;
- va_start(ap, pszFormat);
- cch = wvsprintf(szBuf, pszFormat, ap);
- va_end(ap);
- if (lpInfo == NULL) {
- LVAddText(g_hwndLV, 0, pszName, 0);
- LVAddText(g_hwndLV, 1, TEXT("%s"), szBuf);
- } else {
- int xName, xVal, yLine;
- // Calculate Name and Value column x offsets
- xName = (lpInfo->dwCurrIndent * DEF_TAB_SIZE * lpInfo->dwCharWidth);
- xVal = xName + (32 * lpInfo->dwCharWidth);
- yLine = lpInfo->dwCurrLine * lpInfo->dwLineHeight;
- // Print name
- fRc = PrintLine(xName, yLine, pszName, lstrlen(pszName), lpInfo);
- if (!fRc) goto done;
- // Print value
- fRc = PrintLine(xVal, yLine, szBuf, cch, lpInfo);
- if (!fRc) goto done;
- // Advance to next line on page
- fRc = PrintNextLine(lpInfo);
- if (!fRc) goto done;
- }
- fRc = TRUE;
- done:;
- return fRc;
- }
- /****************************************************************************
- *
- * DIAddTypes
- *
- * Emit the device type information to the output device.
- *
- * lpInfo = print context or NULL if adding to listview
- * dwDevType = device type to decode
- *
- ****************************************************************************/
- BOOL DIAddTypes(PRINTCBINFO *lpInfo, DWORD dwDevType)
- {
- BOOL fRc;
- DWORD dwType;
- LPCTSTR pszValue;
- SUBTYPEINFO *psti;
- /*
- * Add the type code.
- */
- dwType = GET_DIDEVICE_TYPE(dwDevType);
- switch (dwType) {
- case DIDEVTYPE_MOUSE: pszValue = TEXT("%d - Mouse"); break;
- case DIDEVTYPE_KEYBOARD:pszValue = TEXT("%d - Keyboard"); break;
- case DIDEVTYPE_JOYSTICK:pszValue = TEXT("%d - Joystick"); break;
- default: pszValue = TEXT("%d"); break;
- }
- fRc = DIAddRow(lpInfo, "Type", pszValue, dwType);
- if (!fRc) goto done;
- /*
- * Add the sub type code.
- */
- pszValue = TEXT("%d");
- for (psti = DISubTypes; psti->dwDevType; psti++) {
- if (psti->dwDevType == (dwDevType & 0xFFFF)) {
- pszValue = psti->pszName;
- break;
- }
- }
- fRc = DIAddRow(lpInfo, TEXT("Subtype"), pszValue,
- GET_DIDEVICE_SUBTYPE(dwDevType));
- if (!fRc) goto done;
- fRc = TRUE;
- done:;
- return fRc;
- }
- /****************************************************************************
- *
- * DIAddCapsToTarget
- *
- * Add the caps either to the listview or to the printer.
- *
- * lpInfo = print context or NULL if adding to listview
- * pcd = pointer to CAPDEF array describing the caps
- * pv = pointer to structure to be parsed
- *
- ****************************************************************************/
- BOOL
- DIAddCapsToTarget(PRINTCBINFO *lpInfo, CAPDEF *pcd, LPVOID pv)
- {
- BOOL fRc;
- if (lpInfo) {
- fRc = PrintCapsToDC(pcd, pv, lpInfo);
- } else {
- AddMoreCapsToLV(pcd, pv);
- fRc = TRUE;
- }
- return fRc;
- }
- /****************************************************************************
- *
- * DIPrintCaps
- *
- * lpInfo = print context or NULL if adding to listview
- * lParam1 = state info recorded by DIEnumDevCallback (LPGUID)
- * lParam2 = refdata (not used)
- *
- ****************************************************************************/
- BOOL
- DIPrintCaps(LPARAM lParam1, LPARAM lParam2, PRINTCBINFO *lpInfo)
- {
- BOOL fRc;
- LPGUID pguid = (LPGUID)lParam1;
- LPDIRECTINPUTDEVICE pdev;
- if (lpInfo == NULL) {
- AddColsToLV();
- }
- fRc = TRUE;
- pdev = DI_CreateDevice(pguid);
- if (pdev) {
- DIDEVCAPS caps;
- HRESULT hres;
- /*
- * First use the DX3 caps.
- */
- caps.dwSize = sizeof(DIDEVCAPS_DX3);
- hres = IDirectInputDevice_GetCapabilities(pdev, &caps);
- if (SUCCEEDED(hres)) {
- fRc = DIAddTypes(lpInfo, caps.dwDevType) &&
- DIAddCapsToTarget(lpInfo, DI3Info, &caps);
- }
- /*
- * Now get the DX5 caps if we haven't cancelled printing yet.
- */
- if (fRc) {
- caps.dwSize = sizeof(DIDEVCAPS);
- hres = IDirectInputDevice_GetCapabilities(pdev, &caps);
- if (SUCCEEDED(hres)) {
- fRc = DIAddCapsToTarget(lpInfo, DI5Info, &caps);
- }
- }
- IDirectInputDevice_Release(pdev);
- }
- return fRc;
- }
- /****************************************************************************
- *
- * DIAddCaps
- *
- * lParam1 = state info recorded by DIEnumDevCallback (LPGUID)
- * lParam2 = refdata (not used)
- *
- ****************************************************************************/
- void
- DIAddCaps(LPARAM lParam1, LPARAM lParam2)
- {
- DIPrintCaps(lParam1, lParam2, NULL);
- }
- /****************************************************************************
- *
- * DIEnumEffCallback
- *
- * Add the enumerated DirectInput effect to the listview.
- *
- ****************************************************************************/
- BOOL CALLBACK
- DIEnumEffCallback(LPCDIEFFECTINFO pei, LPVOID lpInfo)
- {
- BOOL fRc;
- const GUID *pguid = &pei->guid;
- fRc = DIAddRow(lpInfo, pei->tszName,
- TEXT("{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}"),
- pguid->Data1, pguid->Data2, pguid->Data3,
- pguid->Data4[0], pguid->Data4[1],
- pguid->Data4[2], pguid->Data4[3],
- pguid->Data4[4], pguid->Data4[5],
- pguid->Data4[6], pguid->Data4[7]);
- if (fRc) {
- return DIENUM_CONTINUE;
- } else {
- return DIENUM_STOP;
- }
- }
- /****************************************************************************
- *
- * DIPrintEffects
- *
- * lpInfo = print context or NULL if adding to listview
- * lParam1 = state info recorded by DIEnumDevCallback (LPGUID)
- * lParam2 = refdata (not used)
- *
- ****************************************************************************/
- BOOL
- DIPrintEffects(LPARAM lParam1, LPARAM lParam2, PRINTCBINFO *lpInfo)
- {
- BOOL fRc;
- LPGUID pguid = (LPGUID)lParam1;
- LPDIRECTINPUTDEVICE pdev;
- /*
- * The effects are not a simple name/value thing.
- * But DXView doesn't like multiple nesting levels,
- * so we mash it into the name/value paradigm
- * because I'm lazy. Someday I won't be quite so
- * lazy and do it right.
- */
- if (lpInfo == NULL) {
- AddColsToLV();
- }
- fRc = TRUE;
- pdev = DI_CreateDevice(pguid);
- if (pdev) {
- LPDIRECTINPUTDEVICE2 pdev2;
- HRESULT hres;
- hres = IDirectInputDevice_QueryInterface(
- pdev, &IID_IDirectInputDevice2, (LPVOID *)&pdev2);
- if (SUCCEEDED(hres)) {
- /*
- * Enumerate the effects and add them to the listview.
- */
- IDirectInputDevice2_EnumEffects(pdev2,
- DIEnumEffCallback, lpInfo,
- DIEFT_ALL);
- IDirectInputDevice2_Release(pdev2);
- }
- IDirectInputDevice_Release(pdev);
- }
- return fRc;
- }
- /****************************************************************************
- *
- * DIAddEffects
- *
- * lParam1 = state info recorded by DIEnumDevCallback (LPGUID)
- * lParam2 = refdata (not used)
- *
- ****************************************************************************/
- void
- DIAddEffects(LPARAM lParam1, LPARAM lParam2)
- {
- DIPrintEffects(lParam1, lParam2, NULL);
- }
- /****************************************************************************
- ***************************************************************************/
- CAPDEFS DICapDefs[] =
- {
- {"", DIAddCaps, 0, DIPrintCaps},
- {"Effects", DIAddEffects, 0, DIPrintEffects},
- {NULL, 0, 0, NULL}
- };
- /****************************************************************************
- *
- * DIEnumDevCallback
- *
- * Add the enumerated DirectInput device to the treeview.
- *
- ****************************************************************************/
- BOOL CALLBACK
- DIEnumDevCallback(LPCDIDEVICEINSTANCE pinst, LPVOID pv)
- {
- HTREEITEM hParent = pv;
- TCHAR szText[MAX_PATH + 2 + MAX_PATH + 2];
- LPGUID pguid;
- pguid = LocalAlloc(LPTR, sizeof(GUID));
- if (pguid == NULL) {
- return DIENUM_STOP;
- }
- *pguid = pinst->guidInstance;
- wsprintf(szText, "%s (%s)", pinst->tszInstanceName,
- pinst->tszProductName);
- DICapDefs[0].szName = szText;
- AddCapsToTV(hParent, DICapDefs, (LPARAM)pguid);
- return(DIENUM_CONTINUE);
- }
- /****************************************************************************
- *
- * DI_FillTree
- *
- * Add the DirectInput nodes to the treeview.
- *
- ****************************************************************************/
- void
- DI_FillTree(void)
- {
- LPDIRECTINPUT pdi;
- HTREEITEM hTree;
- // Add direct input devices if DInput is found
- pdi = DI_CreateDI();
- if (pdi) {
- hTree = TVAddNode(TVI_ROOT, "DirectInput Devices", TRUE,
- IDI_DIRECTX, NULL, 0, 0, NULL);
- IDirectInput_EnumDevices(pdi, 0, DIEnumDevCallback, hTree,
- DIEDFL_ALLDEVICES);
- TreeView_Expand(g_hwndTV, hTree, TVE_EXPAND);
- IDirectInput_Release(pdi);
- }
- }