LRESULT CVideoMarkup::OnButtonUp( UINT, WPARAM, LPARAM lParam, BOOL&) { POINT p; p.x = LOWORD(lParam); p.y = HIWORD(lParam); if (draggingIcon) { // we just completed an icon drag // End the drag-and-drop process draggingIcon = FALSE; ImageList_DragLeave(m_sampleListView); ImageList_EndDrag(); ImageList_Destroy(hDragImageList); SetCursor(LoadCursor(NULL, IDC_ARROW)); ReleaseCapture(); // Determine the position of the drop point LVHITTESTINFO lvhti; lvhti.pt = p; ClientToScreen(&lvhti.pt); ::ScreenToClient(m_sampleListView, &lvhti.pt); ListView_HitTestEx(m_sampleListView, &lvhti); CRect posRect, negRect, motionRect, rangeRect; ListView_GetGroupRect(m_sampleListView, GROUPID_POSSAMPLES, LVGGR_GROUP, &posRect); ListView_GetGroupRect(m_sampleListView, GROUPID_NEGSAMPLES, LVGGR_GROUP, &negRect); ListView_GetGroupRect(m_sampleListView, GROUPID_MOTIONSAMPLES, LVGGR_GROUP, &motionRect); ListView_GetGroupRect(m_sampleListView, GROUPID_RANGESAMPLES, LVGGR_GROUP, &rangeRect); int newGroupId; if (posRect.PtInRect(lvhti.pt)) newGroupId = GROUPID_POSSAMPLES; else if (negRect.PtInRect(lvhti.pt)) newGroupId = GROUPID_NEGSAMPLES; else if (motionRect.PtInRect(lvhti.pt)) newGroupId = GROUPID_MOTIONSAMPLES; else if (rangeRect.PtInRect(lvhti.pt)) newGroupId = GROUPID_RANGESAMPLES; else newGroupId = GROUPID_TRASH; // update group membership of selected items based on drop location int numSelected = ListView_GetSelectedCount(m_sampleListView); int iSelection = -1; for (int iIndex=0; iIndex<numSelected; iIndex++) { // retrieve the selected item LVITEM lvi; iSelection = ListView_GetNextItem(m_sampleListView, iSelection, LVNI_SELECTED); lvi.mask = LVIF_IMAGE | LVIF_STATE | LVIF_GROUPID; lvi.state = 0; lvi.stateMask = 0; lvi.iItem = iSelection; lvi.iSubItem = 0; ListView_GetItem(m_sampleListView, &lvi); // Get the ID of this selected item UINT sampleId = ListView_MapIndexToID(m_sampleListView, iSelection); // test if this is an allowable group membership change int origGroupId = sampleSet.GetOriginalSampleGroup(sampleId); if (!GroupTransitionIsAllowed(origGroupId, newGroupId)) { // this is not a valid change so we'll move to the next item continue; } // update sample group in training set sampleSet.SetSampleGroup(sampleId, newGroupId); // Update item in list view with new group id lvi.iGroupId = newGroupId; ListView_SetItem(m_sampleListView, &lvi); } m_sampleListView.Invalidate(FALSE); } else if (m_videoLoader.videoLoaded && selectingRegion) { // we just finished drawing a selection ClipCursor(NULL); // restore full cursor movement if (!m_videoRect.PtInRect(p)) { InvalidateRect(&m_videoRect,FALSE); return 0; } selectingRegion = false; Rect selectRect; selectRect.X = (INT) min(selectStart.X, selectCurrent.X); selectRect.Y = (INT) min(selectStart.Y, selectCurrent.Y); selectRect.Width = (INT) abs(selectStart.X - selectCurrent.X); selectRect.Height = (INT) abs(selectStart.Y - selectCurrent.Y); Rect drawBounds(0,0,VIDEO_X,VIDEO_Y); selectRect.Intersect(drawBounds); double scaleX = ((double)m_videoLoader.videoX) / ((double)VIDEO_X); double scaleY = ((double)m_videoLoader.videoY) / ((double)VIDEO_Y); selectRect.X = (INT) (scaleX * selectRect.X); selectRect.Y = (INT) (scaleY * selectRect.Y); selectRect.Width = (INT) (scaleX * selectRect.Width); selectRect.Height = (INT) (scaleY * selectRect.Height); // discard tiny samples since they won't help if ((selectRect.Width > 10) && (selectRect.Height > 10)) { TrainingSample *sample; // if we're in motion mode, the behavior is a little special if (recognizerMode == MOTION_FILTER) { sample = new TrainingSample(m_videoLoader.copyFrame, m_videoLoader.GetMotionHistory(), m_sampleListView, m_hImageList, selectRect, GROUPID_MOTIONSAMPLES); } else { sample = new TrainingSample(m_videoLoader.copyFrame, m_sampleListView, m_hImageList, selectRect, currentGroupId); } sampleSet.AddSample(sample); } InvalidateRect(&m_videoRect, FALSE); } return 0; }
//------------------------------------------------------------------------ //! Find the group-id below the given point //! //! @param point Mouse position //! @return ID of the group //------------------------------------------------------------------------ int CGridListCtrlGroups::GroupHitTest(const CPoint& point) { if (!IsGroupViewEnabled()) return -1; if (HitTest(point)!=-1) return -1; if (IsGroupStateEnabled()) { #if _WIN32_WINNT >= 0x0600 #ifdef ListView_HitTestEx #ifdef LVHT_EX_GROUP #ifdef ListView_GetGroupInfoByIndex LVHITTESTINFO lvhitinfo = {0}; lvhitinfo.pt = point; ListView_HitTestEx(m_hWnd, &lvhitinfo); if ((lvhitinfo.flags & LVHT_EX_GROUP)==0) return -1; LVGROUP lg = {0}; lg.cbSize = sizeof(lg); lg.mask = LVGF_GROUPID; VERIFY( ListView_GetGroupInfoByIndex(m_hWnd, lvhitinfo.iGroup, &lg) ); return lg.iGroupId; #endif #endif #endif #endif } if (IsGroupStateEnabled()) { // Running on Vista or newer, but compiled without _WIN32_WINNT >= 0x0600 #ifndef LVM_GETGROUPINFOBYINDEX #define LVM_GETGROUPINFOBYINDEX (LVM_FIRST + 153) #endif #ifndef LVM_GETGROUPCOUNT #define LVM_GETGROUPCOUNT (LVM_FIRST + 152) #endif #ifndef LVM_GETGROUPRECT #define LVM_GETGROUPRECT (LVM_FIRST + 98) #endif #ifndef LVGGR_HEADER #define LVGGR_HEADER (1) #endif LRESULT groupCount = SNDMSG((m_hWnd), LVM_GETGROUPCOUNT, (WPARAM)0, (LPARAM)0); if (groupCount <= 0) return -1; for(int i = 0 ; i < groupCount; ++i) { LVGROUP lg = {0}; lg.cbSize = sizeof(lg); lg.mask = LVGF_GROUPID; VERIFY( SNDMSG((m_hWnd), LVM_GETGROUPINFOBYINDEX, (WPARAM)(i), (LPARAM)(&lg)) ); CRect rect(0,LVGGR_HEADER,0,0); VERIFY( SNDMSG((m_hWnd), LVM_GETGROUPRECT, (WPARAM)(lg.iGroupId), (LPARAM)(RECT*)(&rect)) ); if (rect.PtInRect(point)) return lg.iGroupId; } // Don't try other ways to find the group return -1; } // We require that each group contains atleast one item if (GetItemCount()==0) return -1; // This logic doesn't support collapsible groups int nFirstRow = -1; CRect gridRect; GetWindowRect(&gridRect); for(CPoint pt = point ; pt.y < gridRect.bottom ; pt.y += 2) { nFirstRow = HitTest(pt); if (nFirstRow!=-1) break; } if (nFirstRow==-1) return -1; int nGroupId = GetRowGroupId(nFirstRow); // Extra validation that the above row belongs to a different group int nAboveRow = GetNextItem(nFirstRow,LVNI_ABOVE); if (nAboveRow!=-1 && nGroupId==GetRowGroupId(nAboveRow)) return -1; return nGroupId; }
LRESULT CVideoMarkup::OnMouseMove( UINT, WPARAM wParam, LPARAM lParam, BOOL& ) { POINT p; p.x = LOWORD(lParam); p.y = HIWORD(lParam); if ((wParam & MK_LBUTTON) || (wParam & MK_RBUTTON)) { // mouse is down if (draggingIcon) { // we are dragging in listview // Determine which group the cursor is over LVHITTESTINFO lvhti; lvhti.pt = p; ClientToScreen(&lvhti.pt); ::ScreenToClient(m_sampleListView, &lvhti.pt); ListView_HitTestEx(m_sampleListView, &lvhti); CRect posRect, negRect, motionRect, rangeRect; ListView_GetGroupRect(m_sampleListView, GROUPID_POSSAMPLES, LVGGR_GROUP, &posRect); ListView_GetGroupRect(m_sampleListView, GROUPID_NEGSAMPLES, LVGGR_GROUP, &negRect); ListView_GetGroupRect(m_sampleListView, GROUPID_MOTIONSAMPLES, LVGGR_GROUP, &motionRect); ListView_GetGroupRect(m_sampleListView, GROUPID_RANGESAMPLES, LVGGR_GROUP, &rangeRect); if (posRect.PtInRect(lvhti.pt)) { // highlight positive group SetCursor(hDropCursor); dragHover = true; hoverRect.X = posRect.left; hoverRect.Y = posRect.top; hoverRect.Width = posRect.Width(); hoverRect.Height = posRect.Height(); } else if (negRect.PtInRect(lvhti.pt)) { // highlight negative group SetCursor(hDropCursor); dragHover = true; hoverRect.X = negRect.left; hoverRect.Y = negRect.top; hoverRect.Width = negRect.Width(); hoverRect.Height = negRect.Height(); } else if (motionRect.PtInRect(lvhti.pt)) { // highlight motion group SetCursor(hDropCursor); dragHover = true; hoverRect.X = motionRect.left; hoverRect.Y = motionRect.top; hoverRect.Width = motionRect.Width(); hoverRect.Height = motionRect.Height(); } else if (rangeRect.PtInRect(lvhti.pt)) { // highlight gesture group SetCursor(hDropCursor); dragHover = true; hoverRect.X = rangeRect.left; hoverRect.Y = rangeRect.top; hoverRect.Width = rangeRect.Width(); hoverRect.Height = rangeRect.Height(); } else { SetCursor(hTrashCursor); dragHover = false; } // update listview to highlight group on hover m_sampleListView.RedrawWindow(); // draw drag icon ClientToScreen(&p); ImageList_DragMove(p.x, p.y); } else if (m_videoLoader.videoLoaded) { // we are selecting a region if (!m_videoRect.PtInRect(p)) return 0; selectCurrent.X = (REAL) p.x; selectCurrent.Y = (REAL) p.y; InvalidateRgn(activeRgn, FALSE); } } return 0; }