我试图找几次这样的答案,花了好几个小时,但我很困难,我知道这是一个非常基本的问题' - '但是,我仍然被卡住了。 / p>
所以,问题是,对于我与SFGUI的界面,我创建了一个笔记本,所以它工作正常,笔记本显示,它在正确的位置,...
但有一件事我不能靠自己做。我在每页添加一个图像,它仍然正常工作,我的图像正在加载,显示...
但是,当我运行整个事情时,我意识到了一些事情。如果图像很大,则占用的空间将超过100%。说实话,我只想要使用20%的空间。我尝试在笔记本和图像上使用许多内容,如SetRequisition
。它仍然不起作用,它仍然太大。所以我不知道该去哪里,如何调整笔记本大小。
这是代码,对不起评论,我目前尝试过的东西,没有花时间评论它。我很快就会这样做,因为我的小脑子开始变得太多了; - ;
#include "Editor.h"
#include <string>
void Editor::Run() {
sf::RenderWindow render_window(sf::VideoMode(800, 600), "Map Editor");
m_window = sfg::Window::Create(sfg::Window::Style::NO_STYLE);
Init();
render_window.resetGLStates();
while(render_window.isOpen()) {
while (render_window.pollEvent(m_event)) {
m_desktop.HandleEvent(m_event);
if (m_event.type == sf::Event::Closed) {
render_window.close();
}
}
m_desktop.Update(m_clock.restart().asSeconds());
render_window.clear(sf::Color::White);
m_sfgui.Display(render_window);
render_window.display();
}
}
void Editor::Init() {
InitBoxes();
CreateButton(&Editor::CreateFile, "res/newFile.png");
CreateButton(&Editor::OpenFile, "res/openFile.png");
auto updateTileButton = sfg::Button::Create("Update Tiles");
updateTileButton->GetSignal(sfg::Button::OnLeftClick).Connect( std::bind(&Editor::UpdateTilesets, this) );
m_tilesBox->Pack(updateTileButton, false, false);
m_mapPreview = sfg::Canvas::Create();
UpdateTilesets();
m_tilesBox->Pack(m_tilesList, false, false);
m_editBox->Pack(m_tilesBox, false, false);
m_editBox->Pack(m_mapPreview, false, false);
m_generalBox->Pack(m_toolsBox);
m_generalBox->Pack(m_editBox, false, false);
m_window->Add(m_generalBox);
m_desktop.Add(m_window);
}
void Editor::InitBoxes() {
m_generalBox = sfg::Box::Create(sfg::Box::Orientation::VERTICAL, 15.f);
m_toolsBox = sfg::Box::Create(sfg::Box::Orientation::HORIZONTAL, 10.f);
m_editBox = sfg::Box::Create(sfg::Box::Orientation::HORIZONTAL);
m_tilesBox = sfg::Box::Create(sfg::Box::Orientation::VERTICAL);
}
void Editor::UpdateTilesets() {
m_tilesList = sfg::Notebook::Create();
m_tilesList->SetScrollable(true);
int i = 0;
while (true) {
sf::Image tileset;
if (!tileset.loadFromFile("res/tileset" + std::to_string(i) + ".png")) {
return;
}
m_tilesList->AppendPage(sfg::Image::Create(tileset), sfg::Label::Create("Tile "+std::to_string(i)));
i++;
}
}
bool Editor::CreateFile() {
/** @return false if an error occurred, true otherwise. */
return true;
}
bool Editor::OpenFile() {
/** @return false if an error occurred, true otherwise. */
return true;
}
和Editor.h
#ifndef EDITOR_H
#define EDITOR_H
#include <SFGUI/SFGUI.hpp>
#include <SFGUI/Widgets.hpp>
#include <SFML/Graphics.hpp>
class Editor {
public:
template<typename Func>
void CreateButton(Func&& func, std::string imagePath) {
auto button = sfg::Button::Create();
sf::Image newFileImage; newFileImage.loadFromFile(imagePath);
button->SetImage(sfg::Image::Create(newFileImage));
button->GetSignal(sfg::Button::OnLeftClick).Connect( std::bind(func, this) );
m_toolsBox->Pack(button, false, true);
}
/** @brief Starts the program, initializes Window. */
void Run();
/** @brief Initializes widgets, sets the interface. */
void Init();
/** @brief Initializes boxes. */
void InitBoxes();
/** @brief Updates and loads the tilesets available. */
void UpdateTilesets();
/** @brief Creates a new map. */
bool CreateFile();
/** @brief Opens an existing map. */
bool OpenFile();
protected:
sfg::Box::Ptr m_generalBox;
sfg::Box::Ptr m_toolsBox;
sfg::Box::Ptr m_editBox;
sfg::Box::Ptr m_tilesBox;
sfg::Notebook::Ptr m_tilesList;
sfg::Canvas::Ptr m_mapPreview;
sfg::Window::Ptr m_window;
sfg::Desktop m_desktop;
private:
sfg::SFGUI m_sfgui;
sf::Event m_event;
sf::Clock m_clock;
};
#endif // EDITOR_H
编辑:在对SFGUI论坛进行一些研究之后,我发现即使使用SetRequisition也无法在SFGUI设置的最小值下设置大小。所以我明白除非我的图像更小,否则无法调整笔记本的大小,对吧?
嗯,我想这样做的唯一方法是只显示图像的一部分,并使用Notebook页面中的滚动条更改该部分,这是正确的方法吗?