滚动框(Scroller)
滚动框控件可以用于以当前页面无法完全展示所有信息时,滚动框提供横竖两个滚动条,可以在更小的范围内展示更多信息。
在 HiEasyX 中,滚动框的原型函数定义如下:
void BeginScroller(ScrollerProfile &Profile);
void EndScroller(ScrollerProfile &Profile);
与其他控件不同的是,滚动框采用 Begin/End 的方式构建。当一个控件被构建在 BeginScroller
与 EndScroller
之间时,该控件就会被引入成为滚动框的子控件。
参数
参数 | 含义 | 默认取值 |
---|---|---|
ScrollerProfile | 滚动框的资源结构体 | 无 |
资料结构体
滚动框的资源结构体定义如下:
struct ScrollerProfile {
HXPoint Size{};
HXPoint ViewSpace{};
HXPoint Where{};
float VerticalVPer = 0;
float HorizontalVPer = 0;
bool Visible = true;
ScrollerButtonProfile VerticalButton{};
ScrollerButtonProfile HorizontalButton{};
};
变量 | 含义 | 默认取值 |
---|---|---|
Size | 滚动框的大小 | {0, 0} |
ViewSpace | 滚动框的实际可浏览大小(即为滚动框的子空间大小) | {0, 0} |
Where | API 内部变量 | |
VerticalVPer | 竖直的浏览进度,取值范围大于等于零小于等于一 | 0 |
HorizontalVPer | 水平的浏览进度,取值范围大于等于零小于等于一 | 0 |
Visible | API 内部变量 | |
VerticalButton | 竖直的拖拽按钮的资源结构体 | ∅ |
HorizontalButton | 水平的拖拽按钮的资源结构体 | ∅ |
滚动条会根据 Size
和 ViewSpace
的大小关系自动计算出现,无需手动控制。同时,Scroller 支持嵌套,你可以在一个 Scroller 中包含另一个 Scroller。
注意
注意,请确保你的 ViewSpace
的宽高起码等于 Size
的宽高,否则会导致控件行为异常。同时,也确保不要让 ViewSpace
和 Size
差距过于悬殊,否则滚动条会变得非常小以至于无法操作。
ScrollerButtonProfile
该资源结构体为滚动框拖拽按钮的资源结构体,属于子资源结构体。TextInputScrollButtonProfile
的定义如下:
struct TextInputScrollButtonProfile {
bool OnHover = false;
bool InDrag = false;
HXGInt DeltaX = 0;
HXGInt DeltaY = 0;
};
变量 | 含义 | 默认取值 |
---|---|---|
OnHover | 鼠标是否悬停于按钮上 | false |
InDrag | 鼠标是否正在拖拽按钮 | false |
DeltaX | API 内部变量 | |
DeltaY | API 内部变量 |
示例
该示例代码同样可以在代码仓库下 /example/EasyX/Scoller.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 };
HX::ScrollerProfile scrollerProfile;
IMAGE image;
loadimage(&image, "./assets/logo.png");
while (true) {
cleardevice();
HX::HXBegin();
ExMessage message{};
while (peekmessage(&message)) {
HX::PushMessage(HX::GetHXMessage(&message));
}
HX::Window(HXStr("滚动框控件示例"), windowProfile);
scrollerProfile.Size = { windowProfile.Size.X - 20, windowProfile.Size.Y - 80 };
scrollerProfile.ViewSpace = { 3000, 3000 };
HX::BeginScroller(scrollerProfile);
HX::Text(HXStr("在 BeginScroller 和 EndScroller 之间的控件会被当作子控件"));
static HX::ScrollerProfile Profile;
Profile.Size = {300, 100};
Profile.ViewSpace = {7000, 2000};
HX::BeginScroller(Profile);
static HX::ButtonProfile p[30][30];
for (auto j = 0; j < 30; ++j) {
HX::BeginSameLine();
for (auto i = 0; i < 30; ++i) {
HX::Button(HXStr("支持 Scroller 嵌套 Scroller!"), p[i][j]);
}
HX::EndSameLine();
}
HX::EndScroller(Profile);
for (auto i = 0; i < 10; ++i) {
HX::BeginSameLine();
for (auto j = 0; j < 10; ++j) {
HX::Image(&image);
}
HX::EndSameLine();
}
HX::EndScroller(scrollerProfile);
HX::End();
HX::Render();
FlushBatchDraw();
Sleep(1);
}
return 0;
}