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

📄 clistdialog.cpp

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

#include "stdafx.h"
#include "cListDialog.h"
#include "cButton.h"
#include "cGuageBar.h"
#include "cFont.h"
#include "../Input/Mouse.h"


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

cListDialog::cListDialog()
{
	m_lLineHeight		= LINE_HEIGHT;		//default
	m_lLineNum			= 0;
	m_lTopListItemIdx	= 0;
	memset(&m_textRelRect, 0, sizeof(RECT));
	m_minMiddleNum		= 0;
	m_maxMiddleNum		= 0;
	m_wMaxLine			= 50;
	m_middleNum			= 0;
	m_topHeight			= m_downHeight = m_middleHeight = 0;

	m_type				= WT_LISTDIALOG;
	
	m_pLengthLongBtn	= m_pLengthShortBtn = NULL;
	m_pUpwardBtn		= m_pDownwardBtn = NULL;
	m_pGuageBar			= NULL;

	m_SelectedRowIdx	= -1;
	m_ClickSelected		= -1;
	m_fGap				= 0.0f;

	m_bAutoScroll		= TRUE;
}

cListDialog::~cListDialog()
{
}

void cListDialog::Add(cWindow * btn)
{
	if(btn->GetType() == WT_BUTTON)
	{
		if(!m_pUpwardBtn)
		{
			m_pUpwardBtn = (cButton *)btn;
		}
		else if(!m_pDownwardBtn)
		{
			m_pDownwardBtn = (cButton *)btn;
		}
		else if(!m_pLengthLongBtn)
		{
			m_pLengthLongBtn = (cButton *)btn;
		}
		else if(!m_pLengthShortBtn)
		{
			m_pLengthShortBtn = (cButton *)btn;
		}
	}
	else if(btn->GetType() == WT_GUAGEBAR)
	{
		m_pGuageBar = (cGuageBar *)btn;
	}

	cDialog::Add(btn);
}

void cListDialog::Init(LONG x, LONG y, WORD wid, cImage * topImage, WORD topHei, cImage * middleImage, WORD middleHei, cImage * downImage, WORD downHei, cImage * overImage, BYTE num, LONG ID)
{
	// #POINT俊辑 涝仿茄 height绰 荤侩窍瘤 臼绰促
	m_TopImage		= *topImage; 
	m_MiddleImage	= *middleImage; 
	m_DownImage		= *downImage;
	m_OverImage		= *overImage;

	m_topHeight		= topHei; m_middleHeight = middleHei; m_downHeight = downHei;
	m_middleNum		= num;
	int hei			= topHei + downHei + ( num * middleHei );

	cDialog::Init(x,y,wid,hei,NULL,ID);
}

void cListDialog::InitList(WORD wMaxLine, RECT * textClippingRect)
{
	m_wMaxLine = wMaxLine;
	CopyRect(&m_textRelRect, textClippingRect);

	// m_middleNum绰 Init()俊辑 悸泼等 蔼
	// InitList菊俊 m_minMiddleNum, m_maxMiddleNum啊 汲沥登绢 乐绢具 茄促
	Resize( m_middleNum );
}


BOOL cListDialog::Resize(BYTE middleNum)
{
	if(middleNum > m_maxMiddleNum) return FALSE;
	if(middleNum < m_minMiddleNum) return FALSE;

	int var_len = (middleNum - m_middleNum)*m_middleHeight;
	m_middleNum = middleNum;
	m_textRelRect.bottom += var_len;
	m_height = m_topHeight+m_downHeight+(m_middleNum*m_middleHeight);
//	m_lLineHeight = LINE_HEIGHT;		// 烙矫 咆胶飘 臭捞
	m_lLineNum = (m_textRelRect.bottom-m_textRelRect.top)/m_lLineHeight;
//	m_lLineNum = m_middleNum;
	return TRUE;
}

BOOL cListDialog::IsMaxLineOver()
{
	if(m_lLineNum > GetItemCount())
		return FALSE;
	else
		return TRUE;
}

