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

Langage Delphi Discussion :

Graphismes - par où commencer ?


Sujet :

Langage Delphi

  1. #1
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 910
    Points : 6 032
    Points
    6 032
    Par défaut Graphismes - par où commencer ?
    Bonjour à tous.


    J'ambitionne de développer un soft permettant de tracer des rectangles, des lignes, etc, un peu comme un outil de modélisation:
    - figures redimensionnables, en couleur, avec du texte
    - les lignes joignent les figures et y sont ancrées, et disposent d'un point d'inflexion médian afin de pouvoir former un angle
    - les figures ont 4 points d'ancrage

    ce genre de chose quoi...

    Coté objet, il va me falloir une classe pour les rectangles, avec des propriétés a peu près identifiées (cf ci-dessus), idem pour les lignes;

    Mais ensuite ? (syndrome de la feuille blanche)

    Comment (sur quoi dessiner) quels compos ?
    Quelle technique utiliser pour lier les lignes aux rectangles ?

    Je voudrais un espace de travail "glissant" avec une sorte de miniature permettant de situer/positionner l'espace de travail visible
    Je voudrais pouvoir mettre en évidence l'objet sélectionné (pour le redimensionner par exemple).
    Je voudrais bien sûr sauvegarder/restaurer cet "espace de travail", quel support est le plus adapté ?
    Je voudrais...
    Je voudrais.... tous les conseils du monde pour faire ça!

    Merci par avance pour vos conseils avisés.
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  2. #2
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    pour créer un jeu mahjong, j'avais commencé à créer un composant visuel dérivé de TControl (ou TGraphicControl je suis plus sûr). avec ça je gérais le click et la mise en valeur (couelur de fond) du domino sélectioné... après j'ai abandonné le projet par manque de temps (et de motivation surtout)
    Donnez un poisson à un homme et il mangera pendant un jour... Apprenez-lui à pêcher et il s'assiéra dans une barque et boira de la bière toute la journée

  3. #3
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    Pour dessiner, utilise le TPaintBox, il est fait pour ça
    Pour l'enregistrement, je ferais comme suit:
    Créer une classe de containeur (les rectangles) les plus exhaustifsz possibles (textes, liens, etc.) que je mettrais dans une liste. Puis pour enregistrer, je ferais une routine d'enregistrement pour chaque rectangle... Que du classique quoi
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  4. #4
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 910
    Points : 6 032
    Points
    6 032
    Par défaut
    Pedro, une liste comme celle mentionnée ici http://www.developpez.net/forums/vie...er=asc&start=0 pourrait-elle servir avantageusement pour mon projet ?
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  5. #5
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par qi130
    Pedro, une liste comme celle mentionnée ici http://www.developpez.net/forums/vie...er=asc&start=0 pourrait-elle servir avantageusement pour mon projet ?
    Ho oui celà te sera utile. Fait gaffe aux bugs du code généré par mon outil avec les TObjectList (il faut que je mette ses templates et je fais ça ce soir).
    Bidouilleuse Delphi

  6. #6
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 910
    Points : 6 032
    Points
    6 032
    Par défaut
    Waskol

    J'espère que je ne suis pas le seul à utiliser ton outil

    .... process is runing...
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  7. #7
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par qi130
    Waskol

    J'espère que je ne suis pas le seul à utiliser ton outil

    .... process is runing...
    Salut à toi aussi

    Promis, ce soir j'essais de faire une petite mise à jour
    (il y a une scrollbar à rajouter par exemple, l'utilisation de la propriété OwnsObjects, etc...), etc...
    Si tu as des suggestions pour améliorer le contenu des templates, ou autres tu es le bienvenue.
    Bidouilleuse Delphi

  8. #8
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Pour visualiser/déplacer/redimensionner la figure sélectionnée, on peut utiliser une forme transpartente avec juste la figure sélectionnée qui bouge avec les mouvements souris ou les commandes clavier.

    Cela permet de conserver tout le tracé existant intact avec en superposition la figure traitée et de ne le retracer que lorsque le déplacement, l'agrandissement et/ou la modification de la figure sont validés.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  9. #9
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 910
    Points : 6 032
    Points
    6 032
    Par défaut
    Je note cette idée

    Ah tiens, faut aussi que je gère les collisions lors des déplacements...


    (J'ai du boulot pour 20 ans )
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  10. #10
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    je viens de remettre la main sur mon unité. copie tout ça dans un .pas et installe le composant... ben ok c moche mais c'est un début
    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
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
     
    unit Domino;
     
    interface
    uses
      WinTypes,
      Messages,
      Classes,
      Graphics,
      Controls;
     
    Type
      TDomino = class(TGraphicControl) // plus simple pour gérer l'affichage
      private
        FDefColor, FSelColor, FDefBorderColor, FSelBorderColor : TColor;
        FImage : TBitmap;
        FRoundX, FRoundY : Byte;
        FSelected : Boolean;
        FWidth3D : Byte;
        FOnMouseDown : TMouseEvent;
        procedure ChangeDefBorderColor(Val : TColor);
        procedure ChangeDefColor(Val : TColor);
        procedure ChangeImage(Val : TBitmap);
        procedure ChangeRoundX(Val : Byte);
        procedure ChangeRoundY(Val : Byte);
        procedure ChangeSelBorderColor(Val : TColor);
        procedure ChangeSelColor(Val : TColor);
        procedure ChangeSelected(Val : Boolean);
        procedure ChangeWidth3D(Val : Byte);
      protected
      public
        constructor Create(AOwner : TComponent); override;
        destructor Destroy; override;
        procedure Paint; override;
        procedure LMBDown(var msg : TMessage); message WM_LBUTTONDOWN;
        procedure RMBDown(var msg : TMessage); message WM_RBUTTONDOWN;
      published
        property DefBorderColor : TColor read FDefBorderColor write ChangeDefBorderColor;
        property DefColor : TColor read FDefColor write ChangeDefColor;
        property Image : TBitmap read FImage write ChangeImage;
        property RoundX : Byte read FRoundX write ChangeRoundX;
        property RoundY : Byte read FRoundY write ChangeRoundY;
        property SelColor : TColor read FSelColor write ChangeSelColor;
        property SelBorderColor : TColor read FSelBorderColor write ChangeSelBorderColor;
        property Selected : Boolean read FSelected write ChangeSelected;
        property Width3D : Byte read FWidth3D write ChangeWidth3D;
        property OnMouseDown : TMouseEvent read FOnMouseDown write FOnMouseDown;
      end;
     
    procedure Register;
     
    implementation
     
    constructor TDomino.Create(AOwner : TComponent);
    begin
      inherited;
      FImage:=TBitmap.Create;
      FRoundX:=3; FRoundY:=3;
      Height:=71;
      Width:=51;
      Width3D:=6;
      FDefColor:=clOlive; FSelColor:=clFuchsia;
      FDefBorderColor:=FDefColor; FSelBorderColor:=FSelColor;
      FSelected:=False;
    end;
     
    destructor TDomino.Destroy;
    begin
      FImage.Free;
      inherited Destroy;
    end;
     
    procedure TDomino.Paint;
    var Q : Array[1..8] of TPoint;
        P : Array[1..10] of TPoint;
        i : Byte;
        RectDraw : TRect;
    begin
      inherited;
      with Canvas do begin
        Pen.Width:=1;
        Pen.Color:=clBlack;
        Brush.Style:=bsSolid;
        If FSelected Then Brush.Color:=FSelColor
        Else Brush.Color:=FDefColor;
     
        Q[1]:=Point(0, RoundY); // forme principale
        Q[2]:=Point(RoundX, 0);
        Q[3]:=Point(Width - Width3D - RoundX - 1, 0);
        Q[4]:=Point(Width - Width3D - 1, RoundY);
        Q[5]:=Point(Width - Width3D - 1, Height - Width3D - RoundY - 1);
        Q[6]:=Point(Width - Width3D - RoundX - 1, Height - Width3D - 1);
        Q[7]:=Point(RoundX, Height - Width3D - 1);
        Q[8]:=Point(0, Height - Width3D - RoundY - 1);
        Polygon(Q);
     
    // Là j'attaque le relief... j'écrirai le commentaire quand
    // je serai en forme ....
     
        If FSelected Then Brush.Color:=FSelBorderColor
        Else Brush.Color:=FDefBorderColor;
     
        i:=1;  // RoundY/RoundX représente le coef directeur de Q8-Im(Q8)
        If ((RoundX=0) or (RoundY/RoundX>1)) Then P[i]:=Q[7]
        Else begin
          P[i]:=Q[8];
          Inc(i);
          P[i]:=Point(Q[8].x + Width3D, Q[8].y + Width3D);
        end;
        Inc(i);
        P[i]:=Point(Q[7].x + Width3D, Q[7].y + Width3D);
        Inc(i);
        P[i]:=Point(Q[6].x + Width3D, Q[6].y + Width3D);
        Inc(i);
        P[i]:=Point(Q[5].x + Width3D, Q[5].y + Width3D);
        Inc(i);
        P[i]:=Point(Q[4].x + Width3D, Q[4].y + Width3D);
        If ((RoundY=0) or (RoundY/RoundX>1)) Then begin
          P[6]:=Point(Q[3].x + Width3D, Q[3].y + Width3D);
          P[7]:=Q[3];
        end Else P[7]:=Q[4];
        Dec(i);
        P[8]:=Q[i];
        P[9]:=Q[i + 1];
        P[10]:=Q[i + 2];
        Polygon(P);
     
    // dessine l'image sur le domino
        If FImage=nil Then Exit;
        with RectDraw do begin
          Left:=RoundX;
          Top:=RoundY;
          Right:=Width - Width3D - 1 - RoundX;
          Bottom:=Height - Width3D - 1 -RoundY;
        end;
        StretchDraw(RectDraw, FImage);
      end;
    end;
     
    procedure TDomino.LMBDown(var Msg : TMessage);
    // je ne récupère pas la touche [Alt]
    var Shift : TShiftState;
    begin
      inherited;
      Shift:=[];
      with Msg do begin
        If WParam>=MK_MBUTTON Then begin
          Shift:=[ssMiddle];
          WParam:=WParam - MK_MBUTTON;
        end;
        If WParam>=MK_CONTROL Then begin
          Shift:=[ssMiddle];
          WParam:=WParam - MK_CONTROL;
        end;
        If WParam>=MK_SHIFT Then begin
          Shift:=[ssMiddle];
          WParam:=WParam - MK_SHIFT;
        end;
        If WParam>=MK_RBUTTON Then begin
          Shift:=[ssMiddle];
          WParam:=WParam - MK_RBUTTON;
        end;
        If WParam>=MK_LBUTTON Then begin
          Shift:=[ssMiddle];
          WParam:=WParam - MK_LBUTTON;
        end;
        If Assigned(FOnMouseDown) Then
          FOnMouseDown(Self, mbLeft, Shift, LoWord(LParam), HiWord(LParam));
      end;
    end;
     
    procedure TDomino.RMBDown(var Msg : TMessage);
    // je ne récupère pas la touche [Alt]
    var Shift : TShiftState;
    begin
      inherited;
      Shift:=[];
      with Msg do begin
        If WParam>=MK_MBUTTON Then begin
          Shift:=[ssMiddle];
          WParam:=WParam - MK_MBUTTON;
        end;
        If WParam>=MK_CONTROL Then begin
          Shift:=[ssMiddle];
          WParam:=WParam - MK_CONTROL;
        end;
        If WParam>=MK_SHIFT Then begin
          Shift:=[ssMiddle];
          WParam:=WParam - MK_SHIFT;
        end;
        If WParam>=MK_RBUTTON Then begin
          Shift:=[ssMiddle];
          WParam:=WParam - MK_RBUTTON;
        end;
        If WParam>=MK_LBUTTON Then begin
          Shift:=[ssMiddle];
          WParam:=WParam - MK_LBUTTON;
        end;
        If Assigned(FOnMouseDown) Then
          FOnMouseDown(Self, mbRight, Shift, LoWord(LParam), HiWord(LParam));
      end;
    end;
     
    procedure TDomino.ChangeDefBorderColor(Val : TColor);
    begin
      FDefBorderColor:=Val;
      Invalidate;
    end;
     
    procedure TDomino.ChangeDefColor(Val : TColor);
    begin
      FDefColor:=Val;
      Invalidate;
    end;
     
    procedure TDomino.ChangeImage(Val : TBitmap);
    begin
      FImage:=Val;
      Invalidate;
    end;
     
    procedure TDomino.ChangeRoundX(Val : Byte);
    begin
      If Val<=(Width - Width3D) div 2 Then FRoundX:=Val;
      Invalidate;
    end;
     
    procedure TDomino.ChangeRoundY(Val : Byte);
    begin
      If Val<=(Height - Width3D) div 2 Then FRoundY:=Val;
      Invalidate;
    end;
     
    procedure TDomino.ChangeSelBorderColor(Val : TColor);
    begin
      FSelBorderColor:=Val;
      Invalidate;
    end;
     
    procedure TDomino.ChangeSelColor(Val : TColor);
    begin
      FSelColor:=Val;
      Invalidate;
    end;
     
    procedure TDomino.ChangeSelected(Val : Boolean);
    begin
      FSelected:=Val;
      Invalidate;
    end;
     
    procedure TDomino.ChangeWidth3D(Val : Byte);
    begin
      If ((Val<Height) and (Val<Width)) Then FWidth3D:=Val Else FWidth3D:=0;
      Invalidate;
    end;
     
    procedure Register;
    begin
      RegisterComponents('Mahjong', [TDomino]);
    end;
     
    end.
    Donnez un poisson à un homme et il mangera pendant un jour... Apprenez-lui à pêcher et il s'assiéra dans une barque et boira de la bière toute la journée

  11. #11
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 910
    Points : 6 032
    Points
    6 032
    Par défaut
    , je prends.
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

Discussions similaires

  1. [Divers] Par où commencer ?
    Par calogerogigante dans le forum Cobol
    Réponses: 6
    Dernier message: 03/03/2014, 10h22
  2. Réponses: 4
    Dernier message: 03/11/2005, 18h02
  3. Par ou commencer
    Par tonin33 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 02/11/2005, 21h10
  4. par où commencer, delphiX?
    Par tima dans le forum Débuter
    Réponses: 8
    Dernier message: 07/09/2005, 13h45
  5. Par où commence un site
    Par stujava dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 31/08/2005, 09h33

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