跳到主要内容

滑动条(Slider)

滑动条控件可以用于通过滑动滑块来调整对应的数值大小。

在 HiEasyX 中,根据目标数值的类型不同(intfloat)以及为了方便多元向量操作,滑动条总共有 2 个变体(float 变体和 int 变体),每个变体又各有四个版本(分别对应四种多元量)。但是使用起来大同小异。

这八种滑动条分别为:

void Slider1f(const HXString &Title, float &Value, SliderProfile1f &Profile);
void Slider2f(const HXString &Title, float (&Value)[2], SliderProfile2f &Profile);
void Slider3f(const HXString &Title, float (&Value)[3], SliderProfile3f &Profile);
void Slider4f(const HXString &Title, float (&Value)[4], SliderProfile4f &Profile);
void Slider1i(const HXString &Title, int &Value, SliderProfile1i &Profile);
void Slider2i(const HXString &Title, int (&Value)[2], SliderProfile2i &Profile);
void Slider3i(const HXString &Title, int (&Value)[3], SliderProfile3i &Profile);
void Slider4i(const HXString &Title, int (&Value)[4], SliderProfile4i &Profile);

篇幅所限,本文档只介绍以 Slider1f 为例展开介绍。其他的还烦请用户自行类比。以 f 结尾的接口是针对 float 的版本,以 i 结尾的接口是针对 int 的版本。

参数

参数含义默认取值
Title滑动条的标题展示在滑动条的右侧
float/int[n]滑动条直接修改的目标变量
SliderProfileN(f/i)对应的滑动条的资料结构体

资料结构体

滚动框的资源结构体定义如下:

template <class Type>
struct SliderProfile {
bool InDrag = false;
Type MinValue;
Type MaxValue;
HXGInt Width = -1;
};

using SliderProfile1f = SliderProfile<float>;
using SliderProfile2f = std::array<SliderProfile<float>, 2>;
using SliderProfile3f = std::array<SliderProfile<float>, 3>;
using SliderProfile4f = std::array<SliderProfile<float>, 4>;

using SliderProfile1i = SliderProfile<int>;
using SliderProfile2i = std::array<SliderProfile<int>, 2>;
using SliderProfile3i = std::array<SliderProfile<int>, 3>;
using SliderProfile4i = std::array<SliderProfile<int>, 4>;

看起来很复杂,但是我们可以以 SliderProfile1f 为例子来简化:

struct SliderProfile1f {
bool InDrag = false;
float MinValue;
float MaxValue;
HXGInt Width = -1;
};

同理,SliderProfile2f 就相当于 SliderProfile1f[2],不过只是一个数组而已。

变量含义默认取值
InDrag滑动条是否在被拖动,如果正在被拖动,则为 true 否则为 falsefalse
MinValue滑动条的最小值
MaxValue滑动条的最大值
Width滑动条的宽,如果设置为小于等于零的值则为默认宽度(宽度=300/分量数)-1
注意

注意,请确保你的 MaxValue 一定大于 MinValue,否则会导致控件行为异常。

示例

该示例代码同样可以在代码仓库/example/EasyX/Slider.cpp 中找到。

#include <include/hex.h>
#include <include/impl/EasyX/hex_impl_easyx.h>

int main() {
initgraph(640, 480);

BeginBatchDraw();

HX::HXInitForEasyX();
HX::SetBuffer(GetWorkingImage());

setbkcolor(RGB(180, 180, 180));

HX::WindowProfile windowProfile;
windowProfile.Size = { 600, 400 };

while (true) {
cleardevice();

HX::HXBegin();

ExMessage message{};
while (peekmessage(&message)) {
HX::PushMessage(HX::GetHXMessage(&message));
}

HX::Window(HXStr("滑动条控件示例"), windowProfile);

HX::TextProfile titleText;
titleText.Font.Style = HXFontStyle::Bold;
titleText.Height = 30;

{
HX::Text(HXStr("Float 类型的 Slider"), titleText);

static float value1 = 0;
static HX::SliderProfile1f sliderProfile1;
sliderProfile1.MaxValue = 30;
sliderProfile1.MinValue = 0;
HX::Slider1f(HXStr("只有一个分量的 Slider"), value1, sliderProfile1);

static float value2[2] = {};
static HX::SliderProfile2f sliderProfile2;
sliderProfile2[0].MaxValue = 30;
sliderProfile2[0].MinValue = 0;
sliderProfile2[1].MaxValue = 10;
sliderProfile2[1].MinValue = 0;
HX::Slider2f(HXStr("有两个分量的 Slider,分别设置不同的最值"), value2, sliderProfile2);

static float value3[3] = {};
static HX::SliderProfile3f sliderProfile3;
sliderProfile3[0].MaxValue = 30;
sliderProfile3[0].MinValue = 0;
sliderProfile3[1].MaxValue = 10;
sliderProfile3[1].MinValue = 0;
sliderProfile3[2].MaxValue = 20;
sliderProfile3[2].MinValue = 0;
HX::Slider3f(HXStr("有三个分量的 Slider,分别设置不同的最值"), value3, sliderProfile3);

static float value4[4] = {};
static HX::SliderProfile4f sliderProfile4;
sliderProfile4[0].MaxValue = 30;
sliderProfile4[0].MinValue = 0;
sliderProfile4[1].MaxValue = 10;
sliderProfile4[1].MinValue = 0;
sliderProfile4[2].MaxValue = 20;
sliderProfile4[2].MinValue = 0;
sliderProfile4[3].MaxValue = 90;
sliderProfile4[3].MinValue = 0;
HX::Slider4f(HXStr("有四个分量的 Slider,分别设置不同的最值"), value4, sliderProfile4);
}
{
HX::Text(HXStr("Int 类型的 Slider"), titleText);

static int value1 = 0;
static HX::SliderProfile1i sliderProfile1;
sliderProfile1.MaxValue = 30;
sliderProfile1.MinValue = 0;
HX::Slider1i(HXStr("只有一个分量的 Slider"), value1, sliderProfile1);

static int value2[2] = {};
static HX::SliderProfile2i sliderProfile2;
sliderProfile2[0].MaxValue = 30;
sliderProfile2[0].MinValue = 0;
sliderProfile2[1].MaxValue = 10;
sliderProfile2[1].MinValue = 0;
HX::Slider2i(HXStr("有两个分量的 Slider,分别设置不同的最值"), value2, sliderProfile2);

static int value3[3] = {};
static HX::SliderProfile3i sliderProfile3;
sliderProfile3[0].MaxValue = 30;
sliderProfile3[0].MinValue = 0;
sliderProfile3[1].MaxValue = 10;
sliderProfile3[1].MinValue = 0;
sliderProfile3[2].MaxValue = 20;
sliderProfile3[2].MinValue = 0;
HX::Slider3i(HXStr("有三个分量的 Slider,分别设置不同的最值"), value3, sliderProfile3);

static int value4[4] = {};
static HX::SliderProfile4i sliderProfile4;
sliderProfile4[0].MaxValue = 30;
sliderProfile4[0].MinValue = 0;
sliderProfile4[1].MaxValue = 10;
sliderProfile4[1].MinValue = 0;
sliderProfile4[2].MaxValue = 20;
sliderProfile4[2].MinValue = 0;
sliderProfile4[3].MaxValue = 90;
sliderProfile4[3].MinValue = 0;
HX::Slider4i(HXStr("有四个分量的 Slider,分别设置不同的最值"), value4, sliderProfile4);
}

HX::End();
HX::Render();

FlushBatchDraw();

Sleep(1);
}

return 0;
}