Changes to the outliner base class to cut down resource usage. (Bitmaps don't

have to be loaded by a derived class that knows how to draw its triggers.)
This commit is contained in:
hyatt 1998-04-30 22:13:23 +00:00
Родитель 116bba0cd8
Коммит b5bb089e8c
2 изменённых файлов: 43 добавлений и 20 удалений

Просмотреть файл

@ -142,7 +142,7 @@ STDMETHODIMP CNSOutlinerFactory::CreateInstance(
DECLARE_FACTORY(CNSOutlinerFactory); DECLARE_FACTORY(CNSOutlinerFactory);
COutliner::COutliner ( ) COutliner::COutliner ( BOOL bUseTriggerAndLineBitmaps )
{ {
#ifdef _WIN32 #ifdef _WIN32
m_iWheelDelta = 0; m_iWheelDelta = 0;
@ -179,13 +179,18 @@ COutliner::COutliner ( )
m_hItalFont = NULL; m_hItalFont = NULL;
m_pUnkImage = NULL; m_pUnkImage = NULL;
ApiApiPtr(api); m_pIImage = NULL;
m_pUnkImage = api->CreateClassInstance(
APICLASS_IMAGEMAP,NULL,(APISIGNATURE)GetOutlinerBitmap()); if (bUseTriggerAndLineBitmaps)
m_pUnkImage->QueryInterface(IID_IImageMap,(LPVOID*)&m_pIImage); {
ASSERT(m_pIImage); ApiApiPtr(api);
if (!m_pIImage->GetResourceID()) m_pUnkImage = api->CreateClassInstance(
m_pIImage->Initialize(GetOutlinerBitmap(),16,16); APICLASS_IMAGEMAP,NULL,(APISIGNATURE)GetOutlinerBitmap());
m_pUnkImage->QueryInterface(IID_IImageMap,(LPVOID*)&m_pIImage);
ASSERT(m_pIImage);
if (!m_pIImage->GetResourceID())
m_pIImage->Initialize(GetOutlinerBitmap(),16,16);
}
} }
COutliner::~COutliner ( ) COutliner::~COutliner ( )
@ -312,6 +317,13 @@ BOOL COutliner::OnEraseBkgnd( CDC * )
return TRUE; return TRUE;
} }
int COutliner::GetIndentationWidth()
{
if (m_pIImage)
return m_pIImage->GetImageWidth();
return m_itemHeight;
}
int COutliner::GetColumnSize ( UINT idCol ) int COutliner::GetColumnSize ( UINT idCol )
{ {
@ -936,7 +948,7 @@ void COutliner::OnLButtonDown ( UINT nFlags, CPoint point )
GetTreeInfo ( iRow, NULL, &iDepth, NULL ); GetTreeInfo ( iRow, NULL, &iDepth, NULL );
ReleaseLineData ( pLineData ); ReleaseLineData ( pLineData );
int iImageWidth = m_pIImage->GetImageWidth ( ); int iImageWidth = GetIndentationWidth();
RECT rcToggle = m_rcHit; RECT rcToggle = m_rcHit;
rcToggle.left += iDepth * iImageWidth; rcToggle.left += iDepth * iImageWidth;
rcToggle.right = rcToggle.left + iImageWidth; rcToggle.right = rcToggle.left + iImageWidth;
@ -970,7 +982,7 @@ void COutliner::OnLButtonDblClk ( UINT nFlags, CPoint point )
GetTreeInfo ( iRow, NULL, &iDepth, NULL ); GetTreeInfo ( iRow, NULL, &iDepth, NULL );
ReleaseLineData ( pLineData ); ReleaseLineData ( pLineData );
int iImageWidth = m_pIImage->GetImageWidth ( ); int iImageWidth = GetIndentationWidth();
RECT rcToggle = m_rcHit; RECT rcToggle = m_rcHit;
rcToggle.left += iDepth * iImageWidth; rcToggle.left += iDepth * iImageWidth;
rcToggle.right = rcToggle.left + iImageWidth; rcToggle.right = rcToggle.left + iImageWidth;
@ -1260,7 +1272,7 @@ void COutliner::OnTimer( UINT timer)
int x = 0; int x = 0;
if ( m_pColumn[ m_iTipCol ]->iCommand == m_idImageCol ) { if ( m_pColumn[ m_iTipCol ]->iCommand == m_idImageCol ) {
int iDepth = 0; int iDepth = 0;
int iImageWidth = m_pIImage->GetImageWidth ( ); int iImageWidth = GetIndentationWidth();
if ( m_bHasPipes ) { if ( m_bHasPipes ) {
GetTreeInfo ( m_iTipRow, NULL, &iDepth, NULL ); GetTreeInfo ( m_iTipRow, NULL, &iDepth, NULL );
x += (iDepth + 1) * iImageWidth; x += (iDepth + 1) * iImageWidth;
@ -1278,9 +1290,15 @@ void COutliner::OnTimer( UINT timer)
} }
dwStyle |= m_pColumn[ m_iTipCol ]->alignment == AlignRight ? NSTTS_RIGHT : 0; dwStyle |= m_pColumn[ m_iTipCol ]->alignment == AlignRight ? NSTTS_RIGHT : 0;
int left = m_rcHit.left + x;
int top = m_rcHit.top;
int horExtent = m_pColumn[m_iTipCol]->iCol - x;
int vertExtent = m_itemHeight;
AdjustTipSize(left, top, horExtent, vertExtent);
m_pTip->Show( this->GetSafeHwnd(), m_pTip->Show( this->GetSafeHwnd(),
m_rcHit.left + x, m_rcHit.top, left, top, horExtent, vertExtent,
m_pColumn[ m_iTipCol ]->iCol - x, m_itemHeight,
lpszTipText,dwStyle, hTipFont); lpszTipText,dwStyle, hTipFont);
m_iTipState = TIP_SHOWING; m_iTipState = TIP_SHOWING;
if ( !(m_iTipTimer = SetTimer( ID_OUTLINER_HEARTBEAT, 100, NULL )) ) if ( !(m_iTipTimer = SetTimer( ID_OUTLINER_HEARTBEAT, 100, NULL )) )
@ -1854,7 +1872,7 @@ void COutliner::EraseLine ( int iLineNo, HDC hdc, LPRECT lpWinRect )
int COutliner::DrawPipes ( int iLineNo, int iColNo, int offset, HDC hdc, void * pLineData ) int COutliner::DrawPipes ( int iLineNo, int iColNo, int offset, HDC hdc, void * pLineData )
{ {
int iImageWidth = m_pIImage->GetImageWidth ( ); int iImageWidth = GetIndentationWidth();
int iMaxX = offset + m_pColumn[ iColNo ]->iCol; int iMaxX = offset + m_pColumn[ iColNo ]->iCol;
int idx; int idx;
@ -1967,7 +1985,7 @@ void COutliner::PaintColumn ( int iLineNo, int iColumn, LPRECT lpColumnRect,
void COutliner::PaintLine ( int iLineNo, HDC hdc, LPRECT lpPaintRect ) void COutliner::PaintLine ( int iLineNo, HDC hdc, LPRECT lpPaintRect )
{ {
void * pLineData; void * pLineData;
int iImageWidth = m_pIImage->GetImageWidth ( ); int iImageWidth = GetIndentationWidth();
CRect WinRect; CRect WinRect;
GetClientRect(&WinRect); GetClientRect(&WinRect);
@ -2172,6 +2190,7 @@ void COutliner::SetCSID(int csid)
m_itemHeight = m_cyChar; m_itemHeight = m_cyChar;
if ( m_pIImage ) if ( m_pIImage )
InitializeItemHeight(max(m_pIImage->GetImageHeight(),m_itemHeight)); InitializeItemHeight(max(m_pIImage->GetImageHeight(),m_itemHeight));
else InitializeItemHeight(m_itemHeight);
Invalidate(); Invalidate();

Просмотреть файл

@ -98,6 +98,12 @@ private:
int m_iWheelDelta; int m_iWheelDelta;
#endif #endif
public:
OutlinerColumn_t ** m_pColumn;
int m_iNumColumns;
int m_iVisColumns;
protected: protected:
LPUNKNOWN m_pUnkImage; LPUNKNOWN m_pUnkImage;
LPIMAGEMAP m_pIImage; LPIMAGEMAP m_pIImage;
@ -138,10 +144,6 @@ protected:
BOOL m_bClearOnRelease; BOOL m_bClearOnRelease;
BOOL m_bSelectOnRelease; BOOL m_bSelectOnRelease;
OutlinerColumn_t ** m_pColumn;
int m_iNumColumns;
int m_iVisColumns;
int m_iTotalWidth; int m_iTotalWidth;
BOOL m_bDraggingData; BOOL m_bDraggingData;
@ -174,6 +176,8 @@ protected:
CropType_t cropping, AlignType_t alignment ); CropType_t cropping, AlignType_t alignment );
// Basic Overrideables // Basic Overrideables
virtual void AdjustTipSize(int& left, int& top, int& hor, int& vert) {};
virtual int GetIndentationWidth();
virtual COutlinerDropTarget* CreateDropTarget(); virtual COutlinerDropTarget* CreateDropTarget();
@ -256,7 +260,7 @@ protected:
virtual void OnSelDblClk(); virtual void OnSelDblClk();
public: public:
COutliner ( ); COutliner (BOOL bUseTriggerAndLineBitmaps = TRUE);
~COutliner ( ); ~COutliner ( );
STDMETHODIMP QueryInterface(REFIID,LPVOID *); STDMETHODIMP QueryInterface(REFIID,LPVOID *);