⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listviewwindow.cpp

📁 虚拟打印机
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		this->DoUpdateDirectLayer(mdp);	}}void ListViewWindow::EndMouseTracking(BOOL bCancel, BOOL bCtrl) {	if (/*m_bHasMouseCapture*/ m_mouseTrackMode != ListViewWindow::eNotTracking) {		this->KillTimer(ID_SCROLLTIMER);		// MUST SET THIS BOOL FIRST, EndMouseTracking SendMessage's WM_CAPTURECHANGED		//m_bHasMouseCapture = FALSE;		ListViewWindow::MouseTrackingMode oldMode = m_mouseTrackMode;		m_mouseTrackMode = ListViewWindow::eNotTracking;		::ReleaseCapture();		//::EndMouseTracking();		switch(oldMode) {		case ListViewWindow::eTrackViewTranslation:			break;		case ListViewWindow::eTrackDragBoxPart:			if (! ::EqualRect(m_rdDragBoxPart_InitialSelectionBox, m_rdSelectionBox)) {				this->SendNotification(ListViewWindow::eArrowSelectionBoxChange);			}			break;		case ListViewWindow::eTrackDottedSelection: {				POINTD ptd;				m_trans.DoInvTrans(m_ptMouseLast, ptd);				this->MoveArrowSelectionOutline(m_ptdMouseDown, ptd, TRUE, FALSE);				if (!bCancel) {					if (::IsRectEmpty(m_rdArrowSelectionOutline)) {						this->SetArrowSelection(ptd, bCtrl);					} else {						this->SetArrowSelection(m_rdArrowSelectionOutline, bCtrl);					}				}			} break;		default:			// DEBUG - FIX -- MAKE THIS COMPILE TIME			ASSERTFAIL();			break;		}		//switch(m_ct) {		//case eHand:		//	break;		//case eArrow: {		//	switch(m_arrowSelMode) {		//	case ListViewWindow::eSelectBox:		//		if (this->m_bDragBoxPart) {		//			// 6/1		//			if (! ::EqualRect(m_rdDragBoxPart_InitialSelectionBox, m_rdSelectionBox)) {		//				this->SendNotification(ListViewWindow::eArrowSelectionBoxChange);		//			}		//			break;		//		}		//		// FALL THRU		//	case ListViewWindow::eSelectItems: {		//		POINTD ptd;		//		m_trans.DoInvTrans(m_ptMouseLast, ptd);		//		this->MoveArrowSelectionOutline(m_ptdMouseDown, ptd, TRUE, FALSE);		//		if (!bCancel) {		//			if (::IsRectEmpty(m_rdArrowSelectionOutline)) {		//				this->SetArrowSelection(ptd, bCtrl);		//			} else {		//				this->SetArrowSelection(m_rdArrowSelectionOutline, bCtrl);		//			}		//		}		//	} break;		//	default:		//		ASSERTFAIL();		//		break;		//	}		//} break;		//default:		//	ASSERTFAIL();		//	break;		//}	}  // if (/*m_bHasMouseCapture*/ m_mouseTrackMode != ListViewWindow::eNotTracking) } // void ListViewWindow::EndMouseTracking(BOOL bCancel, BOOL bCtrl) BOOL ListViewWindow::IsValidArrowSelectionBox(OUT RECTD& rdBoxAdjusted, const RECTD& rdBox) const {	BOOL bRetValue = FALSE;	if (m_pList != NULL) {		std::vector<uint> vuiItem;		if (m_pList->ItemsFromRect(vuiItem, rdBox)) {			// PICK THE FIRST ONE			uint uiItem = vuiItem[0];			RECTD rdItem;			m_pList->GetItemSelectableBounds(uiItem, rdItem);			RECTD rdIntersect;			::IntersectRect(rdIntersect, rdItem, rdBox);			SIZED szdIntersect = { RW(rdIntersect), RH(rdIntersect) };			if (szdIntersect.cx >= m_szdMinSelectionBox.cx &&				szdIntersect.cy >= m_szdMinSelectionBox.cy) {					rdBoxAdjusted = rdIntersect;					bRetValue = TRUE;			}		}	}	return bRetValue;}void ListViewWindow::InvalidateItem(uint uiItem) {	if (m_pList != NULL) {		RECTD rdItem;		this->m_pList->GetItemBounds(uiItem, rdItem);		RECT rItem;		m_trans.DoTrans(rdItem, rItem);		RECT rDest;		::IntersectRect(&rDest, &rItem, &this->rClient());		this->InvalidateRect(rDest, TRUE);	}}void ListViewWindow::MoveArrowSelectionBox(BOOL bHasArrowSelectionBox, const RECTD* prdNew, BOOL bWithPaint, BOOL bNotify) {	RECT rNew;	if (bHasArrowSelectionBox) {		m_trans.DoTrans(*prdNew, rNew);	}	//if (bHasArrowSelectionBox ^ m_bHasArrowSelectionBox ||	//	bHasArrowSelectionBox && m_bHasArrowSelectionBox  && ! ::EqualRect(&m_rSelectionBox, &rNew)	//) {	if (lxor(bHasArrowSelectionBox, m_bHasArrowSelectionBox) ||		bHasArrowSelectionBox && m_bHasArrowSelectionBox  && ! ::EqualRect(&m_rSelectionBox, &rNew)	) {		if (bHasArrowSelectionBox) {			m_ps->SetNextBox(rNew);			m_rSelectionBox = rNew;			m_rdSelectionBox = *prdNew;		} else {			m_ps->SetNextInvisible();		}		m_bHasArrowSelectionBox = bHasArrowSelectionBox;		if (bWithPaint) {			this->UpdateSpriteOnNextPaint();		} else {			this->DoUpdateSprite();		}		if (bNotify) {			this->SendNotification(eArrowSelectionBoxChange);		}	}}void ListViewWindow::MoveArrowSelectionOutline(const POINTD& ptd1, const POINTD& ptd2, BOOL bEraseOld, BOOL bDrawNew) {	RECTD rdMouseSelOld = m_rdArrowSelectionOutline;	m_rdArrowSelectionOutline.left = min(ptd1.x, ptd2.x);	m_rdArrowSelectionOutline.top = min(ptd1.y, ptd2.y);	m_rdArrowSelectionOutline.right = max(ptd1.x, ptd2.x);	m_rdArrowSelectionOutline.bottom = max(ptd1.y, ptd2.y);	this->DrawArrowSelectionOutline(NULL, rdMouseSelOld, bEraseOld, bDrawNew);}void ListViewWindow::ResetRulers(void) {	const RulerDrawer *prdHorizNew = NULL;	RulerPlacementSpec rpsHorizNew(RulerPlacementSpec::eHorizontal);	const RulerDrawer *prdVertNew = NULL;	RulerPlacementSpec rpsVertNew(RulerPlacementSpec::eVertical);	if (m_prdp != NULL && m_handsel.bHasHandSel) {		RECTD rdItem;		m_pList->GetItemRuledBounds(m_handsel.uiItem, rdItem);		prdHorizNew = m_prdp->GetRulerDrawer(RW(rdItem));		prdVertNew = m_prdp->GetRulerDrawer(RH(rdItem));		if (prdHorizNew != NULL || prdVertNew != NULL) {			RECT rItem;			m_trans.DoTrans(rdItem, rItem);			if (prdHorizNew != NULL) {				rpsHorizNew.m_rDest = m_rHorizRuler;				rpsHorizNew.m_rDest.left = max(rpsHorizNew.m_rDest.left, rItem.left);				rpsHorizNew.m_rDest.right = min(rpsHorizNew.m_rDest.right, rItem.right);				RECTD rdDest;				m_trans.DoInvTrans(rpsHorizNew.m_rDest, rdDest);				OffsetRect(rdDest, -rdItem.left, -rdItem.top);				rpsHorizNew.m_dTopLeft = rdDest.left;				rpsHorizNew.m_dBottomRight = rdDest.right;			}			if (prdVertNew != NULL) {				rpsVertNew.m_rDest = m_rVertRuler;				rpsVertNew.m_rDest.top = max(rpsVertNew.m_rDest.top, rItem.top);				rpsVertNew.m_rDest.bottom = min(rpsVertNew.m_rDest.bottom, rItem.bottom);				RECTD rdDest;				m_trans.DoInvTrans(rpsVertNew.m_rDest, rdDest);				OffsetRect(rdDest, -rdItem.left, -rdItem.top);				rpsVertNew.m_dTopLeft = rdDest.top;				rpsVertNew.m_dBottomRight = rdDest.bottom;			}		}	}	BOOL bUnitLabelChanged = FALSE;	Ruler rHorizNew(prdHorizNew, rpsHorizNew, &m_lfkHoriz);	if (rHorizNew != m_rHoriz) {		this->InvalidateRect(m_rHorizRuler, TRUE);		if (::RulerUnitLabelChanged(rHorizNew, m_rHoriz)) {			bUnitLabelChanged = TRUE;		}		m_rHoriz = rHorizNew;	}	Ruler rVertNew(prdVertNew, rpsVertNew, &m_lfkVert);	if (rVertNew != m_rVert) {		this->InvalidateRect(m_rVertRuler, TRUE);		if (::RulerUnitLabelChanged(rVertNew, m_rVert)) {			bUnitLabelChanged = TRUE;		}		m_rVert = rVertNew;	}	if (bUnitLabelChanged) {		this->SendNotification(ListViewWindow::eRulerUnitsChange);	}}void ListViewWindow::ResetView(void) {	if (m_pList != NULL) {		POINT ptClientCenter;		CenterInRect(ptClientCenter, m_rView);		RECTD rdList;		m_pList->GetBounds(rdList);		POINTD ptdSrcCenter;		CenterInRect(ptdSrcCenter, rdList);		m_trans.Reset(ptdSrcCenter, ptClientCenter, 1.0, rdList, m_rView);	}	this->InvalidateRect(this->rClient(), TRUE);}BOOL ListViewWindow::SelModeVectorHasMode(uint uiSelMode) const {	for(uint ui = 0; ui < m_vsel.size(); ++ui) {		if ( (m_vsel[ui] & uiSelMode) == uiSelMode) {			return TRUE;		}	}	return FALSE;}void ListViewWindow::SetArrowSelection(const POINTD& ptd, BOOL bCtrl) {	if (m_pList != NULL) {		switch(m_arrowSelMode) {		case ListViewWindow::eSelectBox: 			if (m_bHasArrowSelectionBox) {				this->MoveArrowSelectionBox(FALSE, NULL, FALSE, TRUE);			}			break;		case ListViewWindow::eSelectItems: {			std::vector<uint> vuiItem;			uint uiItem;			if (m_pList->ItemFromPt(uiItem, ptd)) {				vuiItem.push_back(uiItem);			}			this->SetArrowSelection(vuiItem, bCtrl);		} break;		default:			ASSERTFAIL();			break;		}	}}void ListViewWindow::SetArrowSelection(const RECTD& rd, BOOL bCtrl) {	if (m_pList != NULL) {		switch(m_arrowSelMode) {		case ListViewWindow::eSelectBox: 			RECTD rdAdjusted;			if (this->IsValidArrowSelectionBox(rdAdjusted, rd)) {				this->MoveArrowSelectionBox(TRUE, &rdAdjusted, FALSE, TRUE);			} else {				this->MoveArrowSelectionBox(FALSE, NULL, FALSE, TRUE);			}			break;		case ListViewWindow::eSelectItems: {			std::vector<uint> vuiItem;			m_pList->ItemsFromRect(vuiItem, rd);			this->SetArrowSelection(vuiItem, bCtrl);		} break;		default:			ASSERTFAIL();			break;		}	}}void ListViewWindow::SetArrowSelection(const std::vector<uint>& vuiItem, BOOL bCtrl) {	if (m_pList != NULL) {		switch(m_arrowSelMode) {		case ListViewWindow::eSelectBox:			ASSERTFAIL();			break;		case ListViewWindow::eSelectItems: {			std::vector<uint> vuiSelOld = m_vsel;			std::vector<uint>& vsel = m_vsel;			if (bCtrl) {				for(uint ui = 0; ui < vuiItem.size(); ++ui) {					uint uiItem = vuiItem[ui];					vsel[uiItem] ^= ViewableList::eArrowSel;				}			} else {				for(uint ui = 0; ui < vsel.size(); ++ui) {					vsel[ui] &= ~ ViewableList::eArrowSel;				}				for(uint ui = 0; ui < vuiItem.size(); ++ui) {					uint uiItem = vuiItem[ui];					vsel[uiItem] |= ViewableList::eArrowSel;				}			}			BOOL bChanged = FALSE;			for(uint ui = 0; ui < vsel.size(); ++ui) {				if (vsel[ui] != vuiSelOld[ui]) {					this->InvalidateItem(ui);					bChanged = TRUE;				}			}			if (bChanged) {				this->SendNotification(ListViewWindow::eArrowSelectionItemsChange);			}		} break;		default:			ASSERTFAIL();			break;		}	}}void ListViewWindow::SetHandSelection(const HandSelState& handsel) {	if (handsel != this->m_handsel) {		switch(m_arrowSelMode) {			case ListViewWindow::eSelectBox: 				// FALL THRU			case ListViewWindow::eSelectItems: {				std::vector<uint>& vsel = m_vsel;				if (handsel.bHasHandSel) {					vsel[handsel.uiItem] |= ViewableList::eHandSel;					this->InvalidateItem(handsel.uiItem);				}				if (m_handsel.bHasHandSel) {					vsel[m_handsel.uiItem] &= ~ViewableList::eHandSel;					this->InvalidateItem(m_handsel.uiItem);				}				m_handsel = handsel;				this->ResetRulers();				this->SendNotification(ListViewWindow::eHandSelChange);			} break;			default:				ASSERTFAIL();				break;		}	}}void ListViewWindow::StartMouseTracking(ListViewWindow::MouseTrackingMode mouseTrackMode) {	// ONLY DEAL WITH THE TRANSITION FROM NOT TRACKING TO TRACKING 	// WE DONT DEAL WITH TRANSITING FROM ONE TRACKING TO ANOTHER (CURRENTLY) RATHER JUST ASSERT	// ALSO THIS ROUTINE CAN'T BE USED TO STOP TRACKING (USING EndMouseTracking INSTEAD)	ASSERT(mouseTrackMode != ListViewWindow::eNotTracking);	switch(m_mouseTrackMode) {	case ListViewWindow::eNotTracking:		this->SetFocus();		this->Window::SetCapture();		//m_bHasMouseCapture = TRUE;		m_mouseTrackMode = mouseTrackMode;		this->SetTimer(ID_SCROLLTIMER, SCROLLTIMER_MS);		break;	default:		// DONT THINK THIS CASE EVER ACTUALLY OCCURS		ASSERT(m_mouseTrackMode == mouseTrackMode);		break;	}	//if (! m_bHasMouseCapture) {	//	this->SetFocus();	//	this->Window::StartMouseTracking();	//	m_bHasMouseCapture = TRUE;	//	this->SetTimer(ID_SCROLLTIMER, SCROLLTIMER_MS);	//}}void ListViewWindow::Translate(IN const POINT& ptDelta) {	if (ptDelta.x != 0 || ptDelta.y != 0) {		m_trans.TranslateSrcOrg(ptDelta);		switch(m_arrowSelMode) {		case ListViewWindow::eSelectBox: 			if (m_bHasArrowSelectionBox) {				this->MoveArrowSelectionBox(TRUE, &m_rdSelectionBox, TRUE, FALSE);			}			break;		case ListViewWindow::eSelectItems:			break;		default:			ASSERTFAIL();			break;		}		switch(m_mouseTrackMode) {		case ListViewWindow::eNotTracking:			break;		case ListViewWindow::eTrackViewTranslation:			break;		case ListViewWindow::eTrackDragBoxPart: {			//POINT ptBoxDelta = { - ptDelta.x, - ptDelta.y };			//this->DragArrowSelectionBoxPart(ptBoxDelta, TRUE);			POINT pt1;			m_trans.DoTrans(this->m_ptdLastGoodDragDelta, pt1);			POINTD ptdZero = { 0, 0 };			POINT pt2;			m_trans.DoTrans(ptdZero, pt2);			POINT ptBoxDelta = { pt1.x - pt2.x - ptDelta.x, pt1.y - pt2.y - ptDelta.y };			this->m_ptMouseDown.x += ptDelta.x;			this->m_ptMouseDown.y += ptDelta.y;			//this->m_ptdMouseDown IS ONLY USED WITH THE DOTTED ELECTION OUTLINE			this->DragArrowSelectionBoxPart(ptBoxDelta, TRUE);		} break;		case ListViewWindow::eTrackDottedSelection: {			POINTD ptd;			m_trans.DoInvTrans(m_ptMouseLast, ptd);			this->MoveArrowSelectionOutline(ptd, m_ptdMouseDown, TRUE, TRUE);		} break;		default:			// DEBUG - FIX MAKE THIS COMPILE TIME			ASSERTFAIL();			break;		}		//if (m_bHasMouseCapture) {		//	switch(m_ct) {		//	case eHand:		//		break;		//	case eArrow: 		//		switch(m_arrowSelMode) {		//		case ListViewWindow::eSelectBox:		//			if (this->m_bDragBoxPart) {		//				POINT ptBoxDelta = { - ptDelta.x, - ptDelta.y };		//				this->DragArrowSelectionBoxPart(ptBoxDelta, TRUE);		//				break;		//			}		//			// FALL THRU		//		case ListViewWindow::eSelectItems:		//			POINTD ptd;		//			m_trans.DoInvTrans(m_ptMouseLast, ptd);		//			this->MoveArrowSelectionOutline(ptd, m_ptdMouseDown, TRUE, TRUE);		//			break;		//		default:		//			ASSERTFAIL();		//			break;		//		}		//		break;		//	default:		//		ASSERTFAIL();		//		break;		//	}		//}				// EITHER OF THESE WORKS, FIRST TRANSLATES AS MUCH OF LIST AS POSSIBLE USING A BITBLT		// AND REPAINTS ONLY THE EDGES (BUT INCURS A SLIGHT INACCURACY DUE TO		// DIFFERENCE BETWEEN RE-STRETCHBLTING AND TRANSLATING, AT LEAST WITH SOME VIDEO DRIVERS)#if 1		this->ScrollWindow(ptDelta.x, ptDelta.y, m_rView);		//m_ps->Scroll(ptDelta);		//this->UpdateSpriteOnNextPaint();#else		this->InvalidateRect(m_rView, TRUE);#endif		this->ResetRulers();	}}// ****************************************************************************************// **  STATIC:  class ListViewWindow  *****************************************************// ****************************************************************************************TCHAR ListViewWindow::atstrWindowClassName[] = LISTVIEWWINDOW_CLASSNAME;//6/2 MOVED THIS CODE INTO THE ONE FN THAT CALLED IT, "SetList" (WITH MODS)//void ListViewWindow::ResetSelection(void) {//	switch(m_arrowSelMode) {//	case ListViewWindow::eSelectBox://		this->MoveArrowSelectionBox(FALSE, NULL, FALSE, TRUE);//		// FALL THRU//	case ListViewWindow::eSelectItems: {//		//std::vector<uint>& vsel = m_vsel;//		//vsel.clear();//		//int nList = m_pList->GetCount();//		//vsel.insert(vsel.begin(), nList, ViewableList::eNormal);//		std::vector<uint> vselTemp;//		int nList = m_pList->GetCount();//		vselTemp.insert(vselTemp.begin(), nList, ViewableList::eNormal);//		if (vselTemp != m_vsel) {//			m_vsel = vselTemp;//			this->SendNotification(ListViewWindow::eArrowSelectionItemsChange);//		}//	} break;//	default://		ASSERTFAIL();//		break;//	}////	// 5/30//	// IN THIS ROUTINE WE ARE RESETTING TO DEFAULT STATE, WITHOUT //	// ENSURING INVALIDATION OF DIRTY PAINT REGIONS//	// THE ABOVE CALL TO "MoveArorwSelectionBox" SHOULDN'T BE USED,//	// BUT SHOULD BE OK (IT DOESN'T MAKE USE OF m_pList)//	ListViewWindow::HandSelState handsel;//	//this->SetHandSelection(handsel);//	this->m_handsel = handsel;//}//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -