📄 slider.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 + -