Ciao a tutti!
Sto cercando di creare un interfaccia grafica con fltk. Ho un problema, anzi 2:
1) Ho una dial che dovrebbe girare in automatico, la funzione di rotazione gira su un thread a parte, vorrei che finisse la rotazione prima di ripartire con l'esecuzione del programma ma non c'è verso, la gira un po', poi si blocca, poi riprende
2) su questa dial vorrei attaccare un immagine e vorrei ruotasse anche questa ma niente.
Mi aiutate? grazie di tutto
ecco il mio codice
#include <windows.h>
#include "../fltk-1.1.7/FL/Fl.h"
#include "../fltk-1.1.7/FL/Fl_Dial.h"
#include "../fltk-1.1.7/FL/Fl_Window.h"
#include "../fltk-1.1.7/FL/Fl_Button.h"
#include "../fltk-1.1.7/FL/Fl_Box.h"
#include "../fltk-1.1.7/FL/Fl_Slider.h"
#include "../fltk-1.1.7/FL/Fl_Value_Output.h"
#include "../fltk-1.1.7/FL/Fl_Text_Display.h"
#include "../fltk-1.1.7/FL/Fl_Dial.h"
#include "../fltk-1.1.7/FL/Fl_JPEG_Image.h"
#include "../fltk-1.1.7/FL/fl_draw.h"
////DEMO/////
HANDLE ThDemoTextDisplay;
HANDLE ThDial;
void ShowText (Fl_Widget *o)
{
Fl_Text_Display *Object = (Fl_Text_Display*) o;
Fl_Text_Buffer *buff = new Fl_Text_Buffer;
Object->buffer(buff);
Sleep (1000);
buff->text("Prova");
}
/////////////
void RotateRoll(Fl_Widget *o)
{
Fl_Dial *Roll = (Fl_Dial*)o;
while (Roll->value()<300)
{
Sleep(10);
Roll->value(Roll->value()+1);
}
}
void Set_Status(Fl_Widget *o)
{
Fl_Window *win = new Fl_Window(300,180, 300,100, "Prova");
win->begin();
Fl_Box *Box_Scelto_Status = new Fl_Box(30,35,105,210,"Propagazione stato");
Box_Scelto_Status->align(FL_ALIGN_INSIDE|FL_ALIGN_TOP);
Box_Scelto_Status->color ();
Box_Scelto_Status->box(FL_FLAT_BOX);
win->end();
win->show();
Fl::run();
}
void Set_Master(Fl_Widget *o)
{
Fl_Window *win = new Fl_Window(300,180, 300,100, "Prova");
win->begin();
Fl_Box *Box_Master = new Fl_Box(30,35,105,210,"Propagazione Master");
Box_Master->align(FL_ALIGN_INSIDE|FL_ALIGN_TOP);
Box_Master->color ();
Box_Master->box(FL_FLAT_BOX);
win->end();
win->show();
Fl::run();
}
int main(int argc, char **argv) {
//FINESTRA PRINCIPALE
Fl_Window *window = new Fl_Window(300,180, 1024,768, "Prova");
window->begin();
//BOX CON LO SLIDER PER SELEZIONARE LO STATUS
Fl_Box *Box_Select_Status = new Fl_Box(30,35,105,210, "Status");
Box_Select_Status->align(FL_ALIGN_INSIDE|FL_ALIGN_CENTER|FL_ALIGN_TO P);
Box_Select_Status->color ();
Box_Select_Status->box(FL_UP_BOX);
//SLIDER PER LO STATUS
Fl_Slider *Slider1 = new Fl_Slider (40,65,20,176);
Slider1->selection_color(1); //setta il colore a rosso
Slider1->slider_size(.08);
Slider1->range(0,2);
Slider1->step(1);
//SETTO LA CALLBACK CHE VIENE CHIAMATA AL CAMBIAMENTO DELLO STATUS
Slider1->callback(Set_Status);
//BOX STATUS SETUP
Fl_Box *Box_Status_SetUp = new Fl_Box(60,65,65,16,"Set-Up");
//BOX STATUS STANDBY
Fl_Box *Box_Status_StandBy = new Fl_Box (60,149,65,16,"StandBy");
//BOX STATUS Operative
Fl_Box *Box_Status_Operative = new Fl_Box (60,224,70,16,"Operative");
//BOX CON LO SLIDER PER SELEZIONARE LA DDU
Fl_Box *Box_Select_DDU = new Fl_Box(30,255,105,105,"Master");
Box_Select_DDU->align(FL_ALIGN_INSIDE|FL_ALIGN_CENTER|FL_ALIGN_TO P);
Box_Select_DDU->color ();
Box_Select_DDU->box(FL_UP_BOX);
//SLIDER PER LO STATUS
Fl_Slider *SliderDDU = new Fl_Slider (40,280,20,75);
SliderDDU->selection_color(1); //setta il colore a rosso
SliderDDU->slider_size(.08);
SliderDDU->range(0,1);
SliderDDU->step(1);
//SETTO LA CALLBACK CHE VIENE CHIAMATA AL CAMBIAMENTO DELLA MASTERSHIP
SliderDDU->callback(Set_Master);
//BOX DDU1
Fl_Box *Box_DDU1= new Fl_Box(65,280,40,16,"DDU1");
//BOX DDU2
Fl_Box *Box_DDU2 = new Fl_Box (65,339,40,16,"DDU2");
//BOX CON l'HEALTH STATUS DELLE DDU
Fl_Box *Box_DDU_Status = new Fl_Box(30,375,105,105,"Health Status");
Box_DDU_Status->align(FL_ALIGN_INSIDE|FL_ALIGN_CENTER|FL_ALIGN_TO P);
Box_DDU_Status->color ();
Box_DDU_Status->box(FL_UP_BOX);
//SLIDER PER LO STATUS
//BOX DDU1
Fl_Box *Box_Status_DDU1= new Fl_Box(40,400,35,15,"DDU1");
//BOX DDU2
Fl_Box *Box_Status_DDU2 = new Fl_Box (40,423,35,15,"DDU2");
//VALUE OUTPUT HEALTH STATUS DDU1
Fl_Value_Output *Health_DDU1 = new Fl_Value_Output (80,396,33,19,"%");
Health_DDU1->align (FL_ALIGN_RIGHT);
//VALUE OUTPUT HEALTH STATUS DDU2
Fl_Value_Output *Health_DDU2 = new Fl_Value_Output (80,421,33,19,"%");
Health_DDU2->align (FL_ALIGN_RIGHT);
//SETTO IL VALORE DELLO STATUS DI DDU1
Health_DDU1->value(50);
//SETTO IL VALORE DELLO STATUS DI DDU2
Health_DDU2->value(50);
//BOX CON I DATA OUTPUT
Fl_Box *Box_DataOutput = new Fl_Box(145,245,755,355,"Data Output");
Box_DataOutput->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT|FL_ALIGN_TOP) ;
Box_DataOutput->color ();
Box_DataOutput->box(FL_UP_BOX);
//TEXT DISPLAY ABSOLUTE WIND SPEED
Fl_Text_Display *Abs_Wind_Speed = new Fl_Text_Display (305,276,95,24,"Absolute wind speed");
Abs_Wind_Speed->align (FL_ALIGN_LEFT);
//CREO L'IMMAGINE ROLL
//Fl_JPEG_Image *ImgRoll = new Fl_JPEG_Image("res/Roll2.jpg");
//CREO IL DIAL ROLL
Fl_Dial *DialRoll = new Fl_Dial (675,55,210,175);
DialRoll->type(FL_LINE_DIAL);
DialRoll->range (0,360);
DialRoll->angle1(90);
DialRoll->angle2(450);
DialRoll->step(1);
//APPICCICO L'IMMAGINE ROLL SUL DIAL
//DialRoll->image(ImgRoll);
//ALLINEO L'IMMAGINE DENTRO IL DIAL
DialRoll->align(FL_ALIGN_INSIDE);
//CREO L'IMMAGINE PITCH
//Fl_JPEG_Image *ImgPitch = new Fl_JPEG_Image("res/Pitch2.jpg");
//CREO IL DIAL PITCH
Fl_Dial *DialPitch = new Fl_Dial (225,55,210,175);
DialPitch->range (0,360);
DialPitch->step(1);
//APPICCICO L'IMMAGINE ROLL SUL DIAL
//DialPitch->image(ImgPitch);
//ALLINEO L'IMMAGINE DENTRO IL DIAL
//DialPitch->align(FL_ALIGN_INSIDE);
//fl_circle(100,100,20);
//////////DEMO///////////////
ThDemoTextDisplay = CreateThread (NULL,0,(LPTHREAD_START_ROUTINE)ShowText,Abs_Wind_ Speed,0,0);
ThDial = CreateThread (NULL,0,(LPTHREAD_START_ROUTINE)RotateRoll,DialRol l,0,0);
////////////////////////////
window->end();
window->show(argc, argv);
Fl::run();
WaitForSingleObject(ThDial,100);
return 0;
}