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 :

Mettre une fenetre toujours au premier plan


Sujet :

C++Builder

  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
    Points : 3 766
    Points
    3 766
    Par défaut Mettre une fenetre toujours au premier plan
    bonsoir
    J'ai cree une fenetre sans barre de titre qui s'affiche en haut de l'ecran la Form est initialisee a " fsStayOnTop ", mais j'aimerais que les autres fenetres s'affichent et s'ajustent sous ma Form, je cherche une piste
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  2. #2
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    s'affichent et s'ajustent sous ma Form
    Dans ce sens là (?) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    SetBounds(0,0,Screen->Width, 100);
    }
    //--
     
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
    Form2->Show();
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void __fastcall TForm2::FormShow(TObject *Sender)
    {
    SetBounds(0,Form1->Height, Width, Height);
    }
    Pour interdire le déplacement de Form2 il suffirait d'intercepter et de gérer l'événement WM_WOVING.
    (toujours sur BCB3 Pro donc ...)

    A plus !

  3. #3
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Sinon, en interprétant le problème autrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
    Form2->Show(); // peu importe
    Form3->Show(); // peu importe à ce stade
    Application->NormalizeAllTopMosts(); // << y compris Form1
    Form3->FormStyle = fsStayOnTop; // << Replace et demeure au premier plan
    }
    Pour gérer le positionnement des autres forms par rapport à cette form, l'interception de WM_MOVING reste d'actualité !

    A plus !

  4. #4
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Merci pour tes reponses henderson
    Je me suis tres mal explique la fenetre que je cree va me servir de Zoom et se place en haut de l'ecran elle est redimensionnable, ce que je cherche, c'est que les fenetres presente se redimensionnes dans l'espace restant sur l'ecran de meme pour celles qui vont se charger la fenetre de Zoom deja presente, je regarde du cote des API Window je pense que c'est ce qu'il faut utiliser mais je ne vois pas lequelles
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  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
    Points : 3 766
    Points
    3 766
    Par défaut
    En faisant des testes je me retrouve devant un probleme si je fais ceci pour obtenir le Handle du bureau j'ai cette valeur " 00010014 "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HWND hwndBureau = GetDesktopWindow();
    Si je fais ceci pour obtenir le Handle pointe par le curseur en faisant ce qui suit j'ai cette valeur " 00010088 ", j'avais pris la precotion de deplacer les fenetre pour verifier que cela pointe sur le bureau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // on positionne le curseur sur la barre de titre
    // a 10 du bord gauche et 10 du bord haut
    TPoint Pt;
    Pt.x = 10;
    Pt.y = 10;
    // on recupere le Handle de la fenetre affichee
    HWND hwndAppli = WindowFromPoint(Pt); // on recupere le Handle du composant sous le curseur
    Pourquoi deux valeurs differentes, comment obtenir le Handle du bureau que l'on voit
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  6. #6
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    DeskTop ... ???

    En supposant que cette fenêtre Zoom ne concerne que ton application, le plus simple serait quand même que ton application gère ses propres fenêtres.
    Ca peut se faire "facilement" en mettant les OnResize en guirlande :
    Zoom étant maître du positionnement des autres fenêtres elle lancera donc la OnResize de la première fenêtre qui lancera la OnResize de la deuxième fenêtre ... la OnResize de la dernière fenêtre ne lancera aucune OnResize.
    Cette daisy-chain doit respecter une condition : Zoom doit être la dernière fenêtre créée et il faudra donc inhiber l'action des OnResize avec un flag que Zoom validera lors de sa construction (pour éviter d'utiliser une fenêtre qui ne serait pas encore construite à cause de ce montage en daisy-chain).
    Dès que la OnResize de cette Zoom sera solicitée (inévitablement après sa construction), toutes les fenêtres se positionneront les unes par rapport aux autres (et l'une après l'autre)... à faire donc dans chaque OnResize (donc pour chacune d'elle) avant de solliciter la OnResize de "sa" suivante dans la daisy-chain.
    Je me limite ici à n'en décrire que le principe (comme j'ai testé ce principe avec mon BCB3 Pro ...) !

    Si on travaille dans un contexte MDI ... c'est encore plus simple ... puisque la MDIForm est maître de son contenu (on peut développer pour faire beaucoup plus que Cascade et Tile ) !!!

    A plus !

  7. #7
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    La seule et unique fenetre que je cree est la fenetre de Zoom, les autres fenetres seront par exemple celle de Word ou Excel ..., c'est pour cela que je teste si il y a une fenetre ou si c'est celle du bureau,
    si c'est celle du bureau je ne redimensionne pas, si c'est Word ou Excel ..., je redimensionne la fenetre Word Excel ..., je n'ai besoin de redimensionner que la fenetre qui est sous celle de Zoom, je sais que cela est faisable j'ai un programme de traduction qui fonctionne comme cela.
    D'ou mon probleme je dois recuperer le Handle du bureau " GetDesktopWindow(); " et " WindowFromPoint(Pt); " revoient deux Handle differents (voir mon post precedent)
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  8. #8
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour,

    Tu as posé un problème sérieux.

    Il ya une solution qui consiste à faire une boucle pour récupérer la liste des fenettres affichées, verifier une/une si elle est visible, et qu'elle ne soit pas celle du bureau.
    Si la condition est verifiée, on la déplace soit par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    MoveWindow(
        HWND hWnd,	// handle of window
        int X,	// horizontal position
        int Y,	// vertical position
        int nWidth,	// width
        int nHeight,	// height
        BOOL bRepaint 	// repaint flag
       );
    ou bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MoveWindowOrg(HDC DC, int DX, int DY);

    Pour avoir la liste des fenetre affichée, il ya un exemple livrer avec Builder,

    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
     
    bool __stdcall EnumProc(HWND hWnd,/*LPARAM*/long/*lp*/)
    {
       unsigned long* pPid;   //LPDWORD
       unsigned long result;      //DWORD
       void *hg;                  //HGLOBAL
       unsigned long id;
     
       if(hWnd==NULL)
          return false;
     
       hg = GlobalAlloc(GMEM_SHARE,sizeof(unsigned long));
       pPid = (unsigned long *)GlobalLock(hg);
     
       result = GetWindowThreadProcessId(hWnd,pPid);
     
       if(result){
          char title[110];
          char className[95];
          char totalStr[256];
          GetClassName(hWnd,className,95);
          GetWindowText(hWnd,title,110);
          id=*pPid;
          ultoa(id,totalStr,10);
          strcat(totalStr,"\t");
          if(title){
             strcat(totalStr,title);
             strcat(totalStr,"\t");
          }
          strcat(totalStr,className);
          FormMain->ListBox1->Items->Add((AnsiString)totalStr);
       }
       else{
          GlobalUnlock(hg);
          GlobalFree(hg);
          return false;
       }
       GlobalUnlock(hg);
       GlobalFree(hg);
       return true;
    }
     
    //---------------------------------------------------------------------
    sur un bouton tu ajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       long lp=0;
       ListBox1->Enabled=true;
       ListBox1->Clear();
       EnumWindows((WNDENUMPROC)EnumProc,lp);
    Attention, ce prog donne la liste des processus en cours d'execution ;
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  9. #9
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Re, j'ai pas eu le temps de tester ce prog, mais je vais le faire dès mon retour, demain au plus tard.
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  10. #10
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour,

    voici l'api pour modifier la position d'une fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       RECT *rct = new RECT() ;;
       GetWindowRect((void*)hWnd, rct) ;
       MoveWindow((void*)hWnd, 100,100, rct->right-rct->left, rct->bottom-rct->top, true);
    hWnd représente le handle de la fenêtre à deplacer, utilise
    BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
    pour avoir la liste des fenêtres affichées.

    Si tu as besoin un peu plus d'aide, j'ai developpé un programme fonctionnel pour ton sujet.

    @+
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  11. #11
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Merci pour tes reponses kmaniche
    J'ai trouve comment recupere le Handle du bureau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // on recupere le Handle de la fenetre du bureau par son nom
     HWND hwndBureau1 = FindWindow("Progman", "Program Manager");
     HWND hwndBureau2 = FindWindowEx(hwndBureau1, NULL, "SHELLDLL_DefView", NULL);
     hwndBureau3 = FindWindowEx(hwndBureau2, NULL,
                                     "SysListView32", "FolderView");
    j'ai trouve la confirmation dans la FAQ
    il me reste maintenant les testes
    1 - le programme Zoom est le seul programme lance
    2 - il y a deja d'autre fenetres d'ouvertes au lancement du programme Zoom
    3 - une ou plusieurs fenetres sont ouvertes au dessus du programme Zoom
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  12. #12
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Il ya aussi plus simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    The GetDesktopWindow function returns the handle of the Windows desktop window. The desktop window covers the entire screen. The desktop window is the area on top of which all icons and other windows are painted. 
     
    HWND GetDesktopWindow(VOID)
     
     
    Parameters
     
    This function has no parameters. 
     
    Return Values
     
    The return value is the handle of the desktop window.
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  13. #13
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Non " GetDesktopWindow " renvoi un Handle different de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // on recupere le Handle de la fenetre du bureau par son nom
     HWND hwndBureau1 = FindWindow("Progman", "Program Manager");
     HWND hwndBureau2 = FindWindowEx(hwndBureau1, NULL, "SHELLDLL_DefView", NULL);
     hwndBureau3 = FindWindowEx(hwndBureau2, NULL,
                                     "SysListView32", "FolderView");
    J'ai verifie avec Spy++
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  14. #14
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    tu peux expliquer un peu le code ?
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  15. #15
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Quelle est alors la différence entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Edit1 -> Text = (int)GetDesktopWindow() ;
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Edit2 -> Text = (int)FindWindow("Progman", "Program Manager");
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  16. #16
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Ce que je crois avoir compris, quand tu fais " GetDesktopWindow " tu accede au support des applications qui tournent en tache de fond et le bureau en fait partie regarde avec un utilitaire type WinSight32 de BCB ou Spy++ de VC tu va comprendre en comparent les Handles renvoyes par " GetDesktopWindow " et " FindWindow("Progman", "Program Manager") "
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  17. #17
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Voici mon programme de zoom qui fonctionne quelque soit la resolution et qui est place en haut de l'ecran
    Sur une Form, un PaintBox, un Panel, un Timer.
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    //---------------------------------------------------------------------------
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published: // IDE-managed Components
            TPaintBox *PaintBox1;
            TTimer *Timer1;
            TPanel *Panel1;
            void __fastcall FormCreate(TObject *Sender);
            void __fastcall PaintBox1MouseUp(TObject *Sender,
              TMouseButton Button, TShiftState Shift, int X, int Y);
            void __fastcall FormMouseUp(TObject *Sender, TMouseButton Button,
              TShiftState Shift, int X, int Y);
            void __fastcall Timer1Timer(TObject *Sender);
            void __fastcall Panel1MouseDown(TObject *Sender,
              TMouseButton Button, TShiftState Shift, int X, int Y);
    private: // User declarations
    public:  // User declarations
            __fastcall TForm1(TComponent* Owner);
            int Zoom;
            POINT MousePos;
            TPoint Pt;
            HWND hwndBureau3;
            HWND hwndAppli;
            HWND hwndZoom;
            bool flag;
            int X;
            int Y;
            int nWidth;
            int nHeight;
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    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
    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    // on recupere le Handle de la fenetre du bureau par son nom
     HWND hwndBureau1 = FindWindow("Progman", "Program Manager");
     HWND hwndBureau2 = FindWindowEx(hwndBureau1, NULL, "SHELLDLL_DefView", NULL);
     hwndBureau3 = FindWindowEx(hwndBureau2, NULL,
                                     "SysListView32", "FolderView");
    // on positionne le curseur sur la barre de titre
    // a 10 du bord gauche et 10 du bord haut
     Pt.x = 10;
     Pt.y = 10;
     X = 0;
     Y = 50;
     nWidth = Screen->Width;
     nHeight = Screen->Height;
    // on recupere le Handle de la fenetre affichee sous le curseur
     hwndAppli = WindowFromPoint(Pt);
    // Si la fenetre au dessous est != du bureau on la redimensionne
     while(WindowFromPoint(Pt) != hwndBureau3)
     {
     hwndAppli = WindowFromPoint(Pt);
      MoveWindow(
       hwndAppli, // handle of window
       X, // horizontal position
       Y, // vertical position
       nWidth, // width
       nHeight, // height
       true  // repaint flag
      );
     }
    // on affiche la fenetre de Zoom sans barre de titre en haut de l'ecran
     Form1->BorderStyle = bsNone;
     Form1->FormStyle = fsStayOnTop; // mettre la Form toujours au premier plan
     Form1->Left = 0;
     Form1->Top = 0;
     Form1->Width = Screen->Width;
     Form1->Height = 50;
    // on dimensionne le PaintBox
     PaintBox1->Top = 5;
     PaintBox1->Left = 5;
     PaintBox1->Height = Form1->Height - 10;
     PaintBox1->Width = Form1->Width - 50;
     PaintBox1->Visible = true;
    // on positionne le TPanel
     Form1->Panel1->Top = 5;
     Form1->Panel1->Left = Form1->Width - 40;
     Form1->Panel1->Width = 37;
     Form1->Panel1->Height = 37;
      Zoom = 2; // valeur de l'agrandissement par default au demarrage
      Application->Title = "Loupe";
      // Timer1 interval = 150
      Timer1->Interval = 150;
      Timer1->Enabled = true;
      flag = true;
    }
    //---------------------------------------------------------------------------
    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 sur le PaintBox.
      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 sur la Form.
      Close();
     }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
     if(flag == true)
    {
    // on cree un Canvas pour peindre sur le TPanel
     TControlCanvas *pCn;
     pCn = new TControlCanvas();
     pCn->Control = Form1->Panel1;
     pCn->Brush->Color = clRed;
     pCn->FillRect(Rect(2, 2, 35, 35));
     pCn->Pen->Width = 5;
     pCn->Pen->Color = clWhite;
     pCn->MoveTo(10, 10);
     pCn->LineTo(27, 27);
     pCn->MoveTo(27, 10);
     pCn->LineTo(10, 27);
     delete pCn;
     flag = false;
    }
    // on positionne le curseur sur la barre de titre
    // a 10 du bord gauche et 51 du bord haut
     Pt.x = 10;
     Pt.y = 60;
    HDC DC;
    int x;
    int y;
    TRect Rect;
    // on recupere le Handle de la fenetre Zoom
     hwndZoom = WindowFromPoint(Pt);
    // on recupere les dimensions de la fenetre
    GetWindowRect(hwndZoom, &Rect);
    // si la position Top de la fenetre est inf a 50 on redimensionne la fenetre
    if(Rect.Top <= 50)
    {
     hwndAppli = WindowFromPoint(Pt);
      MoveWindow(
       hwndAppli, // handle of window
       X, // horizontal position
       Y, // vertical position
       nWidth, // width
       nHeight, // height
       true  // repaint flag
      );
    }
    // 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
        x = Mouse->CursorPos.x;
        y = Mouse->CursorPos.y;
        // prise du point de référence de la souris
        // 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.
        // ne pas ouvbier de libérer le contexte, c'est une ressource rare.
        DeleteDC (DC);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Panel1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
      // Femeture de la fenêtre sur un click droit sur la Form.
      Close();
    }
    //---------------------------------------------------------------------------
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  18. #18
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour,

    le programme à l'air de se planter des fois, j'ai pus avoir une seule bonne execution, depuis que je l'es testé.

    ??
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  19. #19
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut kmaniche
    Bien sur chez moi ca fonctionne
    Alors les questions habituelles quelle version de Window, que fait le programme, en mode pas a pas ou se produit l'erreur ou le mauvais fonctionnement
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  20. #20
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour,
    Pour les cacatéristiques du système :
    WindowsXp SP2, 1Go DDR, Intel P4 3Ghz et VGA Intel 128 Mo Intégrée.

    Les anomalies constatées :
    1- La fiche ne se positionne pas au pt (0,0),
    2- Les dimesions ne sont pas ceux initialisées par le programme (Screen -> Width, et Height = 50).
    3- La fiche se positionne en pt(0,50) et Width = Screen -> Width ; et Height = Screen -> Height
    4- Des fois, la fenêtre ne s'affiche pas !
    5- Des fois, elle s'affiche mais sans l'aperçu (la partie zoomée).

    Voilà, j'ai indiqué l'essentiel, reste à confirmer avec d'autres developpeurs !

    > Est ce que qu'il a déjà essayé ce programme ??
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

Discussions similaires

  1. Savoir si une fenetre est au premier plan
    Par Galip dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/07/2007, 13h37
  2. Réponses: 11
    Dernier message: 05/06/2007, 20h56
  3. [JFrame] Affichage d'une application toujours au premier plan
    Par michaeljeru dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 06/12/2006, 22h49
  4. [C#][.Net] Affichage d'une appli toujours au premier plan
    Par alncool dans le forum Windows Forms
    Réponses: 9
    Dernier message: 13/07/2005, 12h30
  5. forcer une fenetre à etre au premier plan jusqu'a ...
    Par peppena dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 22/12/2003, 16h14

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