IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

FAQ PureBasicConsultez toutes les FAQ

Nombre d'auteurs : 7, nombre de questions : 68, dernière mise à jour : 3 janvier 2013  Ajouter une question

 

Bienvenue dans la F.A.Q. PureBasic !

Celle-ci va tenter de répondre aux questions les plus fréquemment posées sur le langage PureBasic et tous ses outils de programmation. Si elle n'a pas pour vocation de répondre à toutes les interrogations possibles, elle reste une bonne base de connaissances sur le PureBasic, et ne demande qu'à être enrichie par vos expériences personnelles.

Bien entendu, malgré toute l'attention qui a pu être portée à cette F.A.Q., des erreurs ont toujours pu s'y glisser. Prenez donc toutes les précautions qui s'imposent avant d'essayer un exemple.

Nous vous souhaitons une bonne lecture ! Et n'oubliez pas qu'en cas de problème, vous pourrez toujours poser votre question sur le forum PureBasic !

L'équipe PureBasic de Developpez.

SommaireWindows (5)
précédent sommaire suivant
 

Le langage C permet de copier une petite structure directement en paramètre d'une fonction.
Et quelques rares fonctions de l'API windows utilisent cette possibilité plutôt que le passage des données par pointeur.
Prenons l'exemple de la fonction WindowFromPoint, la documentation microsoft indique :

Code purebasic : Sélectionner tout
1
2
3
4
5
6
7
8
 
HWND WindowFromPoint( POINT Point 
); 
 
Parameters 
 
Point 
[in] Specifies a POINT structure that defines the point to be checked.
PureBasic ne permet pas de copier une structure, aussi la déclaration de cette fonction jusqu'à la version 4.20 était :
WindowFromPoint_(x,y)
Sur un système x86, les paramètres sont placés dans la pile exactement comme s'il s'agissait d'un quad, ou notre fameuse structure POINT vu précédemment.
Cette astuce ne peut plus être employée sur un système x64 car les premiers octets sont placés dans un registre et non dans la pile.
C'est pourquoi à partir de la version 4.30 qui comporte une version x86 et x64, l'équipe PureBasic n'a pas eu d'autre choix que de conserver la déclaration avec un seul paramètre (un quad) en guise de structure POINT.
Maintenant comment fait-on ? vous avez deux possibilités :

Code purebasic : Sélectionner tout
1
2
3
 
GetCursorPos_(@point.POINT) 
Handle = WindowFromPoint_(Point\X | (Point\Y << 32))
Code purebasic : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
 
Structure QuadPoint 
  StructureUnion 
    Q.q 
    P.Point 
  EndStructureUnion 
EndStructure 
 
GetCursorPos_(@Point.QuadPoint) 
WindowFromPoint_(Point\Q) 
DisplayPopupMenu(0, WindowID(0), Point\P\X, Point\P\Y)

Mis à jour le 2 janvier 2009 comtois

Ce code fonctionne sous Windows 2000 et supérieur. Il utilise l'API Windows.

Code purebasic : Sélectionner tout
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
 
Global Alpha.l = 50 
 
If OpenWindow(0, 100, 200, 200, 200, "Transparence fenêtre") 
  ; Crée la liste de gadgets 
  ButtonGadget(0, 0, 0, 100, 100, "Appliquer la transparence à la fenêtre",#PB_Button_MultiLine)   
  ButtonGadget(1, 100, 100, 100, 100, "Changer la valeur de la transparence",#PB_Button_MultiLine) 
 
  Repeat 
    EventID = WaitWindowEvent() 
 
    If EventID = #PB_Event_CloseWindow 
      Quit = 1 
    EndIf 
    If EventID = #PB_Event_Gadget 
      GadgetID = EventGadget() 
      If GadgetID = 0 
        SetWindowLong_(WindowID(0), #GWL_EXSTYLE, #WS_EX_LAYERED) 
        SetLayeredWindowAttributes_(WindowID(0), 0, 255 * Alpha / 100, #LWA_ALPHA)  
      EndIf 
      If GadgetID = 1 
        Alpha = Val(InputRequester("Transparence", "Valeur en % (entre 0 et 100)", "50")) 
      EndIf 
    EndIf 
 
  Until Quit = 1 
   
EndIf

Mis à jour le 14 février 2008 Progi1984

La technique utilisée est l'utilisation d'une fonction fournie par PureBasic StickyWindow(). Le premier argument est l'identifiant de la fenêtre. Le second active ou désactive la mise au premier plan.

Code purebasic : Sélectionner tout
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
 
If OpenWindow(0, 100, 200, 200, 200, "Fenêtre au premier plan", #PB_Window_SystemMenu) 
  ; Crée la liste de gadgets 
  ButtonGadget(0, 0, 0, 100, 100, "Activer")   
  ButtonGadget(1, 100, 100, 100, 100, "Désactiver") 
 
  Repeat 
    EventID = WaitWindowEvent() 
 
    If EventID = #PB_Event_CloseWindow 
      Quit = 1 
     
    ElseIf EventID = #PB_Event_Gadget 
      GadgetID = EventGadget() 
       
      If GadgetID = 0 
        StickyWindow(0, #True) 
        SetWindowTitle(0, "Premier plan activé")  
       
      ElseIf GadgetID = 1 
        StickyWindow(0, #False) 
        SetWindowTitle(0, "Premier plan désactivé")  
       
      EndIf 
 
    EndIf 
 
  Until Quit = 1 
   
EndIf

Mis à jour le 14 février 2008 Progi1984

Dans ce cas, il faut utiliser l'API Windows.
Utilisez la touche [Echap] pour quitter le programme.

Code purebasic : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
If OpenWindow(0, 100, 200, 300, 200, "Désactive le bouton de fermeture",#PB_Window_SystemMenu) 
 
  ; Retourne l'identifiant du menu système 
  hSysMenu = GetSystemMenu_(WindowID(0), #False) 
  ; Efface un élément du menu 
  RemoveMenu_(hSysMenu, #SC_CLOSE, #MF_BYCOMMAND) 
  ;Mise à jour du menu 
  DrawMenuBar_(WindowID(0)) 
     
  Repeat 
    EventID = WaitWindowEvent() 
 
    If GetAsyncKeyState_(#VK_ESCAPE) 
      Quit = 1 
    EndIf 
 
  Until Quit = 1 
   
EndIf

Mis à jour le 14 février 2008 Progi1984

En principe il suffit de vérifier dans les options du compilateur si la case est cochée, mais j'ai trouvé ce code intéressant.

Code purebasic : Sélectionner tout
1
2
3
4
5
6
7
 
LibraryID = OpenLibrary(#PB_Any, ProgramFilename()) 
 
If FindResource_(LibraryID(LibraryID), 1, #RT_MANIFEST) = 0 
  MessageRequester("Switch gadget's XP style", "It makes only sense to test this example with XP skin enabled!" + #CR$ + "Please enable XP skin in 'Compiler/Compiler Options...'" + #CR$ + "and restart this program!", #MB_ICONEXCLAMATION) 
  End 
EndIf

Mis à jour le 8 décembre 2008

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.