IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

Comment faire une fenêtre non-rectangulaire ?


Sujet :

GTK+ avec C & C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Points : 117
    Points
    117
    Par défaut Comment faire une fenêtre non-rectangulaire ?
    Bonjour,

    J'aimerais faire une fenêtre de la forme que je souhaite mais je n'y arrive pas.
    J'ai compris qu'il fallait utiliser gtk_widget_combine_mask().
    Mon problème est dans l'obtention du GdkBitmap permettant d'obtenir ce masque.
    Mon masque est contenu dans un fichier .bmp monochrome (j'm'étais dis que c'était ce qui se rapprochait le plus d'une bitmap...), mais pas moyen de faire fonctionner tout ça.
    J'ai lu qu'il était facile de l'obtenir à partir d'un fichier XPM, mais je n'ai pas la moindre idée de comment enregistrer mon masque au format .xpm...

    Si quelqu' un pouvait m'apporter son aide...
    Merci d'avance !

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 293
    Points : 4 943
    Points
    4 943
    Billets dans le blog
    5
    Par défaut
    Ton masque doit être en noir et blanc ce qui semble être le cas. Les points noirs seront transparents. Pour créer un GdkBitmap tu peux commencer par charger l'image dans un GdkPixbuf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    GdkPixbuf*          gdk_pixbuf_new_from_file            (const char *filename,
                                                             GError **error);
     
    Creates a new pixbuf by loading an image from a file. The file format is detected automatically. If NULL is returned, then error will be set. Possible errors are in the GDK_PIXBUF_ERROR and G_FILE_ERROR domains.
     
    filename :
    	Name of file to load, in the GLib file name encoding
     
    error :
    	Return location for an error
     
    Returns :
    	A newly-created pixbuf with a reference count of 1, or NULL if any of several error conditions occurred: the file could not be opened, there was no loader for the file's format, there was not enough memory to allocate the image buffer, or the image file contained invalid data.
    Une fois fait, tu accédes aux données brutes de l'image chargée grâce à la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    guchar*             gdk_pixbuf_get_pixels               (const GdkPixbuf *pixbuf);
     
    Queries a pointer to the pixel data of a pixbuf.
     
    pixbuf :
    	A pixbuf.
     
    Returns :
    	A pointer to the pixbuf's pixel data. Please see the section called “Image Data” for information about how the pixel data is stored in memory.
    Tu peux utiliser ce pointeur pour générer enfin un GdkBitmap avec cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    GdkBitmap*          gdk_bitmap_create_from_data         (GdkDrawable *drawable,
                                                             const gchar *data,
                                                             gint width,
                                                             gint height);
     
    Creates a new bitmap from data in XBM format.
     
    drawable :
    	a GdkDrawable, used to determine default values for the new pixmap. Can be NULL, in which case the root window is used.
     
    data :
    	a pointer to the XBM data.
     
    width :
    	the width of the new pixmap in pixels.
     
    height :
    	the height of the new pixmap in pixels.
     
    Returns :
    	the GdkBitmap
    Je t'avoue tout de même que tout ceci n'est pour moi que simple théorie. Je ne l'ai jamais mis en pratique. En espérant t'aider tout de même un peu.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Points : 117
    Points
    117
    Par défaut
    Merci pour ta réponse
    J'ai répondu à mon tour. Je ne comprends pas vraiment pourquoi ça ne fonctionne pas. Ca a probablement quelquechose à voir avec le format de l'image

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Points : 117
    Points
    117
    Par défaut
    J'ai trouvé !!!
    Alors voici la marche à suivre :
    1) Télécharger XMP Convert
    2) Faire le masque en bmp avec le noir comme partie visible et le blanc comme partie invisible.
    3) Démarrer XMP Convert, ouvrir l'image bmp que l'ont vient de creer, et faire un clic droit sur la partie blanche du masque avant de cocher la case Transparency.
    4) Cliquer sur l'onglet convert et se laisser guider


    ensuite il suffit de mettre ce bout de code dans notre programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
        GdkBitmap* bitmap;
        GdkColormap *colormap;
     
        colormap = gdk_colormap_get_system ();
        gdk_pixmap_colormap_create_from_xpm(NULL, colormap, &bitmap, NULL, /*chemin du fichier .xpm*/);
        gtk_widget_shape_combine_mask(/*fenêtre à laquelle appliquer le masque*/, bitmap,/*x*/,/*y*/);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment faire une fenêtre ancrable ?
    Par JeanMarc_T2k dans le forum Composants VCL
    Réponses: 1
    Dernier message: 04/02/2008, 16h41
  2. Comment faire une petite fenêtre (style : ctrl+space)
    Par Galip dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/05/2007, 13h53
  3. Comment faire une fenêtre clignotante
    Par kkt8 dans le forum MFC
    Réponses: 3
    Dernier message: 17/07/2006, 09h35
  4. Comment faire un panel non rectangulaire?
    Par grincheux dans le forum C++Builder
    Réponses: 4
    Dernier message: 11/05/2003, 15h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo