magic_Nono
Messages postés1878Date d'inscriptionjeudi 16 octobre 2003StatutMembreDernière intervention16 mars 2011
-
13 sept. 2004 à 09:21
magic_Nono
Messages postés1878Date d'inscriptionjeudi 16 octobre 2003StatutMembreDernière intervention16 mars 2011
-
14 sept. 2004 à 08:27
Bonjour
j'aimerai faire une fonction avec ce proto
String fenetreDyn(const int nbChamps);
telle qu'elle ouvre une fenetre ressemblant à ceci si nbChamps=2
-------------------------------------------------------------
+ FORMULAIRE
-------------------------------------------------------------
+ A1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ A2 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+
+ Baratin explicatif
+ Suite du baratin (meme zone)
+
+
+ OK CANCEL
-------------------------------------------------------------
avec
A1 & A2 : des éléments static
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
& bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb : des zones de textes modifiables
et une zone de texte nom modifiable prenant toute la largeur de la fenetre
sur plusieurs lignes
avant les boutons OK & CANCELS
on a donc nbChamp doublets : descriptifs / zone de saisie
J'ai bien une solution en MFC, mais ça borne le nombre passé en paramètre.
Et c'est en MFC :(
On envisagera ensuite de mettre une scrollBar en limitant la taille de la fenetre
à partir d'un n donné.
Ah, j'allais oublier la valeur de retour
Dans le cas de l'exemple précédent:
"A1\taaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nA2\tbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Donc pour chaque doublet: En tete, tabulation, valeur, saut de ligne
(la distinction entre OK & CANCEL se fera par la levée d'une exception dans le cas du CANCEL
ou simplement par un retour de "" dans le cas du CANCEL
mais, ça c'est un détail complétement optionnel)
La difficulté de la fonction est bien évidement, pas la mise en forme
mais la création d'une fenêtre dynamique et l'affectation/récupération de ses éléments.
Merci de votre aide pour la réalisation de cette fonction.
Magicalement,
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 13 sept. 2004 à 12:50
Une fenetre qui doit creer des champs aura bien entendu une wndProc specifique aussi, suffira donc de lire lParam dans W_CREATE ou WM_INITDIALOG et d'avoir le code qui convient.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 13 sept. 2004 à 19:04
victorcoasne> garce a un pointeur de struct tu peux passer des milliers d'informations sur seulement 32 bits et on a ainsi 1 seul PUSH sur stack.
Vitesse et efficacite....
class BWindows
{
public:
bool DoModal();
BWindows();
virtual ~BWindows();
private:
HWND m_hwnd ; //handle pour la fenetre
};
src____________________________________________
#include "BWindows.h"
#include "../Bibli/BException.hpp" //gestion de l'exception... PB1 ...
BWindows::~BWindows()
{
}
#include <windows.h>
// nom de la classe en variable globale
/// Nota : de base, C po une bonne idée...
const char szClassName[ ] = "WindowsApp";
//Prototype de notre fonction d'écoute
/// Nota : TODO :faudrai en faire une fonction membre de ma classe
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
WNDCLASSEX wincl; //on définit une classe pour notre fenetre
//notre classe de fenetre
wincl.hInstance = NULL;//hThisInstance; //B
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; //pas de menu
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
//on enregistre notre classe et si on n'y arrive pas on quitte le programme
if (!RegisterClassEx (&wincl))
PB1("erreur à l'instanciation");
//Maintenant que notre classe de fenetre est enregistré on peut cré la fenêtre
m_hwnd = CreateWindowEx (
0, //pas important :D
szClassName, //nom de la classe
"Windows App", //nom de notre fenetre
WS_OVERLAPPEDWINDOW, //on cré une fenetre redimensionnable
CW_USEDEFAULT, //position par défault
CW_USEDEFAULT, //pareil
544, //longueur de la fenetre
375, //hauteur
HWND_DESKTOP, //fenetre mère (et non pas fille)
NULL, //notre fenetre ne contien pas de menu
NULL,// hThisInstance, //notre handle - mis à null... -B (ça doit po etre bon...)
NULL //pas important :D
);
}
//notre fonction d'écoute des messages
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) //on traite les messages avec un switch
{
case WM_DESTROY:
PostQuitMessage (0); //si on clic sur la croix :D on quitte :D
break;
default:
//si on ne recoit aucun message (ne pas modifier)
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
bool BWindows::DoModal()
{
//retour OK ou cancel...
MSG messages; //on définit une structure de message
// on affiche notre fenetre
ShowWindow (m_hwnd, SW_SHOW
/*nFunsterStil*/
);
//on envoi les message a notre fonction d'écoute
while (GetMessage (&messages, NULL, 0, 0))
//GetMessage revoie 0 quand il recoit le message WM_QUIT
{
//compliqué...
TranslateMessage(&messages);
//c'est ici précisément qu'on envoie les messages
DispatchMessage(&messages);
}
//on quitte
// return messages.wParam;
return true;