begin process at 2012 05 27 15:40:02
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > DIALOGBOXINDIRECT AVEC DES CONTROLES (WIN32)

DIALOGBOXINDIRECT AVEC DES CONTROLES (WIN32)


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Classé sous :dlgitemtemplate, dialogboxindirect, dialogbox, ressource, dlgtemplate Niveau :Débutant Date de création :04/06/2006 Date de mise à jour :04/06/2006 23:19:08 Vu / téléchargé :6 160 / 319

Auteur : vecchio56

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (20)
Ajouter un commentaire et/ou une note


 Description

Ce code montre comment créer une DialogBox contenant des controles sans utilsier des ressources. Il y a déja des codes utilisant DialogBoxIndirect, mais aucun je crois ne montre la création de controles, grâce à la structure DLGITEMTEMPLATE.

Source

  • #include <windows.h>
  • #include <commctrl.h>
  • #pragma comment(lib, "comctl32.lib")
  • INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM, LPARAM)
  • {
  • if(uMsg == WM_CLOSE) EndDialog(hDlg, 0);
  • return 0;
  • }
  • LPWORD CreateControl(LPWORD lpw, DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle,
  • int x, int y, int cx, int cy, int ctlID)
  • {
  • if((LPARAM)lpw & 3) lpw++; // Aligner sur un DWORD
  • LPDLGITEMTEMPLATE lpit = (LPDLGITEMTEMPLATE)lpw;
  • lpit->x = x;
  • lpit->y = y;
  • lpit->cx = cx;
  • lpit->cy = cy;
  • lpit->style = dwStyle;
  • lpit->dwExtendedStyle = dwExStyle;
  • lpit->id = ctlID;
  • lpw = (LPWORD) (lpit + 1);
  • lpw += MultiByteToWideChar(CP_ACP, 0, lpClassName, -1, (LPWSTR)lpw, 128);
  • if(lpWindowName) lpw += MultiByteToWideChar(CP_ACP, 0, lpWindowName, -1, (LPWSTR)lpw, 128);
  • else *lpw++ = 0;
  • *lpw++ = 0; // Pas de data
  • return lpw;
  • }
  • LPWORD CreateDlg(LPWORD lpw, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int cx, int cy,
  • int fontSize, LPCTSTR lpFontName, int ctrlNum)
  • {
  • LPDLGTEMPLATE lpdt = (LPDLGTEMPLATE)lpw;
  • if(!lpFontName)
  • {
  • lpFontName = "Ms Shell Dlg 2";
  • fontSize = 8;
  • }
  • lpdt->style = dwStyle;
  • lpdt->x = x;
  • lpdt->y = y;
  • lpdt->cx = cx;
  • lpdt->cy = cy;
  • lpdt->cdit = ctrlNum; // Nombre de contrôles
  • lpw = (LPWORD)(lpdt + 1);
  • *lpw++ = 0; // Pas de menu
  • *lpw++ = 0; // Classe par défaut
  • if(lpWindowName) lpw += MultiByteToWideChar(CP_ACP, 0, lpWindowName, -1, (LPWSTR)lpw, 128);
  • else *lpw++ = 0;
  • *lpw++ = fontSize;
  • return lpw + MultiByteToWideChar(CP_ACP, 0, lpFontName, -1, (LPWSTR)lpw, 128);
  • }
  • #ifdef _DEBUG
  • int main()
  • #else
  • #pragma comment(linker, "/entry:myWinMain")
  • int __stdcall myWinMain()
  • #endif
  • {
  • InitCommonControls();
  • HGLOBAL mem = GlobalAlloc(GPTR, 1024);
  • LPWORD lpw = (LPWORD)mem;
  • lpw = CreateDlg(lpw, "Test", DS_SETFONT | DS_CENTER | WS_POPUP | WS_BORDER | WS_MINIMIZEBOX | WS_SYSMENU | DS_MODALFRAME | WS_CAPTION,
  • 0, 0, 249, 89, 0, 0, 3);
  • // Création de quelques controles
  • lpw = CreateControl(lpw, 0, "Button", "Cancel", WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 192, 68, 50, 14, 1000);
  • lpw = CreateControl(lpw, 0, "msctls_progress32", 0, WS_VISIBLE | WS_CHILD | PBS_SMOOTH, 7, 40, 235, 9, 1001);
  • lpw = CreateControl(lpw, WS_EX_CLIENTEDGE, "edit", 0, WS_VISIBLE | WS_CHILD, 7, 7, 100, 13, 1002);
  • DialogBoxIndirect(0, (LPDLGTEMPLATE)mem, NULL, DialogProc);
  • GlobalFree(mem);
  • #ifdef _DEBUG
  • return 0;
  • #else
  • ExitProcess(0);
  • #endif
  • }
