265 lines
7 KiB
C++
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__
|