bonjour
je suis débutant au domaine de programmation
et je doit réaliser un projet d'été constitué de 3 partie
1-afficher l'heure dans une fenêtre graphique
2-crée une zone de texte qui permet a l'utilisateur de faire entrer un temps pour l'alarme
3-bip sonore qui se déclenche au temps entrée par l'utilisateur
j'ai arrivé a réaliser la première partie en utilisant la bibliothèque SDL
#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <SDL_ttf.h>
#include <time.h>
int main(int argc, char *argv[])
{
SDL_Surface *ecran = NULL;
SDL_Surface *texte = NULL;
SDL_Rect position;
SDL_Event event;
TTF_Font *police = NULL;
SDL_Color ecranCouleur {0, 0, 0}, fontColor {0, 255, 0};
int continuer = 1;
int tempsActuel 0, tempsPrecedent 0, compteur = 0;
char temps[20] ;
SDL_Init(SDL_INIT_VIDEO);
TTF_Init();
ecran = SDL_SetVideoMode(160, 80, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("timer", NULL);
// Chargement de la police
police = TTF_OpenFont("font.ttf", 23);
// Initialisation du temps et du texte
tempsActuel = SDL_GetTicks();
time_t timestamp = time(NULL);
strftime(temps, sizeof(temps), "%X", localtime(×tamp));
texte = TTF_RenderText_Shaded(police, temps, fontColor, ecranCouleur);
while (continuer)
{
SDL_PollEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
}
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
tempsActuel = SDL_GetTicks();
if (tempsActuel - tempsPrecedent >= 1000) // Si 1000ms au moins se sont écoulées
{
compteur += 1000; // On rajoute 1000ms au compteur
time_t timestamp = time(NULL);
strftime(temps, sizeof(temps), "%X", localtime(×tamp)); // On écrit dans la chaîne "temps" le nouveau temps
SDL_FreeSurface(texte); // On supprime la surface précédente de la mémoire avant d'en charger une nouvelle (IMPORTANT)
texte = TTF_RenderText_Shaded(police, temps, fontColor, ecranCouleur); // On écrit la chaine temps dans la SDL_Surface
tempsPrecedent = tempsActuel; // On met à jour le tempsPrecedent
}
position.x = 40;
position.y = 10;
SDL_BlitSurface(texte, NULL, ecran, &position); // Blit du texte contenant le temps
SDL_Flip(ecran);
}
TTF_CloseFont(police);
TTF_Quit();
SDL_FreeSurface(texte);
SDL_Quit();
return 1 ;
}
et j'ai trouver des problème dans la deuxième partie
#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <SDL_ttf.h>
#include <time.h>
int main(int argc, char *argv[])
{
SDL_Surface *ecran = NULL;
SDL_Surface *texte = NULL;
SDL_Surface *reveille =NULL;
SDL_Rect position;
SDL_Rect position1;
SDL_Event event;
TTF_Font *police = NULL;
SDL_Color ecranCouleur {0, 0, 0}, fontColor {0, 255, 0};
int continuer = 1;
int tempsActuel 0, tempsPrecedent 0, compteur = 0;
char temps[20] ;
int i ;
char y1 [20];
char indice[5];
SDL_Init(SDL_INIT_VIDEO);
TTF_Init();
ecran = SDL_SetVideoMode(160, 80, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("timer", NULL);
// Chargement de la police
police = TTF_OpenFont("font.ttf", 23);
// Initialisation du temps et du texte
tempsActuel = SDL_GetTicks();
time_t timestamp = time(NULL);
strftime(temps, sizeof(temps), "%X", localtime(×tamp));
texte = TTF_RenderText_Shaded(police, temps, fontColor, ecranCouleur);
while (continuer)
{
SDL_PollEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_KEYDOWN :
for(i=1;i<7;i++){
if (event.key.keysym.sym==SDLK_0){
indice[i]=0;
}
if (event.key.keysym.sym==SDLK_1){
indice[i]=1;
}
if (event.key.keysym.sym==SDLK_2){
indice[i]=2;
}
if (event.key.keysym.sym==SDLK_3){
indice[i]=3;
}
if (event.key.keysym.sym==SDLK_4){
indice[i]=4;
}
if (event.key.keysym.sym==SDLK_5){
indice[i]=5;
}
if (event.key.keysym.sym==SDLK_6){
indice[i]=6;
}
if (event.key.keysym.sym==SDLK_7){
indice[i]=7;
}
if (event.key.keysym.sym==SDLK_8){
indice[i]=8;
}
if (event.key.keysym.sym==SDLK_9){
indice[i]=9;
}
position1.x += 5 ;
sprintf (y1,"%d", indice[i]);
reveille = TTF_RenderText_Shaded(police, y1, fontColor, ecranCouleur);
}
}
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
tempsActuel = SDL_GetTicks();
if (tempsActuel - tempsPrecedent >= 1000) // Si 1000ms au moins se sont écoulées
{
compteur += 1000; // On rajoute 1000ms au compteur
time_t timestamp = time(NULL);
strftime(temps, sizeof(temps), "%X", localtime(×tamp)); // On écrit dans la chaîne "temps" le nouveau temps
SDL_FreeSurface(texte); // On supprime la surface précédente de la mémoire avant d'en charger une nouvelle (IMPORTANT)
texte = TTF_RenderText_Shaded(police, temps, fontColor, ecranCouleur); // On écrit la chaine temps dans la SDL_Surface
tempsPrecedent = tempsActuel; // On met à jour le tempsPrecedent
}
position.x = 40;
position.y = 10;
position1.x = 40;
position1.y = 40;
SDL_BlitSurface(reveille, NULL, ecran, &position1);
SDL_BlitSurface(texte, NULL, ecran, &position); // Blit du texte contenant le temps
SDL_Flip(ecran);
}
TTF_CloseFont(police);
TTF_Quit();
SDL_FreeSurface(reveille);
SDL_FreeSurface(texte);
SDL_Quit();
return 1 ;
}
en utilisant gtk j'ai rencontré un problème dans la 1er partie:
j'ai réussi a afficher le temps mais il reste constant (le temps qui s'affiche est le temps de l’exécution du programme)
et en utilisant la fonction g_timeout_add_seconds() voila mon code
le temps s'actualise mais j'avais un problème que le temps ne s'affiche pas dans la fenêtre
#include <stdlib.h>
#include <gtk/gtk.h>
#include <time.h>
void affiche( GtkWidget* Fenetre ,GtkWidget* Label){
char temps[256];
gchar* TexteConverti = NULL;
time_t timestamp = time(NULL);
strftime(temps, sizeof(temps), "%X", localtime(×tamp));
printf(temps);//pour vérifier si le temps s'actualise
TexteConverti = g_locale_to_utf8(temps,-1, NULL, NULL, NULL); //Convertion du texte avec les balises
Label=gtk_label_new(TexteConverti); // Application de la convertion à notre label
g_free(TexteConverti); // Libération de la mémoire
gtk_container_add(GTK_CONTAINER(Fenetre), Label);//je crois que c'est ici le problème:quand j’exécute il s'affiche en ecran noir le message:gtk_container_add: assertion 'gtk_is_container' <container> ' failed
gtk_widget_show(Label); // On affiche 'Fenetre' et tout ce qu'il contient
}
int main(int argc,char **argv)
{
GtkWidget* Fenetre = NULL;
GtkWidget* Label = NULL;
gtk_init(&argc, &argv);
Fenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL); // Définition de la fenêtre
gtk_window_set_title(GTK_WINDOW(Fenetre), "Le texte avec les labels"); // Titre de la fenêtre
gtk_window_set_default_size(GTK_WINDOW(Fenetre), 300, 100); // Taille de la fenêtre
gtk_widget_show(Fenetre); // On affiche 'Fenetre' et tout ce qu'il contient
g_timeout_add_seconds (1,affiche,Label);
gtk_main();
return EXIT_SUCCESS;
}