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

Windows Discussion :

Insertion d'une nouvelle classe dans une boite de dialogue (API win32)


Sujet :

Windows

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Insertion d'une nouvelle classe dans une boite de dialogue (API win32)
    Bonjour à tous (et bonne année),

    Comme écrit dans l'intitulé, j'utilise l'API win32 EXCLUSIVEMENT pour créer mon appli (pas de MFC).

    Mon problème est de créer une boite de dialogue, puis d'y insérer un nouveau composant, c'est à dire un HWND qui ferait appel à une nouvelle classe WNDCLASS possédant sa propre callback.

    J'ai donc deux callback, l'une pour la boite de dialogue et l'autre pour mon nouveau code. J'ai donc écrit le code suivant :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #include "resource.h"
    #include <windows.h>
    
    HINSTANCE hinst;
    
    LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	static HWND dArea = 0;
    	RECT rect;
    	char str[256];
    
    	switch (uMsg)
    	{
    	case WM_INITDIALOG:
    
    		dArea = CreateWindowEx(WS_EX_CLIENTEDGE,"dArea","Texte",
    			WS_CHILD | WS_VISIBLE,
    			0, 0, 0, 100, hwnd, NULL, hinst, NULL);
    		break;
    	case WM_SIZE:
    		MoveWindow(dArea, 5, 5, LOWORD(lParam)-10, HIWORD(lParam)-100, TRUE);
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    	case WM_CLOSE:
    		PostQuitMessage(0);
    		break;
    	}
    	return FALSE;
    }
    
    LRESULT CALLBACK dAreaProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	switch (uMsg)
    	{
    	case WM_CREATE:
    		break;
    	case WM_PAINT:
    		break;
    	default:
    		return TRUE;//DefWindowProc(hwnd,uMsg,wParam,lParam);
    	}
    	return TRUE;
    	//return DefWindowProc(hwnd,uMsg,wParam,lParam);
    }
    
    int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
    {
    	HWND hwnd;
    	MSG msg;
    	WNDCLASS wc,wc2;
    
    	hinst = hinstance;
    
    	wc2.style = 0 ;
    	wc2.lpfnWndProc = dAreaProc;
    	wc2.cbClsExtra = 0;
    	wc2.cbWndExtra = 0;
    	wc2.hInstance = hinstance;
    	wc2.hIcon = NULL;
    	wc2.hCursor = LoadCursor(NULL, IDC_CROSS);
    	wc2.hbrBackground = (HBRUSH)(COLOR_ACTIVECAPTION);
    	wc2.lpszMenuName =  NULL;
    	wc2.lpszClassName = "dArea";
    
    	if(!RegisterClass(&wc2)) return FALSE;
    
    	hwnd = CreateDialogA(hinstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)MainWndProc);
    
    	if (!hwnd)  return FALSE;
    
    	ShowWindow(hwnd, nCmdShow);
    
    	hwnd = GetWindow(hwnd,GW_CHILD);
    	while(1)
    	{
    		const char str[256];
    	}
    
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return msg.wParam;
    }
    avec le fichier resource "test.rc" qui va bien :

    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
    22
    23
    24
    // Generated by ResEdit 1.4.4.13
    // Copyright (C) 2006-2008
    // http://www.resedit.net
    
    #include "resource.h"
    #include <windows.h>
    #include <commctrl.h>
    #include <richedit.h>
    
    
    //
    // Dialog resources
    //
    IDD_DIALOG1 DIALOG 0, 0, 275, 222
    STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
    CAPTION "Dialog"
    FONT 8, "Ms Shell Dlg 2"
    BEGIN
        DEFPUSHBUTTON   "OK", IDOK, 220, 203, 50, 14
        PUSHBUTTON      "Cancel", IDCANCEL, 165, 203, 50, 14
        PUSHBUTTON      "Load...", IDC_BUTTON1, 220, 184, 50, 14
        EDITTEXT        IDC_EDIT1, 5, 184, 210, 14, ES_AUTOHSCROLL
        CONTROL         "", IDC_SLIDER1, TRACKBAR_CLASS, WS_TABSTOP | TBS_BOTH | TBS_NOTICKS, 5, 133, 210, 15
    END
    et le header "resource.h" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifndef IDC_STATIC
    #define IDC_STATIC (-1)
    #endif
    
    #define IDD_DIALOG1                             100
    #define IDC_SLIDER1                             1000
    #define IDC_BUTTON1                             1001
    #define IDC_EDIT1                               1002
    #define IDC_CUSTOM1                             1003
    Seulement voilà, ma boite de dialogue n'affiche pas mon nouveau composant et le programme entre dans une boucle infinie, c'est très décevant...

    Je pense que le problème vient de la callback de la dlg qui renvoie TRUE quand elle devrait renvoyer FALSE ou l'inverse, mais je ne suis pas bien sûr de moi... J'ai essayé différentes configuration de TRUE ou FALSE dans mon switch(uMsg), mais je n'obtiens pas de meilleurs résultats.

    Voilà, donc si quelqu'un peut me dire comment je dois m'y prendre je serai très reconnaissant.

    En vous remerciant.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Bonjour,
    • Déjà, une DLGPROC retourne un INT_PTR et non pas un LRESULT, donc change ça et retire ton horrible cast de pointeur de fonction.
    • Ensuite, seule une DLGPROC doit retourner TRUE ou FALSE (et pour tous les messages non-traités, elle doit retourner FALSE). Une WNDPROC doit appeler DefWindowProc().
    • dAreaProc() est une WNDPROC.
    • Il faut rajouter un +1 dans le hbrBackground
    • Que signifie ta boucle infinie avant la boucle de messages?
    • Pour ta boucle de message, il faut vérifié que GetMessage() est supérieur à zéro, pas seulement différent: Cela permet de quitter la boucle en cas d'erreur.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    oh mon Dieu !!! J'ai très honte de moi, j'avais oublié de supprimer une de mes boucles avant de poster mon message... D'où la boucle infinie

    Mais ne part pas si vite !

    J'ai fait les modifications que tu m'as dit de faire et ma window ne s'affiche toujours pas... Je n'ai plus de boucle infinie (puisque je l'ai retiré, désolé encore une fois... ), mais je devrais voir une fenêtre s'afficher dans ma dialogbox, puisque je fais un CreateWindowEx dans le WM_INITDIALOG de ma boite de dialogue...

    Je reposte mon code c modifié :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    #include "resource.h"
    #include <windows.h>
    
    HINSTANCE hinst;
    
    INT_PTR CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	static HWND dArea = 0;
    	RECT rect;
    	char str[256];
    
    	switch (uMsg)
    	{
    	case WM_INITDIALOG:
    
    		dArea = CreateWindowEx(WS_EX_CLIENTEDGE,"dArea","Texte",
    			WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN,
    			0, 0, 0, 100, hwnd, NULL, hinst, NULL);
    //Cette partie du code est bien appelé, j'ai vérifié avec le debugger de visual, Une dArea devrait donc apparaître dans ma boite de dialogue
    		return TRUE;
    	case WM_SIZE:
    		MoveWindow(dArea, 5, 5, LOWORD(lParam)-10, HIWORD(lParam)-100, TRUE);
    		return TRUE;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return TRUE;
    	case WM_CLOSE:
    		PostQuitMessage(0);
    		return TRUE;
    	}
    	return FALSE;
    }
    
    LRESULT CALLBACK dAreaProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	switch (uMsg)
    	{
    	case WM_CREATE:
    		break;
    	case WM_PAINT:
    		break;
    	default:
    		return DefWindowProc(hwnd,uMsg,wParam,lParam);
    	}
    	return DefWindowProc(hwnd,uMsg,wParam,lParam);
    }
    
    int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
    {
    	HWND hwnd;
    	MSG msg;
    	WNDCLASS wc2;
    
    	hinst = hinstance;
    
    	wc2.style = 0 ;
    	wc2.lpfnWndProc = dAreaProc;
    	wc2.cbClsExtra = 0;
    	wc2.cbWndExtra = 0;
    	wc2.hInstance = hinstance;
    	wc2.hIcon = NULL;
    	wc2.hCursor = LoadCursor(NULL, IDC_CROSS);
    	wc2.hbrBackground = (HBRUSH)(COLOR_ACTIVECAPTION);
    	wc2.lpszMenuName =  NULL;
    	wc2.lpszClassName = "dArea";
    
    	if(!RegisterClass(&wc2)) return FALSE;
    
    	hwnd = CreateDialogA(hinstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,MainWndProc);
    
    	if (!hwnd)  return FALSE;
    
    	ShowWindow(hwnd, nCmdShow);
    
    	while (GetMessage(&msg, NULL, 0, 0) > 0)
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return msg.wParam;
    }
    Encore une fois, je te prie d'accepter mes plus plates excuses et merci encore pour tes indications.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bon ok, je m'excuse à nouveau, j'ai encore commis une boulette...

    J'ai fait une fenêtre de largeur nulle donc forcément ça pouvait pas marcher (cf. la fonction CreateWindowEx dans MainWndProc).

    Merci encore pour tes conseils médinoc et la prochaine fois, je ferai un peu plus attention à ce que je post.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  2. Réponses: 82
    Dernier message: 05/02/2011, 14h34
  3. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  4. Insertion d'un slideshow Flash dans une nouvelle fenêtre.
    Par simplyme dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/11/2006, 18h43
  5. Réponses: 18
    Dernier message: 06/11/2006, 21h32

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