2016-11-08 18 views
0

Здравствуйте, я новичок в FLTK, и сейчас у меня очень простая программа, если вы запустите программу, нажмите «Создать», а затем «Робот» вы увидите несколько вариантов. Новое окно откроется с несколькими полями FL_Input и одной кнопкой ввода. Я хочу сделать обратный вызов, чтобы при нажатии пользователем ввести текст, введенный в поле FL_Input, сохраняется в строке, например, кто-то входит в Space head в FL_Input и то это значение присваивается строке. Мне в первую очередь не нужна помощь с обратным вызовом, просто устанавливая строку, равную FL_Input. Большое спасибо за помощь.FL_Input в строку

#include <iostream> 
#include <sstream> 
#include <stdio.h> 
#include <FL/Fl.H> 
#include <FL/Fl_Text_Display.H> 
#include <FL/fl_draw.H> 
#include <FL/Fl_Double_Window.H> 
#include <FL/Fl_Window.H> 
#include <FL/filename.H>  
#include <FL/Fl_Box.H> 
#include <FL/Fl_Slider.H> 
#include <string> 
#include <FL/Fl_Int_Input.H> 
#include <list> 
#include <FL/Fl_Color_Chooser.H> 
#include <vector> 
#include <FL/Fl_Button.H> 
#include <FL/Fl_Check_Button.H> 
#include <FL/Fl_Tabs.H> 
#include <FL/Fl_Input.H> 
#include <FL/Fl_Menu_Bar.H> 
#include <FL/Fl_Output.H> 
#include <cstdlib> 
using namespace std; 


void Change_CB(Fl_Widget *w, void *) { 
    Fl_Menu_Bar *menu = (Fl_Menu_Bar*)w; 
    Fl_Menu_Item *p; 
    // Change submenu name 
    p = (Fl_Menu_Item*)menu->find_item("Edit/Submenu"); 
    if (p) p->label("New Submenu Name"); 
    // Change item name 
    p = (Fl_Menu_Item*)menu->find_item("Edit/New Submenu Name/Aaa"); 
    if (p) p->label("New Aaa Name"); 
} 
void Quit_CB(Fl_Widget *, void *) { 
    exit(0); 
} 
void head_window(Fl_Widget *, void *) { 
    Fl_Window *head = new Fl_Window(300, 200, "Head"); 
    Fl_Input *input = new Fl_Input(110, 0, 100, 30, "Name"); 
    Fl_Input *input1 = new Fl_Input(110, 40, 100, 30, "Part-Number"); 
    Fl_Input *input2 = new Fl_Input(110, 80, 100, 30, "Weight"); 
    Fl_Input *input3 = new Fl_Input(110, 120, 100, 30, "Cost"); 
    Fl_Button *enter = new Fl_Button(110, 160, 100, 30, "Enter"); 
    head->show(); 
} 
void torso_window(Fl_Widget *, void *) { 
    Fl_Window *head = new Fl_Window(350, 250, "Torso"); 
    Fl_Input *input = new Fl_Input(150, 0, 100, 30, "Name"); 
    Fl_Input *input1 = new Fl_Input(150, 40, 100, 30, "Part-Number"); 
    Fl_Input *input2 = new Fl_Input(150, 80, 100, 30, "Weight"); 
    Fl_Input *input3 = new Fl_Input(150, 120, 100, 30, "Cost"); 
    Fl_Input *input4 = new Fl_Input(150, 160, 100, 30, "Battery Compartments"); 
    Fl_Button *enter = new Fl_Button(150, 200, 100, 30, "Enter"); 
    head->show(); 
} 
void locomotor_window(Fl_Widget *, void *) { 
    Fl_Window *head = new Fl_Window(350, 300, "Locomotor"); 
    Fl_Input *input = new Fl_Input(150, 0, 100, 30, "Name"); 
    Fl_Input *input1 = new Fl_Input(150, 40, 100, 30, "Part-Number"); 
    Fl_Input *input2 = new Fl_Input(150, 80, 100, 30, "Weight"); 
    Fl_Input *input3 = new Fl_Input(150, 120, 100, 30, "Cost"); 
    Fl_Input *input4 = new Fl_Input(150, 160, 100, 30, "Speed(MPH)"); 
    Fl_Input *input5 = new Fl_Input(150, 200, 100, 30, "Power Consumed(W)"); 
    Fl_Button *enter = new Fl_Button(150, 240, 100, 30, "Enter"); 
    head->show(); 
} 
void arm_window(Fl_Widget *, void *) { 
    Fl_Window *head = new Fl_Window(350, 250, "Arm"); 
    Fl_Input *input = new Fl_Input(150, 0, 100, 30, "Name"); 
    Fl_Input *input1 = new Fl_Input(150, 40, 100, 30, "Part-Number"); 
    Fl_Input *input2 = new Fl_Input(150, 80, 100, 30, "Weight"); 
    Fl_Input *input3 = new Fl_Input(150, 120, 100, 30, "Cost"); 
    Fl_Input *input4 = new Fl_Input(150, 160, 100, 30, "Power Consumed(W)"); 
    Fl_Button *enter = new Fl_Button(150, 200, 100, 30, "Enter"); 
    head->show(); 
} 
void battery_window(Fl_Widget *, void *) { 
    Fl_Window *head = new Fl_Window(350, 250, "Battery"); 
    Fl_Input *input = new Fl_Input(150, 0, 100, 30, "Name"); 
    Fl_Input *input1 = new Fl_Input(150, 40, 100, 30, "Part-Number"); 
    Fl_Input *input2 = new Fl_Input(150, 80, 100, 30, "Weight"); 
    Fl_Input *input3 = new Fl_Input(150, 120, 100, 30, "Cost"); 
    Fl_Input *input4 = new Fl_Input(150, 160, 100, 30, "Energy Stored"); 
    Fl_Button *enter = new Fl_Button(150, 200, 100, 30, "Enter"); 
    head->show(); 
} 
void manual_window(Fl_Widget *, void *) { 
    Fl_Window *win = new Fl_Window(400, 275); 
    Fl_Text_Buffer *buff = new Fl_Text_Buffer(); 
    Fl_Text_Display *disp = new Fl_Text_Display(20, 20, 350 , 250 , "Manual"); 
    disp->buffer(buff); 
    win->resizable(*disp); 
    win->show(); 
    buff->text("You may click the file button to open a dropdown\nmenu and you will get a button to exit the window\nor press CTRL + v\n" 
     "You may click create and you get two options either\nto make a robot part or robot model\n" 
     "Clicking on robot part that shows the parts you may\ncreate and their associated shortcuts\n" 
     "If you have any questions click help then click on\nmanual to open the manual\n" 
      ); 
     win->show(); 
} 

