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

📄 bcgpeditlistbox.cpp

📁 远程网络监视程序的源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	m_ptClick = CPoint (-1, -1);
}
//**************************************************************************
CBCGPEditListBox::~CBCGPEditListBox()
{
	if (m_pWndList != NULL)
	{
		ASSERT_VALID (m_pWndList);
		delete m_pWndList;
	}
}

BEGIN_MESSAGE_MAP(CBCGPEditListBox, CBCGPEditListBase)
	//{{AFX_MSG_MAP(CBCGPEditListBox)
	//}}AFX_MSG_MAP
	ON_NOTIFY(LVN_KEYDOWN, iListId, OnKeyDown)
	ON_NOTIFY(NM_DBLCLK, iListId, OnDblclkList)
	ON_NOTIFY(LVN_GETDISPINFO, iListId, OnGetdispinfo)
	ON_NOTIFY(LVN_ENDLABELEDIT, iListId, OnEndLabelEdit)
	ON_NOTIFY(LVN_ITEMCHANGED, iListId, OnItemChanged)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBCGPEditListBox message handlers

CWnd* CBCGPEditListBox::OnCreateList ()
{
	if (GetSafeHwnd () == NULL ||
		m_pWndList != NULL)
	{
		return FALSE;
	}

	ASSERT (GetStyle () & WS_CHILD);

	CRect rectEmpty;
	rectEmpty.SetRectEmpty ();

	m_pWndList = new CListCtrl;
	m_pWndList->CWnd::CreateEx (WS_EX_CLIENTEDGE, _T("SysListView32"), _T(""),
						WS_VISIBLE | WS_CHILD | LVS_REPORT | LVS_SINGLESEL | 
						LVS_NOCOLUMNHEADER | LVS_EDITLABELS | LVS_SHOWSELALWAYS,
						rectEmpty, this, iListId);

	m_pWndList->SendMessage (LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);
	m_pWndList->InsertColumn (0, _T(""));

	return m_pWndList;
}
//*************************************************************************************
int CBCGPEditListBox::AddItem (const CString& strText, DWORD dwData, int iIndex)
{
	if (GetSafeHwnd () == NULL || m_pWndList == NULL)
	{
		return -1;
	}

	ASSERT_VALID (m_pWndList);

	if (iIndex < 0)
	{
		iIndex = m_pWndList->GetItemCount ();
	}

	int iItem = m_pWndList->InsertItem (iIndex, strText, I_IMAGECALLBACK);
	m_pWndList->SetItemData (iItem, dwData);

	if (iItem == 0)
	{
		SelectItem (0);
	}

	return iItem;
}
//*************************************************************************************
int CBCGPEditListBox::GetCount () const
{
	if (GetSafeHwnd () == NULL || m_pWndList == NULL)
	{
		return -1;
	}

	return m_pWndList->GetItemCount ();
}
//*************************************************************************************
CString CBCGPEditListBox::GetItemText (int iIndex) const
{
	if (GetSafeHwnd () == NULL || m_pWndList == NULL)
	{
		return _T("");
	}

	ASSERT_VALID (m_pWndList);

	return m_pWndList->GetItemText (iIndex, 0);
}
//*************************************************************************************
DWORD CBCGPEditListBox::GetItemData (int iIndex) const
{
	if (GetSafeHwnd () == NULL || m_pWndList == NULL)
	{
		ASSERT (FALSE);
		return 0;
	}

	ASSERT_VALID (m_pWndList);

	return m_pWndList->GetItemData (iIndex);
}
//*************************************************************************************
void CBCGPEditListBox::SetItemData (int iIndex, DWORD dwData)
{
	if (GetSafeHwnd () == NULL || m_pWndList == NULL)
	{
		ASSERT (FALSE);
		return;
	}

	ASSERT_VALID (m_pWndList);

	m_pWndList->SetItemData (iIndex, dwData);
}
//*************************************************************************************
#if _MSC_VER >= 1300
void CBCGPEditListBox::OnKeyDown(NMHDR *pNMHDR, LRESULT *pResult)
{
	NMLVKEYDOWN* pKeyDown = (NMLVKEYDOWN*) pNMHDR;
#else
void CBCGPEditListBox::OnKeyDown (LPNMLVKEYDOWN pKeyDown, LRESULT* pResult)
{
#endif
	*pResult = 0;

	if (pKeyDown != NULL)
	{
		BYTE fCurrVirt = 0;

		if (::GetAsyncKeyState (VK_CONTROL) & 0x8000)
		{
			fCurrVirt |= FCONTROL;
		}

		if (::GetAsyncKeyState (VK_MENU) & 0x8000)
		{
			fCurrVirt |= FALT;
		}

		if (::GetAsyncKeyState (VK_SHIFT) & 0x8000)
		{
			fCurrVirt |= FSHIFT;
		}

		int iButton = 0;
		for (POSITION pos = m_lstKeyAccell.GetHeadPosition (); pos != NULL; iButton ++)
		{
			DWORD dwKey = m_lstKeyAccell.GetNext (pos);
		
			if (dwKey != 0 && pKeyDown->wVKey == (dwKey & 0xFFFF))
			{
				//-------------------
				// Check state flags:
				//-------------------
				BYTE fVirt = (BYTE) (dwKey >> 16);
				if (fCurrVirt == fVirt)
				{
					OnClickButton (iButton);
					return;
				}
			}
		}

		OnKey (pKeyDown->wVKey, fCurrVirt);
	}
}
//*************************************************************************************
int CBCGPEditListBox::GetSelItem () const
{
	if (GetSafeHwnd () == NULL || m_pWndList == NULL)
	{
		ASSERT (FALSE);
		return -1;
	}

	ASSERT_VALID (m_pWndList);

	return m_pWndList->GetNextItem (-1, LVNI_SELECTED);
}
//*************************************************************************************
BOOL CBCGPEditListBox::SelectItem (int iItem)
{
	if (GetSafeHwnd () == NULL || m_pWndList == NULL)
	{
		ASSERT (FALSE);
		return FALSE;
	}

	ASSERT_VALID (m_pWndList);

	if (!m_pWndList->SetItemState (iItem,	LVIS_SELECTED | LVIS_FOCUSED, 
								LVIS_SELECTED | LVIS_FOCUSED))
	{
		return FALSE;
	}

	return m_pWndList->EnsureVisible (iItem, FALSE);
}
//*************************************************************************************
void CBCGPEditListBox::OnDblclkList(NMHDR* /*pNMHDR*/, LRESULT* pResult) 
{
	*pResult = 0;

	int iSelItem = GetSelItem ();

	if ((m_uiStandardBtns & BGCEDITLISTBOX_BTN_NEW) && iSelItem == -1)
	{
		CreateNewItem ();
		return;
	}

	if (iSelItem >= 0)
	{
		EditItem (iSelItem);
	}
}
//*************************************************************************************
BOOL CBCGPEditListBox::RemoveItem (int iIndex)
{
	if (GetSafeHwnd () == NULL || m_pWndList == NULL)
	{
		ASSERT (FALSE);
		return FALSE;
	}

	ASSERT_VALID (m_pWndList);

	BOOL bIsSelected = (GetSelItem () == iIndex);

	if (!m_pWndList->DeleteItem (iIndex))
	{
		return FALSE;
	}

	if (!bIsSelected || GetCount () == 0)
	{
		return FALSE;
	}

	//-------------------
	// Restore selection:
	//-------------------
	if (iIndex >= GetCount ())
	{
		iIndex --;
	}

	SelectItem (iIndex);
	return TRUE;
}
//*************************************************************************************
void CBCGPEditListBox::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult) 
{
	ASSERT (pNMHDR != NULL);

	LV_ITEM* pItem = &((LV_DISPINFO*)pNMHDR)->item;
	ASSERT (pItem != NULL);

	if (pItem->mask & LVIF_IMAGE)
	{
		pItem->iImage = OnGetImage (pItem);
	}
	
	*pResult = 0;
}
//**************************************************************************
void CBCGPEditListBox::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult)
{
	ASSERT (pNMHDR != NULL);

	LV_ITEM* pItem = &((LV_DISPINFO*)pNMHDR)->item;
	ASSERT (pItem != NULL);

	OnEndEditLabel (pItem->pszText);

	for (POSITION pos = m_lstButtons.GetTailPosition (); pos != NULL;)
	{
		CBCGPButton* pButton = m_lstButtons.GetPrev (pos);
		ASSERT (pButton != NULL);

		pButton->EnableWindow ();
	}

	*pResult = 0;
}
//**************************************************************************
void CBCGPEditListBox::OnItemChanged(NMHDR* pNMHDR, LRESULT* pResult)
{
	ASSERT (pNMHDR != NULL);

	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	ASSERT (pNMListView != NULL);

	if (pNMListView->uChanged == LVIF_STATE &&
		(pNMListView->uOldState & LVIS_SELECTED) != (pNMListView->uNewState & LVIS_SELECTED))
	{
		OnSelectionChanged ();
	}

	*pResult = 0;
}
//**************************************************************************
BOOL CBCGPEditListBox::EditItem (int iIndex)
{
	m_wndEdit.LockSize (NULL, FALSE);

	if (GetSafeHwnd () == NULL || m_pWndList == NULL)
	{
		ASSERT (FALSE);
		return FALSE;
	}

	ASSERT_VALID (m_pWndList);

	m_pWndList->SetFocus ();
	CEdit* pEdit = m_pWndList->EditLabel (iIndex);
	if (pEdit == NULL)
	{
		return FALSE;
	}

	ASSERT_VALID (pEdit);

	m_wndEdit.SubclassWindow (pEdit->GetSafeHwnd ());
	m_wndEdit.EnableBrowse (m_bBrowseButton);

	CRect rectClient;
	GetClientRect (rectClient);

	CRect rectEdit;
	pEdit->GetClientRect (rectEdit);

	pEdit->SetWindowPos (NULL, -1, -1,
		rectClient.Width () - 2 * afxData.cxBorder2 - ::GetSystemMetrics (SM_CXVSCROLL),
		rectEdit.Height (),
		SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);

	m_wndEdit.LockSize (this);

	for (POSITION pos = m_lstButtons.GetTailPosition (); pos != NULL;)
	{
		CBCGPButton* pButton = m_lstButtons.GetPrev (pos);
		ASSERT (pButton != NULL);

		pButton->EnableWindow (FALSE);
	}

	return TRUE;
}
//**************************************************************************
void CBCGPEditListBox::OnSizeList ()
{
	if (GetSafeHwnd () == NULL || m_pWndList == NULL)
	{
		ASSERT (FALSE);
		return;
	}

	ASSERT_VALID (m_pWndList);

	CRect rectClient;
	GetClientRect (rectClient);

	m_pWndList->SetColumnWidth (0, rectClient.Width () -
		2 * ::GetSystemMetrics (SM_CXEDGE) -
		::GetSystemMetrics (SM_CXVSCROLL));
}
//****************************************************************************
void CBCGPEditListBox::SetItemText (int iIndex, const CString& strText)
{
	if (GetSafeHwnd () == NULL || m_pWndList == NULL)
	{
		ASSERT (FALSE);
		return;
	}

	ASSERT_VALID (m_pWndList);

	m_pWndList->SetItemText (iIndex, 0, strText);
}
//****************************************************************************
BOOL CBCGPEditListBox::PreTranslateMessage(MSG* pMsg) 
{
	if (pMsg->message == WM_LBUTTONDOWN &&
		m_pWndList != NULL &&
		m_pWndList->GetEditControl () == NULL &&
		m_pWndList->GetSafeHwnd () == CWnd::GetFocus ()->GetSafeHwnd ())
	{
		ASSERT_VALID (m_pWndList);

		m_ptClick = CPoint (-1, -1);

		CPoint ptClick = pMsg->pt;
		m_pWndList->ScreenToClient (&ptClick);

		UINT uFlags;
		int iItem = m_pWndList->HitTest (ptClick, &uFlags);
		if (iItem >= 0 && (uFlags & LVHT_ONITEMLABEL))
		{
			UINT uiMask = LVIS_FOCUSED | LVIS_SELECTED;
			if ((m_pWndList->GetItemState (iItem, uiMask) & uiMask) == uiMask)
			{
				// Secondary click on selected item:
				m_ptClick = ptClick;

				SetCapture ();
				return TRUE;
			}
		}
	}
	else if (pMsg->message == WM_LBUTTONUP && m_ptClick != CPoint (-1, -1))
	{
		ASSERT_VALID (m_pWndList);

		ReleaseCapture ();

		CPoint ptClick = pMsg->pt;
		m_pWndList->ScreenToClient (&ptClick);

		int iItem = m_pWndList->HitTest (ptClick);

		BOOL bEditItem =  
			iItem >= 0 &&
			(abs (ptClick.x - m_ptClick.x) < ::GetSystemMetrics (SM_CXDRAG) &&
			abs (ptClick.y - m_ptClick.y) < ::GetSystemMetrics (SM_CYDRAG));

		m_ptClick = CPoint (-1, -1);

		if (bEditItem)
		{
			EditItem (iItem);
		}

		return TRUE;
	}
	
	return CBCGPEditListBase::PreTranslateMessage(pMsg);
}

⌨️ 快捷键说明

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