#include <windows.h>
#include <commctrl.h>

#pragma comment(lib, "comctl32.lib")

INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM, LPARAM)
{
  if(uMsg == WM_CLOSE) EndDialog(hDlg, 0);
  return 0;
}

LPWORD CreateControl(LPWORD lpw, DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle,
                     int x, int y, int cx, int cy, int ctlID)
{
  if((LPARAM)lpw & 3) lpw++; // Aligner sur un DWORD
  LPDLGITEMTEMPLATE lpit = (LPDLGITEMTEMPLATE)lpw;
  lpit->x = x;
  lpit->y = y;
  lpit->cx = cx;
  lpit->cy = cy;
  lpit->style = dwStyle;
  lpit->dwExtendedStyle = dwExStyle;
  lpit->id = ctlID;
  lpw = (LPWORD) (lpit + 1);
  lpw += MultiByteToWideChar(CP_ACP, 0, lpClassName, -1, (LPWSTR)lpw, 128);
  if(lpWindowName) lpw += MultiByteToWideChar(CP_ACP, 0, lpWindowName, -1, (LPWSTR)lpw, 128);
  else *lpw++ = 0;
  *lpw++ = 0; // Pas de data
  return lpw;
}

LPWORD CreateDlg(LPWORD lpw, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int cx, int cy,
                 int fontSize, LPCTSTR lpFontName, int ctrlNum)
{
  LPDLGTEMPLATE lpdt = (LPDLGTEMPLATE)lpw;

  if(!lpFontName)
  {
    lpFontName = "Ms Shell Dlg 2";
    fontSize = 8;
  }

  lpdt->style = dwStyle;
  lpdt->x = x;
  lpdt->y = y;
  lpdt->cx = cx;
  lpdt->cy = cy;
  lpdt->cdit = ctrlNum; // Nombre de contrôles

  lpw = (LPWORD)(lpdt + 1);
  *lpw++ = 0; // Pas de menu
  *lpw++ = 0; // Classe par défaut
  if(lpWindowName) lpw += MultiByteToWideChar(CP_ACP, 0, lpWindowName, -1, (LPWSTR)lpw, 128);
  else *lpw++ = 0;

  *lpw++ = fontSize;
  return lpw + MultiByteToWideChar(CP_ACP, 0, lpFontName, -1, (LPWSTR)lpw, 128);
}


#ifdef _DEBUG
int main()
#else
#pragma comment(linker, "/entry:myWinMain")
int __stdcall myWinMain()
#endif
{
  InitCommonControls();

  HGLOBAL mem = GlobalAlloc(GPTR, 1024);
  LPWORD lpw = (LPWORD)mem;

  lpw = CreateDlg(lpw, "Test", DS_SETFONT | DS_CENTER | WS_POPUP | WS_BORDER | WS_MINIMIZEBOX | WS_SYSMENU | DS_MODALFRAME | WS_CAPTION,
    0, 0, 249, 89, 0, 0, 3);

  // Création de quelques controles
  lpw = CreateControl(lpw, 0, "Button", "Cancel", WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 192, 68, 50, 14, 1000);
  lpw = CreateControl(lpw, 0, "msctls_progress32", 0, WS_VISIBLE | WS_CHILD | PBS_SMOOTH, 7, 40, 235, 9, 1001);
  lpw = CreateControl(lpw, WS_EX_CLIENTEDGE, "edit", 0, WS_VISIBLE | WS_CHILD, 7, 7, 100, 13, 1002);

  DialogBoxIndirect(0, (LPDLGTEMPLATE)mem, NULL, DialogProc);

  GlobalFree(mem);

#ifdef _DEBUG
  return 0;
#else
  ExitProcess(0);
#endif
}


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

04 juin 2006 23:19:08 :
Renommage exe

 Sources du même auteur

