201 lines
5.3 KiB
C
201 lines
5.3 KiB
C
|
//-----------------------------------------------------------------------------
|
||
|
// File: cdevicecontrol.h
|
||
|
//
|
||
|
// Desc: CDeviceControl is a class that encapsulate the functionality of a
|
||
|
// device control (or a callout). CDeviceView accesses it to retrieve/
|
||
|
// save information about the control.
|
||
|
//
|
||
|
// Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
#ifdef FORWARD_DECLS
|
||
|
|
||
|
|
||
|
struct DEVICECONTROLSTRUCT;
|
||
|
enum DEVCTRLHITRESULT;
|
||
|
|
||
|
class CDeviceControl;
|
||
|
|
||
|
|
||
|
#else // FORWARD_DECLS
|
||
|
|
||
|
#ifndef __CDEVICECONTROL_H__
|
||
|
#define __CDEVICECONTROL_H__
|
||
|
|
||
|
|
||
|
const int MAX_DEVICECONTROL_LINEPOINTS = 5;
|
||
|
|
||
|
#define CAF_LEFT 1
|
||
|
#define CAF_RIGHT 2
|
||
|
#define CAF_TOP 4
|
||
|
#define CAF_BOTTOM 8
|
||
|
|
||
|
#define CAF_TOPLEFT (CAF_TOP | CAF_LEFT)
|
||
|
#define CAF_TOPRIGHT (CAF_TOP | CAF_RIGHT)
|
||
|
#define CAF_BOTTOMLEFT (CAF_BOTTOM | CAF_LEFT)
|
||
|
#define CAF_BOTTOMRIGHT (CAF_BOTTOM | CAF_RIGHT)
|
||
|
|
||
|
struct DEVICECONTROLSTRUCT {
|
||
|
DEVICECONTROLSTRUCT() : nLinePoints(0) {CopyStr(wszOverlayPath, "", MAX_PATH); SRECT r; rectOverlay = r.r;}
|
||
|
DWORD dwDeviceControlOffset;
|
||
|
int nLinePoints;
|
||
|
POINT rgptLinePoint[MAX_DEVICECONTROL_LINEPOINTS];
|
||
|
DWORD dwCalloutAlign;
|
||
|
RECT rectCalloutMax;
|
||
|
WCHAR wszOverlayPath[MAX_PATH];
|
||
|
RECT rectOverlay;
|
||
|
};
|
||
|
|
||
|
enum DEVCTRLHITRESULT {
|
||
|
DCHT_LINE,
|
||
|
DCHT_CAPTION,
|
||
|
DCHT_MAXRECT,
|
||
|
DCHT_CONTROL,
|
||
|
DCHT_NOHIT
|
||
|
};
|
||
|
|
||
|
|
||
|
class CDeviceControl
|
||
|
{
|
||
|
private:
|
||
|
friend class CDeviceView; // CDeviceView has exclusive right to create/destroy views
|
||
|
CDeviceControl(CDeviceUI &ui, CDeviceView &view);
|
||
|
~CDeviceControl();
|
||
|
CDeviceView &m_view;
|
||
|
CDeviceUI &m_ui;
|
||
|
|
||
|
public:
|
||
|
// Info
|
||
|
int GetViewIndex() { return m_view.GetViewIndex(); }
|
||
|
int GetControlIndex();
|
||
|
|
||
|
// state information
|
||
|
void SetCaption(LPCTSTR tszCaption, BOOL bFixed = FALSE);
|
||
|
LPCTSTR GetCaption();
|
||
|
BOOL IsFixed() { return m_bFixed; }
|
||
|
void Unhighlight() {Highlight(FALSE);}
|
||
|
void Highlight(BOOL bHighlight = TRUE);
|
||
|
BOOL IsHighlighted() {return m_bHighlight;}
|
||
|
void GetInfo(GUID &rGuid, DWORD &rdwOffset);
|
||
|
DWORD GetOffset();
|
||
|
BOOL IsOffsetAssigned();
|
||
|
BOOL HasAction() { return lstrcmp(m_ptszCaption, g_tszUnassignedControlCaption); }
|
||
|
void FillImageInfo(DIDEVICEIMAGEINFOW *pImgInfo); // This fills the structure info about this control
|
||
|
BOOL IsMapped();
|
||
|
int GetMinX() {return m_rectCallout.left;}
|
||
|
int GetMaxX() {return m_rectCallout.right;}
|
||
|
int GetMinY() {return m_rectCallout.top;}
|
||
|
int GetMaxY() {return m_rectCallout.bottom;}
|
||
|
const RECT &GetCalloutMaxRect() const { return m_rectCalloutMax; }
|
||
|
|
||
|
// hit testing (in coord's relative to view's origin)
|
||
|
DEVCTRLHITRESULT HitTest(POINT test);
|
||
|
|
||
|
// simple notification
|
||
|
void OnMouseOver(POINT point);
|
||
|
void OnClick(POINT point, BOOL bLeft, BOOL bDoubleClick = FALSE);
|
||
|
void OnPaint(HDC hDC);
|
||
|
|
||
|
// redrawing
|
||
|
void Invalidate();
|
||
|
|
||
|
// editing
|
||
|
//@@BEGIN_MSINTERNAL
|
||
|
#ifdef DDKBUILD
|
||
|
void ReselectControl();
|
||
|
void SelectControl(BOOL bReselect = FALSE);
|
||
|
#endif
|
||
|
//@@END_MSINTERNAL
|
||
|
void PlaceCalloutMaxCorner(int nCorner, POINT point);
|
||
|
void ConsiderAlignment(POINT point);
|
||
|
void FinalizeAlignment() { }
|
||
|
void SetLastLinePoint(int nPoint, POINT point, BOOL bShiftDown);
|
||
|
void Position(POINT point);
|
||
|
BOOL ReachedMaxLinePoints() { return m_nLinePoints >= MAX_DEVICECONTROL_LINEPOINTS; }
|
||
|
int GetNextLinePointIndex() { return m_nLinePoints; }
|
||
|
BOOL HasOverlay() { return m_pbmOverlay != NULL; }
|
||
|
//@@BEGIN_MSINTERNAL
|
||
|
#ifdef DDKBUILD
|
||
|
void SelectOverlay();
|
||
|
void PositionOverlay(POINT point);
|
||
|
#endif
|
||
|
//@@END_MSINTERNAL
|
||
|
|
||
|
// population
|
||
|
void SetObjID(DWORD dwObjID) { m_dwDeviceControlOffset = dwObjID; m_bOffsetAssigned = TRUE; }
|
||
|
void SetLinePoints(int n, POINT *rgpt);
|
||
|
void SetCalloutMaxRect(const RECT &r) { m_rectCalloutMax = r; CalcCallout(); }
|
||
|
void SetAlignment(DWORD a) { m_dwCalloutAlign = a; }
|
||
|
void SetOverlayPath(LPCTSTR tszPath);
|
||
|
void SetOverlayRect(const RECT &r);
|
||
|
void Init();
|
||
|
|
||
|
private:
|
||
|
// editing vars/helpers
|
||
|
POINT m_ptFirstCorner;
|
||
|
BOOL m_bPlacedOnlyFirstCorner;
|
||
|
|
||
|
// helpers
|
||
|
void Unpopulate();
|
||
|
BOOL m_bInit;
|
||
|
BOOL m_bFixed; // Whether this control is assigned an action with DIA_APPFIXED flag.
|
||
|
DEVICEUINOTIFY m_uin;
|
||
|
BOOL HitControl(POINT point);
|
||
|
BOOL DrawOverlay(HDC hDC);
|
||
|
//@@BEGIN_MSINTERNAL
|
||
|
#ifdef DDKBUILD
|
||
|
void ManualLoadImage(LPCTSTR);
|
||
|
#endif
|
||
|
//@@END_MSINTERNAL
|
||
|
|
||
|
// device information
|
||
|
DWORD m_dwDeviceControlOffset;
|
||
|
BOOL m_bOffsetAssigned;
|
||
|
|
||
|
// location/indication/visualization...
|
||
|
// (all relative to view's origin)
|
||
|
|
||
|
// overlay
|
||
|
LPTSTR m_ptszOverlayPath;
|
||
|
CBitmap *m_pbmOverlay;
|
||
|
CBitmap *m_pbmHitMask;
|
||
|
POINT m_ptOverlay;
|
||
|
POINT m_ptHitMask;
|
||
|
|
||
|
// caption (allocated and stored here)
|
||
|
LPTSTR m_ptszCaption;
|
||
|
BOOL m_bCaptionClipped; // Whether the caption is clipped when drawn by DrawTextEx.
|
||
|
|
||
|
// coloring
|
||
|
BOOL m_bHighlight;
|
||
|
|
||
|
// line points... first connects to callout, last points to control
|
||
|
int m_nLinePoints;
|
||
|
POINT m_rgptLinePoint[MAX_DEVICECONTROL_LINEPOINTS];
|
||
|
|
||
|
// callout specs
|
||
|
DWORD m_dwCalloutAlign; // where the line emerges from the callout
|
||
|
RECT m_rectCallout, m_rectCalloutMax; // current callout rect, and max rect
|
||
|
|
||
|
// gdi
|
||
|
DWORD m_dwDrawTextFlags;
|
||
|
int m_FontHeight;
|
||
|
void PrepFont();
|
||
|
BOOL PrepCaption();
|
||
|
void PrepLinePoints();
|
||
|
void CalcCallout();
|
||
|
void PrepCallout();
|
||
|
BOOL m_bCalledCalcCallout;
|
||
|
|
||
|
//@@BEGIN_MSINTERNAL
|
||
|
#ifdef DDKBUILD
|
||
|
HRESULT ExportCodeTo(FILE *);
|
||
|
#endif
|
||
|
//@@END_MSINTERNAL
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif //__CDEVICECONTROL_H__
|
||
|
|
||
|
#endif // FORWARD_DECLS
|