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

📄 bcgpintellisenselb.cpp

📁 远程网络监视程序的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// BCGPIntelliSenseLB.cpp : implementation file
//

#include "stdafx.h"
#include "BCGPEditCtrl.h"
#include "bcgglobals.h"
#include "BCGPIntelliSenseWnd.h"
#include "BCGPIntelliSenseLB.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

IMPLEMENT_DYNCREATE (CBCGPBaseIntelliSenseLB, CListBox)
IMPLEMENT_DYNCREATE (CBCGPIntelliSenseLB, CBCGPBaseIntelliSenseLB)
IMPLEMENT_DYNCREATE (CBCGPSymImagesLB, CBCGPBaseIntelliSenseLB)

int CBCGPBaseIntelliSenseLB::m_nNumVisibleItems = 10;

int	CBCGPBaseIntelliSenseLB::m_nImageToFocusRectSpacing = 2;
int	CBCGPBaseIntelliSenseLB::m_nFocusRectToTextSpacing = 1;
int	CBCGPBaseIntelliSenseLB::m_nRightSpacing = 3;

COLORREF CBCGPBaseIntelliSenseLB::m_clrSelectedItemBkColor = globalData.clrHilite;
COLORREF CBCGPBaseIntelliSenseLB::m_clrSelectedItemTextColor = globalData.clrTextHilite;

BOOL CBCGPIntelliSenseLB::m_bComparenoCase = FALSE;


BEGIN_MESSAGE_MAP(CBCGPBaseIntelliSenseLB, CListBox)
	//{{AFX_MSG_MAP(CBCGPBaseIntelliSenseLB)
	ON_CONTROL_REFLECT(LBN_DBLCLK, OnDblclk)
	ON_WM_DESTROY()
	ON_WM_ERASEBKGND()
	ON_CONTROL_REFLECT(LBN_KILLFOCUS, OnKillfocus)
	ON_WM_SYSKEYDOWN()
	ON_WM_NCDESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBCGPBaseIntelliSenseLB

CBCGPBaseIntelliSenseLB::CBCGPBaseIntelliSenseLB () : m_pImageList (NULL), m_nLBHeight (0), 
											 m_pFont (NULL)
{
	m_sizeMaxItem.cx = m_sizeMaxItem.cy = 0;
}
//*****************************************************************************************
CBCGPBaseIntelliSenseLB::~CBCGPBaseIntelliSenseLB()
{
}
//*****************************************************************************************
CSize CBCGPBaseIntelliSenseLB::GetTextSize (CString& str)
{
	CDC* pDC = GetDC ();

	CFont* pOldFont = pDC->SelectObject (m_pFont);
	CSize size = pDC->GetTextExtent (str, str.GetLength ());
	pDC->SelectObject (pOldFont);

	ReleaseDC(pDC);
	return size;
}
//*****************************************************************************************
CSize CBCGPBaseIntelliSenseLB::GetImageSize (int /*iIdx*/)
{
	if (m_pImageList != NULL)
	{
		IMAGEINFO imageInfo;
		m_pImageList->GetImageInfo (0, &imageInfo);

		CRect rect (imageInfo.rcImage);
		return rect.Size ();
	}

	return CSize (0, 0);
}
//*****************************************************************************************
CBCGPEditCtrl* CBCGPBaseIntelliSenseLB::GetParentEditCtrl ()
{
	CBCGPIntelliSenseWnd* pParent = DYNAMIC_DOWNCAST (CBCGPIntelliSenseWnd, GetParent ());
	ASSERT_VALID (pParent);
	return pParent->GetParentEditCtrl ();
}
//*****************************************************************************************
BOOL CBCGPBaseIntelliSenseLB::PreTranslateMessage(MSG* pMsg) 
{
	switch (pMsg->message)
	{
	case WM_SYSKEYUP:
		if (VK_MENU == pMsg->wParam)
		{
			return TRUE;
		}
		break;		
	}
	
	return CListBox::PreTranslateMessage(pMsg);
}
//*****************************************************************************************
void CBCGPBaseIntelliSenseLB::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
	CBCGPIntelliSenseData* pData = (CBCGPIntelliSenseData*)
										lpDrawItemStruct->itemData;
	ASSERT_VALID (pData);

	CDC* pDC = GetDC ();

	CRect rectItem (lpDrawItemStruct->rcItem);

	pDC->FillSolidRect (&rectItem, globalData.clrWindow);

	if (m_pImageList != NULL)
	{
		m_pImageList->Draw (pDC, pData->m_nImageListIndex, rectItem.TopLeft (), 
							ILD_NORMAL);
		rectItem.left += GetImageSize (pData->m_nImageListIndex).cx + 
						 m_nImageToFocusRectSpacing;  
	}

	if (lpDrawItemStruct->itemAction & ODA_FOCUS && 
		lpDrawItemStruct->itemState & ODS_FOCUS)
	{
		pDC->DrawFocusRect (rectItem);
	}

	rectItem.DeflateRect (1, 1, 1, 1);

	if (lpDrawItemStruct->itemState & ODS_SELECTED)
	{
		pDC->FillSolidRect (&rectItem, m_clrSelectedItemBkColor);
		pDC->SetTextColor (m_clrSelectedItemTextColor);
	}
	else
	{ 
		pDC->FillSolidRect (&rectItem, globalData.clrWindow);
	}

	pDC->SetBkMode (TRANSPARENT);
	CFont* pOldFont = pDC->SelectObject (m_pFont);
	rectItem.left += m_nFocusRectToTextSpacing;
	pDC->DrawText (pData->m_strItemName, &rectItem, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
	pDC->SelectObject (pOldFont);
	ReleaseDC (pDC);
}
//*****************************************************************************************
void CBCGPBaseIntelliSenseLB::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
	CBCGPIntelliSenseData* pData = (CBCGPIntelliSenseData*)
										lpMeasureItemStruct->itemData;
	ASSERT_VALID (pData);

	CSize sizeText = GetTextSize (pData->m_strItemName);
	CSize sizeImage = GetImageSize (pData->m_nImageListIndex);

	lpMeasureItemStruct->itemHeight = max (sizeText.cy, sizeImage.cy) + 2;
	lpMeasureItemStruct->itemWidth  = sizeText.cx + sizeImage.cx + 
									  m_nImageToFocusRectSpacing + 
									  m_nFocusRectToTextSpacing + 
									  m_nRightSpacing + 1;

	m_sizeMaxItem.cx = max ((UINT) m_sizeMaxItem.cx, lpMeasureItemStruct->itemWidth);
	m_sizeMaxItem.cy = max ((UINT) m_sizeMaxItem.cy, lpMeasureItemStruct->itemHeight);

	if (GetCount () <= m_nNumVisibleItems)
	{
		m_nLBHeight += lpMeasureItemStruct->itemHeight;
	}
}
//*****************************************************************************************
void CBCGPBaseIntelliSenseLB::OnDblclk() 
{
	InsertDataToEditCtrl ();
	if (!::IsWindow(m_hWnd))
	{
		return;
	}
	PostMessage (WM_CLOSE);
}
//*****************************************************************************************
void CBCGPBaseIntelliSenseLB::OnDestroy() 
{
	for (int i = 0; i < GetCount (); i++)
	{
		CBCGPIntelliSenseData* pData = 
			(CBCGPIntelliSenseData*) GetItemDataPtr (i);
		delete pData;
		SetItemDataPtr (i, NULL);
	}
	CListBox::OnDestroy();
}
//*****************************************************************************************
BOOL CBCGPBaseIntelliSenseLB::OnEraseBkgnd(CDC* /*pDC*/) 
{
	return TRUE;
}
//*****************************************************************************************
void CBCGPBaseIntelliSenseLB::OnKillfocus() 
{
	GetParent ()->PostMessage (WM_CLOSE);
}
//*****************************************************************************************
void CBCGPBaseIntelliSenseLB::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if (nChar == VK_MENU)	
	{
		GetParent ()->PostMessage (WM_CLOSE);
		return;
	}
	
	CListBox::OnSysKeyDown(nChar, nRepCnt, nFlags);
}
//*****************************************************************************************
void CBCGPBaseIntelliSenseLB::OnNcDestroy() 
{
	CListBox::OnNcDestroy();
	delete this;
}


