void CListViewCtrlEx::OnMouseMove(UINT nFlags, CPoint point) { TRACKMOUSEEVENT trkMouse; trkMouse.cbSize = sizeof( TRACKMOUSEEVENT ); trkMouse.dwFlags = TME_LEAVE; trkMouse.hwndTrack = m_hWnd; // notify when the mouse leaves button _TrackMouseEvent( &trkMouse ); CRect rcItem; LVHITTESTINFO hti; hti.pt = point; SubItemHitTest( &hti ); if( m_nHoverItem != hti.iItem || m_nHoverSubItem != hti.iSubItem) { m_nHoverItem = hti.iItem; m_nHoverSubItem = hti.iSubItem; _FireEvent(WMH_LISTEX_HOVERCHANGED, m_nHoverItem); KillTimer(XX_TIMER_ID_TIPS); //CBkSafeTip::Hide(); } static CPoint ptLast; if (ptLast != point && hti.iItem != -1) SetTimer(XX_TIMER_ID_TIPS, 200); ptLast = point; }
void CHappyGoDlg::OnMouseMove(UINT nFlags, CPoint point) { if (! ::g_global.bEnableUserType) { return CListCtrl::OnMouseMove(nFlags, point);; } CString str; LVHITTESTINFO lvhti; // 判断鼠标当前所在的位置(行, 列) lvhti.pt = point; SubItemHitTest(&lvhti); if (lvhti.iItem == -1) { m_toolTip.Activate(false); } // 如果鼠标移动到另一个单元格内, 则进行处理; 否则, 不做处理 if((lvhti.iItem != m_nItem)) { // 保存当前鼠标所在的(行,列) m_nItem = lvhti.iItem; m_nSubItem = lvhti.iSubItem; // 如果鼠标移动到一个合法的单元格内,则显示新的提示信息 if((m_nItem != -1) && (m_nSubItem == 0)) { m_toolTip.DelTool(this); UserItemStruct * pUserItem=(UserItemStruct *)GetItemData(m_nItem); CString strType="玩家类型:"; int nType = pUserItem->GameUserInfo.userType; m_toolTip.SetTipTextColor(RGB(255,0,0)); if (nType ==1) { strType += "电视比赛玩家"; } else if (nType == 2) { strType += "VIP玩家"; } else if (nType == 3) { strType += "电视比赛VIP玩家"; } else { strType += "普通玩家"; m_toolTip.SetTipTextColor(RGB(0,0,255)); } m_toolTip.AddTool(this, strType); m_toolTip.UpdateTipText(strType,this); m_toolTip.Update(); // 显示提示框 m_toolTip.Activate(true); } else return; } CListCtrl::OnMouseMove(nFlags, point); }
BOOL CCPListCtrl::PreTranslateMessage(MSG *pMsg) { if (pMsg->message == WM_LBUTTONDOWN) { // Get cell position for CustomDraw CPoint pt(pMsg->pt); ScreenToClient(&pt); LVHITTESTINFO htinfo = {0}; htinfo.pt = pt; int index = SubItemHitTest(&htinfo); // Ignore any clicks not on an item or not on cloumn 0 or 1 if (index != -1 && (htinfo.iSubItem == 0 || htinfo.iSubItem == 1) && !(htinfo.flags & (LVHT_NOWHERE | LVHT_ABOVE | LVHT_BELOW | LVHT_TORIGHT | LVHT_TOLEFT))) { if ((GetKeyState(VK_CONTROL) & 0x8000) && m_column != htinfo.iSubItem) { // Multi-select - can't change column return TRUE; } m_row = htinfo.iItem; m_column = htinfo.iSubItem; } } return CListCtrl::PreTranslateMessage(pMsg); }
void CListEditCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) { LVHITTESTINFO hi; hi.pt = point; if(SubItemHitTest(&hi) != -1) { m_Row = hi.iItem; m_Col = hi.iSubItem; if(m_EditItem.m_hWnd == NULL) { RECT rect; rect.left = rect.top = 0; rect.bottom = 20; rect.right = 100; m_EditItem.Create(WS_CHILD | ES_LEFT | WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN | ES_MULTILINE, rect, this, IDC_MY_LIST_EDITBOX); m_EditItem.SetFont(this->GetFont(), FALSE); } CRect rect; GetSubItemRect(hi.iItem, hi.iSubItem, LVIR_BOUNDS, rect); m_EditItem.SetWindowText(this->GetItemText(hi.iItem, hi.iSubItem)); m_EditItem.MoveWindow(&rect, TRUE); m_EditItem.ShowWindow(1); } CListCtrl::OnLButtonDblClk(nFlags, point); }
void CListControlEx::OnLButtonDown( UINT nFlags, CPoint point ) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CListCtrl::OnLButtonDown(nFlags, point); CRect rcCtrl; LVHITTESTINFO lvhti; lvhti.pt = point; m_nItem =SubItemHitTest(&lvhti); if (m_nItem == -1) return; m_nSubItem = lvhti.iSubItem; GetSubItemRect(m_nItem,m_nSubItem,LVIR_LABEL,rcCtrl); if (m_Edit_ctlItem.m_hWnd == NULL) { m_Edit_ctlItem.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,99); m_Edit_ctlItem.ShowWindow(SW_HIDE); m_FontItem.CreateStockObject(DEFAULT_GUI_FONT); m_Edit_ctlItem.SetFont(&m_FontItem); m_FontItem.DeleteObject(); } CString strItem=GetItemText(m_nItem,m_nSubItem); m_Edit_ctlItem.MoveWindow(&rcCtrl); m_Edit_ctlItem.ShowWindow(SW_SHOW); m_Edit_ctlItem.SetWindowText(strItem); m_Edit_ctlItem.SetFocus(); m_Edit_ctlItem.SetSel(-1); }
void CReportCtrlEx2::_MouseClkMonitor(UINT nMsg, UINT nFlags, CPoint point, BOOL bTriggerEdit) { LVHITTESTINFO hti; hti.pt = point; const int IDX = SubItemHitTest(&hti); const BOOL BEFORE = CListCtrl::GetCheck(IDX) > 0; const BOOL WAS_EDIT = _IsEditVisible(); EndItem(TRUE); const BOOL WASACTIVE = bTriggerEdit ? ExamItemStates(IDX, RC_ITEM_FOCUSED | RC_ITEM_SELECTED) : FALSE; switch (nMsg) { case WM_LBUTTONDOWN: CListCtrl::OnLButtonDown(nFlags, point); break; case WM_LBUTTONDBLCLK: CListCtrl::OnLButtonDblClk(nFlags, point); break; case WM_MBUTTONDOWN: CListCtrl::OnMButtonDown(nFlags, point); break; case WM_MBUTTONDBLCLK: CListCtrl::OnMButtonDblClk(nFlags, point); break; case WM_RBUTTONDOWN: CListCtrl::OnRButtonDown(nFlags, point); break; case WM_RBUTTONDBLCLK: CListCtrl::OnRButtonDblClk(nFlags, point); break; default: break; } const BOOL STATSCHANGED = _ItemCheckMonitor(IDX, BEFORE, CListCtrl::GetCheck(IDX) > 0, nMsg); if (bTriggerEdit && m_bAllowEdit && !STATSCHANGED && !WAS_EDIT && WASACTIVE) { if (hti.iSubItem == 4 || hti.iSubItem == 5) { m_bEdit = FALSE; StartDateTimeCtrl(IDX, hti.iSubItem); } else { m_bEdit = TRUE; StartEdit(IDX, hti.iSubItem); } } }
BOOL CWaitingUserList::OnToolNeedText( UINT id, NMHDR* pNMHDR, LRESULT* pResult ) { CRect rc; GetWindowRect(&rc); CPoint pot; GetCursorPos(&pot); pot.x = pot.x - rc.left; pot.y = pot.y - rc.top; LVHITTESTINFO LVHTestInfo; LVHTestInfo.pt = pot; HitTest(&LVHTestInfo); int iItem = LVHTestInfo.iItem;//获得行 SubItemHitTest(&LVHTestInfo); int iSubItem = LVHTestInfo.iSubItem;//获得列 if (iItem >= 0 && iItem < GetItemCount()) { IUserItem * pUserItem = (IUserItem*)GetItemData(iItem);//获取该选中项信息 if (pUserItem != NULL && pUserItem->GetUserUIN() != 0) { int columnCount = GetHeaderCtrl()->GetItemCount();//获得总列数 if (iSubItem >= 0 && iSubItem < columnCount) { if (iSubItem < 4) { std::wstring strTip; if (iSubItem == 1) { strTip = ListIconManager::GetIconTipByIndex(USERLIST_ICON_WAIT_MIC); } else { strTip = ListIconManager::GetIconTipByIndex(pUserItem->GetListIconIndex(iSubItem)); } if (strTip != L"") { TOOLTIPTEXTW* pTT = (TOOLTIPTEXT*) pNMHDR; wcscpy(pTT->szText,strTip.c_str()); } } else if (4 == iSubItem)//昵称 {//显示相关信息 std::wstring strName = pUserItem->GetUserName() + L"(" + common::utility::stringhelper::IntToString(pUserItem->GetUser179ID()) + L")"; TOOLTIPTEXTW* pTT = (TOOLTIPTEXT*) pNMHDR; wcscpy(pTT->szText,strName.c_str()); } } } } *pResult = 1; return TRUE; }
BOOL CSubTooltipListCtrl::OnToolTipText(UINT /*id*/, NMHDR * pNMHDR, LRESULT * pResult) { if (pProvider == NULL) return FALSE; TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; // Ignore messages from the built in tooltip, we are processing them internally if( (pNMHDR->idFrom == (UINT_PTR)m_hWnd) && ( ((pNMHDR->code == TTN_NEEDTEXTA) && (pTTTA->uFlags & TTF_IDISHWND)) || ((pNMHDR->code == TTN_NEEDTEXTW) && (pTTTW->uFlags & TTF_IDISHWND)) ) ) { return FALSE; } *pResult = 0; //Get the mouse position const MSG* pMessage = GetCurrentMessage(); CPoint pt; pt = pMessage->pt; ScreenToClient(&pt); // Check if the point falls onto a list item LVHITTESTINFO lvhitTestInfo; lvhitTestInfo.pt = pt; int nItem = SubItemHitTest(&lvhitTestInfo); if (lvhitTestInfo.flags & LVHT_ONITEM) { // we want multiline tooltips ::SendMessage(pNMHDR->hwndFrom, TTM_SETMAXTIPWIDTH, 0, INT_MAX); CString strTipText = pProvider->GetToolTipText(nItem, lvhitTestInfo.iSubItem); //Deal with UNICODE #ifndef _UNICODE if (pNMHDR->code == TTN_NEEDTEXTA) StringCchCopy(pTTTA->szText, _countof(pTTTA->szText), strTipText); else _mbstowcsz(pTTTW->szText, strTipText, 80); #else if (pNMHDR->code == TTN_NEEDTEXTA) _wcstombsz(pTTTA->szText, strTipText, 80); else StringCchCopy(pTTTW->szText, _countof(pTTTW->szText), strTipText); #endif return TRUE; //We found a tool tip, //tell the framework this message has been handled } return FALSE; //We didn't handle the message, //let the framework continue propagating the message }
void CListControlEx::OnLButtonDblClk( UINT nFlags, CPoint point ) { LVHITTESTINFO lvhti; lvhti.pt = point; int nItem = SubItemHitTest(&lvhti); if (nItem == -1)//插入一行 { InsertItem(GetItemCount()+1,L""); } }
void CWatchList::OnLButtonDblClk(UINT nFlags, CPoint point) { SetFocus(); LVHITTESTINFO lvhti; lvhti.pt = point; SubItemHitTest(&lvhti); if (lvhti.flags & LVHT_ONITEMLABEL) EditLabel(lvhti.iItem); else CCJListCtrl::OnLButtonDblClk(nFlags, point); }
BOOL CListViewCtrlEx::OnSetCursor(CWindow wnd, UINT nHitTest, UINT message) { CPoint pt; GetCursorPos( &pt ); ScreenToClient( &pt ); LVHITTESTINFO hti; hti.pt = pt; SubItemHitTest( &hti ); bool bInLink = _PtInSubItemLink(pt, hti.iItem, hti.iSubItem); ::SetCursor(::LoadCursor(NULL, bInLink?IDC_HAND:IDC_ARROW)); return TRUE; }
BOOL CSListCtrl::OnClick(NMHDR* pNMHDR, LRESULT* pResult) { NMITEMACTIVATE* pNMActivate = (NMITEMACTIVATE*)pNMHDR; *pResult = 0; int nItem = -1; //+++ LVHITTESTINFO lvhit; lvhit.pt = pNMActivate->ptAction; SubItemHitTest(&lvhit); if (lvhit.flags & LVHT_ONITEM) { nItem = lvhit.iItem; } if(nItem != -1) { CRect rect; int nSubItem = -1; // check if a subitem checkbox was clicked for (int i = 0; i < GetHeaderCtrl()->GetItemCount(); i++) { GetSubItemRect(nItem, i, LVIR_BOUNDS, rect); if (rect.PtInRect(pNMActivate->ptAction)) { nSubItem = i; break; } } if (nSubItem != -1) { int nChecked = GetItemCheckedState(nItem, nSubItem); if (nChecked != SHC_NONE_CHECK_BOX && IsPtInSubItemCheckBox(nItem, nSubItem, pNMActivate->ptAction)) { nChecked = SwitchCheckedState(nChecked); SetItemCheckedStateByClick(nItem, nSubItem, nChecked, TRUE); } } } return FALSE; }
// CHgzListCtrl 消息处理程序 void CHgzListCtrl::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 BOOL bSelected = FALSE; // 得到被点击的Item LVHITTESTINFO testinfo; testinfo.pt = point; //点击时的鼠标位置 //testinfo.flags = LVHT_ONITEM; //点击的必须不是标题 if( SubItemHitTest(&testinfo)<0 ) goto defalt_session; //没有点在有效区域,不进入编辑 // 检查是否有Item正被编辑 if (m_bEditing == TRUE) { if (m_nItem == testinfo.iItem && m_nSubItem == testinfo.iSubItem) goto defalt_session; else EndEdit(TRUE); } int m = m_nItem; int n = m_nSubItem; m_nItem = testinfo.iItem; //被点击表项的行号 m_nSubItem = testinfo.iSubItem; //被点击表项的列号 Update(m); if(m_nSubItem == 0) { bSelected = IsItemSelected(m_nItem) && GetSelectedCount() == 1; goto defalt_session; //点中第一列,不编辑 } // 开始编辑 CListCtrl::OnLButtonDown(nFlags, point); m_bEditing = BeginEdit(); return; defalt_session: CListCtrl::OnLButtonDown(nFlags, point); if (m_nSubItem == 0 && bSelected) { SetItemState(m_nItem, 0, LVIS_SELECTED); SetItemState(m_nItem, 0, LVIS_FOCUSED); } }
void CUploadListCtrl::OnLvnGetInfoTip(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMLVGETINFOTIP>(pNMHDR); if (pGetInfoTip->iSubItem == 0) { LVHITTESTINFO hti = {0}; ::GetCursorPos(&hti.pt); ScreenToClient(&hti.pt); if (SubItemHitTest(&hti) == -1 || hti.iItem != pGetInfoTip->iItem || hti.iSubItem != 0) { // don't show the default label tip for the main item, if the mouse is not over the main item if ((pGetInfoTip->dwFlags & LVGIT_UNFOLDED) == 0 && pGetInfoTip->cchTextMax > 0 && pGetInfoTip->pszText[0] != _T('\0')) pGetInfoTip->pszText[0] = _T('\0'); return; } const CUpDownClient* client = (CUpDownClient*)GetItemData(pGetInfoTip->iItem); if (client && pGetInfoTip->pszText && pGetInfoTip->cchTextMax > 0) { CString strInfo; strInfo.Format(GetResString(IDS_USERINFO), client->GetUserName()); // ==> requpfile optimization [SiRoB] - Stulle /* const CKnownFile* file = theApp.sharedfiles->GetFileByID(client->GetUploadFileID()); */ const CKnownFile* file = client->CheckAndGetReqUpFile(); // <== requpfile optimization [SiRoB] - Stulle if (file) { strInfo += GetResString(IDS_SF_REQUESTED) + _T(' ') + file->GetFileName() + _T('\n'); strInfo.AppendFormat(GetResString(IDS_FILESTATS_SESSION) + GetResString(IDS_FILESTATS_TOTAL), file->statistic.GetAccepts(), file->statistic.GetRequests(), CastItoXBytes(file->statistic.GetTransferred(), false, false), file->statistic.GetAllTimeAccepts(), file->statistic.GetAllTimeRequests(), CastItoXBytes(file->statistic.GetAllTimeTransferred(), false, false)); } else { strInfo += GetResString(IDS_REQ_UNKNOWNFILE); } strInfo += TOOLTIP_AUTOFORMAT_SUFFIX_CH; _tcsncpy(pGetInfoTip->pszText, strInfo, pGetInfoTip->cchTextMax); pGetInfoTip->pszText[pGetInfoTip->cchTextMax-1] = _T('\0'); } } *pResult = 0; }
void CUploadListCtrl::OnLvnGetInfoTip(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMLVGETINFOTIP>(pNMHDR); if (pGetInfoTip->iSubItem == 0) { LVHITTESTINFO hti = {0}; ::GetCursorPos(&hti.pt); ScreenToClient(&hti.pt); if (SubItemHitTest(&hti) == -1 || hti.iItem != pGetInfoTip->iItem || hti.iSubItem != 0){ // don' show the default label tip for the main item, if the mouse is not over the main item if ((pGetInfoTip->dwFlags & LVGIT_UNFOLDED) == 0 && pGetInfoTip->cchTextMax > 0 && pGetInfoTip->pszText[0] != '\0') pGetInfoTip->pszText[0] = '\0'; return; } const CUpDownClient* client = (CUpDownClient*)GetItemData(pGetInfoTip->iItem); if (client && pGetInfoTip->pszText && pGetInfoTip->cchTextMax > 0) { CString info; CKnownFile* file = theApp.sharedfiles->GetFileByID(client->GetUploadFileID()); // build info text and display it info.Format(GetResString(IDS_USERINFO), client->GetUserName()); if (file) { info += GetResString(IDS_SF_REQUESTED) + _T(" ") + CString(file->GetFileName()) + _T("\n"); CString stat; stat.Format(GetResString(IDS_FILESTATS_SESSION)+GetResString(IDS_FILESTATS_TOTAL), file->statistic.GetAccepts(), file->statistic.GetRequests(), CastItoXBytes(file->statistic.GetTransferred(), false, false), file->statistic.GetAllTimeAccepts(), file->statistic.GetAllTimeRequests(), CastItoXBytes(file->statistic.GetAllTimeTransferred(), false, false) ); info += stat; } else { info += GetResString(IDS_REQ_UNKNOWNFILE); } _tcsncpy(pGetInfoTip->pszText, info, pGetInfoTip->cchTextMax); pGetInfoTip->pszText[pGetInfoTip->cchTextMax-1] = _T('\0'); } } *pResult = 0; }
void CEditableListCtrl::OnLButtonDown(UINT nFlags, CPoint point) { CListCtrl::OnLButtonDown(nFlags, point); LVHITTESTINFO hti = {0}; hti.pt = point; if (SubItemHitTest(&hti) == -1) return; int iItem = hti.iItem; int iSubItem = hti.iSubItem; if (iItem == -1 || iSubItem == -1) return; CRect rect; GetSubItemRect(iItem, iSubItem, LVIR_LABEL, rect); ClientToScreen(rect); CPoint pt(rect.right, rect.bottom); CRect rc; GetWindowRect(rc); if (!rc.PtInRect(pt)) SendMessage(WM_VSCROLL, SB_LINEDOWN, 0); pt.x = rect.left; pt.y = rect.top; if (!rc.PtInRect(pt)) SendMessage(WM_VSCROLL, SB_LINEUP, 0); m_iRow = iItem; m_iCol = iSubItem; switch (m_iCol) { case 0: m_iCol = 1; ShowEditCtrl(); break; case 1: ShowEditCtrl(); break; } }
void CEditListCtrl::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_bFocus = TRUE; LVHITTESTINFO lvhit; lvhit.pt = point; int item = SubItemHitTest(&lvhit); //if (over a item/subitem) if (item != -1 && (lvhit.flags & LVHT_ONITEM)) { CListCtrl::OnLButtonDown(nFlags, point); if(m_bHighLight && m_iItem == lvhit.iItem && m_iSubItem == lvhit.iSubItem && (m_iSubItem==1 || m_iSubItem==2))//在这里只编辑坐标点 { //第二次单击 EditLabel(m_iItem); return; } else { //第一次单击 m_iItem = lvhit.iItem; m_iSubItem = lvhit.iSubItem; m_bHighLight = TRUE; } } else { if(m_edtItemEdit.m_hWnd == NULL) { //未出现文本编辑框时 m_bHighLight = FALSE; } CListCtrl::OnLButtonDown(nFlags, point); } Invalidate(); }
/*=========================================================================== * * Class CSrBatchListCtrl Event - void OnLButtonDown (nFlags, Point); * *=========================================================================*/ void CSrBatchListCtrl::OnLButtonDown (UINT nFlags, CPoint Point) { LVHITTESTINFO HitTest; int Result; CListCtrl::OnLButtonDown(nFlags, Point); HitTest.pt = Point; HitTest.flags = 0; HitTest.iItem = -1; Result = SubItemHitTest(&HitTest); if (Result < 0) { GetParent()->SendMessage(ID_BATCHEDIT_MSG_UPDATE, -1, 0); return; } SetItem(Result, 0, LVIF_STATE, "", 0, LVIS_SELECTED, LVIS_SELECTED, 0); GetParent()->SendMessage(ID_BATCHEDIT_MSG_UPDATE, Result, 0); }
BOOL CRichListCtrl::PreTranslateMessage(MSG* pMsg) { if(pMsg->message == WM_LBUTTONUP) { int nBtnID = GetWindowLong(pMsg->hwnd,GWL_ID); POINT pt; GetCursorPos(&pt); ScreenToClient(&pt); LVHITTESTINFO hitInfo; hitInfo.pt=pt; SubItemHitTest(&hitInfo); if (GetItemType(hitInfo.iItem, hitInfo.iSubItem) == CTRL_BUTTON) { this->GetParent()->SendMessage(WM_RICHLISTCTRL_MESSGAE, WM_RICHLS_CLICK_BUTTON, (LPARAM)&hitInfo); return TRUE; } } return CListCtrl::PreTranslateMessage(pMsg); }
void CListCtrlEx::OnMouseMove(UINT nFlags, CPoint point) { DWORD dwPos=GetMessagePos(); CPoint point1( LOWORD(dwPos), HIWORD(dwPos)); ScreenToClient(&point1); LVHITTESTINFO lvinfo; lvinfo.pt=point; lvinfo.flags=LVHT_ABOVE; int nItem=SubItemHitTest(&lvinfo); if(nItem!=-1 && lvinfo.iSubItem >= 0 && m_HandOverList.Find(lvinfo.iSubItem)) { SetCursor(m_hCursor); } CListCtrl::OnMouseMove(nFlags, point); }
void CEditTable::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 POSITION pos; BOOL bSelected = FALSE; if( m_bEditing ==TRUE) goto defalt_session; // 检查是否有Item被选中,没有时不进入编辑 pos = GetFirstSelectedItemPosition(); if( pos ) { // 得到被点击的Item LVHITTESTINFO testinfo; testinfo.pt.x = point.x; testinfo.pt.y = point.y; //点击时的鼠标位置 testinfo.flags = LVHT_ONITEMLABEL; if( SubItemHitTest(&testinfo)<0 ) //点击的必须是标题 goto defalt_session; //没有点在有效区域,不进入编辑 m_nItem = testinfo.iItem; //被点击表项的行号 m_nSubItem = testinfo.iSubItem; //被点击表项的列号 if(m_nSubItem == 0) { goto defalt_session; //选中第一列,不编辑 } // 检查该表项是否被选中,没被选中不进入编辑 while( pos ) if( m_nItem==GetNextSelectedItem(pos) ) { bSelected = TRUE; break; } if( bSelected==FALSE ) goto defalt_session; //没有点在有效区域,不编辑 // 开始编辑 m_bEditing = BeginEdit(); return; } defalt_session: CListCtrl::OnLButtonDblClk(nFlags, point); }
void CListViewCtrlEx::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent == XX_TIMER_ID_TIPS) { CPoint ptx; CPoint ptxbak; ::GetCursorPos(&ptx); ptxbak = ptx; ptxbak.y -= 25; ScreenToClient(&ptx); LVHITTESTINFO hti; hti.pt = ptx; SubItemHitTest( &hti ); const TListItem* pItem = _GetItemData( hti.iItem ); //if (pItem && hti.iSubItem >= 0 && hti.iSubItem < pItem->subItems.size()) // CBkSafeTip::Show(pItem->subItems[hti.iSubItem].str, ptxbak, m_hWnd); KillTimer(nIDEvent); } }
afx_msg void CCtlPendingOrders::OnLButtonUp( UINT nFlags, CPoint point ) { CListCtrl::OnLButtonUp(nFlags, point); LVHITTESTINFO Info; Info.pt = point; //if( ( index = HitTest( point, NULL )) != -1 ) { //SetItemState( index, LVIS_SELECTED | LVIS_FOCUSED , // LVIS_SELECTED | LVIS_FOCUSED); //} SubItemHitTest( &Info ); // CString s; // s.Format( "item %d, subitem %d", Info.iItem, Info.iSubItem ); // theApp.pConsoleMessages->WriteLine( s ); if ( -1 != Info.iItem ) { if ( IXACTION == Info.iSubItem ) { if ( NULL != OnCancel ) { OnCancel( GetItemData( Info.iItem ) ); } } } }
void CMyListCtrl::OnLButtonUp(UINT nFlags, CPoint point) { LVHITTESTINFO lvhit; lvhit.pt = point; int item = SubItemHitTest(&lvhit); //if (over a subitem) if (item != -1 && lvhit.iSubItem && (lvhit.flags & LVHT_ONITEM )) { //mouse click outside the editbox in an allready editing cell cancels editing if (m_subitem == lvhit.iSubItem && item == m_item) { CListCtrl::OnLButtonUp(nFlags, point); } else { CListCtrl::OnLButtonUp(nFlags, point); m_subitem = lvhit.iSubItem; m_item = item; EditLabel(item); } } else CListCtrl::OnLButtonUp(nFlags, point); }
///////////////////////////////////////////////////////////////////////////// // CSHListCtrl message handlers void CSHListCtrl::OnLButtonDown(UINT nFlags, CPoint point) { LVHITTESTINFO ht; ht.pt = point; int rval = SubItemHitTest(&ht); int oldsubitem = m_CurSubItem; m_CurSubItem = IndexToOrder(ht.iSubItem); CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0); // Make the column fully visible. // We have to take into account that the columns may be reordered MakeColumnVisible(Header_OrderToIndex(pHeader->m_hWnd, m_CurSubItem)); // Store old state of the item. int state = GetItemState(ht.iItem, LVIS_FOCUSED); if (m_CurSubItem == -1 || ht.iItem == -1) { if(ht.iItem == -1) { NMLISTVIEW dispinfo; dispinfo.hdr.hwndFrom = m_hWnd; dispinfo.hdr.idFrom = GetDlgCtrlID(); dispinfo.hdr.code = NM_CLICK; dispinfo.iItem = -1; dispinfo.iSubItem = ht.iSubItem; GetParent()->SendMessage( WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&dispinfo ); } return; } // Call default left button click is here just before we might bail. // Also updates the state of the item. if (m_bClickEdit) m_bKeyEvent = FALSE; CListCtrl::OnLButtonDown(nFlags, point); // Bail if the state from before was not focused or the // user has not already clicked on this cell. if (!m_bClickEdit) { if( !state || m_CurSubItem == -1 || oldsubitem != m_CurSubItem ) return; int doedit = 0; // If we are in column 0 make sure that the user clicked on // the item label. if( 0 == ht.iSubItem ) { if (ht.flags & LVHT_ONITEMLABEL) doedit = 1; } else { doedit = 1; } if ( !doedit ) return; } // Send Notification to parent of ListView ctrl CString str; str = GetItemText( ht.iItem, ht.iSubItem ); LV_DISPINFO dispinfo; dispinfo.hdr.hwndFrom = m_hWnd; dispinfo.hdr.idFrom = GetDlgCtrlID(); dispinfo.hdr.code = LVN_BEGINLABELEDIT; dispinfo.item.mask = LVIF_TEXT; dispinfo.item.iItem = ht.iItem; dispinfo.item.iSubItem = ht.iSubItem; dispinfo.item.pszText = (LPTSTR)((LPCTSTR)str); dispinfo.item.cchTextMax = str.GetLength(); GetParent()->SendMessage( WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&dispinfo ); }
void CServerListCtrl::OnLvnGetInfoTip(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMLVGETINFOTIP>(pNMHDR); if (pGetInfoTip->iSubItem == 0) { LVHITTESTINFO hti = {0}; ::GetCursorPos(&hti.pt); ScreenToClient(&hti.pt); bool bOverMainItem = (SubItemHitTest(&hti) != -1 && hti.iItem == pGetInfoTip->iItem && hti.iSubItem == 0); // those tooltips are very nice for debugging/testing but pretty annoying for general usage // enable tooltips only if Shift+Ctrl is currently pressed bool bShowInfoTip = GetSelectedCount() > 1 || ((GetKeyState(VK_SHIFT) & 0x8000) && (GetKeyState(VK_CONTROL) & 0x8000)); if (!bShowInfoTip){ if (!bOverMainItem){ // don' show the default label tip for the main item, if the mouse is not over the main item if ((pGetInfoTip->dwFlags & LVGIT_UNFOLDED) == 0 && pGetInfoTip->cchTextMax > 0 && pGetInfoTip->pszText[0] != '\0') pGetInfoTip->pszText[0] = '\0'; } return; } if (GetSelectedCount() == 1) { ; } else { int iSelected = 0; ULONGLONG ulTotalUsers = 0; ULONGLONG ulTotalLowIdUsers = 0; ULONGLONG ulTotalFiles = 0; POSITION pos = GetFirstSelectedItemPosition(); while (pos) { const CServer* pServer = (CServer*)GetItemData(GetNextSelectedItem(pos)); if (pServer) { iSelected++; ulTotalUsers += pServer->GetUsers(); ulTotalFiles += pServer->GetFiles(); ulTotalLowIdUsers += pServer->GetLowIDUsers(); } } if (iSelected > 0) { CString strInfo; strInfo.Format(_T("%s: %u\r\n%s: %s\r\n%s: %s\r\n%s: %s"), GetResString(IDS_FSTAT_SERVERS), iSelected, GetResString(IDS_UUSERS), CastItoIShort(ulTotalUsers), GetResString(IDS_IDLOW), CastItoIShort(ulTotalLowIdUsers), GetResString(IDS_PW_FILES), CastItoIShort(ulTotalFiles)); _tcsncpy(pGetInfoTip->pszText, strInfo, pGetInfoTip->cchTextMax); pGetInfoTip->pszText[pGetInfoTip->cchTextMax-1] = _T('\0'); } } } *pResult = 0; }
void CMyListCtrl::OnMouseMove(UINT nFlags, CPoint point) { static CPoint s_pt(0,0); // TRACE("%d,%d",point.x,point.y); if( s_pt == point ) { // __super::OnMouseMove( nFlags,point ); return; } s_pt = point; HideToolTip(); LVHITTESTINFO lvhti; lvhti.pt = point; int ret = SubItemHitTest(&lvhti); if( ret == -1 ) { if( m_iCurrentCursorItem != -1 ) { CRect r; GetItemRect(m_iCurrentCursorItem, &r,LVIR_BOUNDS); InvalidateRect(&r, true); } m_iCurrentCursorItem = m_iCurrentCursorSubItem = -1; m_iOverImageItem = -1; m_iOverImageSubItem = -1; __super::OnMouseMove( nFlags,point ); return; } if( m_iCurrentCursorItem != -1 ) { CRect r; GetItemRect(m_iCurrentCursorItem, &r,LVIR_BOUNDS); InvalidateRect(&r, true); } m_iCurrentCursorItem = lvhti.iItem; m_iCurrentCursorSubItem = lvhti.iSubItem; if( m_iCurrentCursorItem != -1 ) { CRect r; GetItemRect(m_iCurrentCursorItem, &r,LVIR_BOUNDS); InvalidateRect(&r, true); } CRect rectSubItem; GetSubItemRect( m_iCurrentCursorItem,m_iCurrentCursorSubItem,LVIR_BOUNDS,rectSubItem); if( NeedChangeCursor( point ) ) { ::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(32649))); if( m_iOverImageItem == -1 && m_iOverImageSubItem == -1 ) { if( m_iCurrentCursorSubItem == 0 ) { rectSubItem.right = rectSubItem.left + GetColumnWidth(0); } InvalidateRect( rectSubItem ); m_iOverImageItem = lvhti.iItem; m_iOverImageSubItem = lvhti.iSubItem; } ShowSubItemToolTip( m_iOverImageItem,m_iOverImageSubItem); } else { if( m_iOverImageItem != -1 && m_iOverImageSubItem != -1 ) { GetSubItemRect( m_iOverImageItem,m_iOverImageSubItem,LVIR_BOUNDS,rectSubItem); if( m_iCurrentCursorSubItem == 0 ) { rectSubItem.right = rectSubItem.left + GetColumnWidth(0); } InvalidateRect( rectSubItem ); m_iOverImageItem = -1; m_iOverImageSubItem = -1; ::SetCursor(::LoadCursor(NULL, IDC_ARROW)); } ShowItemToolTip( m_iCurrentCursorItem,m_iCurrentCursorSubItem); } if(!m_bTrackMouseEvent) { TRACKMOUSEEVENT tme; tme.cbSize = sizeof(tme); tme.hwndTrack = m_hWnd; tme.dwFlags = TME_LEAVE; tme.dwHoverTime = 1; m_bTrackMouseEvent = _TrackMouseEvent(&tme); } __super::OnMouseMove( nFlags,point ); }