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

 C Discussion :

Initiation à la programmation avec l'API Windows


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2010
    Messages : 87
    Points : 62
    Points
    62
    Par défaut Initiation à la programmation avec l'API Windows
    Bonjour,

    j'ai téléchargé le cours d'initiation A la programmation avec l'API Windows et j'ai essayé de suivre le cours pas à pas mais je me suis planté dans le programme de la fonction MainProc
    Dans le compilateur code::blocks quand je crée un nouveau projet 'win32 gui project' il me demande de choisir 'framebased ou dialogbased'.

    J'ai choisi framebased et bien vérifé bien le programme de la fenêtre donné toute prête par code::blocks et le programme dans cours 'Création d'une fenêtre' c'est les même jusqu'à la fonction MainProc

    Dans le code::blocks le code est comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
     
        switch (message)                  /* handle the messages */
        {
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break; // break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
     
        return 0;
    }
    et dans le cours par " Bob et CGi " il est comme ça
    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
    LRESULT CALLBACK MainProc(HWND hWnd, UINT mes, WPARAM wParam, LPARAM lParam)
    {
    HDC hDC;
    PAINTSTRUCT paintst;
    switch (mes)
    {
    case WM_PAINT:
    hDC=BeginPaint(hWnd,&paintst);
    EndPaint(hWnd,&paintst);
    return 0;
    case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
    default:
    return DefWindowProc(hWnd, mes, wParam, lParam);
    }
    }
    j'ai essayé d'ajouter les lignes manquantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    HDC hDC;
    PAINTSTRUCT paintst;
    case WM_PAINT:
    hDC=BeginPaint(hWnd,&paintst);
    EndPaint(hWnd,&paintst);
    return 0;
    mais le code::blocks ne veut pas compiler

    Si quelqu'un peut m'aider, merci

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par PIC16F877A Voir le message
    mais le code::blocks ne veut pas compiler
    Il te donne quoi comme message d'erreur ?

    EDIT as tu remarqué que le hwnd était devenu un hWnd ?

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Les lignes ne sont pas "manquantes", elles dépendent de ce que tu veux faire.

    Si tu veux trifouiller l'affichage de la fenêtre elle-même, je te conseille cette syntaxe:
    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
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	LRESULT ret = 0;
     
    	switch (message)                  /* handle the messages */
    	{
    	case WM_DESTROY:
    		PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
    		break; // break;
     
    	case WM_PAINT:
    		{
    			PAINTSTRUCT paintst;
    			HDC hDC = BeginPaint(hwnd, &paintst);
     
    			/*Dessiner ici*/
    			/*...*/
     
    			EndPaint(hwnd, &paintst);			
    		}
    		break;
     
    	default:                      /* for messages that we don't deal with */
    		ret = DefWindowProc (hwnd, message, wParam, lParam);
    	}
    	return ret;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2010
    Messages : 87
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par mabu Voir le message
    Bonjour,

    Il te donne quoi comme message d'erreur ?

    EDIT as tu remarqué que le hwnd était devenu un hWnd ?
    non il ne m'affiche pas des errreur et pour 'hWnd' j'ai fais de copie coller pour iviter ce problem et voici le programme complet d'une fenétre sans traitement des messages WM_PAINT et WM_DESTROY et WM_PAINT

    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
    #include <windows.h>
     
    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
     
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "CodeBlocksWindowsApp";
     
    int WINAPI WinMain (HINSTANCE hThisInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpszArgument,
                         int nCmdShow)
    {
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */
     
        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);
     
        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default colour as the background of the window */
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
     
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;
     
        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "Code::Blocks Template Windows App",       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               544,                 /* The programs width */
               375,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
     
        /* Make the window visible on the screen */
        ShowWindow (hwnd, nCmdShow);
     
        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
     
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
     
     
    /*  This function is called by the Windows function DispatchMessage()  */
     
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
     
        return 0;
    }
    si vous essaye d'ajauter ces lignes de code le compilateur ne compile pas


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    HDC hDC;
    PAINTSTRUCT paintst;
     
    case WM_PAINT:
    hDC=BeginPaint(hWnd,&paintst);
    EndPaint(hWnd,&paintst);
    return 0;
    voici ce qu'il ya dans le cours

    La définition de la procédure de cette fenêtre est la même que dans le programme précédent.
    Mais son fonctionnement interne est différent.
    Tout d'abord, cette fenêtre ne contient pas de bouton. Sa fermeture se fera lors d'un clic sur la
    'croix'. Les messages non traités sont passés à DefWindowProc(). Les messages traités seront
    WM_PAINT et WM_DESTROY. WM_PAINT indique que nous devons redessiner la zone client.
    Ici le traitement de ce message ne fera rien et pourrait être ignoré. Il est inclu dans le seul but de
    comprendre le mécanisme de redessinement d'une fenêtre. Le message WM_DESTROY indique que
    la fenêtre est en train d'être détruite (probablement suite au clic sur la 'croix'). Le fermeture de la
    fenêtre ne signifie pas forcément l'arret de l'application. Mais comme dans ce cas notre application
    n'est formée que d'une fenêtre, nous demanderons à terminer l'application dans ce cas en postant un
    message WM_QUIT.
    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
     
    LRESULT CALLBACK MainProc(HWND hWnd, UINT mes, WPARAM wParam, LPARAM lParam)
    {
    HDC hDC;
    PAINTSTRUCT paintst;
    switch (mes)
    {
    case WM_PAINT:
    hDC=BeginPaint(hWnd,&paintst);
    EndPaint(hWnd,&paintst);
    return 0;
    case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
    default:
    return DefWindowProc(hWnd, mes, wParam, lParam);
    }
    }
    Le traitement du message WM_PAINT peut vous paraitre étrange. En effet, pourquoi effectuer
    un BeginPaint() et un EndPaint() alors que nous ne dessinons rien. La raison est très simple. A partir
    du moment ou nous décidons de traiter ce message, nous devons assurer un traitement minimum par
    la suite de ces deux fonction, même si rien n'est dessiné.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2010
    Messages : 87
    Points : 62
    Points
    62
    Par défaut ((())))
    Citation Envoyé par Médinoc Voir le message
    Les lignes ne sont pas "manquantes", elles dépendent de ce que tu veux faire.

    Si tu veux trifouiller l'affichage de la fenêtre elle-même, je te conseille cette syntaxe:
    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
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	LRESULT ret = 0;
     
    	switch (message)                  /* handle the messages */
    	{
    	case WM_DESTROY:
    		PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
    		break; // break;
     
    	case WM_PAINT:
    		{
    			PAINTSTRUCT paintst;
    			HDC hDC = BeginPaint(hwnd, &paintst);
     
    			/*Dessiner ici*/
    			/*...*/
     
    			EndPaint(hwnd, &paintst);			
    		}
    		break;
     
    	default:                      /* for messages that we don't deal with */
    		ret = DefWindowProc (hwnd, message, wParam, lParam);
    	}
    	return ret;
    }
    je ne veux rien faire avec le code je suis un débutant et je veux juste comprendre le traitement de message WM_PAINT et j'ai meme pas reussit d'ajauter le message WM_PAINT avec ses deux fonction hDC=BeginPaint(hWnd,&paintst);
    EndPaint(hWnd,&paintst); et pas encor le traitement lolll moi ce que j'imagine dans tous ca est que les messages system vien via la veriable 'message ou msg' a la
    la linge 'case WM_PAINT:' et demarrer le dessin par la fonction hDC=BeginPaint(hWnd,&paintst); et arrét le dessin par la fonction EndPaint(hWnd,&paintst);

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    En fait, ton code reçoit le message WM_PAINT quand c'est le moment de dessiner.

    Par exemple, pour juste afficher un message au milieu de la fenêtre, tu peux faire ceci:
    Code C : 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
    void AfficherMessage(HWND hWnd, HDC hdc, LPCTSTR texte)
    {
    	/*Récupère le rectangle de la fenêtre parce que DrawText() en a besoin.*/
    	RECT r;
    	GetClientRect(hWnd, &r);
     
    	/*Dessine le texte voulu au centre de la fenêtre*/
    	DrawText(
    	 hdc,   /*HDC où dessiner*/
    	 texte, /*Texte à écrire*/
    	 -1,    /*Longueur automatique*/
    	 &r,    /*Rectangle de la fenêtre*/
    	 /*Flags: Centré, pas de traitement spécial de '&'*/
    	 DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_NOPREFIX
    	 );
    }

    Et entre le BeginPaint() et le EndPaint(), mettre ceci pour l'appeler:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    AfficherMessage(hwnd, hDC, TEXT("Coucou!"));
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 29
    Dernier message: 14/01/2013, 10h40
  2. tutoriel : La programmation de l'API Windows en C++ par Bob
    Par Aurelien.Regat-Barrel dans le forum Windows
    Réponses: 19
    Dernier message: 21/06/2008, 14h34
  3. Tutorial d'initiation a la programmation avec l'API Windows
    Par mcdonald dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 16/09/2005, 17h20
  4. Stocker un imprim ecran sous bmp avec l'api windows
    Par Tofalu dans le forum Windows
    Réponses: 7
    Dernier message: 04/05/2005, 11h32
  5. Réponses: 3
    Dernier message: 09/11/2004, 10h44

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