SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › Интерфейсы управления textbox, button › Ответ в теме: Интерфейсы управления textbox, button
Вообщем вот тот необходимый примитив для реализации Libel, Button, Input:
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
#include <SFML/Graphics.hpp> #include <SFML/Network.hpp> #include <iostream> #include <windows.h> #include "FormSFML.h" using namespace std; using namespace form; using namespace sf; /* char bufRus[256]; char* Rus(const char* text) { CharToOem(text, bufRus); return bufRus; } */ int main() { IpAddress ip = IpAddress::getLocalAddress(); //Считывайем локальный ip адресс RenderWindow window(sf::VideoMode(800, 600), "Form"); Button button(30, 30); Label label(30, 80, "Привет kychka-pc.ru"); Button button2(230, 30, 150, 30, "Заменить текст"); Input input(230, 80, 200, 30); Label label2(230, 150, "Гав"); Label label3(30, 350, "Введите IP-адресс:"); Input input2(30, 400, 200, 30, "192.168.1.64"); Button button3(280, 350, 150, 150, "Connect"); while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); if (event.type == sf::Event::MouseButtonPressed) { if (event.mouseButton.button == sf::Mouse::Left) { Vector2i mouse = Mouse::getPosition(window); // Считываем координаты мыши(если че обратиться можно будет mouse.x mouse.y) if( button.select(mouse)){label.text = "Нажата кнопка!" ;} if( button2.select(mouse)){label2.text = input.readText() ;} if( button3.select(mouse)){ip = input.readText();} input.select(mouse); //поле ввода input2.select(mouse); //поле ввода } } if(event.type == sf::Event::TextEntered){ if(input.select()){ input.reText(event.text.unicode); } if(input2.select()){ input2.reText(event.text.unicode); } } } window.clear(); window.draw(label.displayText()); window.draw(label2.displayText()); window.draw(label3.displayText()); window.draw(button2.displayButton()); window.draw(button2.displayText()); window.draw(button.displayButton()); window.draw(button.displayText()); window.draw(button3.displayButton()); window.draw(button3.displayText()); window.draw(input.displayButton()); window.draw(input.displayText()); window.draw(input2.displayButton()); window.draw(input2.displayText()); window.display(); sleep(milliseconds(1000/60));//Задержка } return 0; } |
А вот подключаемый класс FormSFNL:
C++
1 2 3 4 5 6 7 |
/* * FormSFML.h * * Created on: 02 мая 2015 г. * Author: Fedor * Специально для kychka-pc.ru */ |
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
#include <string> using namespace std; using namespace sf; namespace form { Font None; // Шрифт первичная инициализация class Label { public: string text; //Текст protected: double x; //Координата x double y; //Координата y Text TXT; //Отображаемый текст public: Label(double _x = 0, double _y = 0, string _text ="Текст") { None.loadFromFile("ttf/None.ttf"); //передаем нашему шрифту файл шрифта x = _x; y = _y; text = _text; // загружает текст TXT.setFont(None); // загружаем фрифт TXT.setCharacterSize(20); // в пикселях, а не точках! TXT.setColor(Color::White); // устанавливаем цвет выводимого текста TXT.setPosition(x,y); // позиция текста } Text displayText() { TXT.setString(text); // загружаем в выводимый текст загружаемый текст return TXT; } }; class Button : public Label { protected: double width; // Ширина Кнопки double height; // Высота Кнопки RectangleShape BOX; // Создаем прямоугольник с размером width, height public: Button(double _x = 0, double _y = 0, double _width = 150, double _height = 30, string _text ="Кнопка") { None.loadFromFile("ttf/None.ttf"); //передаем нашему шрифту файл шрифта x = _x; y = _y; width = _width; height = _height; text = _text; // загружает текст TXT.setFont(None); // загружаем фрифт TXT.setCharacterSize(20); // в пикселях, а не точках! TXT.setColor(Color::White); // устанавливаем цвет выводимого текста TXT.setPosition(x,y); // позиция текста BOX.setSize(Vector2f(width, height)); // размер кнопки BOX.setPosition(x,y); // координаты кнопки BOX.setFillColor(sf::Color(133, 133, 133)); // цвет кнопки BOX.setOutlineThickness(2); // Контур X пикселей BOX.setOutlineColor(Color(66, 66, 66)); // Цвет контура } //Проверка нажатия на кнопку bool select(Vector2i _mouse) { if((_mouse.x > x && _mouse.x < x + width) && (_mouse.y > y && _mouse.y < y + height)){ return true; } else { return false; } } //Вывод Текста Text displayText() { TXT.setString(text); // загружаем в выводимый текст загружаемый текст return TXT; } //Вывод кнопки RectangleShape displayButton() { return BOX; } }; class Input : public Button{ protected: bool focus; public: Input(double _x = 0, double _y = 0, double _width = 150, double _height = 30, string _text ="") { x = _x; y = _y; width = _width; height = _height; text = _text; // загружает текст focus = false; // фокус поля ввода TXT.setFont(None); // загружаем фрифт TXT.setCharacterSize(20); // в пикселях, а не точках! TXT.setColor(Color::Black); // устанавливаем цвет выводимого текста TXT.setPosition(x,y); // позиция текста BOX.setSize(Vector2f(width, height)); // размер поля ввода BOX.setPosition(x,y); // координаты поля ввода BOX.setFillColor(Color::White); // цвет кнопки } //метод .reText( char ) изменяет текст внутри класса Типа данных Input void reText(char _tmp) { text.erase(text.size()-1); if(_tmp != 8){ text += _tmp; } else { if(text.size() > 0){ text.erase(text.size()-1); } } text += "|"; TXT.setString(text); } // Проверка Фокуса Input bool select() { return focus; } // Установка Фокуса Input bool select(Vector2i _mouse) { if((_mouse.x > x && _mouse.x < x + width) && (_mouse.y > y && _mouse.y < y + height)){ //Если нажат клаиша над объектом Input... focus = true; // Фокус true text += "|"; // В конец строки добаляем | (что бы понимать что input в фокусе) } else { //...Иначе если нажатие произошло не над объектом, то... if(text.size() > 0){ // проверка последнего символа(иначе вылетает) if(text[text.size()-1] == 124){ // если символ | ... text.erase(text.size()-1); // ... то удаляем его } } focus = false; // устанавливаем фокус false } return focus; } //Вывод Текста Text displayText() { TXT.setString(text); // загружаем в выводимый текст загружаемый текст return TXT; } //Вывод фона Input RectangleShape displayBOX() { return BOX; } //Для того, что бы считать текст с поля Ipnut необходимо пременить readText() который возвращает string string readText() { if(text[text.size()-1] == 124){ // удаляем (если есть) символ | text.erase(text.size()-1); } return text; } }; } /* namespace form */ |
////////////////////////////////////////////////////////////////////////
Прошу обратить внимание на метод
C++
1 |
readText() |
он позволяет считывать данные с поля Input без лишних знаков и занести в ip адрес и это будет работать!
P.S. Русские символы не вводятся хз как решить проблему(
P.S.S. я создал class с минимальным набором необходимым для работы с Интерфейсом вы же можете расширить так как вам необходимо…