DWORD cListDialog::ActionEvent(CMouse * mouseInfo)
{
	DWORD we = WE_NULL;
	if( !m_bActive ) return we;

	if( IsMaxLineOver() )
	{	
		if(m_pUpwardBtn)
		{
			m_pUpwardBtn->SetActive(TRUE);
		}
		if(m_pDownwardBtn)
		{
			m_pDownwardBtn->SetActive(TRUE);
		}

		if(m_pGuageBar)
		{
			m_pGuageBar->SetActive(TRUE);
			m_pGuageBar->ActionEvent(mouseInfo);
		}
			
	}
	else if( m_bAutoScroll )
	{
		if(m_pUpwardBtn)
		{
			m_pUpwardBtn->SetActive(FALSE);
		}
		if(m_pDownwardBtn)
		{
			m_pDownwardBtn->SetActive(FALSE);
		}
		if(m_pGuageBar)
		{
			m_pGuageBar->SetActive(FALSE);
		}
	}

	DWORD we2 = WE_NULL;

	if(m_pLengthLongBtn)
	{
		we2 = m_pLengthLongBtn->ActionEvent(mouseInfo);
		if(we2 & WE_BTNCLICK)
			onSize(TRUE);
	}
	if(m_pLengthShortBtn)
	{
		we2 = m_pLengthShortBtn->ActionEvent(mouseInfo);
		if(we2 & WE_BTNCLICK)
			onSize(FALSE);
	}

	if(m_pUpwardBtn)
	{
		we2 = m_pUpwardBtn->ActionEvent(mouseInfo);
		if(we2 & WE_BTNCLICK)
			OnUpwardItem();
	}

	if(m_pDownwardBtn)
	{
		we2 = m_pDownwardBtn->ActionEvent(mouseInfo);
		if(we2 & WE_BTNCLICK)
			OnDownwardItem();
	}


	LONG cnt = GetItemCount();
	int itemCnt = cnt - m_lLineNum;
	if(itemCnt > 0)
	{
		if(m_pGuageBar)
		if(m_pGuageBar->IsDrag() )
		{
			m_lTopListItemIdx = (LONG)(((float)itemCnt)*m_pGuageBar->GetCurRate());
		}
	}
	else
		m_lTopListItemIdx = 0;

	// LBS 03.10.20  Mouse俊 措茄 眉农甫 茄促. (阿 Line俊 措茄 check)
	we |= cDialog::ActionEvent(mouseInfo);

//	LONG x = mouseInfo->GetMouseX();
//	LONG y = mouseInfo->GetMouseY();
	
//	if( mouseInfo->LButtonDown() )
//	if( PtInWindow( x, y ) /*&& !WINDOWMGR->IsMouseDownUsed()*/ )
//		we |= WE_LBTNCLICK;
	ListMouseCheck( mouseInfo );

	return we;
}

BOOL cListDialog::PtInWindow(LONG x, LONG y)
{
	if( !m_bActive ) return FALSE;

	WORD height = m_topHeight + m_middleNum * m_middleHeight; 
	if(m_absPos.x > x || m_absPos.y > y || m_absPos.x+m_width < x || m_absPos.y+height < y)
		return FALSE;
	else
		return TRUE;
}

void cListDialog::ListMouseCheck( CMouse * mouseInfo )
{
	LONG x = mouseInfo->GetMouseX();
	LONG y = mouseInfo->GetMouseY();
	

	int selIdx = PtIdxInRow(x, y);

	if( selIdx < m_lLineNum && selIdx != -1)
	{

		m_SelectedRowIdx = selIdx;
		if( mouseInfo->LButtonDown() )
		{
			ITEM* item = NULL;
			LONG i = 0;

			m_ClickSelected  = selIdx + m_lTopListItemIdx;

			PTRLISTPOS pos = m_ListItem.FindIndex(m_lTopListItemIdx+m_SelectedRowIdx);
			if( pos == NULL ) return;

			item = (ITEM*)m_ListItem.GetAt(pos);
			if( item )
			{
				cbWindowFunc(m_ID, m_pParent, WE_ROWCLICK);	//PPP
//				we |= WE_ROWCLICK;
			}
		}
	}
	else
	{
		m_SelectedRowIdx = -1;
	}
}

