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

199 lines
6 KiB
C++

//-----------------------------------------------------------------------------
// File: cdiacpage.h
//
// Desc: CDIDeviceActionConfigPage implements the page object used by the UI.
// A page covers the entire UI minus the device tabs and the bottons at
// the bottom. The information window, player combo-box, genre combo-
// box, action list tree, and device view window are all managed by
// the page.
//
// Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved.
//-----------------------------------------------------------------------------
#ifdef FORWARD_DECLS
class CDIDeviceActionConfigPage;
#else // FORWARD_DECLS
#ifndef __CDIACPAGE_H__
#define __CDIACPAGE_H__
// For WINMM.DLL
typedef MMRESULT (WINAPI *FUNCTYPE_timeSetEvent)(UINT, UINT, LPTIMECALLBACK, DWORD_PTR, UINT);
extern HINSTANCE g_hWinMmDLL;
extern FUNCTYPE_timeSetEvent g_fptimeSetEvent;
//implementation class
class CDIDeviceActionConfigPage : public IDIDeviceActionConfigPage, public CDeviceUINotify, public CFlexWnd
{
public:
//IUnknown fns
STDMETHOD (QueryInterface) (REFIID iid, LPVOID *ppv);
STDMETHOD_(ULONG, AddRef) ();
STDMETHOD_(ULONG, Release) ();
//IDirectInputActionConfigPage
STDMETHOD (Create) (DICFGPAGECREATESTRUCT *pcs);
STDMETHOD (Show) (LPDIACTIONFORMATW lpDiActFor);
STDMETHOD (Hide) ();
// layout edit mode
STDMETHOD (SetEditLayout) (BOOL bEditLayout);
//@@BEGIN_MSINTERNAL
#ifdef DDKBUILD
// Write layout to IHV setting file
STDMETHOD (WriteIHVSetting) ();
#endif
//@@END_MSINTERNAL
// Set the info box text
STDMETHOD (SetInfoText) (int iCode);
// Unacquire and Reacquire the device for page's purposes
// (the configwnd needs to do this around SetActionMap() calls)
STDMETHOD (Unacquire) ();
STDMETHOD (Reacquire) ();
//construction/destruction
CDIDeviceActionConfigPage();
~CDIDeviceActionConfigPage();
// dialog window message handlers
/* BOOL OnInitDialog(HWND hWnd, HWND hwndFocus);
BOOL OnCommand(WPARAM wParam, LPARAM lParam);
LRESULT OnNotify(WPARAM wParam, LPARAM lParam);
void OnPaint(HDC hDC);
void OnClick(POINT point, WPARAM, BOOL bLeft);*/
protected:
virtual void OnInit();
virtual void OnPaint(HDC hDC);
virtual void OnClick(POINT point, WPARAM fwKeys, BOOL bLeft);
virtual void OnMouseOver(POINT point, WPARAM fwKeys);
virtual LRESULT WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
private:
enum CONFIGSTATE {CFGSTATE_NORMAL, CFGSTATE_ASSIGN};
// HWND m_hWnd; // handle to the page dialog window
LONG m_cRef; //reference count
LPDIACTIONFORMATW m_lpDiac;
DIDEVICEINSTANCEW m_didi;
LPDIRECTINPUTDEVICE8W m_lpDID;
CUIGlobals *m_puig;
IDIConfigUIFrameWindow *m_pUIFrame;
CONFIGSTATE m_State;
// device ui
CDeviceUI *m_pDeviceUI;
CDeviceControl *m_pCurControl;
virtual void DeviceUINotify(const DEVICEUINOTIFY &);
virtual BOOL IsControlMapped(CDeviceControl *);
// ui logic
void SetCurrentControl(CDeviceControl *pControl);
void NullAction(LPDIACTIONW lpac);
void UnassignControl(CDeviceControl *pControl);
friend void CallUnassignControl(CDeviceControl *pControl, LPVOID pVoid, BOOL bFixed);
void UnassignAction(LPDIACTIONW lpac);
void UnassignSpecificAction(LPDIACTIONW lpac);
void UnassignActionsAssignedTo(const GUID &guidInstance, DWORD dwOffset);
void AssignCurrentControlToAction(LPDIACTIONW lpac);
void ActionClick(LPDIACTIONW lpac);
void EnterAssignState();
void ExitAssignState();
void UnassignCallout();
void SetAppropriateDefaultText();
void GlobalUnassignControlAt(const GUID &, DWORD);
void SetControlAssignments();
void ShowCurrentControlAssignment();
CBitmap *m_pbmRelAxesGlyph;
CBitmap *m_pbmAbsAxesGlyph;
CBitmap *m_pbmButtonGlyph;
CBitmap *m_pbmHatGlyph;
CBitmap *m_pbmCheckGlyph;
CBitmap *m_pbmCheckGlyphDark;
CBitmap *m_pbmIB;
CBitmap *m_pbmIB2;
void InitResources();
void FreeResources();
RECT m_rectIB;
RECT m_rectIBLeft;
RECT m_rectIBRight;
LPTSTR m_tszIBText;
POINT m_ptIBOffset;
POINT m_ptIBOffset2;
RECT m_rectIBText;
void InitIB();
CViewSelWnd m_ViewSelWnd;
void DoViewSel();
CFlexTree m_Tree;
CFTItem *m_pRelAxesParent, *m_pAbsAxesParent, *m_pButtonParent, *m_pHatParent, *m_pUnknownParent;
void ClearTree();
void InitTree(BOOL bForceInit = FALSE);
DWORD m_dwLastControlType;
CFTItem *GetItemForActionAssignedToControl(CDeviceControl *pControl);
int GetNumItemLpacs(CFTItem *pItem);
LPDIACTIONW GetItemLpac(CFTItem *pItem, int i = 0);
typedef CArray<LPDIACTIONW, LPDIACTIONW &> RGLPDIACW;
// GetItemWithActionNameAndSemType returns an item with the specified action name and semantic type. NULL if none.
CFTItem *GetItemWithActionNameAndSemType(LPCWSTR acname, DWORD dwSemantic);
BOOL IsActionAssignedHere(int index);
// quick fix for offset->objid change:
void SetInvalid(LPDIACTIONW);
DWORD GetOffset(LPDIACTIONW);
void SetOffset(LPDIACTIONW, DWORD);
bidirlookup<DWORD, DWORD> offset_objid;
HRESULT InitLookup();
// dropdowns
CFlexComboBox m_UserNames, m_Genres;
// Information window
CFlexInfoBox m_InfoBox;
// Sort Assigned check box for keyboard devices
CFlexCheckBox m_CheckBox;
// device control
DWORD m_cbDeviceDataSize;
DWORD *m_pDeviceData[2];
int m_nOnDeviceData;
BOOL m_bFirstDeviceData;
void InitDevice();
void DeviceTimer();
static void CALLBACK DeviceTimerProc(UINT uID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
void DeviceDelta(DWORD *pData, DWORD *pOldData);
void AxisDelta(const DIDEVICEOBJECTINSTANCEW &doi, BOOL data, BOOL old);
void ButtonDelta(const DIDEVICEOBJECTINSTANCEW &doi, DWORD data, DWORD old);
void PovDelta(const DIDEVICEOBJECTINSTANCEW &doi, DWORD data, DWORD old);
void ActivateObject(const DIDEVICEOBJECTINSTANCEW &doi);
void DeactivateObject(const DIDEVICEOBJECTINSTANCEW &doi);
bidirlookup<DWORD, int> objid_avai;
typedef CArray<int, int &> AxisValueArray;
CArray<AxisValueArray, AxisValueArray &> m_AxisValueArray;
void StoreAxisDeltaAndCalcSignificance(const DIDEVICEOBJECTINSTANCEW &doi, DWORD data, DWORD olddata, BOOL &bSig, BOOL &bOldSig);
// page index
int m_nPageIndex;
};
#endif //__CDIACPAGE_H__
#endif // FORWARD_DECLS