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.
- Comment utiliser les fonctions de l'api ayant une structure en paramètre plutôt qu'un pointeur ?
- Comment régler la transparence d'une fenêtre ?
- Comment faire pour que ma fenêtre soit toujours au premier plan ?
- Comment désactiver le bouton de fermeture d'une fenêtre ?
- Comment tester si l'option du compilateur 'Activer le support des thèmes XP' est activée ?
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. |
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) |
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 |
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 |
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 |
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 |
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 çaLes 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.