void cListDialog::Render()
{
	if(!m_bActive) return;
	cDialog::RenderWindow();			//component render

	static VECTOR2 m_tmpPos;
	m_TopImage.RenderSprite(NULL,NULL,0,&m_absPos,RGBA_MERGE(m_dwImageRGB, m_alpha * m_dwOptionAlpha / 100));

	m_tmpPos.x = m_absPos.x;
	m_tmpPos.y = m_absPos.y+m_topHeight;
	for(int j = 0 ; j < m_middleNum ; j++)
	{
		m_MiddleImage.RenderSprite(NULL,NULL,0,&m_tmpPos,RGBA_MERGE(m_dwImageRGB, m_alpha * m_dwOptionAlpha / 100));
		m_tmpPos.y += m_middleHeight;
	}

		m_DownImage.RenderSprite(NULL,NULL,0,&m_tmpPos,RGBA_MERGE(m_dwImageRGB, m_alpha * m_dwOptionAlpha / 100));

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

	// List Text Display //////////////////////////////////////////////////////////////

	PTRLISTPOS pos = m_ListItem.FindIndex( m_lTopListItemIdx );
	ITEM* item = NULL;
	LONG i = 0;

	// 巩磊 吝埃俊 窍捞扼捞飘 祸阑 持菌阑 版快(Item狼 Line阑 眉农)
	// RaMa 04.8.3
	int bline = -1;
	int blinelen = 0;
	int line = -1;
	int linelen = 0;
	DWORD dwFontColor = 0xffffffff;

	while(pos)
	{
		item = (ITEM*)m_ListItem.GetNext(pos);
		if(line < m_lLineNum-1)
//		if(i < m_lLineNum)
		{
			if(CFONT_OBJ->IsCreateFont(m_wFontIdx))
			{
				// 捞傈苞 鞍篮 扼牢捞搁 捞傈狼 辨捞甫 备茄促.
				if(item->line != -1 && item->line == bline)
				{					
					linelen += blinelen;
					blinelen = strlen(item->string)*CFONT_OBJ->GetTextWidth(m_wFontIdx);
				}
				// 货肺款 扼牢捞搁
				else if(item->line != -1 && item->line != bline)
				{
					linelen = 0;
					++line;
					bline = item->line;
					blinelen = strlen(item->string)*CFONT_OBJ->GetTextWidth(m_wFontIdx);
				}
				// 老馆利牢 版快
				else
				{					
					linelen = 0;
					++line;
				}

				RECT rect={(LONG)m_absPos.x+m_textRelRect.left+linelen, (LONG)m_absPos.y+m_textRelRect.top + (m_lLineHeight*line), 1,1};

				if( (m_ClickSelected-m_lTopListItemIdx) == line )
					CFONT_OBJ->RenderFont(m_wFontIdx,item->string,lstrlen(item->string),&rect,RGBA_MERGE(0xffffff00, m_alpha * m_dwOptionAlpha / 100));
				else
					CFONT_OBJ->RenderFont(m_wFontIdx,item->string,lstrlen(item->string),&rect,RGBA_MERGE(item->rgb, m_alpha * m_dwOptionAlpha / 100));



				

/*				// 促弗 扼牢捞搁 临阑 官层霖促.				
				RECT rect={(LONG)m_absPos.x+m_textRelRect.left, (LONG)m_absPos.y+m_textRelRect.top + (m_lLineHeight*i), 1,1};
				//rect.right = rect.left + 1;
				//rect.bottom = rect.top + 1;
				
				CFONT_OBJ->RenderFont(m_wFontIdx,item->string,lstrlen(item->string),&rect,RGBA_MERGE(item->rgb, m_alpha * m_dwOptionAlpha / 100));				
*/
			}
//			i++;
		}
		else
			break;
	}
	////////////////////////////////////////////////////////////////////////////////////

	cDialog::RenderComponent();			//component render
}


void cListDialog::onSize(BOOL fSize)
{
	if(fSize)
	{
		// long
		if(!Resize(m_middleNum+1)) return;
		//1. 扩档快 捞悼
		SetAbsY((LONG)(GetAbsY()-m_middleHeight));
		SetHeight(cWindow::GetHeight()+m_middleHeight);
		//2. guagebar函拳
		m_pGuageBar->SetAbsY((LONG)(m_pGuageBar->GetAbsY()-m_middleHeight));
		m_pGuageBar->SetHeight(m_pGuageBar->GetHeight()+m_middleHeight);
		m_pGuageBar->SetInterval(m_pGuageBar->GetInterval()+m_middleHeight);
		//3. upward 困摹 函拳
		m_pUpwardBtn->SetAbsY((LONG)(m_pUpwardBtn->GetAbsY()-m_middleHeight));
		
		OnUpwardItem();	//KES 040309
	}
	else
	{
		// short
		if(!Resize(m_middleNum-1)) return;
		//1. 扩档快 捞悼
		SetAbsY((LONG)((GetAbsY()+m_middleHeight)));
		SetHeight(cWindow::GetHeight()-m_middleHeight);
		//2. guagebar函拳
		m_pGuageBar->SetAbsY((LONG)(m_pGuageBar->GetAbsY()+m_middleHeight));
		m_pGuageBar->SetHeight(m_pGuageBar->GetHeight()-m_middleHeight);
		m_pGuageBar->SetInterval(m_pGuageBar->GetInterval()-m_middleHeight);
		//3. upward 困摹 函拳
		m_pUpwardBtn->SetAbsY((LONG)(m_pUpwardBtn->GetAbsY()+m_middleHeight));
		
		OnDownwardItem();	//KES 040309
	}
}

void cListDialog::OnUpwardItem() 
{ 
	LONG cnt = GetItemCount();
	if(cnt < m_lLineNum) return;

	if(m_lTopListItemIdx < 1) return;
	m_lTopListItemIdx--;

	if( m_pGuageBar )
	m_pGuageBar->SetCurRate( (float)m_lTopListItemIdx/(float)(cnt-m_lLineNum) );
	
}

void cListDialog::OnDownwardItem() 
{ 
	LONG cnt = GetItemCount();
	if(cnt < m_lLineNum) return;

	if((cnt-m_lTopListItemIdx-1) < m_lLineNum) return;
	m_lTopListItemIdx++;

	if( m_pGuageBar )
	m_pGuageBar->SetCurRate( (float)m_lTopListItemIdx/(float)(cnt-m_lLineNum) );
}

void cListDialog::AddItem(char * str, DWORD color, int line)
{
	ITEM* pItem = new ITEM;
	strcpy( pItem->string, str);
	pItem->rgb = color;
	pItem->line = line;
//	pItem->line = -1;
	cListItem::AddItem(pItem);	

//盖酒贰老锭父
/*	if( m_pGuageBar )
	if( m_lTopListItemIdx == GetItemCount() - m_lLineNum -1 )
	{
		m_pGuageBar->SetCurValue(m_pGuageBar->GetMaxValue());
		m_lTopListItemIdx = GetItemCount() - m_lLineNum;
	}
*/
	if( m_pGuageBar )
	if( m_lTopListItemIdx == GetItemCount() - m_lLineNum -1 )
	{
		m_pGuageBar->SetCurValue(m_pGuageBar->GetMaxValue());
		m_lTopListItemIdx = GetItemCount() - m_lLineNum;
	}

	
}


void cListDialog::SetTopListItemIdx(int Idx)
{
	m_lTopListItemIdx=Idx;
	LONG cnt = GetItemCount();

	if( m_pGuageBar )
	{
		float rate = (float)m_lTopListItemIdx/(float)(cnt-m_lLineNum);
		if(rate > 1.f)		rate = 1.f;
		else if(rate< 0.f)	rate = 0.f;
		m_pGuageBar->SetCurRate( rate );		
	}	
}

//void cListDialog::RemoveItem( char * str )
//{
//	
//}

int cListDialog::PtIdxInRow(LONG x, LONG y)
{
	LONG cnt = GetItemCount();

	for(int i = 0 ; i < cnt ; i++)
	{
		if( m_absPos.x < x 
			&& m_absPos.y < y
			&& x < m_absPos.x+m_width 
			&& y < m_absPos.y+m_textRelRect.top+(i+1)*m_lLineHeight )

			return i;
	}

	return -1;
}

int cListDialog::GetCurSelectedRowIdx()
{
	if( m_SelectedRowIdx == -1 ) 
		return m_SelectedRowIdx;

	return m_SelectedRowIdx+m_lTopListItemIdx;
}

void cListDialog::ResetGuageBarPos()
{ 
	if( m_pGuageBar )
	{
		m_pGuageBar->SetCurValue(0); 

		int itemCnt = GetItemCount() - m_lLineNum;
		
		if(itemCnt > 0)
			m_lTopListItemIdx = (LONG)(((float)itemCnt)*m_pGuageBar->GetCurRate());
		else
			m_lTopListItemIdx = 0;
	}
}

void cListDialog::SetLineHeight( LONG height )
{ 
	m_lLineHeight = height; 

	if( height > 10 )
		m_fGap = ((float)height - 10.0f)/2.0f; // 烙矫肺 (唱吝俊 臂磊狼 臭捞甫 舅酒客辑 拌魂茄促.)
	else
		m_fGap = 0.0f;
}

⌨️ 快捷键说明

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