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

259 lines
6.4 KiB
C++

/******************************************************************************
* File: CDeviceUI.h
*
* Desc:
*
* CDeviceUI is a helper that holds all the views and a bunch of
* information for a specific device. It has a CFlexWnd whose
* handler it sets to the CDeviceView for the current view,
* thus reusing one window to implement multiple pages.
*
* All CDeviceViews and CDeviceControls have a reference to the CDeviceUI
* that created them (m_ui). Thus, they also have access to the
* CUIGlobals, since CDeviceUI has a reference to them (m_ui.m_uig).
* CDeviceUI also provides the following read-only public variables
* for convenience, all referring to the device this CDeviceUI
* represents:
*
* const DIDEVICEINSTANCEW &m_didi;
* const LPDIRECTINPUTDEVICE8W &m_lpDID;
* const DIDEVOBJSTRUCT &m_os;
*
* See usefuldi.h for a description of DIDEVOBJSTRUCT.
*
* CDeviceUI communicates to the rest of the UI via the CDeviceUINotify
* abstract base class. Another class (in our case CDIDeviceActionConfigPage)
* must derive from CDeviceUINotify, and define the DeviceUINotify() and
* IsControlMapped() virtual functions. This derived class must be passed as
* the last parameter to CDeviceUI's Init() function. All the views and
* controls within the views notify the UI of user actions via m_ui.Notify(),
* so that all actionformat manipulation can be done in the page class. The
* views and controls themselves never touch the actionformat. See the
* DEVICEUINOTIFY structure below for information on the parameter passed
* through Notify()/DeviceUINotify().
*
* Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved.
*
***************************************************************************/
#ifdef FORWARD_DECLS
struct DEVICEUINOTIFY;
struct UIDELETENOTE;
class CDeviceUINotify;
class CDeviceUI;
#else // FORWARD_DECLS
#ifndef __CDEVICEUI_H__
#define __CDEVICEUI_H__
enum {
DEVUINM_NUMVIEWSCHANGED,
DEVUINM_ONCONTROLDESTROY,
DEVUINM_MOUSEOVER,
DEVUINM_CLICK,
DEVUINM_DOUBLECLICK,
DEVUINM_SELVIEW,
DEVUINM_INVALID,
DEVUINM_UNASSIGNCALLOUT,
DEVUINM_RENEWDEVICE
};
enum {
DEVUINFROM_CONTROL,
DEVUINFROM_THUMBNAIL,
DEVUINFROM_SELWND,
DEVUINFROM_VIEWWND,
DEVUINFROM_INVALID
};
struct DEVICEUINOTIFY {
DEVICEUINOTIFY() : msg(DEVUINM_INVALID), from(DEVUINFROM_INVALID) {}
int msg;
int from;
union {
struct {
CDeviceControl *pControl;
} control;
struct {
CDeviceView *pView;
BOOL bSelected;
} thumbnail;
struct {
int dummy;
} selwnd;
struct {
int dummy;
} viewwnd;
};
union {
struct {
int nView;
} selview;
struct {
POINT point;
} mouseover;
struct {
BOOL bLeftButton;
} click;
};
};
enum UIDELETENOTETYPE {
UIDNT_VIEW,
UIDNT_CONTROL,
};
struct UIDELETENOTE {
UIDELETENOTETYPE eType;
int nViewIndex;
int nControlIndex;
DWORD dwObjID;
};
typedef void (*DEVCTRLCALLBACK)(CDeviceControl *, LPVOID, BOOL);
class CDeviceUINotify
{
public:
virtual void DeviceUINotify(const DEVICEUINOTIFY &) = 0;
virtual BOOL IsControlMapped(CDeviceControl *) = 0;
};
class CDeviceUI
{
public:
CDeviceUI(CUIGlobals &uig, IDIConfigUIFrameWindow &uif);
~CDeviceUI();
// intialization
HRESULT Init(const DIDEVICEINSTANCEW &didi, LPDIRECTINPUTDEVICE8W lpDID, HWND hWnd, CDeviceUINotify *pNotify);
// view state
void SetView(int nView);
void SetView(CDeviceView *pView);
CDeviceView *GetView(int nView);
CDeviceView *GetCurView();
int GetViewIndex(CDeviceView *pView);
int GetCurViewIndex();
int GetNumViews() {return m_arpView.GetSize();}
void NextView() {SetView((GetCurViewIndex() + 1) % GetNumViews());}
void PrevView() {SetView((GetCurViewIndex() - 1 + GetNumViews()) % GetNumViews());}
// gets the thumbnail for the specified view,
// using the selected version if the view is selected
CBitmap *GetViewThumbnail(int nView);
// gets the thumbnail for the specified view,
// specifiying whether or not we want the selected version
CBitmap *GetViewThumbnail(int nView, BOOL bSelected);
// for view/control to notify
void Notify(const DEVICEUINOTIFY &uin)
{if (m_pNotify != NULL) m_pNotify->DeviceUINotify(uin);}
// device control access
void SetAllControlCaptionsTo(LPCTSTR tszCaption);
void SetCaptionForControlsAtOffset(DWORD dwOffset, LPCTSTR tszCaption, BOOL bFixed = FALSE);
void DoForAllControls(DEVCTRLCALLBACK callback, LPVOID pVoid, BOOL bFixed = FALSE);
void DoForAllControlsAtOffset(DWORD dwOffset, DEVCTRLCALLBACK callback, LPVOID pVoid, BOOL bFixed = FALSE);
// page querying
BOOL IsControlMapped(CDeviceControl *);
// other
void GetDeviceInstanceGuid(GUID &rGuid) {rGuid = m_didi.guidInstance;}
// editing
void SetEditMode(BOOL bEdit = TRUE);
BOOL InEditMode() {return m_bInEditMode;}
void Remove(CDeviceView *pView);
void RemoveAll();
#define NVT_USER 1
#define NVT_POPULATE 2
#define NVT_REQUIREATLEASTONE 3
CDeviceView *NewView();
CDeviceView *UserNewView();
void RequireAtLeastOneView();
//@@BEGIN_MSINTERNAL
#ifdef DDKBUILD
void SetStateIndication(LPCTSTR) {}
void EndStateIndication() {}
BOOL WriteToINI();
#endif
//@@END_MSINTERNAL
void SetDevice(LPDIRECTINPUTDEVICE8W lpDID); // Sets the device object that we are using
//@@BEGIN_MSINTERNAL
#ifdef DDKBUILD
// deletion noting
void NoteDeleteView(CDeviceView *pView);
void NoteDeleteView(int nView);
void NoteDeleteControl(CDeviceControl *pControl);
void NoteDeleteControl(int nView, int nControl, DWORD dwObjID);
void NoteDeleteAllControlsForView(CDeviceView *pView);
void NoteDeleteAllViews();
// deletion querying
int GetNumDeleteNotes();
BOOL GetDeleteNote(UIDELETENOTE &uidn, int i);
void ClearDeleteNotes();
// deletion debugging
void DumpDeleteNotes();
#endif
//@@END_MSINTERNAL
// drawing
void Invalidate();
// clearing
void Unpopulate();
private:
// delete notes
CArray<UIDELETENOTE, UIDELETENOTE &> m_DeleteNotes;
// who we're going to notify
CDeviceUINotify *m_pNotify;
HWND m_hWnd;
// view state
CArray<CDeviceView *, CDeviceView *&> m_arpView;
CDeviceView *m_pCurView;
BOOL m_bInEditMode;
RECT m_ViewRect;
void NumViewsChanged();
// device globals...
public:
// full access to ui globals and frame
CUIGlobals &m_uig;
IDIConfigUIFrameWindow &m_UIFrame;
// read only public access versions
const DIDEVICEINSTANCEW &m_didi;
const LPDIRECTINPUTDEVICE8W &m_lpDID;
const DIDEVOBJSTRUCT &m_os;
private:
// private versions
DIDEVICEINSTANCEW m_priv_didi;
LPDIRECTINPUTDEVICE8W m_priv_lpDID;
DIDEVOBJSTRUCT m_priv_os;
};
#endif //__CDEVICEUI_H__
#endif // FORWARD_DECLS