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

📄 slider.cpp

📁 3D游戏展示程序
💻 CPP
字号:
//--------------------------------------------------
//  Desc: Slider
//  Author: artsylee/2006.11.18
//--------------------------------------------------
#include "../stdafx.h"
#include "Slider.h"
#include "../Core/Common.h"
#include "../Core/Input.h"
#include "../Core/IniFile.h"
#include "../Core/Graphics.h"
#include "../Core/Log.h"
#include "../Core/Message.h"
#include "../Core/Interface.h"
#include "../Core/TextureManager.h"


CSlider::CSlider(CWindow* pParent):CWindow(pParent)
{
	m_dwGUIType = GUI_SLIDER;
	m_hBtnTexture = INVALID_HANDLE;
	m_bPressed = false;
}

CSlider::~CSlider()
{
	if(g_pTextureManager)
	{
		ReleaseTexture(m_hBtnTexture);
	}
}

bool CSlider::LoadFromIni(char* pfilename, char* pIndex)
{
	CIniFile ui(pfilename);
	m_dwID = ui.ReadDWORD(pIndex, "ID");
	m_ptPos = ui.ReadPoint(pIndex, "Position");
	m_rcSrc = ui.ReadRect(pIndex, "SrcRect");
	m_dwColor = ui.ReadDWORD(pIndex, "Color", 0xffffffff);
	m_dwAttrib = ui.ReadDWORD(pIndex, "Attrib", 10);
	m_nMax = ui.ReadInt(pIndex, "Max", 100);
	m_nMin = ui.ReadInt(pIndex, "Min", 0);
	int nValue = ui.ReadInt(pIndex, "Value", 50);
	m_SliderType = (SLIDER_TYPE)(ui.ReadInt(pIndex, "Type"));
	
	GRect zeroRc(0, 0, 0, 0);
	ui.ReadString(pIndex, "File", m_szUIPath);
	DWORD index = ui.ReadDWORD(pIndex, "Picture");
	if(ui.IsReadSucceed())
	{
		m_hTexture = LoadAMFTexture(m_szUIPath, index);
		if(m_rcSrc==zeroRc)
		{
			CTexture * ptex = g_pTextureManager->GetTexture(m_hTexture);
			if(ptex)
			{
				m_rcSrc.SetRect(0, 0, ptex->GetWidth(), ptex->GetHeight());
			}
		}
		CTexture *pTex = g_pTextureManager->GetTexture(m_hTexture);
		if(pTex)
		{
			m_WindowBorder = pTex->GetHeight();
			if(m_WindowBorder==8)	m_WindowCull = 3;
			if(m_WindowBorder==16)	m_WindowCull = 5;
			if(m_WindowBorder==32)	m_WindowCull = 10;
		}
	}

	if(m_rcSrc==zeroRc)
	{
		WriteLog(INFO_ERROR, "Can't Get m_rcSrc in file[%s] index[%s]", pfilename, pIndex);
		return false;
	}
	m_rcButton = ui.ReadRect(pIndex, "BtnSrcRect");

	index = ui.ReadDWORD(pIndex, "BtnPicture");
	if(ui.IsReadSucceed())
		m_hBtnTexture = LoadAMFTexture(m_szUIPath, index);
	if(m_rcButton==zeroRc && m_hBtnTexture)
	{
		CTexture * ptex = g_pTextureManager->GetTexture(m_hBtnTexture);
		if(ptex)
		{
			m_rcButton.SetRect(0, 0, ptex->GetWidth(), ptex->GetHeight());
		}
	}
	if(m_rcButton==zeroRc)
	{
		WriteLog(INFO_ERROR, "Can't Get m_rcButton in file[%s] index[%s]", pfilename, pIndex);
		return false;
	}
	if(m_pParent)
	{
		OffSet(m_pParent->GetRect().left, m_pParent->GetRect().top);
	}
	SetValueInternal(nValue, false);
	return true;
}

void  CSlider::OffSet(int x, int y)
{
	CWindow::OffSet(x, y);
	UpdateRect();
}

