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

📄 ccombobox.cpp

📁 墨香最新私服
💻 CPP
字号:
// cComboBox.cpp: implementation of the cComboBox class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "cComboBox.h"
#include "cWindowManager.h"
#include "cPushupButton.h"
#include "cFont.h"
#include "../Input/Mouse.h"

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

cComboBox::cComboBox()
{
	m_pComboBtn = NULL;
	m_wFontIdx = 0;
	m_ComboTextColor = RGB_HALF(255,255,255);
	memset(m_szComboText, 0, MAX_COMBOTEXT_SIZE);
	m_type = WT_COMBOBOX;
	m_topHeight=0;
	m_middleHeight=0;
	m_downHeight=0;
	m_listWidth = 0;
	SetRect(&m_textClippingRect, 3,4,0,0);
	
	m_nCurSelectedIdx = -1;
	m_OverImageScale.x = m_OverImageScale.y = 1;
	m_nOverIdx = -1;
}

cComboBox::~cComboBox()
{
	SAFE_DELETE(m_pComboBtn);
}

void cComboBox::Init(LONG x, LONG y, WORD wid, WORD hei, cImage * basicImage, cbFUNC Func, LONG ID)
{
	cWindow::Init(x,y,wid,hei,basicImage,ID);
	if(Func)
		cbWindowFunc = Func;

}
void cComboBox::InitComboList(WORD wid, cImage * topImage, WORD topHei, cImage * middleImage, WORD middleHei, cImage * downImage, WORD downHei, cImage * overImage )
{
	m_listWidth=wid;
	m_TopImage=*topImage;				m_topHeight=topHei;
	m_MiddleImage=*middleImage;			m_middleHeight=middleHei;
	m_DownImage=*downImage;				m_downHeight=downHei;
	m_OverImage = *overImage;
}
DWORD cComboBox::ActionEvent(CMouse * mouseInfo)
{
	DWORD we = WE_NULL;
	if( !m_bActive ) return we;

	we = cWindow::ActionEvent( mouseInfo );
	if( m_bDisable ) return we;

	if( we & WE_LBTNCLICK )	//
	{
		DWORD we2 = m_pComboBtn->ActionEvent(mouseInfo);

		if(we2 & WE_PUSHDOWN)
		{
			cbWindowFunc(m_ID, m_pParent, WE_PUSHDOWN);	//PPP
			return we;
		}
		else if(we2 & WE_PUSHUP)
		{
			cbWindowFunc(m_ID, m_pParent, WE_PUSHUP);	//PPP
			return we;
		}
	}
	
	if(m_pComboBtn->IsPushed())
	{
		ListMouseCheck( mouseInfo );
	}
	
	return we;
}


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

	BOOL LeftDown = mouseInfo->LButtonDown();
	
	if( !WINDOWMGR->IsMouseOverUsed() )
	{
		m_nOverIdx = PtIdxInComboList(x, y);
		
		if( m_nOverIdx > GetItemCount() )
			m_nOverIdx = -1;
		else
			WINDOWMGR->SetMouseOverUsed();
	}
	else
	{
		m_nOverIdx = -1;
	}
	
	if( LeftDown )
	{
		LONG x2 = mouseInfo->GetMouseEventX();
		LONG y2 = mouseInfo->GetMouseEventY();

		m_nCurSelectedIdx = PtIdxInComboList(x2, y2);
		
		if(m_nCurSelectedIdx > GetItemCount() || m_nCurSelectedIdx == -1 )
		{
			m_pComboBtn->SetPush(FALSE);
			m_nCurSelectedIdx = -1;
		}
		else if( !WINDOWMGR->IsMouseDownUsed() )
		{
			m_pComboBtn->SetPush(FALSE);
			m_nOverIdx = -1;
			
			PTRLISTPOS p = m_ListItem.FindIndex(m_nCurSelectedIdx);
			ITEM * item = (ITEM*)m_ListItem.GetAt(p);
			if( item )
				strcpy(m_szComboText, item->string);
			// 府胶飘 急琶 妮归
			cbWindowFunc(m_ID, m_pParent, WE_COMBOBOXSELECT);	//PPP

			WINDOWMGR->SetMouseDownUsed();
		}
	}
}

WORD cComboBox::PtIdxInComboList(LONG x, LONG y)
{
	int listnum = GetItemCount();
	for(int i = 0 ; i < listnum ; i++)
	{
		if(m_absPos.x < x && m_absPos.y+m_height < y && x < m_absPos.x+m_listWidth && y < m_absPos.y+m_height+(i+1)*m_middleHeight)
			return i;
	}

	return listnum+1;
}

void cComboBox::Render()
{
	cWindow::Render();
	m_pComboBtn->Render();

	if(m_pComboBtn->IsPushed())
	{
		// 府胶飘 焊烙
		int listnum = GetItemCount();
		switch(listnum)
		{
		case 0:
			break;
		case 1:
			{
				VECTOR2 start_pos;
				start_pos.x = m_absPos.x;
				start_pos.y = m_absPos.y+m_height;
				m_DownImage.RenderSprite(NULL,NULL,0,&start_pos,RGBA_MERGE(m_dwImageRGB, m_alpha * m_dwOptionAlpha / 100));
			}
			break;
		default:
			{
				VECTOR2 start_pos;
				start_pos.x = m_absPos.x;
				start_pos.y = m_absPos.y+m_height;
				m_TopImage.RenderSprite(NULL,NULL,0,&start_pos,RGBA_MERGE(m_dwImageRGB, m_alpha * m_dwOptionAlpha / 100));
				for(int i = 0 ; i < listnum - 2 ; i++)
				{
					start_pos.y += m_middleHeight;
					m_MiddleImage.RenderSprite(NULL,NULL,0,&start_pos,RGBA_MERGE(m_dwImageRGB, m_alpha * m_dwOptionAlpha / 100));
				}
				start_pos.y += m_middleHeight;
				m_DownImage.RenderSprite(NULL,NULL,0,&start_pos,RGBA_MERGE(m_dwImageRGB, m_alpha * m_dwOptionAlpha / 100));

			}
			break;

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


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

		while(pos)
		{
			item = (ITEM*)m_ListItem.GetNext(pos);
			RECT rect={(LONG)m_absPos.x+m_textClippingRect.left, (LONG)m_absPos.y+m_height+m_textClippingRect.top+(m_middleHeight*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++;
		}
		// 亲格 急琶 bg

/* 捞傈 荤亲
		POS pos = m_pItemList->GetFirstPos();
		ITEM * item = NULL;
		LONG i = 0;
		while (pos)
		{
			item = m_pItemList->GetNextPos(pos);
			RECT rect={(LONG)m_absPos.x+m_textClippingRect.left, (LONG)m_absPos.y+m_height+m_textClippingRect.top+(m_middleHeight*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++;
		}
		// 亲格 急琶 bg
*/
	}



	RECT rect={(LONG)m_absPos.x+5, (LONG)m_absPos.y+6, 1,1};
	//rect.right = rect.left + 1;
	//rect.bottom = rect.top + 1;
	CFONT_OBJ->RenderFont(m_wFontIdx,m_szComboText,lstrlen(m_szComboText),&rect,RGBA_MERGE(m_ComboTextColor, m_alpha * m_dwOptionAlpha / 100));
}

void cComboBox::Add(cWindow * pushupBtn)
{
	if(pushupBtn->GetType() == WT_PUSHUPBUTTON)
	{
		if(pushupBtn == (cWindow *)0x00000001)
		{ASSERT(0);}
		m_pComboBtn = (cPushupButton *)pushupBtn;
		m_pComboBtn->SetAbsXY((LONG)(m_absPos.x+m_pComboBtn->m_relPos.x), (LONG)(m_absPos.y+m_pComboBtn->m_relPos.y));
		m_pComboBtn->SetParent(this);
	}
}

void cComboBox::SetAbsXY(LONG x, LONG y)
{
	cWindow::SetAbsXY(x,y);
	if(m_pComboBtn)
	m_pComboBtn->SetAbsXY((LONG)m_absPos.x+(LONG)m_pComboBtn->GetRelX(), (LONG)m_absPos.y+(LONG)m_pComboBtn->GetRelY());
}
void cComboBox::SetMargin(RECT textClippingRect)
{
	m_textClippingRect = textClippingRect;
}

⌨️ 快捷键说明

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