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

📄 coollistctrl.cpp

📁 自绘CCombBox组件,具有combo组件的所有功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	//画背景
	m_MemDC.BitBlt(m_screenRect.left,m_screenRect.top,m_screenRect.Width(),m_screenRect.Height(),
		m_pBackDC,m_pBkImageRect->left,m_pBkImageRect->top,SRCCOPY);
	
	//创建并且设置字体
	pOldFont = (CFont*)m_MemDC.SelectObject(font); 

	//画标题文字
	m_MemDC.SetBkMode(TRANSPARENT);
	m_MemDC.SetTextColor(m_TextColor);
	CRect TempRect;

	//绘制列表条目文字
	for(int i = m_iHead,j = AREA_LIST_SLIDER_0 ;i<=m_iTail;i++,j++)
	{

			GetAppointedRect(j,&TempRect);
			
			if(m_iCurTextID == i)
			{
				DrawSemiTransparentRect(&m_MemDC,TempRect,m_SeledTransColor);//半透明
				m_MemDC.SetTextColor(m_SeledTxtColor);
			}
			else
			{
				DrawSemiTransparentRect(&m_MemDC,TempRect,m_TransColor);//半透明
				m_MemDC.SetTextColor(m_TextColor);
			}

			m_MemDC.DrawText(m_pItemText.GetAt(i),TempRect,DT_SINGLELINE|DT_VCENTER|DT_CENTER);
	}

	memDC.CreateCompatibleDC(pDC);
	pOldBmp = memDC.SelectObject(m_pButtonBmp);

	//绘制绘制滑竿上按纽
	GetAppointedRect(AREA_LIST_SLIDER_UP,&TempRect);

	if(m_iCurFocusBtn==FOCUS_UPBTN)
	{
			::TransparentImage(m_MemDC.m_hDC,TempRect.left,TempRect.top,TempRect.Width(),TempRect.Height(),
					   memDC.m_hDC,slideWid,0,slideWid,slideWid,RGB(255,0,255));//图片是横放的		
	}
	else
	{
			::TransparentImage(m_MemDC.m_hDC,TempRect.left,TempRect.top,TempRect.Width(),TempRect.Height(),
					   memDC.m_hDC,0,0,slideWid,slideWid,RGB(255,0,255));//图片是横放的	
	}

	//绘制绘制滑竿下按纽
	GetAppointedRect(AREA_LIST_SLIDER_DOWN,&TempRect);

	if(m_iCurFocusBtn==FOCUS_DOWNBTN)
	{
			::TransparentImage(m_MemDC.m_hDC,TempRect.left,TempRect.top,TempRect.Width(),TempRect.Height(),
					   memDC.m_hDC,slideWid*3,0,slideWid,slideWid,RGB(255,0,255));//图片是横放的		
	}
	else
	{
			::TransparentImage(m_MemDC.m_hDC,TempRect.left,TempRect.top,TempRect.Width(),TempRect.Height(),
					   memDC.m_hDC,2*slideWid,0,slideWid,slideWid,RGB(255,0,255));//图片是横放的	
	}

	//绘制滑竿半透明可滑动区域
	GetAppointedRect(AREA_LIST_SLIDER,&TempRect);
	DrawSemiTransparentRect(&m_MemDC,TempRect,m_TransColor);//半透明

	//绘制小滑块
	if(m_iCurFocusBtn==FOCUS_SLIDER)
	{
			::TransparentImage(m_MemDC.m_hDC,m_SliderRect.left,m_SliderRect.top,m_SliderRect.Width(),m_SliderRect.Height(),
					   memDC.m_hDC,slideWid*5,0,slideWid,slideWid,RGB(255,0,255));//图片是横放的		
	}
	else
	{
		::TransparentImage(m_MemDC.m_hDC,m_SliderRect.left,m_SliderRect.top,m_SliderRect.Width(),m_SliderRect.Height(),
				       memDC.m_hDC,slideWid*4,0,slideWid,slideWid,RGB(255,0,255));//图片是横放的	
	}
	
	//绘制边框:灰色
	/*CPen pen( PS_SOLID, 1, m_BorderColor );

	CPen *pOldPen = m_MemDC.SelectObject( &pen );

	m_MemDC.MoveTo(m_screenRect.left,m_screenRect.top);

	m_MemDC.LineTo(m_screenRect.right-1,m_screenRect.top);
	
	m_MemDC.LineTo(m_screenRect.right-1,m_screenRect.bottom-1);
	
	m_MemDC.LineTo(m_screenRect.left,m_screenRect.bottom-1);
	
	m_MemDC.LineTo(m_screenRect.left,m_screenRect.top);
	
	m_MemDC.MoveTo(m_screenRect.right-slideWid,m_screenRect.top);

	m_MemDC.LineTo(m_screenRect.right-slideWid,m_screenRect.bottom);
	
	m_MemDC.SelectObject( pOldPen );

	pen.DeleteObject();*/

	memDC.SelectObject(pOldBmp);

	memDC.DeleteDC();

	pDC->BitBlt(m_screenRect.left,m_screenRect.top,m_screenRect.Width(),m_screenRect.Height(),&m_MemDC,0,0,SRCCOPY);

}



