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

📄 listviewwindow.cpp

📁 虚拟打印机
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	if (m_pList != NULL) {		int nSaveDC = ::SaveDC(hdc);		::IntersectClipRect(hdc, m_rView.left, m_rView.top, m_rView.right, m_rView.bottom);		switch(this->m_arrowSelMode) {			case ListViewWindow::eSelectBox:				// FALL THRU			case ListViewWindow::eSelectItems:				// 7/2				m_pList->Draw(hdc, m_trans, m_rView, m_vsel, m_bDraftMode);				break;			default: 				ASSERTFAIL();				break;		}		::RestoreDC(hdc, nSaveDC);		//::SelectClipRgn(hdc, NULL);		if (m_rHoriz.CanDraw()) {			m_rHoriz.Draw(hdc);		}		if (m_rVert.CanDraw()) {			m_rVert.Draw(hdc);		}	}	RECT r = m_rViewFrame;	::DrawEdge(hdc, &r, EDGE_SUNKEN, BF_RECT);	::InflateRect(&r, -1, -1);	::DrawEdge(hdc, &r, EDGE_SUNKEN, BF_RECT);}void ListViewWindow::PaintDirectLayer(HDC hdc) {	if (m_pList != NULL) {		::IntersectClipRect(hdc, m_rView.left, m_rView.top, m_rView.right, m_rView.bottom);		switch(m_mouseTrackMode) {		case ListViewWindow::eNotTracking:			break;		case ListViewWindow::eTrackViewTranslation:			break;		case ListViewWindow::eTrackDragBoxPart:			break;		case ListViewWindow::eTrackDottedSelection:			this->DrawArrowSelectionOutline(hdc, m_rdArrowSelectionOutline, FALSE, 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) {		//				break;		//			}		//			// FALL THRU		//		case ListViewWindow::eSelectItems:		//			this->DrawArrowSelectionOutline(hdc, m_rdArrowSelectionOutline, FALSE, TRUE);		//			break;		//		default:		//			ASSERTFAIL();		//			break;		//		}		//		break;		//	default:		//		ASSERTFAIL();		//		break;		//	}		//}		::SelectClipRgn(hdc, NULL);	}}void ListViewWindow::CursorMsg(OUT MSGRESULT& mr, UINT msg, WPARAM wParam, LPARAM lParam) {	switch(msg) {	case WM_SETCURSOR: {		// 7/3 ADDED 'IF' BELOW		if (m_pList != NULL) {			HCURSOR hcurs = NULL;			POINT pt;			::GetCursorPos(&pt);			this->ScreenToClient(pt);			if (::PtInRect(& this->m_rView, pt)) {				if (m_arrowSelMode == ListViewWindow::eSelectBox && m_bHasArrowSelectionBox) {					::BoxPart bp;					if (m_ps->BoxPartFromPt(pt, bp)) {						switch(bp) {						case eTopLeft:							hcurs =m_hcursTwoArrowTLBR;							break;						case eTopRight:							hcurs = m_hcursTwoArrowTRBL;							break;						case eBottomRight:								hcurs =m_hcursTwoArrowTLBR;							break;						case eBottomLeft:							hcurs = m_hcursTwoArrowTRBL;							break;						case eTop:						case eRight:						case eBottom:						case eLeft:							hcurs = m_hcursFourArrow;							break;						default:							// DEBUG / FIX -- MAKE COMPILE TIME							ASSERTFAIL();							break;						} // switch(bp)					} // if (m_ps->BoxPartFromPt(pt, bp)) 				} // if (m_arrowSelMode == ListViewWindow::eSelectBox && m_bHasArrowSelectionBox) 				if (hcurs == NULL) {					switch(m_ct) {					case eArrow:	hcurs = m_hcursArrow;	break;					case eHand:		hcurs = m_hcursHand;	break;					default:						ASSERTFAIL();						break;					}				}			} // if (::PtInRect(& this->m_rView, pt)) 			//if (m_pList != NULL /*&& m_pList->GetCount() != 0*/) {			//	switch(m_ct) {			//	case eArrow:	hcurs = m_hcursArrow; break;			//	case eHand:		hcurs = m_hcursHand; break;			//	default:			//		ASSERTFAIL();			//		break;			//	}			//} else {			//	hcurs = m_hcursArrow;			//}			// 7/2 BEFORE ALWAYS CLAIMED MESSAGE WAS PROCESSED, DIDN'T CHECK FOR NULL			if (hcurs != NULL) {				::SetCursor(hcurs);				mr.bProcessed = TRUE;				mr.lRetValue = TRUE;			}		} // if (m_pList != NULL) 	} break;	default:		mr.bProcessed = FALSE;		break;	}}void ListViewWindow::KeyboardMsg(OUT MSGRESULT& mr, UINT msg, WPARAM wParam, LPARAM lParam) {	mr.bProcessed = FALSE;	switch(msg) {	// 7/9	case WM_CHAR:	case WM_KEYUP:	// 7/9	case WM_KEYDOWN:		if (wParam == VK_ESCAPE) {			switch(this->m_mouseTrackMode) {			case ListViewWindow::eNotTracking:				break;			case ListViewWindow::eTrackViewTranslation:				break;			case ListViewWindow::eTrackDragBoxPart:				this->SetArrowSelectionBox(TRUE, &this->m_rdDragBoxPart_InitialSelectionBox);				// FALL THRU			case ListViewWindow::eTrackDottedSelection:				this->EndMouseTracking(TRUE, FALSE);				break;			default:				// DEBUG / FIX MAKE THIS COMPILE-TIME				ASSERTFAIL();				break;			}		}		break;		//if (wParam == VK_ESCAPE && m_bHasMouseCapture) {		//	switch(m_ct) {		//	case eHand:		//		break;		//	case eArrow:		//		this->EndMouseTracking(TRUE, FALSE);		//		break;		//	default:		//		ASSERTFAIL();		//		break;		//	}		//}		//mr.bProcessed = TRUE;		//mr.lRetValue = 0;		//break;	default:		break;	}}void ListViewWindow::MouseMsg(OUT MSGRESULT& mr, UINT msg, WPARAM wParam, LPARAM lParam) {	switch(msg) {	case WM_CAPTURECHANGED:		if (! this->IsMyWindowHandle((HWND) lParam) && /*m_bHasMouseCapture*/ m_mouseTrackMode != eNotTracking) {			this->EndMouseTracking(TRUE, FALSE);		}		break;	case WM_LBUTTONDOWN: 		m_ptMouseDown.x = LOWORD(lParam);		m_ptMouseDown.y = HIWORD(lParam);		m_ptMouseLast = m_ptMouseDown;		// 7/3		if (m_arrowSelMode == ListViewWindow::eSelectBox && m_bHasArrowSelectionBox) {			::BoxPart bp;			if (m_ps->BoxPartFromPt(m_ptMouseDown, bp)) {				//this->m_bDragBoxPart = TRUE;				this->m_bpMouseDrag = bp;				//6/1				m_rdDragBoxPart_InitialSelectionBox = m_rdSelectionBox;				m_ptdLastGoodDragDelta.x = m_ptdLastGoodDragDelta.y = 0;				this->StartMouseTracking(ListViewWindow::eTrackDragBoxPart);				//break;			} 		}		// 7/3 NEW IF		if (m_mouseTrackMode == ListViewWindow::eNotTracking) {			switch(m_ct) {			case eHand: 				if (m_pList != NULL) {					POINTD ptd;					m_trans.DoInvTrans(m_ptMouseDown, ptd);					uint uiHitItem;					BOOL bHitItem = m_pList->ItemFromPt(uiHitItem, ptd);					ListViewWindow::HandSelState handsel(bHitItem, uiHitItem);					this->SetHandSelection(handsel);					this->StartMouseTracking(ListViewWindow::eTrackViewTranslation);				}				break;			case eArrow: 				switch(m_arrowSelMode) {				case ListViewWindow::eSelectBox: 					// 7/3					// MOVED TEST ABOVE					// SO NOW JUST FALL THRU					////this->m_bDragBoxPart = FALSE;					//if (m_bHasArrowSelectionBox) {					//	::BoxPart bp;					//	if (m_ps->BoxPartFromPt(m_ptMouseDown, bp)) {					//		//this->m_bDragBoxPart = TRUE;					//		this->m_bpMouseDrag = bp;					//		//6/1					//		m_rdDragBoxPart_InitialSelectionBox = m_rdSelectionBox;					//		this->StartMouseTracking(ListViewWindow::eTrackDragBoxPart);					//		break;					//	} 					//}					//// FALL THRU				case ListViewWindow::eSelectItems: 					m_trans.DoInvTrans(m_ptMouseDown, m_ptdMouseDown);					this->MoveArrowSelectionOutline(m_ptdMouseDown, m_ptdMouseDown, FALSE, TRUE);					this->StartMouseTracking(ListViewWindow::eTrackDottedSelection);					break;				default:					ASSERTFAIL();					break;				}				break;			default:				ASSERTFAIL();				break;			}		} // if (m_mouseTrackMode == ListViewWindow::eNotTracking) 		break;	case WM_LBUTTONUP: {		POINT pt = { MAKEPOINTS(lParam).x, MAKEPOINTS(lParam).y };		if (/*m_bHasMouseCapture*/ m_mouseTrackMode != ListViewWindow::eNotTracking) {			//7/8			if (m_mouseTrackMode == ::ListViewWindow::eTrackViewTranslation && ::PtInRect(&m_rView, pt)) {				POINTD ptdNewSrcOrg;				m_trans.DoInvTrans(pt, ptdNewSrcOrg);				m_trans.SetNewOrgs(ptdNewSrcOrg, pt);			}			m_ptMouseLast = pt;			BOOL bCtrl = (wParam & MK_CONTROL) != 0;			this->EndMouseTracking(FALSE, bCtrl);		}	} break;	case WM_MOUSEMOVE: 		if (m_mouseTrackMode != ListViewWindow::eNotTracking) {			POINT pt = { MAKEPOINTS(lParam).x, MAKEPOINTS(lParam).y };			POINT ptDelta = { pt.x - this->m_ptMouseLast.x, pt.y - m_ptMouseLast.y };			m_ptMouseLast = pt;			switch(m_mouseTrackMode) {			case ListViewWindow::eTrackViewTranslation: 				this->Translate(ptDelta);				break;			case ListViewWindow::eTrackDragBoxPart: {				// 7/7 DEBUG/FIX TRY TO GET MOUSE TO STAY W/BOX PART BETTER				//this->DragArrowSelectionBoxPart(ptDelta, FALSE);				//break;				POINT ptDeltaNew = { pt.x - this->m_ptMouseDown.x, pt.y - this->m_ptMouseDown.y };				this->DragArrowSelectionBoxPart(ptDeltaNew, FALSE);			} break;			case ListViewWindow::eTrackDottedSelection: {				POINTD ptd;				m_trans.DoInvTrans(pt, ptd);				this->MoveArrowSelectionOutline(m_ptdMouseDown, ptd, TRUE, TRUE);			} break;			default:				// DEBUG / FIX MAKE THIS A COMPILE-TIME ERROR				ASSERTFAIL();				break;			}		}		break;		//if (m_bHasMouseCapture) {		//	POINT pt = { MAKEPOINTS(lParam).x, MAKEPOINTS(lParam).y };		//	switch(m_ct) {		//	case eHand: {		//		POINT ptDelta = { pt.x - this->m_ptMouseLast.x, pt.y - m_ptMouseLast.y };		//		this->Translate(ptDelta);		//	} break;		//	case eArrow: 		//		switch(m_arrowSelMode) {		//		case ListViewWindow::eSelectBox:		//			if (this->m_bDragBoxPart) {		//				POINT ptDelta = { pt.x - this->m_ptMouseLast.x, pt.y - m_ptMouseLast.y };		//				this->DragArrowSelectionBoxPart(ptDelta, FALSE);		//				break;		//			}		//			// FALL THRU		//		case ListViewWindow::eSelectItems: {		//			POINTD ptd;		//			m_trans.DoInvTrans(pt, ptd);		//			this->MoveArrowSelectionOutline(m_ptdMouseDown, ptd, TRUE, TRUE);		//		} break;		//		default:		//			ASSERTFAIL();		//			break;		//		}		//		break;		//	default:		//		ASSERTFAIL();		//		break;		//	}		//	m_ptMouseLast = pt;		//}		break;	default: 		mr.bProcessed = FALSE;		break;	}}void ListViewWindow::TimerMsg(OUT MSGRESULT& mr, WPARAM wParam, LPARAM lParam) {	mr.bProcessed = FALSE;	switch(wParam) {		// DEBUG#if 0	case 200:		this->DoUpdateSprite();		break;#endif 	case ID_SCROLLTIMER:		if (/*m_bHasMouseCapture*/ m_mouseTrackMode != ListViewWindow::eNotTracking) {			if ( ! PtInRect(&m_rView, m_ptMouseLast)) {				POINT ptDelta = { 0, 0 };				if (m_ptMouseLast.x < m_rView.left) {					ptDelta.x = -1 - (m_rView.left - m_ptMouseLast.x) / MOUSEOUTOBACCEL_GRID;				} else if (m_ptMouseLast.x >= m_rView.right) {					ptDelta.x = 1 + (1 + m_ptMouseLast.x - m_rView.right) / MOUSEOUTOBACCEL_GRID;				} 				if (m_ptMouseLast.y < m_rView.top) {					ptDelta.y = -1 - (m_rView.top - m_ptMouseLast.y) / MOUSEOUTOBACCEL_GRID;				} else if (m_ptMouseLast.y >= m_rView.bottom) {					ptDelta.y = 1 + (1 + m_ptMouseLast.y - m_rView.bottom) / MOUSEOUTOBACCEL_GRID;				}				switch(m_mouseTrackMode) {				case ListViewWindow::eTrackViewTranslation:					break;				case ListViewWindow::eTrackDottedSelection:					// FALL THRU				case ListViewWindow::eTrackDragBoxPart:					ptDelta.x = -ptDelta.x;					ptDelta.y = -ptDelta.y;					break;				default:					// DEBUG / FIX -- MAKE THS COMPILE TIME					ASSERTFAIL();					break;				}				//switch(m_ct) {				//case eHand:				//	break;				//case eArrow:				//	ptDelta.x = -ptDelta.x;				//	ptDelta.y = -ptDelta.y;				//	break;				//default:				//	ASSERTFAIL();				//	break;				//}				this->Translate(ptDelta);			}		}		break;	default:		break;	}}// ****// **** private:// ****void ListViewWindow::CalculateLayout(void) {	m_rViewFrame = this->rClient();	m_rViewFrame.top += RULER_SIZE;	m_rViewFrame.left += RULER_SIZE;	m_rView = m_rViewFrame;	::InflateRect(&m_rView, -FRAME_SIZE, -FRAME_SIZE);	m_rHorizRuler.left = m_rViewFrame.left + FRAME_SIZE;	m_rHorizRuler.right = m_rViewFrame.right - FRAME_SIZE;	m_rHorizRuler.bottom = m_rViewFrame.top;	m_rHorizRuler.top = 0;	m_rVertRuler.top = m_rViewFrame.top + FRAME_SIZE;	m_rVertRuler.bottom = m_rViewFrame.bottom - FRAME_SIZE;	m_rVertRuler.right = m_rViewFrame.left;	m_rVertRuler.left = 0;}void ListViewWindow::DragArrowSelectionBoxPart(const POINT& ptDelta, BOOL bWithPaint) {	// 7/7 TRY TO GET MOUSE TO STAY W/PART BETTER	//POINT ptOrg = { 0, 0 };	//POINTD ptd1;	//m_trans.DoInvTrans(ptOrg, ptd1);	//POINTD ptd2;	//m_trans.DoInvTrans(ptDelta, ptd2);	//POINTD ptdDelta = { ptd2.x - ptd1.x, ptd2.y - ptd1.y };	//RECTD rd = m_rdSelectionBox;	//::OffsetBoxPart(rd, ptdDelta, this->m_bpMouseDrag);	//RECTD rdAdjusted;	//if (this->IsValidArrowSelectionBox(rdAdjusted, rd)) {	//	this->MoveArrowSelectionBox(TRUE, &rdAdjusted, bWithPaint, FALSE);	//}	POINT ptOrg = { 0, 0 };	POINTD ptd1;	m_trans.DoInvTrans(ptOrg, ptd1);	POINTD ptd2;	m_trans.DoInvTrans(ptDelta, ptd2);	BOOL bDone = FALSE;	POINTD ptdDelta = { ptd2.x - ptd1.x, ptd2.y - ptd1.y };	{		RECTD rd = m_rdDragBoxPart_InitialSelectionBox;		::OffsetBoxPart(rd, ptdDelta, this->m_bpMouseDrag);		RECTD rdAdjusted;		if (this->IsValidArrowSelectionBox(rdAdjusted, rd)) {			this->MoveArrowSelectionBox(TRUE, &rdAdjusted, bWithPaint, FALSE);			m_ptdLastGoodDragDelta = ptdDelta;			bDone = TRUE;		}	}	if (!bDone) {		POINTD ptdDeltaFallBack = { ptdDelta.x, m_ptdLastGoodDragDelta.y };		RECTD rd = m_rdDragBoxPart_InitialSelectionBox;		::OffsetBoxPart(rd, ptdDeltaFallBack, this->m_bpMouseDrag);		RECTD rdAdjusted;		if (this->IsValidArrowSelectionBox(rdAdjusted, rd)) {			this->MoveArrowSelectionBox(TRUE, &rdAdjusted, bWithPaint, FALSE);			m_ptdLastGoodDragDelta = ptdDeltaFallBack;			bDone = TRUE;		}	}	if (!bDone) {		POINTD ptdDeltaFallBack = { m_ptdLastGoodDragDelta.x, ptdDelta.y };		RECTD rd = m_rdDragBoxPart_InitialSelectionBox;		::OffsetBoxPart(rd, ptdDeltaFallBack, this->m_bpMouseDrag);		RECTD rdAdjusted;		if (this->IsValidArrowSelectionBox(rdAdjusted, rd)) {			this->MoveArrowSelectionBox(TRUE, &rdAdjusted, bWithPaint, FALSE);			m_ptdLastGoodDragDelta = ptdDeltaFallBack;			bDone = TRUE;		}	}}// ASSUME NO CLIP RGN, AND ON EXIT REMOVES CLIP RGNvoid ListViewWindow::DrawArrowSelectionOutline(	OUT HDC hdc, IN const RECTD& rdMouseSelOld, IN BOOL bEraseOld, IN BOOL bDrawNew) {	ArrowSelectionOutlineDirectPainter mdp(rdMouseSelOld, m_rdArrowSelectionOutline, bEraseOld, bDrawNew, m_rView, m_trans);	if (hdc != NULL) {		mdp.PaintDirect(hdc);	} else {

⌨️ 快捷键说明

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