begin process at 2012 05 30 09:51:34
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

GUI

 > 

Skins : form "polygonale" sans titre mais déplaçable quand même ?


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Skins : form "polygonale" sans titre mais déplaçable quand même ?

vendredi 28 mars 2008 à 14:18:53 | Skins : form "polygonale" sans titre mais déplaçable quand même ?

steph12358

Salut à tous

Je sais déjà faire une fenêtre polygonale.
Histoire de ne plus voir un bout de la barre de titre qui dépasse j'ai supprimé la bordure (de toutes façons ma fenêtre ne doit pas être retaillable).
Mais maintenant je ne peux plus la déplacer, évidemment...
Pas de bras, pas de chocolat !

Voilà un exemple de code pour une fenêtre triangulaire en c++ builder ça donne :

(...)
//déclarations
HRGN maRegion;
TPoint contours[10];
(...)
//création du formulaire : on créée le masque et on l'applique à la forme
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   contours[0] = Point(0,0);
   contours[1] = Point(320,0);
   contours[2] = Point(160,200);

   //pas de bordure
   BorderStyle = bsNone;
   try
   {
      maRegion = CreatePolygonRgn(contours, 3, WINDING);
      assert(maRegion!=0);
      SetWindowRgn(Handle, maRegion, true);
   }
   catch (Exception * ev)
   {
      Application->MessageBox("Lézard !","Erreur", MB_OK);
   }
}
(...)
//Destruction : on supprime le masque
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
   DeleteObject(maRegion);
}

Quelqu'un a une idée ?
vendredi 28 mars 2008 à 14:44:47 | Re : Skins : form "polygonale" sans titre mais déplaçable quand même ?

jfrancois

Réponse acceptée !

Bonjour,

J'ai rencontré une fois ce problème avec une fenêtre sans barre de titre donc non déplaçable en cliquant dessus. Voilà ce que j'ai écrit et qui fonctionne en cliquant sur le corps de la fenêtre pour la déplacer. Il s'agit de traiter certains messages Windows dans la procédure de traitement des messages de la fenêtre :

LRESULT CALLBACK WinMainProc
(
    HWND   hWnd   // E:handle sur la fenêtre
   ,UINT   uiMsg  // E:message à traiter
   ,WPARAM wParam // E:paramètre WPARAM
   ,LPARAM lParam // E:paramètre LPARAM
)                 // S:code retour
{
   static bool    bIsLeftMouseButtonDown = false;
   static RECT    WindowSizeDown;
   static POINT   CursorPosDown;
   static HCURSOR hCursorPrev = NULL;

   switch(uiMsg)
   {
      ...

      // -----------------------------------------------------
      // Déplacement de la fenêtre sur l'écran
      // (impossible à faire en cliquant sur la barre de titre
      // puisqu'il n'y en a pas !)
      // -----------------------------------------------------

      // --- Appui sur le bouton gauche de la souris
      case WM_LBUTTONDOWN :
      {
         bIsLeftMouseButtonDown = true;

         // --- Curseur de déplacement
         HCURSOR hCursor = LoadCursor(NULL,IDC_SIZEALL);
         if (hCursor) hCursorPrev = SetCursor(hCursor);

         // --- Dimension de la fenêtre
         GetWindowRect(hWnd,&WindowSizeDown);

         // --- Position de la souris
         GetCursorPos(&CursorPosDown);
         ScreenToClient(hWnd,&CursorPosDown);
      }
      return 0;


      // --- Relâche du bouton gauche de la souris
      case WM_LBUTTONUP :
      {
         bIsLeftMouseButtonDown = false;

         // --- Retour au curseur initial
         if (hCursorPrev) SetCursor(hCursorPrev);
      }
      return 0;


      // --- Déplacement de la souris
      case WM_MOUSEMOVE :
      {
         // --- Pas de déplacement si pas d'appui sur le bouton gauche
         if (! bIsLeftMouseButtonDown) return 0;

         // --- Curseur de déplacement
         HCURSOR hCursor = LoadCursor(NULL,IDC_SIZEALL);
         if (hCursor) hCursorPrev = SetCursor(hCursor);

         // --- Coordonnées de la souris
         POINT CursorPos;
         GetCursorPos(&CursorPos);

         // --- Déplacer la fenêtre de la valeur du déplacement de la souris
         int iX      = CursorPos.x - CursorPosDown.x;
         int iY      = CursorPos.y - CursorPosDown.y;
         int iWidth  = WindowSizeDown.right  - WindowSizeDown.left;
         int iHeight = WindowSizeDown.bottom - WindowSizeDown.top;
         MoveWindow(hWnd,iX,iY,iWidth,iHeight,TRUE);
      }
      return 0;


      case ...
   }
   ...
}