void CCoolListCtrl::OnPaint() 
{
	CPaintDC dc(this); 

	if(!m_bOnceFlag)
	{

		OnceCode(&dc);

		m_bOnceFlag = !m_bOnceFlag;

	}
	
	DrawOneScreen(&dc);
}


BOOL CCoolListCtrl::DestroyWindow() 
{
	m_MemDC.SelectObject(pOldFont);

	font->DeleteObject();

	delete font;
	
	font = NULL;

	m_MemDC.SelectObject(pOldTempBmp);

	m_MemDC.DeleteDC();

	TempBmp.DeleteObject();

	
	return CStatic::DestroyWindow();
}


void CCoolListCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
{
	INT iSeledArea = -1;

	iSeledArea	= GetCurSeledRect(point);


	if( iSeledArea>=AREA_LIST_SLIDER_0 && iSeledArea<=AREA_LIST_SLIDER_7 )//列表
	{	
		m_iCurTextID = m_iHead + iSeledArea;

		m_iCurFocusBtn = -1;

		::InvalidateRect(this->m_hWnd,NULL,false);
	}
	else if(iSeledArea>=AREA_LIST_SLIDER_UP&&iSeledArea<=AREA_LIST_SLIDER_DOWN)//滑块上下按纽
	{
		
		if(iSeledArea == AREA_LIST_SLIDER_UP)
		{


			if(m_iHead>0)
			{
				m_iHead --;
				m_iTail --;
			}

			m_iCurFocusBtn = FOCUS_UPBTN;

			SetSliderPercent(m_iHead);

		}
		else if(iSeledArea == AREA_LIST_SLIDER_DOWN)
		{

			if(m_iTail<m_iItemTotal-1)
			{
				m_iHead ++;
				m_iTail ++;
			}

			SetSliderPercent(m_iHead);

			m_iCurFocusBtn = FOCUS_DOWNBTN;
		}
		GetSliderRectFromPercent(m_fSliderPercent,&m_SliderRect);
		::InvalidateRect(this->m_hWnd,NULL,false);
	}
	else if(iSeledArea == AREA_LIST_SLIDER)//滑竿区域
	{
		m_bIsMouseDownFlag = true;

		CRect rect;
		
		GetAppointedRect(AREA_LIST_SLIDER,&rect);
		
		m_SliderY = point.y;
		
		//求出按下的点与SLIDER区域顶点相对百分比
		m_fSliderPercent = (float)((float)(m_SliderY - rect.top))/((float)rect.Height());
		
		if(m_fSliderPercent<0.0)
			m_fSliderPercent=0.0;
		else if(m_fSliderPercent>1.0)
			m_fSliderPercent = 1.0;

		GetSliderRectFromPercent(m_fSliderPercent,&m_SliderRect);

		m_iCurFocusBtn = FOCUS_SLIDER;

		GetHeadTailFromPercent(m_fSliderPercent,&m_iHead,&m_iTail);
	}


	CStatic::OnLButtonDown(nFlags, point);
}