/////////////////////////////////////////////////////////////////////////////
// CBCGPIntelliSenseLB

CBCGPIntelliSenseLB::CBCGPIntelliSenseLB() 
{
	m_nInitOffset = m_nInitRow = -1;
}

CBCGPIntelliSenseLB::~CBCGPIntelliSenseLB()
{
}


BEGIN_MESSAGE_MAP(CBCGPIntelliSenseLB, CBCGPBaseIntelliSenseLB)
	//{{AFX_MSG_MAP(CBCGPIntelliSenseLB)
	ON_WM_CHAR()
	ON_WM_KEYDOWN()
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBCGPIntelliSenseLB message handlers
int CBCGPIntelliSenseLB::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CBCGPBaseIntelliSenseLB::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	CBCGPEditCtrl* pParentEdit = GetParentEditCtrl ();
	ASSERT_VALID (pParentEdit);

	int nCurrOffset = pParentEdit->GetCurOffset ();
	int nFinish = 0;
	pParentEdit->FindWordStartFinish (nCurrOffset, pParentEdit->m_strBuffer, m_nInitOffset, nFinish);
	
    // If we are at the end of the word (and the next symbol is not in m_strNonSelectableChars)
    if (m_nInitOffset > nFinish)
	{
		pParentEdit->FindWordStartFinish (nCurrOffset - 1, pParentEdit->m_strBuffer, m_nInitOffset, nFinish);
	}

	m_nInitOffset = min (nCurrOffset, m_nInitOffset);

	CPoint pt;
	CPoint ptRowColumn;
	pParentEdit->OffsetToPoint (nCurrOffset, pt, &ptRowColumn);
	m_nInitRow = ptRowColumn.y;
	
	return 0;
}
//*****************************************************************************************
int CBCGPIntelliSenseLB::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct) 
{
	// TODO: Add your code to determine the sorting order of the specified items
	// return -1 = item 1 sorts before item 2
	// return 0 = item 1 and item 2 sort the same
	// return 1 = item 1 sorts after item 2

	CString strToCompare;
	BOOL bFindSubstring = FALSE;
	if (lpCompareItemStruct->itemID1 == -1)
	{
		strToCompare = (LPCTSTR) lpCompareItemStruct->itemData1;
		bFindSubstring = TRUE;
	}
	else
	{
		CBCGPIntelliSenseData* pData1 = (CBCGPIntelliSenseData*)
										lpCompareItemStruct->itemData1;
		ASSERT_VALID (pData1);
		strToCompare = pData1->m_strItemName;
	}

	
	CBCGPIntelliSenseData* pData2 = (CBCGPIntelliSenseData*)
										lpCompareItemStruct->itemData2;

	
	ASSERT_VALID (pData2);
	
	if (bFindSubstring)
	{
		if (strToCompare.GetLength () < pData2->m_strItemName.GetLength ())
		{
			return CBCGPIntelliSenseLB::m_bComparenoCase ?
				lstrcmpi (strToCompare, pData2->m_strItemName.Left (strToCompare.GetLength ())) :

⌨️ 快捷键说明

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