Jean-François

vendredi 28 mars 2008 à 15:20:37 | Re : Skins : form "polygonale" sans titre mais déplaçable quand même ?

BruNews

Administrateur CodeS-SourceS
Suffit de cela:
    case WM_MOUSEMOVE: // lParam client area
      if(wParam & MK_LBUTTON) SendMessage(hdlg, WM_NCLBUTTONDOWN, HTCAPTION, 0);
      return 0;

ciao...
BruNews, MVP VC++
vendredi 28 mars 2008 à 15:36:21 | Re : Skins : form "polygonale" sans titre mais déplaçable quand même ?

steph12358

Merci Jean-François

Je ne maîtrise pas encore les callback
Du coup en attendant de me dégrossir j'ai utilisé les événements de ma form
FormMouseDown, Move et Up et me suis inspiré de ton code
J'ai juste une erreur de compil sur la ligne ScreenToClient que j'ai du mettre entre commentaire ce qui n'est peut être pas étranger au fait que lorsque je clique sur la fenêtre... elle saute d'un côté et le curseur de l'autre...
Après quoi le déplacement se passe trés bien

J'y suis presque !

//---------------------------------------------------------------------------

void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
   if (Button != mbLeft)
      return;

   GetWindowRect(Handle,&WindowSizeDown);

   // --- Position de la souris
   GetCursorPos(&CursorPosDown);
   //ScreenToClient(Handle, &CursorPosDown);

   bIsLeftMouseButtonDown = true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
   if (! bIsLeftMouseButtonDown)
      return;
   // --- Coordonnées de la souris
   POINT CursorPos;
   GetCursorPos(&CursorPos);

   // --- Déplacer la fenêtre de la valeur du déplacement de la souris
   int iX      = CursorPos.x - CursorPosDown.x;
   int iY      = CursorPos.y - CursorPosDown.y;
   int iWidth  = WindowSizeDown.right  - WindowSizeDown.left;
   int iHeight = WindowSizeDown.bottom - WindowSizeDown.top;

   MoveWindow(Handle, iX,iY,iWidth,iHeight,TRUE);
}

Merci encore pour ton aide
et bon Week-end

vendredi 28 mars 2008 à 15:57:16 | Re : Skins : form "polygonale" sans titre mais déplaçable quand même ?

jfrancois

Merci Steph et bon WE aussi !

Merci aussi à BruNews car sa solution est beaucoup plus simple (si on ne veut pas changer le curseur de la souris, mais c'est un détail).

Jean-François

vendredi 28 mars 2008 à 16:08:58 | Re : Skins : form "polygonale" sans titre mais déplaçable quand même ?

steph12358

Salut BruNews

bizarre ! j'ai voulu essayer aussi ta soluce
Dans l'événement MouseMove j'ai mis :

void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
   if (! bIsLeftMouseButtonDown)
      return;

   ReleaseCapture;
   SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}


En debug c'est bien exécuté mais ça ne déplace pas la fenêtre. Pourtant j'ai retrouvé cette syntaxe dans plusieurs forums depuis...j'ai du louper qque chose

A+

vendredi 28 mars 2008 à 16:20:23 | Re : Skins : form "polygonale" sans titre mais déplaçable quand même ?

BruNews

Administrateur CodeS-SourceS
if (! bIsLeftMouseButtonDown)  return;
ReleaseCapture;

C'est quoi ces 2 lignes ?

Sur du direct API, ça fonctionne nickel sans risque de perfre le mouvement du curseur.

ciao...
BruNews, MVP VC++
vendredi 28 mars 2008 à 16:20:57 | Re : Skins : form "polygonale" sans titre mais déplaçable quand même ?

jfrancois

Il faut peut-être éviter de mélanger les 2 solutions (if (! bIsLeftMouseButtonDown) return;) ?
J'ai testé la solution de BruNews sur un programme et ça marche très bien.


Jean-François

lundi 31 mars 2008 à 09:45:48 | Re : Skins : form "polygonale" sans titre mais déplaçable quand même ?

steph12358

Salut

Bon ben ... pour la soluce de brunews je verrai plus tard
En attendant pour ceux que ça peut intéresser :

En adaptant le code de jfrancois pour utiliser les événements d'une form ça donne :