void CSlider::UpdateRect()
{
	if(m_SliderType)	// 垂直
	{
		int m_nYButtonOffset = (int)(((float)(m_rcSrc.Height()-m_rcButton.Height())/(m_nMax-m_nMin))*(m_nValue-m_nMin));
		m_ptButton.y = m_ptPos.y + m_nYButtonOffset;
		m_ptButton.x = m_ptPos.x+m_rcSrc.Width()/2-m_rcButton.Width()/2;
	}
	else				// 水平
	{
		int m_nXButtonOffset = (int)(((float)(m_rcSrc.Width()-m_rcButton.Width())/(m_nMax-m_nMin))*(m_nValue-m_nMin));
		m_ptButton.x = m_ptPos.x + m_nXButtonOffset;
		m_ptButton.y = m_ptPos.y+m_rcSrc.Height()/2-m_rcButton.Height()/2;
	}
}

void CSlider::SetValueInternal(int nValue, bool bFromInput)
{
	nValue = (m_nMin>nValue)?m_nMin:nValue;
	nValue = (m_nMax<nValue)?m_nMax:nValue;

	if(m_nValue != nValue)
	{
		m_nValue = nValue;
		//发送ValueChange信息
		CMessage msg(MSG_SYS_GUI, m_dwID);
		msg.SetParameter(GUI_VALUE_CHANGE, m_nValue, this);
		PostMessage(msg);
	}
	UpdateRect();
}

void CSlider::SetRange(int nMin, int nMax)
{
	m_nMin = nMin;
	m_nMax = nMax;

	SetValueInternal(m_nValue, false);
}

void CSlider::SetValue(int nValue)
{
	SetValueInternal(nValue, false); 
}

void CSlider::Render()
{
	if(m_dwAttrib & GUI_VISIBLE)
	{
		RECT rc = { m_ptPos.x, m_ptPos.y, m_ptPos.x+m_rcSrc.Width(), m_ptPos.y+m_rcSrc.Height()	};
		CWindow::RenderNewStyle(m_hTexture, rc, m_dwColor, m_WindowBorder);
		//g_pGraphics->RenderSprite(m_hTexture, m_ptPos.x, m_ptPos.y, &m_rcSrc, m_dwColor);
		g_pGraphics->RenderSprite(m_hBtnTexture, m_ptButton.x, m_ptButton.y, &m_rcButton, m_dwColor);
	}
}

DWORD CSlider::ProcessEvent()
{
	if(!(m_dwAttrib & GUI_VISIBLE) || !(m_dwAttrib & GUI_ENABLE) || m_hBtnTexture==INVALID_HANDLE)
	{
		return INVALID_ID;
	}
	GRect rcPos;
	rcPos.SetRectWH(m_ptButton.x, m_ptButton.y, m_rcButton.Width(), m_rcButton.Height());
	if(CheckInRGN(rcPos) && g_stInputInfo.MouseValue==LB_DOWN)
	{
		m_bPressed = true;
	}
	rcPos.SetRectWH(m_ptPos.x, m_ptPos.y, m_rcSrc.Width(), m_rcSrc.Height());
	if(CheckInRGN(rcPos))
	{
		// 点击
		if(g_stInputInfo.MouseValue==LB_DOWN && !m_bPressed)
		{	
			SetValueInternal(ValueFromMousePos(), true);
			return m_dwID;
		}
	}
	if(g_stInputInfo.MouseMove && m_bPressed)
	{
		SetValueInternal(ValueFromMousePos(), true);
	}
	if(g_stInputInfo.MouseValue==LB_UP)
	{
		if(m_bPressed)
		{
			m_bPressed = false;
		}
	}
	if(m_bPressed)
	{
		return m_dwID;
	}
	return INVALID_ID;
}

int CSlider::ValueFromMousePos()
{
	int newValue = 0;
	float fPixelPerValue = 0.0f;
	if(m_SliderType)	// 垂直
	{
		fPixelPerValue = (float)(m_rcSrc.Height()-m_rcButton.Height())/(m_nMax-m_nMin);
		newValue = (int)((g_stInputInfo.point.y-m_ptPos.y)/fPixelPerValue);
	}
	else				// 水平
	{
		fPixelPerValue = (float)(m_rcSrc.Width()-m_rcButton.Width())/(m_nMax-m_nMin);
		newValue = (int)((g_stInputInfo.point.x-m_ptPos.x)/fPixelPerValue);
	}
	return m_nMin+newValue;
}


⌨️ 快捷键说明

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