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

265 lines
7 KiB
C++

//-----------------------------------------------------------------------------
// File: configwnd.h
//
// Desc: CConfigWnd is derived from CFlexWnd. It implements the top-level
// UI window which all other windows are descendents of.
//
// Functionalities handled by CConfigWnd are device tabs, Reset, Ok,
// and Cancel buttons.
//
// Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved.
//-----------------------------------------------------------------------------
#ifndef __CONFIGWND_H__
#define __CONFIGWND_H__
#define PAGETYPE IDIDeviceActionConfigPage
//@@BEGIN_MSINTERNAL
#ifdef DDKBUILD
#define NUMBUTTONS 4
#else
#define NUMBUTTONS 3
#endif
/*
//@@END_MSINTERNAL
#define NUMBUTTONS 3
//@@BEGIN_MSINTERNAL
*/
//@@END_MSINTERNAL
class CMouseTrap : public CFlexWnd
{
HWND m_hParent;
public:
CMouseTrap() : m_hParent(NULL) { }
HWND Create(HWND hParent = NULL, BOOL bInRenderMode = TRUE);
protected:
virtual BOOL OnEraseBkgnd(HDC hDC) {return TRUE;}
virtual void OnPaint(HDC hDC) {}
virtual void OnRender(BOOL bInternalCall = FALSE) {}
};
// Each device is represented by an ELEMENT object that is managed by
// CConfigWnd.
struct ELEMENT {
ELEMENT() : nCurUser(-1), pPage(NULL), lpDID(NULL) {tszCaption[0] = 0;}
// everything's cleaned up in CConfigWnd::ClearElement();
DIDEVICEINSTANCEW didi;
PAGETYPE *pPage;
HWND hWnd;
BOOL bCalc;
RECT rect, textrect;
TCHAR tszCaption[MAX_PATH];
LPDIRECTINPUTDEVICE8W lpDID;
// the map of acfors contains an acfor for each genre/username
// that has been used so far on this device. the dword represents
// the genre username as follows: the hiword is the index of the
// genre per uiglobals. the loword is the index of the username
// per uiglobals.
CMap<DWORD, DWORD &, LPDIACTIONFORMATW, LPDIACTIONFORMATW &> AcForMap;
#define MAP2GENRE(m) (int(((m) & 0xffff0000) >> 16))
#define MAP2USER(m) (int((m) & 0x0000ffff))
#define GENREUSER2MAP(g,u) \
( \
((((DWORD)(nGenre)) & 0xffff) << 16) | \
(((DWORD)(nUser)) & 0xffff) \
)
// this function simply returns the corresponding entry in the
// map if it already exists. otherwise, it creates a copy for
// this entry from the masteracfor and calls buildactionmap on
// it with the appropriate username.
// bHwDefault flag is added to properly support Reset button. BuildActionMap must be
// called with the flag to get hardware default mapping, so we need this parameter.
LPDIACTIONFORMATW GetAcFor(int nGenre, int nUser, BOOL bHwDefault = FALSE);
// we need to keep track of the current user per-element
int nCurUser;
// we need a pointer to the uiglobals in order to correspond
// user indexes to the actual string
CUIGlobals *pUIGlobals;
// this function will be called in CConfigWnd::ClearElement to
// free all the actionformats from the map
void FreeMap();
// Applies all the acfor's in the map
void Apply();
};
typedef CArray<ELEMENT, ELEMENT &> ELEMENTARRAY;
// CConfigWnd needs to expose methods for child windows to notify it.
class CConfigWnd : public CFlexWnd, public IDIConfigUIFrameWindow
{
public:
CConfigWnd(CUIGlobals &uig);
~CConfigWnd();
BOOL Create(HWND hParent);
static void SetForegroundWindow();
LPDIRECTINPUTDEVICE8W RenewDevice(GUID &GuidInstance);
BOOL EnumDeviceCallback(const DIDEVICEINSTANCEW *lpdidi);
void EnumDeviceCallbackAssignUser(const DIDEVICEINSTANCEW *lpdidi, DWORD *pdwOwner);
CUIGlobals &m_uig;
// IDIConfigUIFrameWindow implementation...
// Reset Entire Configuration
STDMETHOD (Reset) ();
// Assignment Querying. GuidInstance is the guid of the device initiating the query.
STDMETHOD (QueryActionAssignedAnywhere) (GUID GuidInstance, int i);
// Genre Control
STDMETHOD_(int, GetNumGenres) ();
STDMETHOD (SetCurGenre) (int i);
STDMETHOD_(int, GetCurGenre) ();
// User Control
STDMETHOD_(int, GetNumUsers) ();
STDMETHOD (SetCurUser) (int nPage, int nUser);
STDMETHOD_(int, GetCurUser) (int nPage);
// ActionFormat Access
STDMETHOD (GetActionFormatFromInstanceGuid) (LPDIACTIONFORMATW *lplpAcFor, REFGUID);
// Main HWND Access
STDMETHOD_(HWND, GetMainHWND) ();
protected:
// overrides
virtual void OnRender(BOOL bInternalCall = FALSE);
virtual LRESULT OnCreate(LPCREATESTRUCT lpCreateStruct);
virtual void OnPaint(HDC hDC);
virtual void OnMouseOver(POINT point, WPARAM fwKeys);
virtual void OnClick(POINT point, WPARAM fwKeys, BOOL bLeft);
virtual void OnDestroy();
virtual LRESULT WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
private:
#define CFGWND_INIT_REINIT 1
#define CFGWND_INIT_RESET 2
BOOL Init(DWORD dwInitFlags = 0);
DWORD m_dwInitFlags;
BOOL m_bCreated;
int AddToList(const DIDEVICEINSTANCEW *lpdidi, BOOL bReset = FALSE);
void ClearList();
void PlacePages();
void GetPageRect(RECT &rect, BOOL bTemp = FALSE);
void Render(BOOL bInternalCall = FALSE);
ELEMENTARRAY m_Element;
ELEMENT m_InvalidElement;
int m_CurSel;
int GetNumElements();
ELEMENT &GetElement(int i);
void ClearElement(int i, BOOL bReset = FALSE);
void ClearElement(ELEMENT &e, BOOL bReset = FALSE);
BOOL m_bScrollTabs, m_bScrollTabsLeft, m_bScrollTabsRight;
int m_nLeftTab;
RECT m_rectSTLeft, m_rectSTRight;
void ScrollTabs(int);
LPDIRECTINPUTDEVICE8W CreateDevice(GUID &guid);
BOOL m_bNeedRedraw;
CFlexMsgBox m_MsgBox;
LPDIACTIONFORMATW GetCurAcFor(ELEMENT &e);
int m_nCurGenre;
IClassFactory *m_pPageFactory;
HINSTANCE m_hPageFactoryInst;
PAGETYPE *CreatePageObject(int nPage, const ELEMENT &e, HWND &refhChildWnd);
void DestroyPageObject(PAGETYPE *&pPage);
LPDIRECTINPUT8W m_lpDI;
RECT m_rectTopGradient, m_rectBottomGradient;
CBitmap *m_pbmTopGradient, *m_pbmBottomGradient;
BOOL m_bHourGlass; // Set when the cursor should be an hourglass
typedef struct BUTTON {
BUTTON() {CopyStr(tszCaption, _T(""), MAX_PATH);}
RECT rect;
TCHAR tszCaption[MAX_PATH];
SIZE textsize;
RECT textrect;
} BUTTON;
BUTTON m_Button[NUMBUTTONS];
enum {
BUTTON_RESET = 0,
BUTTON_CANCEL,
BUTTON_OK,
//@@BEGIN_MSINTERNAL
#ifdef DDKBUILD
BUTTON_LAYOUT
#endif
//@@END_MSINTERNAL
};
SIZE GetTextSize(LPCTSTR tszText);
void CalcTabs();
void CalcButtons();
void InitGradients();
void SelTab(int);
void FireButton(int);
void ShowPage(int);
void HidePage(int);
HDC GetRenderDC();
void ReleaseRenderDC(HDC &phDC);
void Create3DBitmap();
void Copy3DBitmapToSurface3D();
void CallRenderCallback();
IDirectDrawSurface *m_pSurface;
IDirect3DSurface8 *m_pSurface3D;
D3DFORMAT m_SurfFormat;
UINT m_uiPixelSize; // Size of a pixel in byte for the format we are using
CBitmap *m_pbmPointerEraser;
CBitmap *m_pbm3D;
LPVOID m_p3DBits;
BOOL m_bRender3D;
POINT m_ptTest;
void MapBitmaps(HDC);
BOOL m_bBitmapsMapped;
BOOL m_bAllowEditLayout;
BOOL m_bEditLayout;
void ToggleLayoutEditting();
CMouseTrap m_MouseTrap;
// Timer
static void CALLBACK TimerProc(UINT uID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
HRESULT Apply();
// GuidInstance is the guid of the device initiating the query.
BOOL IsActionAssignedAnywhere(GUID GuidInstance, int nActionIndex);
void Unacquire();
void Reacquire();
};
#endif //__CONFIGWND_H__