dans le .cpp :
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
   bIsLeftMouseButtonDown = false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
   DeleteObject(mRegion);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
   bIsLeftMouseButtonDown = false;

   contours[0] = Point(0,0);
   contours[1] = Point(320,0);
   contours[2] = Point(160,200);
   BorderStyle = bsNone;
   try
   {
      mRegion = CreatePolygonRgn(contours, 3, WINDING);
      assert(mRegion!=0);
      SetWindowRgn(Handle, mRegion, true);
   }
   catch (Exception * ev)
   {
      Application->MessageBox("Lézard !","Erreur", MB_OK);
   }
   HCURSOR hCursorPrev = NULL;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
   if (Button != mbLeft)
      return;
   GetWindowRect(Handle,&WindowSizeDown);
   // --- Position de la souris au clic initial
   GetCursorPos(&CursorPosDown);
   // --- Changement de repère
   CursorPosDown = ScreenToClient(CursorPosDown);
   bIsLeftMouseButtonDown = true;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
   if (! bIsLeftMouseButtonDown)
      return;
   POINT CursorPos;
   GetCursorPos(&CursorPos);
   // --- Déplacer la fenêtre de la valeur du déplacement de la souris
   int iX;
   int iY;
   int iWidth;
   int iHeight;
   iX  = CursorPos.x - CursorPosDown.x;
   iY  = CursorPos.y - CursorPosDown.y;
   iWidth = WindowSizeDown.right  - WindowSizeDown.left;
   iHeight = WindowSizeDown.bottom - WindowSizeDown.top;
   MoveWindow(Handle, iX,iY, iWidth, iHeight, TRUE);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
   bIsLeftMouseButtonDown = false;
}
//---------------------------------------------------------------------------

et dans le .h :

   bool    bIsLeftMouseButtonDown;
   RECT    WindowSizeDown;
   POINT   CursorPosDown;
   HCURSOR hCursorPrev;

C'est plus long à taper, certes, mais ça marche trés bien alors...
Merci encore pour votre aide à tous les deux.

Bonne semaine
A+
mercredi 2 avril 2008 à 10:34:23 | Re : Skins : form "polygonale" sans titre mais déplaçable quand même ?

jfrancois

Petite relance !!!

Je viens de constater qu'il y a encore plus simple pour déplacer une fenêtre en cliquant dans la zone client (et à condition de ne pas vouloir changer le curseur de la souris) :

      case WM_NCHITTEST :
      return HTCAPTION;

Jean-François



Cette discussion est classée dans : titre, fenêtre, contours, polygonale, maregion


Répondre à ce message

Sujets en rapport avec ce message

Changer titre Fenetre [ par by_rabbit_08 ] Bonjour!! Comment est-ce que l'on peut changer le titre de notre fenêtre en cours d'application? Ma fenêtre est généré par CreateWindowsEx(); Merci d' Problème d'affichage d'une barre de titre [ par rachid12450 ] Voilà , j'ai une application qui affiche une fenêtre avec une barrre de titre j'ai remarqué que quand j'essai de redimensionner la fenêtre de cette ap [Win32] Détection de changement de titre d'une fenêtre [ par buno ] Hello z'à tous!Pour faire le lien entre ma dernière question et ma <a href="http://www.cppfrance.com/codes/RECUPERATION-URL-COURANTE-DANS-INTERNET-EXP Récupérer le titre d'une fenêtre [ par Ajakaty ] Bonjour!! Je vous écris car je me trouve devant un problème que je n'arrive pas à résoudre... En fait je veux récupérer le titre d'une fenêtre q Du 3D dans une fenêtre Windows [ par Tibabou ] Bonjour/soir,J'aimerais savoir comment insérer dans une fenêtre windows toute simple une zone de "dessin": un cadre avec du 3D dedans en fait. (c'est Enlever la barre système d'une fenêtre fille MDI sous windows [ par MeRiX ] Si quelqu'un savait comment faire pour ne pas faire apparaître la barre système d'une fenêtre fille MDI sous windows... Il serait aimable de laisser u Contrôles invisibles sans redimensionnement de la fenêtre [ par Tibabou ] Bonjour/soir,   Je rencontre un problème très étrange: j'ai sur ma fenêtre 2 contrôles avec du 3D dedans (OpenGL) et en dessous un bouton tout bête.Au detection d'un messageBox et fermeture automatique [ par elroulianito ] J'aimerai utiliser une fonction issue d'une dll. Le problème est qu'à l'execution de celle-ci une fenêtre de type messagebox apparait m'invitant à cli Choosepixelformat & Setpixelformat [ par mondrone ] Voila, je developpe actuellement sur dev-c++, et l'utilisation de ces deux fonctions me renvoie une erreur de linkage. Je voudrais donc savoir ce qui Boite de [ par aabhanane ] Bonjour à tous, je travilles sous VC++, j'ai crée une boite de dialogue principale pour mon application. Quand je clique sur un boutton de ma boite de


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,997 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales