[C++ avec API Win32] Créer des contrôles dans la fenêtre principale

cs_FineLizzyX Messages postés 9 Date d'inscription jeudi 4 août 2005 Statut Membre Dernière intervention 25 juin 2011 - 26 mars 2011 à 15:10
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 - 1 avril 2011 à 01:43
Bonjour,
Je souhaite utiliser la fenêtre principale de mon appli Win32 pour afficher les formulaires de saisie.
Au départ, je n'affiche rien, puis, à l'activation d'une option de menu, j'enchaîne les "CreateWindow" pour créer les différents contrôles du formulaire correspondant à l'option de menu. Hélas, rien ne s'affiche.
J'ajoute des "ShowWindow" : toujours rien !
J'ai, du coup, plusieurs questions :
- Comment fait-on pour créer des contrôles dans la fenêtre principale via CreateWindow ?
- Est-ce souhaitable d'opérer ainsi, voire est-ce possible ?

Pour info, la création d'une boîte de dialogue statique (via un fichier de ressources) fonctionne très bien !

Merci d'avance !

XBX

3 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
26 mars 2011 à 18:51
salut,

C'est tout à fait possible et tu dois oublier quelque chose dans ton CreateWindow(). (Le hinstance, la fenêtre parent ou la position relative ?)

Ici, l'exemple pour un contrôle bouton.

@++
0
cs_FineLizzyX Messages postés 9 Date d'inscription jeudi 4 août 2005 Statut Membre Dernière intervention 25 juin 2011
27 mars 2011 à 09:24
Bonjour,

Merci pour ta réponse. ^_^

Ce qui est décrit dans l'exemple ressemble très fortement à ce que j'ai codé. L'élément déterminant m'échappe...

JE VIENS DE TROUVER !!!!!
C'est, comme d'habitude dans ce genre de problème, très c..... Je m'explique.

Afin d'éviter de transporter de partout (sous forme de paramètres de fonctions, par exemple) des caisses de handles nécessaires dans l'ensemble des fichiers sources, je les ai placés en variables globales. Le handle de la fenêtre principale fait partie du lot. Or, le code de création de la fenêtre principale est un code généré et contient la déclaration dans la fonction WinMAin de la même variable affectée au handle de la fenêtre principale.
En définitive, la variable globale n'a pas de valeur car c'est la variable locale à WinMain portant le même nom qui est valorisée...

Je viens d'enlever cette déclaration dans WinMAin : ça marche impec !!!! (enfin presque : le gris du fond des contrôles est différent de celui du fond de la fenêtre principale.)

Et comment se passe l'interception des messages ? WinProc de la fenêtre principale ? Une WinProc par contrôle ?
Je vais chercher....

Merci encore !!

@++
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
1 avril 2011 à 01:43
Salut,
Je ne pense pas que ce soit une bonne idée de créer des contrôles suite à l'activation d'une option de menu. Normalement, tous les contrôles enfants d'une fenêtre doivent être créés pendant le traitement de WM_CREATE (ou WM_INITDIALOG pour une boite de dialogue). Les contrôles qu'on ne veut pas montrer au lancement de la fenêtre mère ne doivent pas avoir le style WS_VISIBLE dans CreateWindow(). Avec ShowWindow() on peut afficher ou cacher le contrôle voulu quand on veut.
Pour la couleur de fond de la fenêtre, le plus simple est d'utiliser le membre hbrBackground de la structure WNDCLASS ( ou WNDCLASSEX). Par exemple, pour le faire ressembler à la couleur des boutons on peut faire:
wc.hbrBackground=(HBRUSH)(COLOR_BTNFACE + 1);

Normalement, l'interception des messages se fait dans le WNDPROC de la fenêtre principale. Dans certains cas, on peut avoir besoin d'intercepter les messages destinés aux contrôles enfants. Pour ce faire on utilise le sous-classement.
0
Rejoignez-nous