home *** CD-ROM | disk | FTP | other *** search
- //-----------------------------------------------------------------------------
- // 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-2001 Microsoft Corporation. All Rights Reserved.
- //-----------------------------------------------------------------------------
-
- #ifndef __CONFIGWND_H__
- #define __CONFIGWND_H__
-
-
- #define PAGETYPE IDIDeviceActionConfigPage
- #define NUMBUTTONS 3
-
-
- 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,
- };
-
- 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__
-