//通过百分比获得小滑块的位置矩形
void CCoolListCtrl::GetSliderRectFromPercent(float fPercent,CRect *pRect)
{

	CRect rect;
	
	GetAppointedRect(AREA_LIST_SLIDER,&rect);

	int iBaseX,iBaseY;

	iBaseX = rect.left;
	iBaseY = rect.top;

	float ftemp = fPercent;

	if(ftemp<0.0)
		ftemp = 0.0;
	else if(ftemp>1.0)
		ftemp = 1.0;

	float delta_y = ftemp*(float)rect.Height();//相对于顶部的增量

	pRect->left = iBaseX;
	pRect->top = iBaseY + delta_y;
	pRect->right = rect.right;
	pRect->bottom = pRect->top + rect.Width();

	pRect->OffsetRect(0,-rect.Width()/2);//移动半截

}

void CCoolListCtrl::OnMouseMove(UINT nFlags, CPoint point) 
{
	//处理滑竿上的小滑块
	if(m_bIsMouseDownFlag)
	{		
		CRect rect;
		
		GetAppointedRect(AREA_LIST_SLIDER,&rect);
		
		m_SliderY = point.y;
		
		//求出按下的点与SLIDER区域顶点相对百分比
		m_fSliderPercent = (float)((float)(m_SliderY - rect.top))/((float)rect.Height());
	
		if(m_fSliderPercent<0.08)
			m_fSliderPercent=0.08;
		else if(m_fSliderPercent>0.93)
			m_fSliderPercent = 0.93;

		GetSliderRectFromPercent(m_fSliderPercent,&m_SliderRect);
		
		m_iCurFocusBtn = FOCUS_SLIDER;

		GetHeadTailFromPercent(m_fSliderPercent,&m_iHead,&m_iTail);

		::InvalidateRect(this->m_hWnd,NULL,false);
	}
	
	CStatic::OnMouseMove(nFlags, point);
}

void CCoolListCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if(m_bIsMouseDownFlag)
	{
		m_bIsMouseDownFlag = false;
		m_iCurFocusBtn = -1;
	}

	CStatic::OnLButtonUp(nFlags, point);
}


//获得条目总数
INT CCoolListCtrl::GetItemTotal()
{
	return m_iItemTotal;
}

//根据百分比得到头和尾
BOOL CCoolListCtrl::GetHeadTailFromPercent(float fPercent,int *iHead,int *iTail)
{
	
	if(m_iItemTotal<ONEPAGE_NUM)
	{		
		*iHead = 0;
		*iTail = ONEPAGE_NUM - 1;
		return true;
	}

	*iHead = (int)( fPercent*((float)m_iItemTotal) );

	if(*iHead>m_iItemTotal-ONEPAGE_NUM)
		*iHead = m_iItemTotal-ONEPAGE_NUM;

	*iTail = *iHead + ONEPAGE_NUM - 1;
	
	return true;
}

//通过头标志设置SLIDER的位置
BOOL CCoolListCtrl::SetSliderPercent(int iHead)
{
	m_fSliderPercent = ((float)(iHead+4))/((float)m_iItemTotal);//+2是因为一幕为8,一半为4

	return true;
}
//获得当前选择的条目字符串
LPTSTR CCoolListCtrl::GetCurSeledStr()
{
	return m_pItemText.GetAt(m_iCurTextID);
}

//设置颜色
BOOL CCoolListCtrl::SetColor(COLORREF TxtColor,COLORREF SeledTxtColor,
							 COLORREF TransColor,COLORREF SeledTransColor,COLORREF BorderColor)
{

	m_TextColor = TxtColor;

	SeledTxtColor = m_SeledTxtColor;

	m_TransColor = TransColor;

	m_SeledTransColor =SeledTransColor ;

	m_BorderColor = BorderColor;

	return true;
}

//获得当前选中的条目
int CCoolListCtrl::GetCurSeledItem()
{
	return m_iCurTextID;
}

⌨️ 快捷键说明

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