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 :

[Win32] - Changer la taille et la position d'une fenetre


Sujet :

Windows

  1. #1
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut [Win32] - Changer la taille et la position d'une fenetre
    Bonjour,

    J'ai crée une fenetre sans bordure et sans barre de titre (elle a une forme un peu spéciale)

    Donc on ne peut, à priori, ni la deplacer ni changer sa taille en cliquant sur une bordure ou dans le titre.

    J'ai trouvé cette astuce sur le net :

    Dans le traitement des messages :

    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
    case WM_LBUTTONDOWN:
        if (dansLaZonePourDeplacer)
        {
           SendMessage(m_HWND, WM_NCLBUTTONDOWN, HTCAPTION,NULL);
        }
        else if (dansLaZonePourChangerLaTailleHorizontale)
        {
           SendMessage(m_HWND, WM_NCLBUTTONDOWN, HTTOP,NULL);
        }
        else if (dansLaZonePourChangerLaTailleVerticale)
        {
           SendMessage(m_HWND, WM_NCLBUTTONDOWN, HTLEFT,NULL);
        }
        else
        {
            ....
        }
        return 0;
    En fait, ça consiste a faire croire à Windows que l'on a cliqué dans le titre ou sur une bordure lorsque l'on clique dans certaines zones....

    Ca marche tres bien, sauf que :
    - apres avoir deplacé la fenetre, lorsque l'on relache le bouton de la souris, il faut re-cliquer dans la fenetre pour que celle-ci recoivent les messages à nouveau, sinon elle ne recoit rien
    - le curseur ne change pas de forme

    Auriez-vous une idée ?

    Merci !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 72
    Points : 77
    Points
    77
    Par défaut
    Bonjour,
    Je ne comprends pas trop ce que tu souhaites faire (et par la même occasion ton problème) mais as-tu pensé à regarder du côté du traitement des messages:
    WM_SIZE
    WM_WINDOWPOSCHANGING
    WM_WINDOWPOSCHANGED
    et de la fonction SetWindowPos() ?

  3. #3
    Membre actif Avatar de Nyarlathotep
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 174
    Points : 217
    Points
    217
    Par défaut
    Tu peux faire changer le curseur de forme manuellement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    HCURSOR SetCursor(HCURSOR hCursor);
    //Change le curseur de forme.
    
    HCURSOR LoadCursor(HINSTANCE hInstance,LPCTSTR lpCursorName);
    //Charge un curseur. Il peut s'agir d'un curseur de Windows,
    //par ex: le curseur question, d'edition, ...
    
    //Voir MSDN
    Sinon, si ta fenêtre ne reçoit pas de message une fois déplacée,
    Tu peux essayer ( je ne sais pas si ça marche, mais bon ) de faire un appel à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HWND SetFocus(HWND hWnd);
    "That is not dead which can eternal lie
    And with strange aeons even death may die"

    The Call of Cthulhu

  4. #4
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Effectivement, j'ai pas pensé à redonner le focus à la fenetre apres un deplacement... j'essaie ce soir !

    Pour comprendre le probleme, c'est un truc dans le genre de ce qui est expliqué ici :

    http://www.flipcode.com/articles/art...n32skins.shtml

    (vers la fin, il y a une section sur le deplacement de la fenetre)

    Le but est de gérer le deplacement/resize de la fenetre sans avoir à tout gerer (drag de la souris, envoit de WM_MOVE/WM_SIZE etc...) mais le laisser windows gerer cela, vu qu'il le fait tres bien !

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Le mieux pour laisser faire Windows, c'est de faire une fenêtre avec bordure épaisse, mais cachée en traitant le message WM_NCCALCSIZE.
    On peut alors répondre ce qu'on veut au message WM_NCHITTEST (HTTOP, HTRIGHT, etc.) sur les zones qu'on veut, pour laisser Windows redimensionner sur les zones concernées. Hélas, ça ne marche pas si la fenêtre ne possède pas le style WS_THICKFRAME.
    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.

  6. #6
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    J'ai trouvé la solution idéale (dans mon cas précis)

    Voici ma classe de fenetre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      m_WC.style               = 0;
      m_WC.lpfnWndProc     = gestionMessagesStatic;
      m_WC.cbClsExtra        = 0;
      m_WC.cbWndExtra      = 0;
      m_WC.hInstance         = (HINSTANCE) hInstance;
      m_WC.hIcon               = NULL;
      m_WC.hCursor            = LoadCursor(NULL, IDC_ARROW);
      m_WC.hbrBackground   = NULL;
      m_WC.lpszMenuName   = NULL;
      m_WC.lpszClassName   = "FenetrePopUp";
    Voici la création de la fenetre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    m_HWND = CreateWindowEx(
    					WS_EX_TOOLWINDOW,
    					"FenetrePopUp",
    					titre,
    					WS_POPUP,
    					x,
    					y,
    					l,
    					h,
    					NULL,
    					NULL,
    					(HINSTANCE) hInstance,
    					(void *)this);
    Avec ces parametres, j'obtiens une fenetre sans bordure, sans fond, sans barre de titre ni de menu et qui n'apparait pas dans la barre des taches...

    (c'est pour faire des popup d'outils dans un logiciel)

    Ensuite, lors de traitement de WM_PAINT, je dessine moi-meme une bordure et un titre (pas forcement droite, la bordure, d'ailleurs)

    Pour pouvoir redimensionner/deplacer, je fait ça dans mon traitement de messages :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    case WM_NCHITTEST:
          POINT    coords;
          coords.x = GET_X_LPARAM(lParam);
          coords.y = GET_Y_LPARAM(lParam);
          ScreenToClient(hwnd,&coords);
          if (coords dans une zone de deplacement) return HTCAPTION;
          if (coords dans une zone de changement de taille) return HTLEFT;
          if (coords dans une zone de changement de taille) return HTRIGHT;
          if (coords dans une zone de changement de taille) return HTTOP;
          if (coords dans une zone de changement de taille) return HTBOTTOM;
          return HTCLIENT;
    Du coup :

    - les curseurs changent de forme sans que j'ai à m'en occuper
    - on peut faire les tests que l'on veut, donc deplacer/retailler la fenetre à partir de n'importe quelle zone...

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 518
    Points
    41 518
    Par défaut
    C'est marrant, ça :
    • Sans le style WS_SYSMENU, le fait de retourner HT(une bordure) marche sans tenir compte des styles de bordure.
    • Avec, il faut une bordure épaisse, sinon les HT(une bordure) sont ignorés.
    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.

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

Discussions similaires

  1. Changer la taille d'un champ d'une table
    Par casawi dans le forum Oracle
    Réponses: 9
    Dernier message: 24/11/2010, 18h10
  2. Réponses: 3
    Dernier message: 17/04/2009, 11h32
  3. Changer la taille d'un item d'une tilelist
    Par gobgob dans le forum Flex
    Réponses: 1
    Dernier message: 17/11/2008, 10h55
  4. Figer la taille et la position d'une fenêtre
    Par nashpimp dans le forum Agents de placement/Fenêtres
    Réponses: 12
    Dernier message: 07/08/2008, 17h08
  5. Changer la taille et la couleur d'une page
    Par persia dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 06/12/2007, 22h42

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