// CTransparentListBox.cpp : implementation file
//
#include "stdafx.h"
#include "TransparentListBox.h"
#include ".\transparentlistbox.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTransparentListBox
CTransparentListBox::CTransparentListBox()
: m_ItemHeight(20),
m_HasBackGround(FALSE),
m_Color(RGB(0,0,0)),
m_SelColor(RGB(255,0,0)),
m_ShadowColor(RGB(0,0,0)),
m_Shadow(FALSE),
m_ShadowOffset(3),
m_HorzWidth(0)
{
m_SelColor = G_HIGHLISTTX;//GetSysColor(COLOR_HIGHLIGHTTEXT);
m_Color = G_NORMALTEXT;//GetSysColor(COLOR_WINDOWTEXT);
}
CTransparentListBox::~CTransparentListBox()
{
}
BEGIN_MESSAGE_MAP(CTransparentListBox, CListBox)
//{{AFX_MSG_MAP(CTransparentListBox)
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_WM_VSCROLL()
ON_CONTROL_REFLECT_EX(LBN_SELCHANGE, OnLbnSelchange)
// ON_WM_KEYDOWN()
// ON_WM_CHAR()
// ON_WM_MOVE()
// ON_WM_SIZE()
ON_WM_HSCROLL()
ON_WM_MOUSEWHEEL()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTransparentListBox message handlers
void CTransparentListBox::PreSubclassWindow()
{
CListBox::PreSubclassWindow();
ModifyStyle(0,SS_NOTIFY|LBS_NOSEL);
}
BOOL CTransparentListBox::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
CFont *CTransparentListBox::GetFont()
{
if (m_Font.m_hObject == NULL)
{
return CListBox::GetFont();
}
return &m_Font;
}
void CTransparentListBox::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
}
///////////////////////////////////////////////////////////////////////////////
//CTransparentListBox::DrawItem
//__________________________________________
//
// Description:
// 自绘listbox函数,字体、背景、选中、未选中的颜色
//
// Argument(s):
// <Author>
// 谭挺
// Input Param: 系统参数
// Out Param: void
// 调用关系:由OnPaint调用
///////////////////////////////////////////////////////////////////////////////
void CTransparentListBox::DrawItem(CDC &Dc,int Index,CRect &Rect,BOOL Selected)
{
if (Index == LB_ERR || Index >= GetCount())
return;
CRect TheRect = Rect;
// Dc.SetBkMode(TRANSPARENT);
CFont *pFont = GetFont();
CFont *oldFont = Dc.SelectObject(pFont);
CString Text;
GetText(Index,Text);
//判断字体的大小,通过字体大小来设定文字输入的矩形大小
SIZE strSize;
GetTextExtentPoint32(Dc.GetSafeHdc(), Text, lstrlen(Text), &strSize);
TheRect.left += 3;
if ((strSize.cx - TheRect.Width()) > 0)
{
TheRect.right += strSize.cx - TheRect.Width() + 8;
}
//阴影,暂时不用
if (m_Shadow)
{
if (IsWindowEnabled())
{
Dc.SetTextColor(G_NORMALTEXT);
Dc.SetBkColor(G_NORMALBK);
}
else
{
Dc.SetTextColor(RGB(140,140,140));
Dc.SetBkColor(G_NORMALBK);
}
TheRect.OffsetRect(m_ShadowOffset,m_ShadowOffset);
Dc.DrawText(Text,TheRect,DT_LEFT|DT_EXPANDTABS|DT_NOPREFIX);
TheRect.OffsetRect(-m_ShadowOffset,-m_ShadowOffset);
}
//可用时字体颜色,背景颜色
if (IsWindowEnabled())
{
if (Selected)
{
Dc.SetTextColor(G_HIGHLISTTX);
Dc.SetBkColor(G_HIGHLIST);
}
else
{
Dc.SetTextColor(G_NORMALTEXT);
Dc.SetBkColor(G_NORMALBK);
}
}
//不可用时字体颜色,背景颜色
else
{
Dc.SetTextColor(RGB(140,140,140));
Dc.SetBkColor(G_NORMALBK);
}
//draw输入文字
Dc.DrawText(Text,TheRect,DT_LEFT|DT_EXPANDTABS|DT_NOPREFIX);
}
void CTransparentListBox::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect Rect;
GetClientRect(&Rect);
int Width = Rect.Width();
int Height = Rect.Height();
dc.FillSolidRect(Rect, G_NORMALBK);
Rect.top = 0;
Rect.left = 0;
Rect.bottom = Rect.top + GetItemHeight(0);
Rect.right = Width;
int size = GetCount();
Rect.left -= m_HorzWidth;
Rect.right -= m_HorzWidth;
for (int i = GetTopIndex(); i < size && Rect.top <= Height;++i)
{
DrawItem(dc,i,Rect,GetSel(i));
Rect.OffsetRect(0,GetItemHeight(i));
}
}
///////////////////////////////////////////////////////////////////////////////
// CTransparentListBox::OnLbnSelchange
//__________________________________________
//
// Description:
// 对左键选中的行进行重绘
//
// Argument(s):
// <Author>
// 谭挺
// Input Param: 系统函数
// Out Param: void
// 调用关系:由系统调用
///////////////////////////////////////////////////////////////////////////////
BOOL CTransparentListBox::OnLbnSelchange()
{
RedrawWindow(0,0,RDW_FRAME|RDW_INVALIDATE|RDW_UPDATENOW);
return FALSE;
}
///////////////////////////////////////////////////////////////////////////////
// CTransparentListBox::SetTopIndex
//__________________________________________
//
// Description:
// 设定当前最top的行
//
// Argument(s):
// <Author>
// 谭挺
// Input Param: Index表示输入行数
// Out Param: void
// 调用关系:由ScrollUp、ScrollDown调用
///////////////////////////////////////////////////////////////////////////////
int CTransparentListBox::SetTopIndex(int Index)
{
SetRedraw(FALSE);
int Ret = CListBox::SetTopIndex(Index);
SetRedraw(TRUE);
//重绘窗口函数
RedrawWindow(0,0,RDW_FRAME|RDW_INVALIDATE|RDW_UPDATENOW);
return Ret;
}
///////////////////////////////////////////////////////////////////////////////
// CTransparentListBox::ScrollUp、ScrollDown、OnVScroll、OnHScroll、OnMouseWheel
//__________________________________________
//
// Description:
// 对滚动条进行操作的函数
//
// Argument(s):
// <Author>
// 谭挺
// Input Param: 系统参数
// Out Param: void
// 调用关系:由系统调用
///////////////////////////////////////////////////////////////////////////////
int CTransparentListBox::ScrollUp(int Lines)
{
int Index = GetTopIndex();
if (Index-Lines < 0)
{
Index = Lines;
}
return SetTopIndex(Index-Lines);
}
int CTransparentListBox::ScrollDown(int Lines)
{
int Index = GetTopIndex();
if (Index+Lines > GetCount()-1)
{
Index = GetCount()-Lines;
}
return SetTopIndex(Index+Lines);
}
//纵向滚动条
void CTransparentListBox::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
SetRedraw(FALSE);
CListBox::OnVScroll(nSBCode,nPos,pScrollBar);
SetRedraw(TRUE);
//重绘窗口
RedrawWindow(0,0,RDW_FRAME|RDW_INVALIDATE|RDW_UPDATENOW);
}
//横向滚动条
void CTransparentListBox::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
SetRedraw(FALSE);
CListBox::OnHScroll(nSBCode, nPos, pScrollBar);
SetRedraw(TRUE);
m_HorzWidth = nPos;
this->Invalidate(TRUE);
/* RedrawWindow(0,0,RDW_INVALIDATE);*/
}
//滑轮滚动
BOOL CTransparentListBox::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
int nOffSetVert, nOffSetHorz;
nOffSetVert = this->GetScrollPos(SB_VERT);
nOffSetHorz = this->GetScrollPos(SB_HORZ);
if (0 == this->GetScrollLimit(SB_VERT))
{
if (zDelta>0)
{
//远离用户的方向
nOffSetHorz -= (SUMBAND_INTERVAL_VAL+SUMBAND_BAR_VAL);
if (nOffSetHorz <= 0)
{
nOffSetHorz = 0;
}
}
else
{
nOffSetHorz += 20;
if (nOffSetHorz <= 0)
{
nOffSetHorz = 0;
}
}
m_HorzWidth = nOffSetHorz;
this->SetScrollPos(SB_HORZ,nOffSetHorz);
}
else
{
if (zDelta>0)
{
//远离用户的方向
nOffSetVert -= (SUMBAND_INTERVAL_VAL+SUMBAND_BAR_VAL);
if (nOffSetVert <= 0)
{
nOffSetVert = 0;
}
}
else
{
nOffSetVert += 110;
if (nOffSetVert <= 0)
{
nOffSetVert = 0;
}
}
this->SetScrollPos(SB_VERT,nOffSetVert);
}
RedrawWindow(0,0,RDW_FRAME|RDW_INVALIDATE|RDW_UPDATENOW);
return CListBox::OnMouseWheel(nFlags, zDelta, pt);
}
//void CTransparentListBox::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
//{
// SetRedraw(FALSE);
// CListBox::OnKeyDow
- 1
- 2
- 3
- 4
前往页