📄 listviewwindow.cpp
字号:
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 + -