int main() { 
    Fl_Window *win = new Fl_Window(600, 300, "Robot Shop"); 
    Fl_Menu_Bar *menu = new Fl_Menu_Bar(0, 0, 600, 25); 
    menu->add("File/Quit", FL_CTRL + 'v', Quit_CB); 
    menu->add("Create/Robot Part/Head" , FL_CTRL + 'h' , head_window); 
    menu->add("Create/Robot Part/Torso" , FL_CTRL + 't' , torso_window); 
    menu->add("Create/Robot Part/Arm" , FL_CTRL + 'a' , arm_window); 
    menu->add("Create/Robot Part/Battery" , FL_CTRL + 'b' , battery_window); 
    menu->add("Create/Robot Part/Locomotor" , FL_CTRL + 'l' , locomotor_window); 
    menu->add("Create/Robot Model"); 
    menu->add("Help/Manual", FL_CTRL + 'm' , manual_window); 

    win->show(); 
    return(Fl::run()); 
} 
+0

Рекомендация: при подготовке образца для других людей для запуска, скопируйте все входы, чтобы убедиться, что они испытывают то же самое поведение, что и вы. – user4581301

ответ

0

Вам нужно где-то хранить данные. Предложите что-то вроде

enum EData 
{ 
    EDHeadWeight, 
    EDHeadCost, 
    ... 
    EDMax 
}; 
std::string data[EDMax]; 

Вариант 1: Изменение Fl_Button (ввод) для Fl_Return_Button затем установить функцию обратного вызова для кнопки, чтобы сохранить все значения. Это предполагает, что когда пользователь нажимает кнопку возврата, они ввели все значения.

Вариант 2: Если вы хотите, чтобы захватить ввода на каждый вход, используемый при (FL_WHEN_ENTER_KEY)

Fl_Input *input4 = new Fl_Input(150, 160, 100, 30, "Battery Compartments"); 
input4->when(FL_WHEN_ENTER_KEY); 
input4->callback(grab, &data[EDTorsoBattery]); 
... 
void grab(Fl_Widget* w, void* param) 
{ 
    std::string& rv = *((std::string*)param); 
    Fl_Input* inp = dynamic_cast<Fl_Input*>(w); 
    rv = inp->value(); 
} 
+0

и как я могу установить строку, равную Fl_Input? Я полностью потерялся на этом – Xavier

+0

Я изменил ответ. – cup

1

К сожалению это опоздание, но я думаю, что ниже будет работать.

Fl_Input * inp1; //This is a global declaration 
Fl_Button * sav1; 
static void sav1_cb(Fl_Button *theButton, void*) // The callback function 
{ 
    string Surname = inp1 -> value(); 
cout << Surname; 
} 

inp1 = new Fl_Input (170+100, 50, 200, 20,"Surname"); // The input field which must be in a window 
sav1 = new Fl_Button (170+310, 50 + 280, 100, 30,"Save"); // The save button 
    sav1->callback((Fl_Callback*)sav1_cb); //Attaching the callback to the save button 

Что следует отметить, что «значение()» функция, что я использую для обработки данных, сохраненных или записанных в поле ввода. Это всего лишь образец. Надеюсь, это поможет.