Source avec Zip COLORATION DE CODE C/C++ POUR LE FORUM DE CPPFRANCE
Source avec Zip SUPPRIMER LES # AJOUTÉS LORS D'UN COPIER/COLLER
Source avec Zip Source avec une capture CRÉER UN FICHIER ISO À PARTIR D'UN RÉPERTOIRE (WIN32)
Source avec Zip Source avec une capture EXPLORATEUR DE FICHIERS ISO
Source avec Zip Source avec une capture CHARGER UNE POLICE DEPUIS UN FICHIER OU UNE RESSOURCE (WIN32...

 Sources de la même categorie

Source avec Zip WIN32 TLS LENT par dguilmain
Source avec Zip VIDER ELEMENTS DE CORBEILLE WINDOWS7 (WIN64) par BruNews
Source avec Zip Source avec une capture FIND TEXT (WIN64) par BruNews
Source avec Zip DELETE DIRECTORY (WIN64) par BruNews
Source avec Zip ENUM DIRECTORY (WIN64) par BruNews

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture VOIR UNE IMAGE GIF C/C++ par nanonavich
Source avec Zip Source avec une capture [C++/WIN32] RECHERCHE DE FUITES DE MEMOIRE par yann_lo_san
Source avec Zip Source avec une capture PIECHART SUR DIALOG SANS RESSOURCE par yann_lo_san
Source avec Zip Source avec une capture CHARGER UNE POLICE DEPUIS UN FICHIER OU UNE RESSOURCE (WIN32... par vecchio56
Source avec Zip Source avec une capture TRIF : PERMET DE DÉPLACER/SUPPRIMER/COPIER DES FICHIERS EN M... par deck_bsd

Commentaires et avis

Commentaire de BruNews le 04/06/2006 23:11:06 administrateur CS

Renomme ton exe.
En bonne voie pour fournir ton éditeur de ressources par petits morceaux.

Commentaire de vecchio56 le 04/06/2006 23:14:18 administrateur CS

Ce code la je l'utilise pas dedans t'inquiète pas
Je renomme l'exe...

Commentaire de gagah1 le 05/06/2006 07:47:35

Je pense que tu as utilisé ce code pour l'aperçu dans ton éditeur de ressources.

Commentaire de vecchio56 le 05/06/2006 10:26:08 administrateur CS

Moi je ne pense pas

Commentaire de deck_bsd le 06/06/2006 17:56:55

"mais aucun je crois ne montre la création de controles".Si moi je crée mes boites de dialogue comme cela :D avec LPDLGTEMPLATE.D'ailleur cela ce voi dans ma dernière source mdr.

Mais c'est une bonne source :D

Commentaire de vecchio56 le 06/06/2006 18:38:28 administrateur CS

Je ne vois pas de DLGITEMTEMPLATE pour créer des controles dans ta source.
Tu utilises des CreateWindow, ce qui n'est pas logique dans une DialogBox

Commentaire de vecchio56 le 06/06/2006 18:45:21 administrateur CS

Un avantage de ma méthode aussi, c'est que tu n'a pas à te soucier des problèmes de police (pas de WM_SETFONT a envoyer, c'est géré automatiquement: les contrôles héritent de la police de la boite de dialogue)

Commentaire de deck_bsd le 06/06/2006 20:34:49

? vecchio tu a des problèmes de vue regarde :D :

HGLOBAL hgMemory;
LPDLGTEMPLATE stDlgBox;
LPWORD lpwWord;
LPWSTR lpwsUnicode;

hgMemory = GlobalAlloc(GPTR,512);
if(!hgMemory){
MessageBox(hwnd,"Function : GlobalAlloc()","Erreur",MB_OK |MB_ICONERROR);
break;
}
stDlgBox = (LPDLGTEMPLATE) hgMemory;

stDlgBox->style = WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_POPUP | DS_MODALFRAME;
stDlgBox->cx = 110;
stDlgBox->cy = 50;
stDlgBox->x = GetSystemMetrics(SM_CXSCREEN)/6;
stDlgBox->y = GetSystemMetrics(SM_CYSCREEN)/6;

lpwWord = (LPWORD) (stDlgBox + 1);
lpwsUnicode = (LPWSTR) (lpwWord + 2);

MultiByteToWideChar(CP_ACP,0,"Execute",-1,lpwsUnicode,128);
DialogBoxIndirect(GlobalHInstance,stDlgBox,0,(DLGPROC)ExeProc);

J'utilise bien LPDLGTEMPLATE mdr

Commentaire de deck_bsd le 06/06/2006 20:36:02

ha dans une dialogbox non, sorry mais je crée bien une dialogbox sans ressource ;) .

Commentaire de vecchio56 le 06/06/2006 20:37:09 administrateur CS

Oui, mais c'est toi qui a des problèmes de vue :)
DLGTEMPLATE -> Pour la dialogBox
DLGITEMTEMPLATE -> pour les contrôles
C'est l'utilisation de la structure DLGITEMTEMPLATE qui est expliquée ici (et pas DLGTEMPLATE)

Commentaire de deck_bsd le 06/06/2006 20:38:43

oui oui je m'en susi rendu compte après, toutes mes excuse :p

Commentaire de vecchio56 le 06/06/2006 20:45:55 administrateur CS

Trop tard, encore une blague de ce genre et t'es viré :)

Commentaire de deck_bsd le 06/06/2006 20:46:16

par contre "C'est l'utilisation de la structure DLGITEMTEMPLATE qui est expliquée ici (et pas DLGTEMPLATE)" vraiment? alors qu'est ce que :

# LPWORD CreateDlg(LPWORD lpw, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int cx, int cy,
#                  int fontSize, LPCTSTR lpFontName, int ctrlNum)
# {
#   LPDLGTEMPLATE lpdt = (LPDLGTEMPLATE)lpw;
#  
#   if(!lpFontName)
#   {
#     lpFontName = "Ms Shell Dlg 2";
#     fontSize = 8;
#   }
#  
#   lpdt->style = dwStyle;
#   lpdt->x = x;
#   lpdt->y = y;
#   lpdt->cx = cx;
#   lpdt->cy = cy;
#   lpdt->cdit = ctrlNum; // Nombre de contrôles
#  
#   lpw = (LPWORD)(lpdt + 1);
#   *lpw++ = 0; // Pas de menu
#   *lpw++ = 0; // Classe par défaut
#   if(lpWindowName) lpw += MultiByteToWideChar(CP_ACP, 0, lpWindowName, -1, (LPWSTR)lpw, 128);
#   else *lpw++ = 0;
#  
#   *lpw++ = fontSize;
#   return lpw + MultiByteToWideChar(CP_ACP, 0, lpFontName, -1, (LPWSTR)lpw, 128);
# }

héhé bon bon cava j'arrête MDR :D

Commentaire de racpp le 07/06/2006 15:03:08 administrateur CS

Salut,
vecchio56 a raison, l'intérêt de ce code réside dans l'utilisation de la structure DLGITEMTEMPLATE. Il l'utilise dans la fonction CreateControl() pour justement créer des controles. Pour créer la boite de dialogue il est normal qu'il utilise DLGTEMPLATE. Ca, ce n'est pas nouveau. Cela fait presque deux ans que j'ai déposé une source utilisant cette structure pour créer des boites de dialogue sans ressources. Je connaissais la structure DLGITEMTEMPLATE mais je trouvais son utilisation moins pratique que CreateWindow(). Il est vrai qu'on n'aura plus besoin de WM_SETFONT. Par contre il faudra utiliser GetDlgItem() pour récupérer le HWND des controles. Tout le monde sait que beaucoup de fonctions API utilisent un HWND comme paramètre. Si on pourrait améliorer la fonction CreateControl() pour qu'elle retourne un HWND ce serait parfait.
En lançant l'exécutable, deux choses m'ont frappé. La taille de l'exe (2 Ko), c'est un record, et la rapidité. Même en ajoutant beaucoup de controles, tout s'affiche instantanément. J'aimerais juste préciser que pour mettre beaucoup de controles, il faut allouer suffisamment de mémoire avec GlobalAlloc().
Je pense que ja vais explorer davantage ta méthode car elle semble intéressante.
Une question: Ce projet est console? car une fenêtre console s'affiche en mode Debug.
Merci pour le code.

Commentaire de vecchio56 le 07/06/2006 15:44:00 administrateur CS

Le projet est en mode console pour la version debug, c'est une habitude que j'ai prise car j'utilise souvent la console en debug.
CreateControl ne peut pas retourner un HWND, car cette fonction est appelée avant la création du DialogBox, et donc quand CreateControl retourne, aucune fenêtre n'est encore créée.
Il faut donc en effet utilsier GetDlgItem, ou d'autres fonctions comme SendDlgItemMessage
Cela dit, a mon avis ma solution reste meilleure. Comme tu le dis le chargement est plus rapide, car au moment de l'appel de DialogBoxParam, tout est prêt en mémoire, ce qui est faux quand on fait des appels successifs à CreateWindow
Par ailleurs, l'utilisation de CreateWindow n'est pas logique, car les coordonnées fournies sont en pixels, alors que dans une DialogBox on doit raisonner en dialog unit.
Ainsi, si tu choisis de modifier ta police, ma solution sera meilleure, car tous les contrôles seront automatiquement redimentionnés. Ce n'est évidemment pas le cas avec des appels à CreateWindow.
Si pour toi le seul inconvénient est qu'il faut appeler GetDlgItem, je trouve qu'il s'agit d'un inconvénient mineur

Commentaire de racpp le 07/06/2006 16:20:25 administrateur CS

Merci por ces précisions.
Pour modifier la police de tous les controles enfants, une simple petite boucle do while() suffit. J'ai utilisé cette astuce dans mes dernières sources déposées sur le site. Mais ta solution doit être meilleure car plus rapide.
C'est vrai que CreateWindow() travaille en pixels. Je contourne le problème dans une DialogBox en récupérant le clientrect(qui est en pixels) de la boite de dialogue et positionner les controles dans ce rectangle.
A propos de GetDlgItem(), si on utilise beaucoup les HWNDs, on peut les récupérer une seule fois pendant WM_INITDALOG. La boite s'affiche un peu moins vite mais c'est mieux que CreateWindow().
10/10

Commentaire de racpp le 07/06/2006 16:29:55 administrateur CS

Dommage que les fenêtres ne supportent pas cette méthode. On est obligés de passer par CreateWindow().

Commentaire de deck_bsd le 10/06/2006 09:31:30

Yop vecchio, j'ai regardé ton utilisation de DLGITEMTEMPLATE ca ressemble fort a DLGTEMPLATE mais je ne comprend pas cece :
if((LPARAM)lpw & 3) lpw++; // Aligner sur un DWORD

A quoi cella sert-il (et ne me dit pas a aligner sur un DWORD mdr :) ).

Commentaire de vecchio56 le 10/06/2006 10:54:56 administrateur CS

Dans MSDN c'est écrit que les DLGITEMTEMPLATES doivent être alignées sur des DWORD (Each DLGITEMTEMPLATE structure in the template must be aligned on a DWORD boundary).
Or le premier param est aligné sur un WORD, mais pas forcément un DWORD
Si tu me demandes ce que signifie aligné sur un DWORD, ca veut juste dire que l'adresse est un mutliple de la taille d'un DWORD, soit 4
Donc, si (lpw & 3) est différent de 0, ca veut dire que c'est pas un multiple de 4 (les multiples de 4 on leur deux bits de poids faible à 0). Dans ce cas je l'incrémente (ce qui ajoute en fait deux au pointeur, qui est maintenant aligné sur un DWORD).

Commentaire de deck_bsd le 10/06/2006 14:28:11

Merci bien pour l'explication :D

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Prob Tab control avec VC++ [ par loicus ] Bon voila, j'aimerais rajouter un Tab COntrol dans une DialogBox, Mais quand j'en ajoute une avec VC++ grace a l'editeur de ressource (dialogbox)de 1 Problème pour importer une DialogBox depuis une DLL [ par Kheo ] Afin de rendre mon soft skinable j'ai exporté toute les ressources de mon projet vers une DLL que j'imoprte au debut de mon logiciel avec un LoadLibra CComboBox resize (vc++6) [ par beny ] je cree une combobox dynamiquement dans une dialogbox resizable.Je souhaite redimensionner ma combobox en fonction de la taille de la dialogbox. (une Utilisation d'une DialogBox ? [ par arconius ] Voilà si quelqu'un serait m'expliquer quels sont les paramètres à entrer dans la fonction DialogBox se serait niquel. Merci d'avance !!! @+ et bonne p lire et afficher un .txt dans un dialogbox visual c++ [ par Vaeron ] Mettre un Exe en Ressource et le lire [ par LordDaedalus ] Lord DaedalusJe souhaite mettre un exe en Ressource comme un menu ou une boite de dialogue puis le lire à partir du programme principal (par exemple p DialogBox pour recuperer un fichier sur le disque... [ par coyote19 ] J'ai besoin de recuperer un path d'un fichier. J'ai reussi grace a la fonction SH_BrowseForFolder et les objets BROWSEINFO, mais a present je ne voudr creer dialogbox + modif forme [ par alanbraxe31 ] http://membres.lycos.fr/alanbraxe31bonjour,je cherche tout simplement à effectuer des modifs sur ma dialog box, j'aimerai qu'elle fasse comme la barre copier un fichier ressource lors de l'execution [ par arthuro2001 ] Je voudrais copier un fichier exe ( ou tout autre type de fichier ) en ressource de mon programme sur la machine executant mon programme afin de pouv string table ressource [ par redshirt ] Je voudrais creer une application en plusieurs langues. J'essaye donc d'utiliser les string tables. J'en ai cree une en francais et une en anglais. Po


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,390 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales