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++Builder Discussion :

Un programme de Zoom


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut Un programme de Zoom
    Bonsoir
    Voici une petite loupe qui s'affiche en haut a droite de l'ecran et que l'on peut deplacer, qui reste au premier plan, un click gauche sur la bordure permet de la deplacer, un click droit ou Echap arrete le programme, l'appui sur les touche " - " et " + " modifie le Zoom de 1 a 10
    c'est une adaptation d'une source en Delphi
    le .cpp
    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Zoom.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      Form1->BorderStyle = bsNone;
      Form1->FormStyle = fsStayOnTop; // mettre la Form toujours au premier plan
      // Par défaut la loupe est en haut à droite
      Top = 20;
      Left = Screen->Width - Width - 20;
      Zoom = 3; // valeur de l'agrandissement par default au demarrage
      Application->Title = "Loupe";
      Timer1->Interval = 150;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    // Timer1 interval = 150
    HDC DC;
    int x;
    int y;
      // Création d'un contexte d'affichage non lié à une fenêtre
      // donc permet d'accéder à l'écran entier
      DC = CreateDC("DISPLAY", NULL, NULL, NULL);
    //  With PaintBox1 Do Try
        // prise du point de référence de la souris
        x = Mouse->CursorPos.x;
        y = Mouse->CursorPos.y;
        // limitations de la zone pour ne pas sortir de l'écran
    if(x >= (Screen->Width - ClientWidth / Zoom))
    {
    x = (Screen->Width - ClientWidth / Zoom) - 1;
    }
    if(y >= (Screen->Height - ClientHeight / Zoom))
    {
    y = (Screen->Height - ClientHeight / Zoom) - 1;
    }
        // Copie d'une partie de l'écran dans la boite à peindre
    StretchBlt(PaintBox1->Canvas->Handle // Copie vers le canevas de la boite
                   , 0                      //       vers X=0
                   , 0                      //       et   Y=0
                   ,(ClientWidth * Zoom) - 1  // en multipliant par Zoom la largeur
                   ,(ClientHeight * Zoom) - 1  // en multipliant par Zoom la hauteur
                   ,DC                     // Copie à partir du canevas global
                   ,x - 5                     //       de la position de la souris
                   ,y - 10                     //       ...
                   ,ClientWidth            //       sur la taille de la boite
                   ,ClientHeight           //
                   ,SRCCOPY);              // Simple copie sans autre effet.
    SetForegroundWindow(DC); // mettre la Form toujours au premier plan
        // ne pas ouvbier de libérer le contexte, c'est une ressource rare.
        DeleteDC (DC);
      // Mettre la fenêtre au premier plan
    Show();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::PaintBox1MouseUp(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    if(Button == mbRight)
    {
      // Femeture de la fenêtre sur un click droit.
      Close();
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
    if(Button == mbLeft)
    {
      // Astuce pour déplacer facilement un WinControl ou descendant
      // ( Merci à DelphiProg qui l'a donnée dans le forum il y a un bout de temps...)
        ReleaseCapture();
        Perform(WM_SYSCOMMAND, 0xF012, 0);
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
    if(Key == VK_SUBTRACT)
            {
            Zoom = Zoom - 1;
            if(Zoom <= 1)
            {
            Zoom = 1;
            }
            }
    if(Key == VK_ADD)
            {
            Zoom = Zoom + 1;
            if(Zoom >= 10)
            {
            Zoom = 10;
            }
            }
    if(Key == VK_ESCAPE)
            {
            // Femeture de la fenêtre sur un click droit.
              Close();
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
    if(Button == mbRight)
    {
      // Femeture de la fenêtre sur un click droit.
      Close();
    }
    }
    //---------------------------------------------------------------------------
    le .h
    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
     
    //---------------------------------------------------------------------------
    #ifndef ZoomH
    #define ZoomH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published: // IDE-managed Components
            TTimer *Timer1;
            TPaintBox *PaintBox1;
            void __fastcall FormCreate(TObject *Sender);
            void __fastcall Timer1Timer(TObject *Sender);
            void __fastcall PaintBox1MouseUp(TObject *Sender,
              TMouseButton Button, TShiftState Shift, int X, int Y);
            void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button,
              TShiftState Shift, int X, int Y);
            void __fastcall FormKeyDown(TObject *Sender, WORD &Key,
              TShiftState Shift);
            void __fastcall FormMouseUp(TObject *Sender, TMouseButton Button,
              TShiftState Shift, int X, int Y);
    private: // User declarations
    public:  // User declarations
            __fastcall TForm1(TComponent* Owner);
            int Zoom;
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif

  2. #2
    Membre habitué

    Inscrit en
    Décembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 14
    Par défaut
    Bonsoir,


    Super sympat et compact le zoom que tu propose .


    Pour info, j'ai trouvé une (petite) erreur à la compile (il manque la déclaration de la variable 'Zoom' )
    Pour corriger le problème, il suffit par exemple de rajouter sa déclaration dans Zoom.h :
    public:
    int Zoom;
    Je déplacerais egalement
    Form1->FormStyle = fsStayOnTop; // mettre la Form toujours au premier plan
    dans la méthode FormCreate() car on ne doit pas utiliser en meme temps le constructeur TForm1::TForm1() et FormCreate().
    (Avec Builder, c'est l'un ou l'autre)

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut Dure_Limite
    C'est une retranscription d'un code Delphi que je trouvais pas mal et que j'ai complete.
    La variable Zoom est bien declaree ici dans le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public:  // User declarations
            __fastcall TForm1(TComponent* Owner);
            int Zoom;
    dans la méthode FormCreate() car on ne doit pas utiliser en meme temps le constructeur TForm1::TForm1() et FormCreate().
    (Avec Builder, c'est l'un ou l'autre)
    C'est possible mais je n'en vois pas la raison, si effectivement c'est deconseille peut on m'eclairer

  4. #4
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 527
    Par défaut
    Citation Envoyé par blondelle Voir le message
    C'est possible mais je n'en vois pas la raison, si effectivement c'est deconseille peut on m'eclairer
    Il vaut mieux mettre le code dans TForm1 :: Create effectivement car dans le constructeur de TForm1 , la fenêtre n'est pas tout à fait initialisée et si on veut accéder à TForm1 elle risque de valoir=NULL

  5. #5
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Merci pour ta reponse Mat.M
    je vais corriger en deplacent les instructions

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    L'ensemble des initialisations peut effectivement être réalisé dans le constructeur, sans quoi on ne pourrait jamais rien y faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    BorderStyle = bsNone;
    FormStyle = fsStayOnTop
    On peut se passer du TPaintBox en dessinant directement sur la form.
    Pour ceux qui n'auraient pas Mouse (pour ma version BCB3 Pro, ou alors je suis vraiment nul), voici comment s'en passer :

    -Déclarer dans la classe de TForm1

    -Dans la OnTimer on récupère les coordonnées absolues avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // prise du point de référence de la souris
    GetCursorPos(&MousePos);
    int x = MousePos.x;
    int y = MousePos.y;
    J'ai gardé ici le couple (x,y) mais on peut très bien utiliser celui donné par MousePos.

    Pour dessiner directement sur la form :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    StretchBlt(Canvas->Handle,
               ...
               ...
    A plus !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/09/2011, 21h21
  2. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  3. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  4. communication entre programmes
    Par jérôme dans le forum C
    Réponses: 12
    Dernier message: 16/04/2002, 08h05
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

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