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

📄 clistctrl.cpp

📁 墨香完整原代码 C++ 值得研究 可以编译
💻 CPP
字号:
// cListCtrl.cpp: implementation of the cListCtrl class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "cListCtrl.h"
#include "cFont.h"
#include "../Input/Mouse.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
cListCtrl::cListCtrl()
{
	m_bHeadLineHeight=0;
	m_bBodyLineHeight=0;
	m_wLinePerPage = 0;
	SetRect(&m_textRelRect, 3,4,0,0);
	m_type = WT_LISTCTRL;
	m_SelectedRowIdx = -1;

	m_lTopListItemIdx = 0;

	m_OverImageScale.x = 1;
	m_OverImageScale.y = 1;
	
	m_nOverIdx = -1;
	m_fGap = 0.0f;
	m_wSelectOption = 0;
}

cListCtrl::~cListCtrl()
{

}

void cListCtrl::Init(LONG x, LONG y, WORD wid, WORD hei, cImage * basicImage, LONG ID)
{
	cWindow::Init(x,y,wid,hei,basicImage,ID);
}

void cListCtrl::InitListCtrl(WORD wMaxColumns, WORD wLinePerPage)
{
	m_wLinePerPage = wLinePerPage;
}

void cListCtrl::InitListCtrlImage(cImage * HeadImage, BYTE HHeight, cImage * BodyImage, BYTE BHeight, cImage * OverImage )
{
	m_HeadImage=*HeadImage;
	m_BodyImage=*BodyImage;
	m_bHeadLineHeight=HHeight;
	m_bBodyLineHeight=BHeight;
	m_OverImage = *OverImage;

	if( m_bBodyLineHeight > 10)
		m_fGap = ((float)m_bBodyLineHeight-10.0f)/2.0f;
}
void cListCtrl::Render()
{
	VECTOR2 m_tmpPos = m_absPos;
	m_HeadImage.RenderSprite(NULL,NULL,0,&m_tmpPos,RGBA_MERGE(m_dwImageRGB, m_alpha * m_dwOptionAlpha / 100));
	m_tmpPos.y += m_bHeadLineHeight;

	for(int k = 0 ; k < m_wLinePerPage ; k++)
	{
		m_BodyImage.RenderSprite(NULL,NULL,0,&m_tmpPos,RGBA_MERGE(m_dwImageRGB, m_alpha * m_dwOptionAlpha / 100));
		m_tmpPos.y += m_bBodyLineHeight;
	}

	if( m_wSelectOption == 0 )
	{
		// Over Image Display 
		if( m_nOverIdx != -1 )
		{
			m_tmpPos.x = m_absPos.x;
			m_tmpPos.y = m_absPos.y + m_textRelRect.top + m_bHeadLineHeight + (((float)m_nOverIdx)*m_bBodyLineHeight ) - m_fGap;
			m_OverImage.RenderSprite(&m_OverImageScale,NULL,0,&m_tmpPos,RGBA_MERGE(m_dwImageRGB, m_alpha * m_dwOptionAlpha / 100));
		}
	}
	else if( m_wSelectOption == 1 )
	{
		if( m_nOverIdx != 0 )
		{
			m_tmpPos.x = m_absPos.x;
			m_tmpPos.y = m_absPos.y + m_textRelRect.top + m_bHeadLineHeight + (((float)m_SelectedRowIdx)*m_bBodyLineHeight ) - m_fGap;
			m_OverImage.RenderSprite(&m_OverImageScale,NULL,0,&m_tmpPos,RGBA_MERGE(m_dwImageRGB, m_alpha * m_dwOptionAlpha / 100));
		}
	}

	// HEAD TEXT DISPLAY //////////////////////////////////////////////////////////////
	RECT headRect = {(LONG)m_absPos.x+m_textRelRect.left, (LONG)m_absPos.y+m_textRelRect.top,0,0};
	for(int l = 0 ; l < m_Cols ; l++)
	{
		headRect.right = headRect.left + 1;
		headRect.bottom = headRect.top + 1;
		CFONT_OBJ->RenderFont(m_wFontIdx,pszColumnHeader[l],lstrlen(pszColumnHeader[l]),&headRect,RGBA_MERGE(pColumnTextColor[l], m_alpha * m_dwOptionAlpha / 100));		
		headRect.left += pColumnSize[l];
	}
	
	// BODY TEXT DISPLAY //////////////////////////////////////////////////////////////
	POS pos = m_pItemList->GetIndexPos(m_lTopListItemIdx);
	RITEM * ritem = NULL;
	LONG i = 0;
	while (pos)
    {
        ritem = m_pItemList->GetNextPos(pos);
		if(i < m_wLinePerPage)
		{
			RECT rect={(LONG)m_absPos.x+m_textRelRect.left, (LONG)m_absPos.y+m_bHeadLineHeight+m_textRelRect.top+(m_bBodyLineHeight*i), 0,0};
			for(int j = 0 ; j < m_Cols ; j++)
			{
				CFONT_OBJ->RenderFont(m_wFontIdx,ritem->pString[j],lstrlen(ritem->pString[j]),&rect,RGBA_MERGE(ritem->rgb[j], m_alpha * m_dwOptionAlpha / 100));
				//pGeometry->RenderFont(CFONT_OBJ->GetFont(m_wFontIdx),ritem->pString[j],lstrlen(ritem->pString[j]),&rect,RGBA_MERGE(ritem->rgb[j], m_alpha),CHAR_CODE_TYPE_ASCII,0,0);
				rect.left += pColumnSize[j];
			}
			i++;
		}
		else
			break;
	}
	////////////////////////////////////////////////////////////////////////////////////

	cWindow::Render();
}

DWORD cListCtrl::ActionEvent(CMouse * mouseInfo)
{
//KES INTERFACE 031009
	DWORD we = WE_NULL;
	if( !m_bActive ) return we;

	LONG x = mouseInfo->GetMouseX();
	LONG y = mouseInfo->GetMouseY();

//	BOOL LeftUp = mouseInfo->LButtonUp();
	BOOL LeftDown = mouseInfo->LButtonDown();

	we = cWindow::ActionEvent(mouseInfo);

//	if( !WINDOWMGR->IsMouseOverUsed() )
	if( we & WE_MOUSEOVER )
	{
		m_nOverIdx = PtIdxInRow(x, y);
		if( m_nOverIdx > m_wLinePerPage || m_pItemList->GetCount() <= m_nOverIdx )
			m_nOverIdx = -1;
	}
	else
	{
		m_nOverIdx = -1;
	}

//	if( !WINDOWMGR->IsMouseDownUsed() )
	if( we & WE_LBTNCLICK )
	{
		LONG x = mouseInfo->GetMouseEventX();
		LONG y = mouseInfo->GetMouseEventY();

		int selIdx = PtIdxInRow(x, y);
		if(selIdx < m_wLinePerPage)
		{
			//RITEM * ritem = m_pItemList->GetAt(selIdx);
			//m_SelectedRowIdx = ritem->dwData[0];
			m_SelectedRowIdx = selIdx;
			cbWindowFunc(m_ID, m_pParent, WE_ROWCLICK);	//PPP
			we |= WE_ROWCLICK;
		}
		else
		{
			m_SelectedRowIdx = 0;
		}
	}
	else if( we & WE_LBTNDBLCLICK )
	{
		LONG x = mouseInfo->GetMouseEventX();
		LONG y = mouseInfo->GetMouseEventY();

		int selIdx = PtIdxInRow(x, y);
		if(selIdx < m_wLinePerPage)
		{
			//RITEM * ritem = m_pItemList->GetAt(selIdx);
			//m_SelectedRowIdx = ritem->dwData[0];
			m_SelectedRowIdx = selIdx;
			cbWindowFunc(m_ID, m_pParent, WE_ROWDBLCLICK);	//PPP
			we |= WE_ROWDBLCLICK;
		}
		else
		{
			m_SelectedRowIdx = 0;
		}
	}

	return we;
}

void cListCtrl::SetMargin(const RECT * textRelRect)
{
	CopyRect(&m_textRelRect, textRelRect);
}

WORD cListCtrl::PtIdxInRow(LONG x, LONG y)
{
	for(int i = 0 ; i < m_wLinePerPage ; i++)
	{
		if( m_absPos.x < x 
			&& m_absPos.y+m_bHeadLineHeight < y 
			&& x < m_absPos.x+m_width 
			&& y < m_absPos.y+m_bHeadLineHeight+(i+1)*m_bBodyLineHeight)
			return i;
	}

	return m_wLinePerPage+1;
}
/*
void cListCtrl::ListMouseCheck( LONG x, LONG y, DWORD we )
{
	int selIdx = PtIdxInRow(x, y);

	if(selIdx < m_wLinePerPage)
	{
		if(LeftUp)
		{
			//RITEM * ritem = m_pItemList->GetAt(selIdx);
			//m_SelectedRowIdx = ritem->dwData[0];
			m_SelectedRowIdx = selIdx;
			cbWindowFunc(m_ID, m_pParent, WE_ROWCLICK);	//PPP
			we |= WE_ROWCLICK;
		}
	}
}
*/

⌨️ 快捷键说明

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