📄 gameobjectslider.cpp
字号:
// ***************************************************************
// GameObject version: 1.0
// -------------------------------------------------------------
// File Name: GameObjectSlider.cpp
// Created: 2007/07/31
// Modified: 2007/07/31 23:28
// Author: William.Liang
// Msn: lwq49@msn.com
// Email: lwq49@21cn.com, lwq49@msn.com
// Description:
//
// Purpose:
// -------------------------------------------------------------
// license:
//
// The contents of this file are subject to the Mozilla Public
// License Version 1.1 (the "License"); you may not use this file
// except in compliance with the License. You may obtain a copy
// of the License at http://www.mozilla.org/MPL/ Software dis-
// tributed under the License is distributed on an "AS IS"
// basis, WITHOUT WARRANTY OF ANY KIND, either express or im-
// plied. See the License for the specific language governing
// rights and limitations under the License.
//
// The Initial Developer of the Original Code is William.Liang .
// Copyright (C) 2007 - All Rights Reserved.
// ***************************************************************
#include "StdAfx.h"
#include ".\gameobjectslider.h"
CGameObjectSlider::CGameObjectSlider(void)
{
m_pResource = NULL;
m_wCurrent = 0;
m_wMax = 1;
m_wMin = 0;
m_wStep = 1;
m_wSliderType = CN_SLIDER_TYPE_NORMAL;
m_wDirection = CN_SLIDER_DIRECTION_LEFTRIGHT;
m_bDropping = false;
m_hWnd = NULL;
m_BasalInfo.Disabled = false;
}
CGameObjectSlider::~CGameObjectSlider(void)
{
}
//计算间隔
void CGameObjectSlider::CalcInterval(){
_SIZE siBarSize = m_GOBar.GetSize();
_SIZE siBlockSize = m_GOBlock.GetSize();
if(m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT || m_wDirection==CN_SLIDER_DIRECTION_RIGHTLEFT){
m_siInterval.cy = 0;
m_siInterval.cx = (siBarSize.cx - (m_wSliderType==CN_SLIDER_TYPE_NORMAL?siBlockSize.cx:0))/(m_wMax - m_wMin);
}
else{
m_siInterval.cx = 0;
m_siInterval.cy = (siBarSize.cy - (m_wSliderType==CN_SLIDER_TYPE_EXTEND?siBlockSize.cy:0))/(m_wMax - m_wMin);
}
}
//对象创建
bool CGameObjectSlider::Create(LPCTSTR lpName, _SIZE siSize, CResource* pResource, _RECT rcBar, _RECT rcBlock, WORD wSliderType, WORD wDirection, WORD wMax, WORD wMin, WORD wStep){
__super::Create(lpName, siSize, Type_Slider);
m_pResource = pResource;
m_wMax = wMax;
m_wMin = wMin;
m_wStep = wStep;
m_GOBar.Create("Bar", _SIZE(rcBar.right-rcBar.left, rcBar.bottom-rcBar.top), pResource);
m_GOBar.SetTextureSize(rcBar);
m_GOBlock.Create("Block", _SIZE(rcBlock.right-rcBlock.left, rcBlock.bottom-rcBlock.top), pResource);
m_GOBlock.SetTextureSize(rcBlock);
Add(GET_OBJECT_INTERFACE(m_GOBar, IGameObject), "Bar");
Add(GET_OBJECT_INTERFACE(m_GOBlock, IGameObject), "Block");
SetSliderType(wSliderType);
SetDirection(wDirection);
m_hWnd = m_pResource->GetGDI()->System_GetState(HGE_HWND);
return true;
}
//渲染对象
void CGameObjectSlider::Render(WPARAM wParam){
m_GOBar.Render(wParam);
m_GOBlock.Render(wParam);
}
//调整当前值
bool CGameObjectSlider::Increase(bool bFlag){
if(bFlag && m_wCurrent>=m_wMax) return false;
if(!bFlag && m_wCurrent<=m_wMin) return false;
SetCurrent(m_wCurrent+(bFlag?1:-1));
return true;
}
//返回当前值
WORD CGameObjectSlider::GetCurrent(){
return m_wCurrent;
}
//返回增长方向
WORD CGameObjectSlider::GetDirection(){
return m_wDirection;
}
//返回最大值
WORD CGameObjectSlider::GetMax(){
return m_wMax;
}
//返回最小值
WORD CGameObjectSlider::GetMin(){
return m_wMin;
}
//返回滑动类型
WORD CGameObjectSlider::GetSliderType(){
return m_wSliderType;
}
//返回步长值
WORD CGameObjectSlider::GetStep(){
return m_wStep;
}
//设置BAR的纹理区域
void CGameObjectSlider::SetBarRect(_RECT rcRect){
m_GOBar.SetTextureSize(rcRect);
}
//设置BLOCK的纹理区域
void CGameObjectSlider::SetBlockRect(_RECT rcRect){
m_GOBlock.SetTextureSize(rcRect);
}
//设置当前值
void CGameObjectSlider::SetCurrent(WORD wCurrent){
WORD wOrignal = m_wCurrent;
m_wCurrent = wCurrent;
//计算位置的位标
_POINT piBlockPos = m_GOBlock.GetLocalPosition();
if(m_wDirection==1 || m_wDirection==2){
//水平方向
piBlockPos.x = m_siInterval.cx*((m_wDirection==1?m_wCurrent:m_wMax-m_wCurrent)-m_wMin);
}
else{
//垂直方向
piBlockPos.y = m_siInterval.cy*((m_wDirection==3?m_wCurrent:m_wMax-m_wCurrent)-m_wMin);
}
if(m_wSliderType==CN_SLIDER_TYPE_NORMAL){
//移动至新位置
m_GOBlock.MoveTo(piBlockPos);
}
else{
//需要重计移动块的大小
_RECT rcSize = m_GOBlock.GetTextureSize();
switch(m_wDirection){
case CN_SLIDER_DIRECTION_LEFTRIGHT:
rcSize.right = piBlockPos.x;
break;
case CN_SLIDER_DIRECTION_TOPBOTTOM:
rcSize.bottom = piBlockPos.y;
break;
case CN_SLIDER_DIRECTION_RIGHTLEFT:
{
_SIZE siBarSize = m_GOBar.GetSize();
rcSize.right = siBarSize.cx - piBlockPos.x;
//移动至新位置
m_GOBlock.MoveTo(piBlockPos);
}
break;
case CN_SLIDER_DIRECTION_BOTTOMTOP:
{
_SIZE siBarSize = m_GOBar.GetSize();
rcSize.bottom = siBarSize.cy - piBlockPos.y;
//移动至新位置
m_GOBlock.MoveTo(piBlockPos);
}
break;
}
//重置物件及纹理的大小
m_GOBlock.SetTextureSize(rcSize);
m_GOBlock.SetSize(_SIZE(rcSize.right, rcSize.bottom));
}
CONTROLMESSAGE* tagControlMsg = new CONTROLMESSAGE;
tagControlMsg->lpVoid = this;
tagControlMsg->wParam = m_wCurrent;
tagControlMsg->lParam = wOrignal;
PostMessage(m_hWnd, CN_CONTROL_MESSAGE, (WPARAM)(tagControlMsg), sizeof(CONTROLMESSAGE));
}
//设置增长方向
void CGameObjectSlider::SetDirection(WORD wDirection){
m_wDirection = wDirection;
_SIZE siBarSize = m_GOBar.GetSize();
_SIZE siBlockSize = m_GOBlock.GetSize();
_POINT piBarPoint;
//BAR按方向居中及设置块的大小
if(m_wDirection == CN_SLIDER_DIRECTION_LEFTRIGHT || m_wDirection == CN_SLIDER_DIRECTION_RIGHTLEFT){
//BAR垂直居中
piBarPoint.y = (m_BasalInfo.Size.cy - siBarSize.cy)/2;
if(m_wSliderType==CN_SLIDER_TYPE_EXTEND){
siBlockSize.cx = 0;
m_GOBlock.SetSize(siBlockSize);
}
}
else{
//BAR水平居中
piBarPoint.x = (m_BasalInfo.Size.cx - siBarSize.cx)/2;
//扩展模式下,移动块默认为0高
if(m_wSliderType==CN_SLIDER_TYPE_EXTEND){
siBlockSize.cy = 0;
m_GOBlock.SetSize(siBlockSize);
}
}
m_GOBar.MoveTo(piBarPoint);
//块按方向对齐顶点
switch(m_wDirection){
case CN_SLIDER_DIRECTION_LEFTRIGHT: //从左至右
case CN_SLIDER_DIRECTION_TOPBOTTOM: //从上至下
//对齐左上角
m_GOBlock.MoveTo(m_BasalInfo.LocalPos);
break;
case CN_SLIDER_DIRECTION_RIGHTLEFT: //从右至左
{
//对齐右上角
_POINT piPos = m_BasalInfo.LocalPos;
piPos.x += (siBarSize.cx-siBlockSize.cx);
m_GOBlock.MoveTo(piPos);
}
break;
case CN_SLIDER_DIRECTION_BOTTOMTOP: //从下至上
{
//对齐左下角
_POINT piPos = m_BasalInfo.LocalPos;
piPos.y += (siBarSize.cy-siBlockSize.cy);
m_GOBlock.MoveTo(piPos);
}
break;
}
//若扩展模式需设置块的纹理大小
if(m_wSliderType==CN_SLIDER_TYPE_EXTEND){
_RECT rcTexture = m_GOBlock.GetTextureSize();
rcTexture.right = rcTexture.left + siBlockSize.cx;
rcTexture.bottom = rcTexture.top + siBlockSize.cy;
m_GOBlock.SetTextureSize(rcTexture);
}
}
//设置最大值
void CGameObjectSlider::SetMax(WORD wMax){
if(m_wCurrent>wMax)
m_wCurrent = wMax;
m_wMax = wMax;
CalcInterval();
}
//设置最小值
void CGameObjectSlider::SetMin(WORD wMin){
if(m_wCurrent<wMin)
m_wCurrent = wMin;
m_wMin = wMin;
CalcInterval();
}
//设置图片资源
void CGameObjectSlider::SetResource(CResource* pResource){
m_pResource = pResource;
}
//设置滑动类型
void CGameObjectSlider::SetSliderType(WORD wType){
m_wSliderType = wType;
}
//设置步长值
void CGameObjectSlider::SetStep(WORD wStep){
m_wStep = wStep;
}
//************************************
// <p>Description: 接口查询</p>
// <p>Parameters: </p>
// <p> const IID & Guid</p>
// <p> DWORD dwQueryVer</p>
//
// <p>Returns: void*</p>
//************************************
void* CGameObjectSlider::QueryInterface(const IID &Guid, DWORD dwQueryVer){
QUERYINTERFACE(IGameObjectSlider,Guid,dwQueryVer);
QUERYINTERFACE(IGameObject,Guid,dwQueryVer);
QUERYINTERFACE(IBaseObject,Guid,dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(IGameObjectSlider,Guid,dwQueryVer);
return NULL;
}
//************************************
// <p>Description: =操作重载</p>
// <p>Parameters: </p>
// <p> const CGameObjectText & GameObject</p>
//
// <p>Returns: CGameObjectText&</p>
//************************************
CGameObjectSlider& CGameObjectSlider::operator=(CGameObjectSlider& GameObject){
CGameObject* pOtherBaseClass = static_cast<CGameObject *>(&GameObject);
CGameObject* pMySelfBaseClass = static_cast<CGameObject *>(this);
*pMySelfBaseClass = *pOtherBaseClass;
m_siInterval = GameObject.m_siInterval;
m_pResource = GameObject.m_pResource;
m_wCurrent = GameObject.m_wCurrent;
m_wMax = GameObject.m_wMax;
m_wMin = GameObject.m_wMin;
m_wSliderType = GameObject.m_wSliderType;
m_wStep = GameObject.m_wStep;
m_GOBar = GameObject.m_GOBar;
m_GOBlock = GameObject.m_GOBlock;
m_wDirection = GameObject.m_wDirection;
Add(GET_OBJECT_INTERFACE(m_GOBar, IGameObject), "Bar");
Add(GET_OBJECT_INTERFACE(m_GOBlock, IGameObject), "Block");
return *this;
}
//************************************
// <p>Description: 鼠标移动</p>
// <p>Parameters: </p>
// <p> float x</p>
// <p> float y</p>
// <p> int nType</p>
// <p> int nKey</p>
//
// <p>Returns: bool</p>
//************************************
bool CGameObjectSlider::OnMouseMove(float x, float y, UINT nComboKey){
if(nComboKey!=0 && m_bDropping){
_POINT piBlockPos = m_GOBlock.ScreenToLocal(_POINT(x, y));
if(!m_GOBlock.Hitting(x,y)){
if(m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT || m_wDirection==CN_SLIDER_DIRECTION_RIGHTLEFT){
if(piBlockPos.x<0)
Increase(m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT?false:true);
else
Increase(m_wDirection==CN_SLIDER_DIRECTION_RIGHTLEFT?false:true);
}
else{
if(piBlockPos.y<0)
Increase(m_wDirection==CN_SLIDER_DIRECTION_TOPBOTTOM?false:true);
else
Increase(m_wDirection==CN_SLIDER_DIRECTION_BOTTOMTOP?false:true);
}
}
}
return true;
}
//************************************
// <p>Description: 鼠标点击</p>
// <p>Parameters: </p>
// <p> float x</p>
// <p> float y</p>
// <p> int nType</p>
// <p> int nKey</p>
//
// <p>Returns: bool</p>
//************************************
bool CGameObjectSlider::OnMouseClick(float x, float y, int nType, UINT nMessage, UINT nComboKey){
if(nType==INPUT_MOUSE_DOWN){
_POINT piBlockPos = m_GOBlock.ScreenToLocal(_POINT(x, y));
if(m_wSliderType==CN_SLIDER_TYPE_NORMAL){
if(m_GOBlock.Hitting(x,y)){
m_bDropping = true;
}
else{
if(m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT || m_wDirection==CN_SLIDER_DIRECTION_RIGHTLEFT){
if(piBlockPos.x<0)
Increase(m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT?false:true);
else
Increase(m_wDirection==CN_SLIDER_DIRECTION_RIGHTLEFT?false:true);
}
else{
if(piBlockPos.y<0)
Increase(m_wDirection==CN_SLIDER_DIRECTION_TOPBOTTOM?false:true);
else
Increase(m_wDirection==CN_SLIDER_DIRECTION_BOTTOMTOP?false:true);
}
}
}
else{
//根据X,Y求出当前STEP
//求间隔宽度
piBlockPos = ScreenToLocal(_POINT(x, y));
WORD wStep = 0;
if(m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT || m_wDirection==CN_SLIDER_DIRECTION_RIGHTLEFT){
//左右
wStep = (WORD)(piBlockPos.x/m_siInterval.cx);
wStep = (m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT?wStep+1:m_wMax-wStep)-m_wMin;
}
else{
//上下
wStep = (WORD)abs(piBlockPos.y/m_siInterval.cy);
wStep = (m_wDirection==CN_SLIDER_DIRECTION_TOPBOTTOM?wStep+1:m_wMax-wStep)-m_wMin;
}
SetCurrent(wStep);
}
}
else{
if(nType==INPUT_MOUSE_UP && m_bDropping)
m_bDropping = false;
}
return true;
}
//************************************
// <p>Description: 鼠标移出</p>
// <p>Parameters: </p>
// <p> float x</p>
// <p> float y</p>
// <p> int nType</p>
// <p> int nKey</p>
//
// <p>Returns: bool</p>
//************************************
bool CGameObjectSlider::OnMouseOut(float x, float y, int nType, UINT nMessage, UINT nComboKey){
if(m_bDropping){
m_bDropping = false;
}
return true;
}
//************************************
// <p>Description: 键盘事件</p>
//
// <p>Returns: bool</p>
//************************************
bool CGameObjectSlider::OnKeyDown(TCHAR nKey, UINT nFlag){
//只处理KEYDOWN事件
switch(nKey){
case VK_LEFT: //左
case VK_UP: //上
if(m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT || m_wDirection==CN_SLIDER_DIRECTION_TOPBOTTOM)
Increase(false);
else
Increase();
break;
case VK_RIGHT: //右
case VK_DOWN: //下
if(m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT || m_wDirection==CN_SLIDER_DIRECTION_TOPBOTTOM)
Increase();
else
Increase(false);
break;
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -