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