163 lines
3.5 KiB
C++
163 lines
3.5 KiB
C++
// OXAutoListBox.cpp : implementation file
|
|
//
|
|
|
|
// Version: 9.3
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "OXAutoListBox.h"
|
|
#include "OXAutoComplete.h"
|
|
#include "UTB64Bit.h"
|
|
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COXAutoListBox
|
|
|
|
COXAutoListBox::COXAutoListBox(COXAutoComplete* pComplete) :
|
|
m_bDraw(FALSE), m_nHeight(NULL), m_nWidth(NULL),
|
|
m_pComplete(pComplete)
|
|
{
|
|
}
|
|
|
|
COXAutoListBox::~COXAutoListBox()
|
|
{
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(COXAutoListBox, CListBox)
|
|
//{{AFX_MSG_MAP(COXAutoListBox)
|
|
ON_WM_MOUSEMOVE()
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_SETCURSOR( )
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COXAutoListBox message handlers
|
|
|
|
void COXAutoListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
|
|
{
|
|
if (m_bDraw)
|
|
{
|
|
CRect rct=lpDrawItemStruct->rcItem;
|
|
CDC* pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
|
|
int nIndex=(lpDrawItemStruct->itemState & ODS_SELECTED)?
|
|
COLOR_HIGHLIGHT:COLOR_WINDOW;
|
|
CBrush* pBrush=CBrush::FromHandle(::GetSysColorBrush(nIndex));
|
|
pDC->FillRect(rct,pBrush);
|
|
|
|
int nMode=pDC->SetBkMode(TRANSPARENT);
|
|
if (lpDrawItemStruct->itemID>=0)
|
|
{
|
|
CString sText;
|
|
COLORREF clrText=::GetSysColor((lpDrawItemStruct->itemState & ODS_SELECTED)?
|
|
COLOR_HIGHLIGHTTEXT:COLOR_WINDOWTEXT);
|
|
COLORREF clrOld=pDC->SetTextColor(clrText);
|
|
GetText(lpDrawItemStruct->itemID, sText);
|
|
pDC->TextOut(rct.left,rct.top,sText);
|
|
pDC->SetTextColor(clrOld);
|
|
}
|
|
pDC->SetBkMode(nMode);
|
|
}
|
|
}
|
|
|
|
BOOL COXAutoListBox::PreCreateWindow(CREATESTRUCT& cs)
|
|
{
|
|
ASSERT(cs.style & LBS_OWNERDRAWFIXED);
|
|
|
|
|
|
return CListBox::PreCreateWindow(cs);
|
|
}
|
|
|
|
void COXAutoListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
|
|
{
|
|
lpMeasureItemStruct->CtlID=::GetWindowLongPtr(
|
|
GetSafeHwnd(),GWL_ID);
|
|
lpMeasureItemStruct->CtlType=ODT_LISTBOX;
|
|
lpMeasureItemStruct->itemData=1;
|
|
lpMeasureItemStruct->itemWidth=m_nWidth;
|
|
lpMeasureItemStruct->itemHeight=m_nHeight;
|
|
lpMeasureItemStruct->itemID=0;
|
|
}
|
|
|
|
BOOL COXAutoListBox::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
|
|
{
|
|
#if defined (_WINDLL)
|
|
#if defined (_AFXDLL)
|
|
AFX_MANAGE_STATE(AfxGetAppModuleState());
|
|
#else
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
#endif
|
|
#endif
|
|
|
|
return CWnd::Create(_T("LISTBOX"), NULL, dwStyle, rect, pParentWnd, nID,NULL);
|
|
}
|
|
|
|
void COXAutoListBox::OnMouseMove(UINT nFlags, CPoint point)
|
|
{
|
|
|
|
int nIndex=GetItemFromPoint(point);
|
|
if (nIndex!=-1)
|
|
{
|
|
if (GetCurSel()!=nIndex)
|
|
SetCurSel(nIndex);
|
|
}
|
|
CListBox::OnMouseMove(nFlags, point);
|
|
}
|
|
|
|
void COXAutoListBox::SetComplete(COXAutoComplete *pComplete)
|
|
{
|
|
m_pComplete=pComplete;
|
|
}
|
|
|
|
void COXAutoListBox::OnLButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
UNUSED_ALWAYS(nFlags);
|
|
|
|
ASSERT(m_pComplete);
|
|
|
|
int nIndex=GetItemFromPoint(point);
|
|
if (nIndex!=-1)
|
|
{
|
|
CString sText;
|
|
GetText(nIndex,sText);
|
|
::SendMessage( m_pComplete->m_hAttached, WM_SETTEXT, NULL,(LPARAM)(LPCTSTR) sText);
|
|
}
|
|
CListBox::OnLButtonDown(nFlags, point);
|
|
::PostMessage( m_pComplete->m_hAttached, WM_SETFOCUS, (WPARAM)::GetFocus(), NULL);
|
|
}
|
|
|
|
int COXAutoListBox::GetItemFromPoint(POINT pt)
|
|
{
|
|
CRect rct;
|
|
GetClientRect(&rct);
|
|
|
|
|
|
if (rct.PtInRect(pt))
|
|
{
|
|
int nTop=GetTopIndex();
|
|
|
|
int nCount=rct.Height()/GetItemHeight(nTop);
|
|
for (int n=nTop;n<nTop+nCount;n++)
|
|
{
|
|
//find hot item to select
|
|
GetItemRect(n,&rct);
|
|
if (rct.PtInRect(pt))
|
|
return n;
|
|
|
|
}
|
|
}
|
|
return -1;
|
|
|
|
}
|
|
|
|
BOOL COXAutoListBox::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
|
|
{
|
|
return CListBox::OnSetCursor(pWnd, nHitTest, message);
|
|
} |