Introduction

PureBasic est un langage de programmation de "haut niveau" basé sur les règles du langage BASIC. Il est identique à tout autre compilateur BASIC que vous auriez pu déjà utiliser, sur PC ou Amiga. PureBasic a été créé pour être aussi accessible au débutant qu'à l'expert, il est donc très facile à apprendre. La compilation est très rapide, presque instantanée. Nous avons consacré beaucoup de temps et d'efforts pour vous proposer un langage rapide, fiable et convivial.

La syntaxe de PureBasic est simple, mais ses possibilités sont infinies grâce à certaines caractéristiques évoluées comme, entre autres, les pointeurs, structures, procédures, listes dynamiques, etc. Le programmeur expérimenté n'aura aucune difficulté à accéder aux structures du système d'exploitation et aux API's.

PureBasic est un langage portable qui fonctionne actuellement sur AmigaOS (680x0 et PowerPC) et sur les ordinateurs PC dotés du système d'exploitation Windows ou Linux. Cela signifie qu'un même programme peut être compilé sur chacune de ces machines et en exploiter toute la puissance. PureBasic est un compilateur. Il n'utilise donc pas de code intermédiaire ou de machine virtuelle, mais produit un code optimisé directement exécutable par la machine ou le système d'exploitation sur lequel il est compilé. Les bibliothèques externes sont écrites et optimisées manuellement en assembleur. Les commandes sont donc très rapides, souvent plus rapides que leurs équivalentes écrites en langage C/C++.

Caractéristiques techniques

- Supporte nativement les microprocesseurs x86, x64, 680x0 and PowerPC
- Définitions intégrées de tableaux, listes dynamiques, structures complexes, pointeurs et variables
- Types supportés : Byte (8-bit), Word (16-bit), Long (32-bit), Quad (64-bit), Flottant (32 et 64-bit) et Caractere (8 ou 16-bit)
- Types définis par l'utilisateur (structures)
- Définition intégrée des chaines de caractères avec de nombreuses fonctions dédiées, y compris en mode unicode
- Puissant support des macros
- Support des constantes et valeurs octales et hexadécimales
- Réducteur d'expression (regroupement des constantes et valeurs explicites)
- Calcul arithmétique standard avec respect de la priorité des opérateurs et parenthèses : +, -, /, *, and, or, lsl, asl, lsr, asr
- Compilation très rapide
- Support des procédures pour une programmation structurée avec variables globales et locales
- Supporte tous les mots-clé évolués du langage Basic : If-Else-EndIf, Repeat-Until, For-Next, etc.
- Support de bibliothèques externes pour la manipulation d'objets Windows : Images, fenêtres, composants graphiques, DirectX, etc.
- Les bibliothèques externes sont également toutes écrites en langage assembleur optimisé pour plus de rapidité et de compacité
- Les API's de Windows, AmigaOS et Linux sont toutes supportées et considérées comme des mots-clé du BASIC
- Langage assembleur intégré permettant d'insérer toute commande ou routine assembleur dans le corps du programme Basic
- Constantes et structures précompilées pour une compilation encore plus rapide
- Débogueur intégré pour suivre l'exécution d'un programme et corriger les erreurs plus facilement
- Options de conpilation configurables
- Editeur dédié avec syntaxe automatiquement surlignée
- Système convivial, facile à installer, à comprendre et utiliser
- Entièrement en francais

Système nécessaire

- Windows 9x/ME, Windows NT/2000/XP, Windows Vista/7/8, AmigaOS 3.1+, Linux x86 ou MacOS X.
- DirectX 7 ou ultérieur pour les graphismes mais la plupart des fonctions 3D nécessite DirectX9.0c.
- Pas d'autres caractéristiques particulières

Informations complémentaires

PureBasic est conçu aussi bien pour les débutants que pour les programmeurs avertis. Nous allons préciser ici quelques caractéristiques importantes qui font de PureBasic un langage très puissant et unique. La première : PureBasic utilise des bibliothèques externes "tierces" très souples d'emploi. Un programme PureBasic peut faire appel à un nombre illimité de bibliothèques. De nombreuses bibliothèques sont fournies avec la version de base de PureBasic. Seules les portions utiles de bibliothèques utilisées sont incorporées dans le logiciel exécutable final, afin d'obtenir une taille aussi réduite que possible. Elles permettent de gérer les fenêtres, le son, les interfaces graphiques, les sprites, les palettes de couleurs, OpenGL, etc. Ces bibliothèques, écrites en assembleur, le langage le plus rapide, ont un niveau de performance équivalent au langage PureBasic.

Note: Tout utilisateur de PureBasic peut créer ses propres bibliothèques. Les outils nécessaires sont fournis avec la version complète. Dans la version PC de PureBasic, les bibliothèques peuvent être écrites en langage C ou assembleur.

Le système de structures et pointeurs permet au programmeur avancé d'accéder simplement aux composants du système d'exploitation par le biais de commandes Basic classiques. Toutes les fonctions Windows sont regroupées dans un (grand) fichier contenant toutes les constantes et structures nécessaires. Des fichiers 'include' sont également fournis. Ils peuvent être facilement corrigés en cas d'erreur. Un utilitaire est également fourni pour vous aider à convertir les fichiers include C ou C++ et vous faire gagner beaucoup de temps et d'efforts.

Les inconditionnels de l'assembleur (nous en faisons partie! :-)) pourront compiler leurs programmes PureBasic tout en obtenant le fichier source complet en assembleur commenté du programme compilé, directement recompilable avec l'assembleur Fasm. Il n'a jamais été aussi simple d'optimiser et de garder un contrôle complet du code généré par un compilateur Basic.

PureBasic a lui-même été programmé avec un grand souci de modularité. Pour cette raison, il peut supporter tout type de microprocesseur et de système d'exploitation. C'est pour cette raison qu'il fonctionne actuellement sur deux types d'ordinateurs très différents : l'Amiga et le PC.


Licence et Conditions

Ce programme est proposé sans aucunes garanties. Fantaisie Software ne peut en aucun cas être tenu responsable des dégâts occasionnés par PureBasic. Vous utilisez ce logiciel à vos risques et périls.

La version de démonstration de PureBasic peut être distribuée librement tant que le contenu de l'archive reste intacte. Il n'est permis de modifier, changer l'organisation de l'archive sans la permission écrite de Fantaisie Software.

La version complète de PureBasic ne doit en aucun cas être cédée à une personne autre que l'acheteur du logiciel.

Fantaisie Software détient tous les droits sur PureBasic et ses composants. Aucun module ne peut être utilisé dans une autre application sans l'autorisation de Fantaisie Software. Il est interdit d'encapsuler ou d'utiliser directement les commandes de haut niveau de PureBasic dans un autre langage de programmation que ce soit sous forme de bibliothèques dynamiques (DLL) ou statiques. Cette règle ne s'applique pas pour les utilisateurs possédant une licence de PureBasic.

PureBasic utilise le moteur 3D OpenSource OGRE et sa licence peut être consultée ici.
Les sources modifiées spécialement pour PureBasic du moteur 3D OGRE peuvent être téléchargées à l'adresse suivante: http://www.purebasic.com/OgreSources.zip.

PureBasic utilise la bibliothèque OnError, écrite et (c) 2003 par Siegfried Rings et Sebastian Lackner.

PureBasic utilise le composant d'édition Scintilla et sa licence peut être consultée ici.

La bibliothèque XML utilise le parseur XML expat et sa licence peut être consultée ici.

La bibliothèque RegularExpression utilise PCRE. et sa license peut être consultée ici.


Configuration système requise

PureBasic fonctionne sur n'importe quel système Windows (Windows 95/98/Me, Windows NT/2000 et Windows XP/Vista/7/8), AmigaOS (3.0 ou ultérieur), Linux (noyau 2.2 ou ultérieur) et MacOS X (10.2 (Jaguar) ou ultérieur).

Si vous rencontrez un problème sur l'une des configurations ci-dessus, n'hésitez pas à nous en informer.

Windows

Afin d'utiliser les nombreuses fonctions graphiques 3D ainsi que les Sprites, il est nécessaire d'utiliser la version 9.0c de DirectX. Windows Vista et les versions ultérieures de Windows contiennent déjà cette version de DirectX, mais pour les versions antérieures de Windows, il faudra procéder à une installation manuelle.

Vous pouvez la télécharger et l'installer via le "DirectX End-User Runtime Web Installer" ici: http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=35.

Linux

Paquets nécessaires pour utiliser PureBasic sous Linux:

- sdl 1.2 devel (pour les commandes multimédias)
- gtk 1.2+ devel or/and gtk 2+ (Pour les programmes GUI)
- libstdc++ devel
- gcc correctement installé

- iodbc et iodbc-devel doivent être installés pour utiliser les commandes Database (voir www.iodbc.org)

- libgtkembedmoz.so doit être installé pour utiliser WebGadget() (fourni avec le paquet Mozilla/Firefox).

- xine et xine-devel pour les commandes Movie
PureBasic a été testé avec succès sur les configurations suivantes (cela ne veut pas dire qu'il ne fonctionne que sur celles-ci):

- Redhat 7.0, 7.2, 7.3, 8.0 et 9.0
- Mandrake 6.1, 8.0, 10.0 et 10.1
- Suse 7.3, 8.0, 9.0, 10.2
- Debian
- Ubuntu

MacOS X

Les outils de développement Apple (Apple Developer Tools) doivent être installés avant de pouvoir utiliser PureBasic. Ils sont fournis sur les CDs (ou DVD) d'installation de MacOS X ou disponible sur le site web d'Apple: http://developer.apple.com/

Pensez à utiliser la dernière version des différents outils (par exemple XCode), adaptée à la bonne version de votre OS !


Installation

Pour installer PureBasic, cliquez sur l'icône d'installation et suivez les instructions. Cliquez ensuite sur l'icône PureBasic qui se trouve dans le menu démarrer ou sur le bureau.

Pour utiliser le compilateur en ligne de commande, il est conseillé de rajouter le répertoire "compilers\" de l'installation PureBasic à la variable d'environnement 'PATH'. Ainsi la commande 'pbcompiler' sera accessible à partir de n'importe quelle console.

Note: Pour éviter les conflits avec une ancienne version, installez toujours une nouvelle version de PureBasic dans un nouveau répertoire .


Débuter avec l'IDE

L'IDE PureBasic est un environnement complet qui permet la création et l'édition de fichiers sources, leur compilation, débogage ainsi que la création de l'exécutable final. Il sert d'interface au compilateur ainsi qu'au débogueur.

La fenêtre principale de l'IDE se divise en 3 parties:

La zone d'édition du code (en dessous de la barre d'outils)
Tous les codes sources sont affichés ici. Il est possible de passer de l'un vers l'autre à l'aide des onglets situés entre la barre d'outils et la zone d'édition.

La palette d'outils (par défaut située à droite de la zone d'édition)
La palette contient plusieurs outils rendant la programmation plus facile et plus productive. Les outils affichés ici peuvent être configurés, déplacés ou même enlevés si besoin est. Voir Configurer l'IDE pour plus de renseignements.

Le rapport d'activité (situé en dessous de la zone d'édition)
Les erreurs de compilation ainsi que les messages d'erreur du débogueur seront affichés dans cette partie. Il peut être visible ou caché séparément pour chaque fichier.

Le reste de l'interface se compose du menu principal et de la barre d'outils. Cette dernière est simplement un raccourci des fonctions disponibles dans le menu et peut être complètement paramétrée (chaque fonction du menu peut être enlevée, déplacée ou ajoutée à la barre d'outils). Pour savoir ce que fait un bouton, il suffit de laisser le pointeur de la souris dessus un court instant et une aide apparaîtra (et affichera la fonction du menu correspondante). Les commandes du menu sont expliquées dans une autre section.


Gestion des fichiers

Le menu "Fichier" permet de réaliser les opérations de base tel que l'ouverture ou l'enregistrement des fichiers.

Il est possible d'éditer plusieurs codes sources simultanément, et de passer de l'un à l'autre grâce aux onglets situés sous la barre d'outils. Par défaut, les raccourcis claviers Ctrl+Tab et Ctrl+Shift+Tab permettent de passer au fichier suivant (ou précédent).

Contenu du menu "Fichier"

Nouveau
Créé un nouveau code source vide.

Ouvrir
Ouvre un code source existant pour l'éditer.

Les fichiers de type 'texte' seront tous chargés dans la zone d'édition. Il est aussi possible d'ouvrir des fichiers binaires et dans ce cas ils seront ouverts par le visualisateur de fichier interne.

Enregistrer
Enregistre le source en cours d'édition sur le disque. Si il n'a pas encore été enregistré, son nom et son emplacement devra être défini à l'aide de la fenêtre de dialogue, sinon le code sera enregistré dans le fichier précédent.

Enregistrer sous
Enregistre le code source en cours d'édition à un emplacement différent. Une boîte de dialogue demandant le nom du nouveau fichier sera affichée. L'ancien code source restera inchangé.

Enregistrer tout
Enregistre tous les codes source ouverts.

Recharger
Recharge le fichier courant à partir du disque. Cela annulera tous les changements non sauvegardés.

Fermer
Ferme le code source en cours d'édition. Si c'était le dernier fichier, l'IDE affichera un nouveau fichier vide.

Fermer tout
Ferme tous les codes source en cours d'édition. L'IDE affichera un nouveau fichier vide.

Voir changements
Affiche les modifications qui ont été apportées au code source de courant par rapport à la version qui existe sur le disque dur.

Format du fichier
Dans ce sous-menu, il est possible de sélectionner le format d'encodage ainsi que les terminaisons de lignes du fichier courant. L'IDE supporte les fichiers textes ASCII ou UTF-8. Les terminaisons de ligne supportées sont: Windows (CRLF), Linux/Unix (LF) et MacOSX (CR). Les paramètres par défaut appliqué lors de la création d'un nouveau fichier peuvent être changés dans les préférences de l'IDE. Trier les sources
Quand plusieurs fichiers sont ouvert en même temps, ils sont affichés dans les onglets situés en dessous de la barre d'outils. Cette fonction permet de changer l'ordre dans lequel les codes sources sont affichés sans les fermer puis les ré-ouvrir. L'ordre des onglets peut aussi être directement changé en utilisant le glisser/déposer sur l'onglet.

Préférences
Cette fenêtre permet de contrôler le look et le comportement de l'IDE pour qu'il s'adapte aux besoins de chacun. Pour une description détaillée des fonctions disponibles, voir Configurer l'IDE.

Session History (Historique)
Cette fenêtre affiche la liste des fichiers ainsi que leur contenu, qui ont été ouverts lors des différentes sessions au cours du temps.

Fichiers récents
Le sous-menu affiche la liste des dix derniers fichiers ouverts. Sélectionner un fichier dans le sous-menu l'ouvrira à nouveau.

Quitter
Cela permet bien entendu de quitter l'IDE. Si un ou plusieurs fichiers ne sont pas enregistrés, une confirmation pour chacun des fichiers sera demandée.


Edition du code

L'IDE du PureBasic se comporte comme un éditeur de texte classique en ce qui concerne la saisie de texte. Les touches de curseur, Page précédente, Page suivante, Début et Fin permettent de se déplacer dans le code. Ctrl+Début se rend au début du code et Ctrl+Fin se déplace à la fin.

Les raccourcis par défaut Ctrl+C (copier), Ctrl+X (couper) et Ctrl+V (coller) servent à l'édition. La touche Insérer change le mode d'édition pour déterminer si le texte doit etre remplacé ou ajouté (le mode par défaut est l'ajout). La touche Supprimer supprime une lettre à droite du curseur. Maintenir la touche Shift appuyée et utiliser les flèches permet de sélectionner du texte.

Au delà des fonctions de base, l'IDE a de nombreuses fonctionnalités dédiées à la programmation PureBasic.

Indentation

Quand un retour à ligne est effectué, l'indentation (nombre d'espaces/tabulations en début de ligne) de la ligne courante et de la ligne suivante sera calculée automatiquement en fonction du mot-clé qui est présent sur la ligne. Un mode "block" est aussi disponible. Dans ce cas, la nouvelle ligne aura la même indentation que la ligne courante. Tout ceci est paramètrable dans les preférences.

Caractères de tabulation

Par défaut, l'IDE n'insère pas une vraie tabulation quand la touche Tab est utilisée. En cas d'échange de source, ceci permet d'éviter les problèmes d'affichage inhérents aux normes de tabulation utilisées.

A la place, deux caractères espaces sont insérés. Ce comportement peut être modifié dans les préférences de l'IDE (voir Configurer l'IDE).

Comportement particulier de la touche Tab

Quand la touche Tab est utilisée alors que la sélection est vide ou ne contient que quelques caractères, elle agit comme décrit ci-dessus (insertion d'un nombre d'espaces, ou d'une vraie tabulation selon le réglage défini dans les préférences de l'IDE).

Quand la touche Tab est utilisée alors qu'une ou plusieurs lignes complètes sont sélectionnées, des espaces (ou des tabulations, en fonction de la configuration) sont insérés au début de chaque ligne. Cela permet d'indenter rapidement des blocs complets de code.

Quand la combinaison de touches Shift+Tab est utilisée alors que plusieurs lignes sont sélectionnées, les espaces/tabulations au début de chaque ligne sont supprimés afin de réduire l'indentation du bloc complet.

Double-cliquer sur un mot

En principe, double-cliquer sur un mot le sélectionne. Néanmoins, dans quelques cas, le comportement est différent:

Maintenir la touche Ctrl appuyée et double-cliquer sur le nom d'une procédure , définie dans le même fichier, permet de se rendre directement à sa déclaration.

Double-cliquer sur un mot-clé IncludeFile ou XincludeFile ouvrira le fichier dans l'IDE (le nom du fichier doit être spécifié en entier, sans utiliser de constante par exemple).

De la même manière, double-cliquer sur le mot-clé IncludeBinary aura pour effet d'ouvrir le fichier dans le visualisateur de fichier intégré à l'IDE.

Marqueur de parenthèse et de mots-clés:

Quand le curseur est sur une parenthèse ouvrante ou fermante, l'IDE mettra en surbrillance l'autre parenthèse qui lui correspond. Si aucune parenthèse ne correspond (ce qui est une erreur de syntaxe en PureBasic), l'IDE affichera la parenthèse en rouge. Le même concept est appliqué aux mots-clés. Si le curseur est sur un mot-clé comme "If", l'IDE soulignera ce mot-clé et tous les autres mots-clés qui lui correspond, comme "Else", "ElseIf" ou "EndIf". Si il manque des mots-clés, il sera souligné en rouge. Le menu "Aller au mot-clé correspondant" décrit ci-dessous peut être utilisé pour aller rapidement d'un mot-clé à l'autre.

Le marqueur de parenthèse et de mots-clés est configurable dans les préférences.

Aide syntaxique dans la barre d'état

L'IDE affichera les paramètres nécessaires pour chaque fonction PureBasic qui est en cours de frappe. Cela rend plus facile la saisie, en montrant les paramètres qui sont indispensables. Cela fonctionne aussi pour les procédures, prototypes, interfaces ou fonctions importées si elle sont déclarées dans le même fichier source, our dans le même projet.

Options de pliage

Quand un mot-clé de pliage est rencontré (Procedure / EndProcedure par défaut, d'autres peuvent être ajoutés) l'IDE marque la région délimitée par ces deux mots-clés par un [-] sur la ligne du premier mot et une ligne verticale jusqu'à la fin du bloc.

En cliquant sur le [-], il est possible de cacher (replier) le contenu du bloc pour garder une meilleure vue d'ensemble sur les codes sources conséquents. Le [-] se transformera alors en [+]. En cliquant de nouveau dessus, le code sera de nouveau affiché (déplié).

Note: Même si l'état des blocs est préservé lors de l'enregistrement du fichier, le fichier lui-même contient bien sûr toutes les lignes de codes. Cette option affecte seulement l'affichage du code source, pas son contenu.

Deux autres délimiteurs de replis sont activés par défaut: ";{" et ";}". Comme ";" marque le début d'un commentaire en PureBasic, ils seront ignorés par le compilateur. Néanmoins, ils permettent de placer des délimiteurs à des endroits arbitraires qui ne correspond pas forcément à un mot-clé PureBasic.

Auto-complétion

Pour ne pas avoir à se souvenir de tous les noms des commandes PureBasic, il y a l'auto-complétion qui peut rendre bien des services.

Après avoir tapé le début du nom de la commande, une liste des commandes possibles qui débute par ce mot s'affichera. Une liste de choix est aussi affichée après avoir tapé "\" sur une variable liée à une structure ou une interface.

Une fois le mot sélectionné à l'aide des flèches il peut être inséré dans le code source en appuyant sur la touche Tab. Il est aussi possible de continuer à taper les lettres pendant que la liste est affichée, pour réduire le choix. Si plus aucune proposition n'est disponible, alors la boîte se fermera automatiquement.

La touche Echappement permet de fermer la liste à tout moment. La liste se ferme aussi automatiquement si un bouton souris est utilisé dans l'IDE.

Note: Pour configurer le contenu qui sera affiché dans la liste d'auto-complétion, ainsi que ses nombreuses fonctionnalités, voir Configurer l'IDE. Par exemple, il est possible de désactiver l'apparition automatique de la liste (Ctrl+Espace sera alors necessaire pour l'afficher).

Panneau d'outils

La plupart des outils qui rendent la navigation et l'édition de code sources plus aisées peuvent être ajoutés au panneau d'outils situé sur le côté de la zone d'édition. Pour avoir un aperçu des outils disponibles et pour les configurer, voir Les outils intégrés.

Le menu édition

Les rubriques suivantes expliquent les commandes disponibles dans le menu édition. A noter que bon nombre de ces commandes sont aussi présentes dans le menu contextuel de la zone d'édition.

Annuler
Annule la dernière action effectuée dans la zone d'édition. Il est possible d'annuler plusieurs actions à la suite.

Rétablir
Refait la dernière action annulée par la commande "Annuler".

Couper
Copie le texte sélectionné dans le presse-papier et le supprime du code.

Copier
Copie le texte sélectionné dans le presse-papier.

Coller
Insère le contenu du presse-papier dans le code, à la position du curseur. Si une partie du code était sélectionnée, elle sera alors remplacée par le contenu du presse-papier.

Insérer commentaires
Insère un commentaire (";") au début de chaque ligne sélectionnée. Cela permet de commenter rapidement un nombre conséquent de lignes.

Supprimer commentaires
Enlève le commentaire (";") du début de chaque ligne sélectionnée. Cela permet de dé-commenter rapidement un nombre conséquent de lignes. C'est la fonction inverse de "Insérer commentaire", mais elle fonctionne aussi sur des commentaires entrés manuellement.

Format et indentation
Reformate le code source sélectionné pour aligner le code en fonction des règles définie dans les préférences.

Sélectionner tout
Sélectionne le code source en entier.

Aller à
Permet de se rendre directement à une ligne donnée.

Aller au mot-clé correspondant
Si le curseur est actuellement sur un mot-clé comme "If", le curseur ira directement sur le mot-clé correspondant (dans ce cas "EndIf").

Ligne récente
L'IDE garde une trace des lignes qui sont visualisées. Par exemple, si la position du curseur est changée par la commande "Aller à" ou en cliquant sur l'outil Navigateur de procédures, cette fonction permet de revenir rapidement à la ligne précédente. L'IDE retient 20 positions différentes.

A noter que l'enregistrement ne se fait que si le déplacement est conséquent (ex: pas si les touches haut/bas sont utilisées).

Changer le pliage courant
Change l'état du point de repli associé à la ligne courante (le déplier ou le replier le cas échéant).

Plier/Déplier tout
Change l'état de tous les points de replis dans le code source, très utile pour cacher toutes les procédures d'un code source (ou pour ré-afficher le code complet en une seule fois).

Ajouter/Supprimer un marqueur
Cette commande permet d'ajouter un marqueur sur la ligne courante (ou de le retirer si il y en avait déjà un). Un marqueur permet de retrouver rapidement une ligne de code. Il est identifié par une petite flèche horizontale (verte, par défaut) à côté de la ligne concernée. Il est possible de passer de marqueur en marqueur en utilisant la commande "Marqueur suivant".

Note: Pour ajouter/retirer un marqueur à l'aide de la souris, il faut maintenir la touche Ctrl appuyée pendant le clic sur la bordure qui affiche les marqueurs (la colonne de numérotation des lignes n'est pas prise en compte).

Aller au marqueur
Se rend au premier marqueur disponible, situé en dessous de la ligne en cours d'édition. Si il n'y a plus de marqueur en dessous de cette ligne, la recherche reprend au début du code source. En utilisant le raccourci "Marqueur suivant" (F2, par défaut) plusieurs fois, il est possible de parcourir tous les marqueurs du code très rapidement.

Effacer les marqueurs
Retire tous les marqueurs du code source en cours d'édition.

Rechercher/Remplacer

Cette fenêtre permet de rechercher un mot (ou une suite de mots) dans le code source et de les remplacer par d'autres mots si nécessaire.

Le bouton "Chercher suivant" démarre la recherche. La recherche peut continuer une fois un terme trouvé en utiliser la commande du menu "Rechercher à nouveau" (raccourci F3 par défaut).

Pour rendre la recherche plus pointue, les options suivantes sont disponibles:
Respecter la casse : Seul le texte qui est strictement identique au mot recherché sera retenu (les minuscules ne sont pas identiques aux majuscules).
Mots entiers seulement : Recherche seulement les termes qui forment un mot. Les termes qui contiennent le mot recherché ne seront pas retenus.
Ignorer les commentaires : Tous les commentaires PureBasic sont exclus de la recherche.
Ignorer les chaînes : Tous les contenus des strings (entre " ") sont ignorés.
Rechercher seulement dans la sélection: recherche seulement dans le texte sélectionné. C'est une option très utile quand elle est utilisée en conjonction avec la fonction "Remplacer tout". Dans ce cas, le remplacement ne s'opèrera uniquement que dans la sélection.

En activant la case à cocher "Remplacer par", la fonction remplacer devient disponible. "Chercher suivant" cherchera toujours l'occurrence suivante, et chaque clic sur le bouton "Remplacer" remplacera le texte trouvé par le contenu du champ "Remplacer par".

En cliquant sur "Remplacer tout", tous les termes correspondants à la recherche situés en dessous du curseur seront remplacés (sauf si l'option "Rechercher seulement dans la sélection" est activée).

Rechercher suivant
Continue la recherche correspondant à la dernière recherche entamée dans la fenêtre "Chercher/Remplacer".

Rechercher dans les fichiers

Cette fonction permet de rechercher parmi tous les fichiers d'un répertoire donné (et optionnellement dans ses sous-répertoires).

Il suffit de spécifier le mot (ou la séquence de mots) à rechercher ainsi que le répertoire de base (champ "Répertoire"). Il est possible d'indiquer des filtres pour inclure uniquement les fichiers voulus (ex: *.pb). Plusieurs filtres peuvent être spécifiés, en les séparant par une virgule "," (un filtre vide ou *.* recherche dans tous les fichiers). Des options similaires à la fenêtre "Rechercher/Remplacer" sont disponibles pour rendre la recherche plus pointue.

La case à cocher "Inclure les sous-répertoires" permet de rechercher dans tous les sous-répertoire (d'une manière récursive) du répertoire de base.

Quand la recherche débute, une fenêtre indépendante sera ouverte pour afficher les résultats de la recherche en indiquant le fichier, le numéro de la ligne ainsi que le contenu de la ligne.

En double-cliquant sur une des lignes, le fichier sera automatiquement ouvert dans l'IDE à la ligne concernée.


Gestion de projets

L'IDE contient des fonctionnalités avancées pour gérer de larges projets. Ces fonctionnalités sont complètement facultatives, les programmes peuvent être créés et compilés sans recourir à la création d'un projet. Cependant, dès qu'un programme atteint une certaine taille et qu'il se décompose en de nombreux fichiers, il sera probablement plus facile de le gérer au sein d'un projet.

Aperçu de la gestion de projets

Un projet regroupe tous les codes sources et les autres fichiers nécessaires au programme à un seul endroit, avec un accès rapide à tous les fichiers à l'aide de l'outil de projet. Les fichiers sources inclus dans le projet peuvent être scannés automatiquement pour l'auto-complétion même s'ils ne sont pas ouverts dans l'IDE. Donc les fonctions, constantes, variables etc. du projet entier peuvent être utilisés dans l'auto-complétion. Le projet enregistre aussi les fichiers ouverts lors sa fermeture, donc l'espace de travail sera retabli à l'identique lors de la réouverture du projet.

De plus, le projet regroupe toutes les options de compilation à un seul endroit (dans le fichier du projet) et permet même de créer plusieurs cibles de compilation par projet. Une cible de compilation est un ensemble d'options permettant de générer plusieurs programmes distincts, ou plusieurs versions différentes du même programme. Toutes les cibles peuvent être compilées en une seule étape, ce qui permet de gagner en productivité.

Pour compiler un projet à partir d'un script ou d'un makefile, l'IDE accepte une option en ligne de commande pour compiler un projet sans ouvrir d'interface. Voir la section Commutateurs de la ligne de commande pour plus de détails.

Tous les noms de fichiers et les chemins d'un projet sont stockés de manière relative à son fichier de configuration, donc il est facile de déplacer ou de partager un projet, tout en gardant la structure du répertoire intacte.

Le menu Projet

Nouveau projet
Crée un nouveau projet. Si un autre projet était déjà ouvert, il sera fermé. La fenêtre d'options sera ouverte où le nom du projet devra être saisi. La configuration du projet se fera à partir de cette fenêtre.

Ouvrir un projet
Ouvre un projet existant. Si un autre projet était déjà ouvert, il sera fermé. Les fichiers qui étaient déjà ouverts dans ce projet seront automatiquement ré-ouverts (si cette option est activée).

Projets récents
Ce sous-menu affiche la liste des projets les plus récemment ouverts.

Fermer le projet
Ferme le projet actuellement ouvert. La configuration du projet sera enregistrée et les fichiers ouverts associés au projets seront fermés (si cette option est activée).

Options du projet
Ouvre la fenêtre d'options propre au projet (voir ci-dessous pour plus d'informations)

Ajouter le fichier au projet
Ajoute le fichier courant dans le projet courant. Les fichiers qui appartiennent à un projet ont le symbole ">" devant leur nom dans les onglets.

Retirer le fichier du projet
Retire le fichier courant du projet courant.

Ouvrir le répertoire du projet
Ouvre le répertoire qui contient le fichier projet dans l'explorateur de fichier du système.

La fenêtre d'options du projet

La fenêtre d'options du projet est le centre de configuration du projet. Les paramètres relatifs au projet et aux fichiers gérés par le projet sont accessibles ici. Les paramètres suivants peuvent être modifiés dans l'onglet "Options du projet":

Nom de fichier du projet
Affiche le nom de fichier du projet. Il ne peut être défini seulement pendant la création du projet.

Nom du projet
Nom du projet. Ce nom sera affiché dans la barre de titre de l'IDE et dans le menu "Projets récents".

Commentaires
Ce champ permet d'ajouter des informations complémentaires sur le projet. Elles seront affichées dans l'onglet d'information du projet.

Définir comme projet par défaut
Le projet par défaut sera ouvert automatiquement à chaque démarrage de l'IDE. Un seul projet peut être le projet par défaut. S'il n'y a pas de projet par défaut, l'IDE chargera le dernier projet qui était ouvert lors de sa fermeture (s'il y en avait un).

Fermer tous les fichiers lors de la fermeture du projet
Permet de fermer tous les fichiers qui appartiennent au projet lorsque ce dernier est fermé.

A l'ouverture du projet...
Charger tous les fichiers sources précédemment ouverts
Quand le projet est ouvert, tous les fichiers sources précédemment ouverts seront chargés.

Charger tous les fichiers sources du projet
Quand le projet est ouvert, tous les fichiers sources du projet seront chargés.

Ne charger que les fichiers sources marqués dans 'Fichiers du projet'
Quand le projet est ouvert, seuls les fichiers sources marqués dans 'Fichier du projet' seront chargés. De cette manière, il sera possible d'avoir toujours la même configuration lorsque qu'un projet est ouvert.

Ne charger que le fichier principal du projet de la cible par défaut
Quand le projet est ouvert, seul le fichier principal de la cible par défaut sera chargé.

Ne charger aucun fichier
Aucun fichier source ne sera chargé lors de l'ouverture du projet.
L'onglet "Fichiers du projet" affiche la liste des fichiers qui compose le projet et permet de changer leurs paramètres. L'explorateur sur la partie gauche permet de rajouter facilement des fichiers au projet. Les boutons en haut de l'onglet ont les fonctions suivantes:
Ajouter
Ajouter le(s) fichier(s) sélectionné(s) de l'explorateur dans le projet.

Retirer
Retire du projet les fichiers sélectionnés dans la liste.

Nouveau
Ouvre une fenêtre permettant de choisir le nom du nouveau fichier à créer. Ce fichier sera créé, ajouté au projet et ouvert dans l'IDE.

Ouvrir
Ouvre une fenêtre permettant de choisir un fichier existant à ajouter au projet. Le fichier sera automatiquement ouvert dans l'IDE.

Voir
Ouvre le(s) fichier(s) sélectionné(s) de la liste dans l'IDE, ou dans le visualisateur de fichiers si ce sont des fichiers binaires.
Les cases à cocher en dessous de la liste des fichiers représentent les options disponibles pour chaque fichier. Elles peuvent être changées pour un seul ou plusieurs fichiers à la fois. Voici leurs descriptions:
Changer le fichier à l'ouverture du projet
Indique à l'IDE de charger ce fichier lorsque que le projet est ouvert et que l'option "Ne charger que les fichiers sources marqués dans 'Fichiers projet'" est activée dans l'onglet "Options du projet".

Afficher une alerte si le fichier a été modifié
Quand le projet est fermé, l'IDE calcule un checksum de tous les fichiers qui ont cette option activée, et affichera une alerte si le fichier a été modifié en dehors de l'IDE. Cela permet de savoir qu'une modification externe a eu lieu lorsque l'on partage des fichiers avec différents projets. Cette option ne devrait pas être activée pour les fichiers binaires imposants pour garder une bonne rapidité d'ouverture et de sauvegarde du projet.

Scanner le fichier pour l'auto-complétion
Active le scan du fichier pour la liste d'auto-complétion, même si ce dernier n'est pas chargé dans l'IDE. Cette option est activée par défaut pour tous les fichiers non-binaires. Il faudra le désactiver pour tous les fichiers qui ne contiennent pas de code source, ainsi que pour les fichiers qui n'ont pas leurs places dans la liste d'auto-complétion.

Afficher le fichier dans le panneau de projet
Affichera le fichier dans le panneau de projet, qui se trouve à droite de l'éditeur. Si le projet a beaucoup de fichiers, il peut être utile d'en cacher quelques-un pour garder un accès rapide aux fichiers principaux.

Résumé du projet

Quand un projet est ouvert, le premier onglet des fichiers affiche un résumé du projet et de ses fichiers. Informations du projet
Cette section affiche les informations générales du projet, comme le nom du projet, ses commentaires ou quand le fichier a été ouvert pour la dernière fois.

Fichiers du projet
Cette section affiche tous les fichiers du projet et leurs paramètres. Un double-clic sur un de ces fichiers l'ouvre automatiquement dans l'IDE. Un clic-droit fait apparaître un menu contextuel avec davantage d'options:
Ouvrir - Ouvre le fichier dans l'IDE.
Ouvrir avec le visualisateur de fichiers - Ouvre le fichier dans le visualisateur intégré de l'IDE.
Ouvrir avec l'explorateur - Ouvre le fichier dans l'explorateur du système d'exploitation.
Ajouter un nouveau fichier - Ajoute un nouveau fichier au projet.
Retirer du projet - Retire le(s) fichier(s) sélectionné(s) du projet.
Rafraîchir les données de l'auto-complétion - Rescanne tous les fichiers du projet pour actualiser les données de l'auto-complétion.
Cibles du projet
Cette section affiche toutes les cibles du projet et quelques un de leurs paramètres. Un double-clic sur l'une des cibles l'ouvre dans les options de compilation. Un clic-droit affiche un menu contextuel avec davantage d'options:
Editer la cible - Ouvre la cible dans la fenêtre options de compilation.
Définir comme défaut - Défini cette cible comme celle par défaut.
Inclure dans 'Créer toutes les cibles' - Inclu cette cible dans 'Créer toutes les cibles'.

La panneau projet

Un outil intégré permet d'accéder rapidement aux fichiers du projet. Pour plus d'informations voir la section outils intégrés.


Compilation d'un programme

La compilation d'un programme est facile, il suffit de sélectionner 'Compiler/Executer' (raccourcis F5 par défaut) et le code sera compilé et exécuté.
Les "Options de compilation" permettent de paramétrer le processus de compilation. Les choix effectués sont associés au fichier ou au projet courant et sont persistants, même quand ils sont fermés. Par défaut ces paramètres sont écrits à la fin du fichier, sous forme de commentaires (invisibles quand le fichier est chargé par l'IDE). Il est possible de changer cet emplacement si, par exemple, un outil de gestion de versions tel que CVS est utilisé (pour éviter les conflits entre les utilisateurs qui auront chacun leurs propres paramètres en fin de fichier).

Si une erreur est rencontrée lors de la compilation, un message sera affiché en indiquant la ligne incriminée. Ce message sera aussi ajouté dans le rapport d'activité.

Le menu "Compilation"

Compiler/Exécuter
Lance la compilation du code source en cours d'édition en tenant compte de ses options de compilation. Le programme est créé dans un répertoire temporaire, mais il sera exécuté comme si il avait été lancé à partir du répertoire du code source (donc charger un fichier de ce répertoire fonctionnera).
Le code source n'a pas besoin d'être enregistré pour être compilé (mais les fichiers qu'il inclut doivent être enregistrés).

La commande "Compiler/Exécuter" utilise le paramétrage du débogueur (actif ou inactif), qu'il soit défini à partir du menu ou des options de compilations (les deux reviennent au même).

Exécuter
Exécute le dernier programme compilé une nouvelle fois. Tout changement concernant le débogueur (actif ou inactif) ne sera pas pris en compte par cette commande.

syntax Check
Vérifie la syntaxe du code..

Compiler avec le Débogueur
Lance la compilation de la même manière que la commande "Compiler/Exécuter", en forçant l'utilisation du débogueur. Cela permet de tester rapidement une compilation avec le débogueur lorsqu'il est normalement désactivé.

Compiler sans le Débogueur
Lance la compilation de la même manière que la commande "Compiler avec le débogueur", en désactivant le débogueur.

Redémarrer le compilateur (Windows uniquement)
Relance le compilateur et réinitialise toutes les bibliothèques et résidents chargées (sous Windows, le compilateur se lance lors du démarrage de l'IDE et se met en attente pour une plus grande rapidité). Cela a pour effet de mettre à jour la liste des fonctions, structures, interfaces et constantes reconnues par l'IDE. Cette commande permet de charger une nouvelle bibliothèque utilisateur nouvellement installée sans redémarrer l'IDE. De plus, pour les développeurs de bibliothèques, cela facilite le test en évitant de relancer l'IDE.

Options du Compilateur...
Ouvre la fenêtre d'options, qui permet d'ajuster les paramètres concernant la compilation du code source en cours d'édition.

Créer un éxecutable...
Ouvre une boîte de dialogue de sauvegarde, demandant le nom de l'exécutable à créer. Si le format exécutable est réglé sur DLL, il créera une DLL sous Windows, un objet partagé sous Linux et une dylib sous OS X. Lorsque vous créez un fichier exécutable sous OS X, en ajoutant '. App 'au nom de l'exécutable créera un fichier exécutable fourni avec la structure de répertoires nécessaires, y compris l'icône. Si aucun '. App' n'est défini, il va créer un exécutable standard de type console.

Cible par défaut
Quand un projet est ouvert, ce sous-menu permet de changer rapidement de cible par défaut. La cible par défaut est celle qui sera lancée automatiquement par le menu "Compiler/Exécuter.

Créer une cible
Quand un projet est ouvert, ce sous-menu montre toutes les cibles disponibles et permet d'en compiler directement une d'entre elles.

Créer toutes les cibles
Quand un projet est ouvert, ce menu compile toutes les cibles qui ont l'option idoine activée dans les options de compilation. Une fenêtre s'ouvre permettant de suivre l'état d'avancement des compilations.

La fenêtre d'options de compilation pour les fichiers hors projets

Fichier principal
En activant cette option, il est possible de définir un fichier principal pour la compilation du fichier actuel. Ce sera ce fichier qui sera alors utilisé lors de la compilation et non le fichier en cours d'édition.

Note: quand cette option est utilisée, le fichier en cours d'édition doit être enregistré avant de lancer la compilation, sinon les modifications ne seront pas prises en compte (car les fichiers inclus sont chargés à partir du disque). La plupart des options de compilation seront héritées du fichier principal, seuls les paramètres concernant le débogueur et la ligne de commande seront propres au fichier actuel.

Utiliser Compilateur
Cette option permet de sélectionner un compilateur différent de la version actuelle de PureBasic. Cela facilite la compilation d'un programme sous differente achitectures (x86, x64 ou PowerPC) sans avoir à redemarrer une nouvelle instance de l'IDE. Les compilateurs additionnels sont paramètrables dans les préférences.

Si la version du compilateur est identique à celle de l'IDE mais que le processeur géré est different, le débogueur intégré peut quand même être utilisé pour déboguer cet exécutable. Par exemple, une exécutable compilé avec la version x86 du compilateur peut être débogué avec l'IDE x64 et vice versa. C'est la même chose avec les compilateur x86 et PowerPC sous MacOS X. C'est dans ce dernier cas très pratique, car seul le programme compilé utilisera la lente emulation PowerPC. L'IDE et le deboggeur resteront très rapides et réactifs. Si la version du compilateur et de l'IDE ne correspondent pas, alors le débogueur indépendant sera utilisé pour éviter des problèmes potentiels.

Utiliser une icone (Uniquement pour Windows et MacOS X)
Il est possible de spécifier une icône qui sera associée à l'exécutable et affichée dans l'Explorateur Windows (ainsi que dans le coin supérieur gauche des fenêtres du programme et dans la barre des tâches).

Activer l'assembleur en ligne
Active l'assembleur en ligne, ce qui permet de mixer librement du code assembleur avec du code BASIC. Voir la section Assembleur en ligne x86 pour plus d'informations.

Activer le support Unicode
Informe le compilateur qu'il doit utiliser les routines unicode lors de la création de l'exécutable. Les fonctions de gestion des chaînes de caractères ainsi que toutes les fonctions PureBasic fonctionneront en unicode. Pour pouvoir exploiter les chaînes de caractères unicode directement à partir du code source, il est recommandé d'activer l'encodage UTF-8 (voir plus ci-dessous).

Pour déboguer un programme unicode, il faut sélectionner le débogeur autonome dans les préférences, car le débogueur qui est intégré à l'IDE ne peut pas, pour l'instant, afficher du texte unicode (le texte est converti en ascii avant affichage).

Activer la gestion des Thread
Informe le compilateur qu'il doit utiliser les routines multi-threadées lors de la création de l'exécutable (voir la bibliothèque Thread pour plus d'information).

Ce mode permet aussi au débogueur d'afficher correctement les informations si des threads sont utilisés. Sans cette option, le débogueur peut afficher un numéro de ligne erroné si une erreur intervient à l'intérieur d'un thread.

Activer le numéro de ligne pour OnError (Uniquement pour Windows)
Ajoute des informations dans l'exécutable pour pouvoir identifier la ligne qui a provoqué une erreur (à utiliser en combinaison avec les commandes de la bibliothèque OnError). Cette option influe légèrement sur les performances du programme.

Activer le support des thèmes XP (Uniquement pour Windows)
Ajoute un fichier permettant la gestion des skins, lorsque le programme est exécuté sur Windows XP ou Windows Vista (fortement recommandé).

L'application nécessite les droits administrateurs (Windows Vista) (Windows seulement)
L'exécutable créé sera toujours lancé avec les droits d'administration (i.e vous devez être logué en tant qu'administrateur système) sous windows vista. (il ne s'exécutera pas si le mot de passe de l'administrateur n'est pas donné). Cette option sera définie pour des programmes qui ont besoin d'un accès à des dossiers ou à des zones de registres à accès restreint afin d'obtenir un accès complet.
Si cette option est activée, le débogueur indépendant sera automatiquement sélectionné pendant la phase de débogage, ainsi le programme pourra être testé sous le mode administrateur.

Note : cette option n'a aucun effet quand le programme est lancé sous d'autres versions de windows.

L'application ne nécessite aucun droits particuliers (Windows Vista) (Windows seulement)
Cette option désactive la «virtualisation» de cet exécutable sur Windows Vista. La Virtualisation provoque la redirection des fichiers et les accès au Registre vers un dossier utilisateur si l'utilisateur n'a pas les droits nécessaires à l'opération. (ce qui permet de conserver la compatibilité avec d'anciens programmes)
Notez que cette redirection se fait sans en aviser l'utilisateur ce qui peut conduire à une certaine confusion si il essaye de trouver les fichiers sauvegardés sur le système de fichiers. Pour cette raison, il est recommandé de désactiver cette fonctionnalité si le logiciel est conforme avec les règles d'accès aux fichiers ou du registre de Vista.

Note: cette option n'a aucun effet quand le programme est lancé sous d'autres versions de windows. Elle ne peut pas être combinée avec l'option "Mode Administrateur" ci-dessus.

bibliothèque Sous-système
Il est possible d'utiliser différents sous-systèmes lors de la compilation. Plus d'un sous-système peut être spécifié, séparés par un espace. Pour plus d'informations, consultez sous-systèmes.

Format de l'exécutable
Permet de déterminer le type de l'exécutable qui sera généré:
Windows : format par défaut sous Windows, convient pour tout type d'applications.
Console : un exécutable avec une console par défaut. Il est toujours possible de créer des fenêtre, boutons etc. avec ce type d'exécutable, mais une console sera toujours ouverte quand le programme est exécuté. Si le programme est exécuté à partir d'une ligne de commande, il utilisera ce terminal pour les sorties textes, là où un programme du type "Windows" nécessite la création d'une nouvelle console (à l'aide d'OpenConsole()). Si un programme peut avoir son entrée ou sa sortie redirigée (au travers de 'pipes'), cette option doit être utilisée.
DLL Partagé : crée une DLL Windows. Voir "Créer une DLL" pour plus d'informations.
Note: Quand un code source de type DLL est lancé avec "Compiler/Exécuter", il sera traité comme un programme classique, pour permettre de tester facilement les fonctions de la DLL. La DLL sera réellement créée en appellant la commande "Créer un exécutable".

Optimisations CPU (à coté de "Format de l'exécutable")
Cette option permet d'inclure des fonctions spécialement optimisées pour un type de processeur, lorsqu'elles sont disponibles.
Tout CPU : Les fonctions génériques qui fonctionnent sur tous les processeurs seront utilisées.
CPU Dynamique : Les fonctions génériques ainsi que les fonctions spécifiques à tous les CPU supportés seront intégrées à l'exécutable. Le choix des fonctions à utiliser se fera au démarrage de l'exécutable, en détectant dynamiquement le processeur sur lequel il est lancé. Cela crée des exécutables plus gros, mais que seront aussi rapides que possible.
Les autres options : Les fonctions spécifiques à un CPU seront utilisées (ainsi que les fonctions génériques pour celle qui n'ont pas de version spécifiques). L'exécutable ne fonctionnera que sur le processeur choisi.

Note: Pour le moment, aucune fonction de PureBasic n'intègre de version spécifique, mais quelques bibliothèques utilisateurs en propose.

Fichier d'options du Linker
Un fichier texte peut être spécifié ici avec de nouvelles options de ligne de commande à transmettre à l'éditeur de liens lors de la création de l'exécutable. Le fichier doit contenir une option par ligne.

Compiler/Exécuter

Cette section contient des options qui affectent la façon dont l'exécutable est exécuté à partir de l'IDE pendant les tests. Sauf pour l'option 'outils', ils n'ont aucun effet quand le menu "Créer un exécutable" est utilisé.

Activer le Débogueur
Définit l'état du débogueur (on/off) pour le code source en cours, ou si l'option du fichier principal est utilisé, pour ce fichier aussi. On peut utiliser directement le menu du débogueur

Activer le Purifier
Active le purificateur du débogueur. Le purificateur peut détecter certains types d'erreurs de programmation comme écrire au delà des capacités d'un tampon en mémoire. Voir outils de débogage interne pour plus de détails.

Débogueur à utiliser
Permet de choisir un type de débogueur différent pour le fichier en cours uniquement. Si cette option est désactivée, le débogueur par défaut est utilisée, c'est celui spécifié dans les préférences.

Utiliser le mode avertissement
Permet d'ignorer, d'afficher ou de traiter les avertissements.

Paramètre de l'éxecutable
La chaîne donnée ici sera passé en tant que ligne de commande pour le programme lorsqu'il est exécuté à partir de l'IDE.

Répertoire courant
Le répertoire spécifié ici sera défini comme le répertoire courant pour le programme lorsqu'il est exécuté à partir de l'IDE.

Créer l'exécutable temporaire dans le répertoire source
Avec cette option activée, le fichier exécutable temporaire sera placé à l'intérieur du répertoire source. Cela peut être utile si le programme dépend de fichiers à l'intérieur du répertoire source. Avec cette option désactivée, l'exécutable est créé dans le répertoire temporaire de système.

Outils à exécuter
Des outils externes peuvent être activés. La colonne "Paramètres globaux" indique si l'outil est activé ou désactivé dans la configuration des outils. Un outil ne sera exécuté pour la source que s'il est à la fois activé globalement et pour la source en cours.

Remarque: Pour qu'un outil puisse être énuméré ici, il doit avoir l'option "Activer l'outil sur une base per-source" dans la configuration des outils et être exécuté par un déclencheur qui est associé à un fichier source. (c.-à-pas par le menu de démarrage ou de l'éditeur par exemple)

Constantes

Dans cette section, un ensemble de constantes spéciales pour l'éditeur aussi bien que des constantes personnalisées peuvent être définis pour ce qui sera prédéfini au moment de la compilation du code source.

#PB_Editor_CompileCount
Si cette constante est activée, elle contiendra le nombre de fois que le code a été compilé en choisissant aussi bien "Compiler/Exécuter" que "Créer un exécutable" dans le menu. Le compteur peut être édité manuellement dans le champ de saisie.

#PB_Editor_BuildCount
Si cette constante est activée, elle contiendra le nombre de fois que le code a été compilé en choisissant "Créer un exécutable" dans le menu. Le compteur peut être édité manuellement dans le champ de saisie.

#PB_Editor_CreateExecutable
Si cette constante est activée, elle aura la valeur 1 si le code est compilé en choisissant "Créer un exécutable" dans le menu ou 0 si "Compiler/Exécuter" est utilisé.

Constantes utilisateurs
Les constantes personnalisées peuvent être définies et facilement activé / désactivé avec les cases à cocher. Les constantes devraient être ajoutées à mesure qu'elles apparaissent dans le code source. Cela fournit un moyen pour activer / désactiver certaines fonctionnalités dans un programme et on peut activer / désactiver ces fonctionnalités avec CompilerIf/CompilerEndIf.

Dans la définition de ces constantes, les variables d'environnement peuvent être utilisées dans un style "bash" avec un "$" devant. La variable d'environnement sera remplacée par la définition avant de compiler le source.

Exemple: #Creator="$USERNAME"
Ici,le $USERNAME sera remplacé par le nom de l'utilisateur connecté sur les systèmes Windows. Si une variable d'environnement n'existe pas, elle sera remplacée par une chaîne vide.

Note: Pour tester dans le code source si une constante est définie ou non, la fonction Defined() dans fonction du compilateur peut être utilisée.

Informations de version

Si cette fonction est activée, une 'ressource' sera ajoutée à l'exécutable final contenant les informations de version du programme. Il est possible de les consulter en utilisant l'explorateur Windows et de sélectionner 'Propriétés' dans le menu contextuel. D'autres outils peuvent utiliser ces informations, comme par exemple les installateurs de programmes.

Les champs marqués avec une '*' sont indispensables, sinon les informations ne seront pas affichées correctement sur toutes les versions de Windows.
Les deux premiers champs doivent contenir 4 nombres séparés par des virgules. Tous les autres champs peuvent contenir n'importe quel texte. Dans les 3 boîtes vides, il est possible de définir ses propres champs à inclure dans les informations de version.

Dans tous les champs texte, il est possible d'intégrer des tags spéciaux qui seront remplacés par leur valeur associée lors de la compilation:
%OS : remplacé par la version de Windows utilisée pour compiler le programme.
%SOURCE : remplacé par le nom du fichier source (sans son chemin).
%EXECUTABLE : remplacé par le nom de l'exécutable créé (fonctionne uniquement quand "Créer un exécutable" est utilisé).
%COMPILECOUNT : remplacé par la valeur de la constante #PB_Editor_CompileCount.
%BUILDCOUNT : remplacé par la valeur de la constante #PB_Editor_BuildCount.

De plus, il possible d'utiliser n'importe quels tags supportés par la commande FormatDate(). Ils seront alors remplacés par leur valeur par rapport à la date de la compilation (ex: %yy correspondra à l'année de la compilation).

Définition des 3 champs du bas:

OS du fichier
Spécifie l'OS pour lequel ce programme est compilé (utiliser VOS_DOS ou VOS_WINDOWS16 n'a pas vraiment de sens pour un programme PureBasic, ils sont présents uniquement pour avoir une liste exhaustive).

Type du fichier
Défini le type de l'exécutable (ici seuls VFT_UNKNOWN, VFT_APP et VFT_DLL ont un sens pour les programmes PureBasic).

Langue
Spécifie la langue dans laquelle sont décrites ces informations de version.

Ressources

Permet d'inclure autant de scripts de ressources (fichiers *.rc) que nécessaire. Ils seront alors compilés et ajoutés à l'exécutable, et accessible dans le programme via les commandes API (étant donné que les ressources sont spécifiques à Windows, PureBasic ne les supporte pas de manière implicite, pour plus de renseignement consultez la MSDN). Pour créer facilement ces scripts, il est conseillé d'utiliser un éditeur de ressources tel que celui présent dans 'PellesC'.

La fenêtre d'options de compilation pour projets

La fenêtre "options de compilation pour projets" permet de définir plusieurs cibles de compilation. Chaque cible est un ensemble de paramètres de compilation avec un fichier source principal et un executable. La partie gauche de la fenêtre affiche la liste de toutes les cibles disponibles. La barre d'outils juste au dessus permet de créer, effacer, copier, éditer ou déplacer une cible.

La cible par défaut sera celle qui sera exécutée quand le menu "Compilateur/Exécuter" est sélectionné. Elle peut être rapidement changée par la case à cocher "Définir comme cible par défaut" ou à partir du menu "Compilateur". L'option "Autoriser dans 'Compiler toutes les cibles'" indique si cette cible doit être compilée quand le menu "Compiler toutes les cibles" est utilisé.

La partie droite de la fenêtre est quasiment la même qu'en mode hors projet, et reflète les paramètres de compilation de la cible actuellement selectionnée. Les seules différences sont les champs "Fichier source d'entrée" et "Executable de destination" qui doivent être renseignés pour chaque cible, car sans ces informations, il n'est pas possible de compiler la cible automatiquement.

En mode projet, les informations relatives à chaque cible sont enregistrées dans le fichier projet, et pas dans les fichiers sources. Les informations qui sont propres à chaque fichiers (comme l'état du pliage) sont toujours enregistrées pour chaque fichier à l'endroit indiqué dans les Preferences.

La fenêtre de compilation des cibles

Quand le menu "Créer toutes les cibles" est sélectionné pour le projet en cours, toutes les cibles qui ont l'option idoine activée seront compilées dans l'ordre où elles apparaissent dans la liste des cibles. La fenêtre de progression montre la cible et l'ensemble des cibles ainsi que leurs status. Quand le processus de compilation est fini, le log peut être copié dans le presse-papier ou enregistré sur le disque.


Utiliser le débogueur

PureBasic est fourni avec un puissant débogueur pour trouver rapidement les erreurs et les bugs des programmes. Il permet de contrôler le flux d'exécution du programme, d'observer le contenu des variables, tableaux et listes chaînées, d'afficher des informations de débuggage etc. Il supporte aussi des fonctions avancées tels que l'affichage du contenu des registres (assembleur), voir le contenu de la pile ou d'une zone de mémoire quelconque. De plus il permet de faire du déboguage à distance, via le réseau.

Pour activer le débogueur, il suffit de choisir "Utiliser le débogueur" dans menu "Débogueur" (ou de l'activer dans les "Options de compilation"). En choisissant le menu "Compiler avec le débogueur", le débogueur sera activé seulement pour une compilation.

Le débogueur du PureBasic se présente sous 3 formes:

- Un débogueur intégré directement dans l'IDE, pour une utilisation facile et rapide. C'est ce débogueur qui propose le plus de fonctionnalités.

- Un débogueur indépendant, qui est utile dans plusieurs cas spéciaux (par exemple si le programme est déjà en cours de débuggage et qu'il doit être exécuté une nouvelle fois) ou pour être utilisé par un éditeur de code tierce. Il propose quasiment toutes les fonctionnalités du débogueur intégré, mais parce qu'il est séparé de l'IDE, la rapidité des commandes est légèrement diminuée.
De plus il permet de déboguer un programme à distance, via le réseau.

Un débogueur en ligne de commande uniquement. Le but premier de ce débogueur est de pouvoir tester et développer un programme PureBasic sur un système dépourvu d'environnement graphique (comme un serveur linux), et/ou développer à distance via SSH.

Le type de débogueur à utiliser est sélectionnable dans les préférences.

Bien entendu, quand un programme utilise le débogueur, il fonctionne bien plus lentement. Cela ne devrait pas poser de problèmes majeurs étant donné que la rapidité est toujours acceptable, et que ce mode est utilisé uniquement pendant le développement.
Si quelques parties du programme ont déjà été testées et nécessitent une rapidité maximale même pendant les phases de déboguages, il est possible d'utiliser les directives de compilation DisableDebugger et EnableDebugger autour de ces parties.

Le débogueur intégré

Toutes les commandes relatives au débogueur lorsqu'un programme est en cours d'exécution sont disponibles à partir du menu "Débogueur" (ou de la barre d'outils et des raccourcis claviers).

Tant que le programme est en cours de débuggage, tous les fichiers sources qui sont en rapport avec ce programme sont verrouillés en lecture seule jusqu'à la fin de son exécution. Ceci est fait pour assurer que le code qui sera affiché lors du 'pas à pas' ou lors d'une erreur sera correct (et qu'il n'a pas été édité entre temps sans avoir été recompilé).

A noter qu'un programme ne peut être débogué qu'une seule fois par le débogueur intégré. Si le même programme est de nouveau compilé pour être debuggé, le débogueur indépendant sera utilisé. Par contre il est possible de déboguer plusieurs programmes différents simultanément avec le débogueur intégré.

Astuce
Sous Windows, le menu "Débogueur" est aussi ajouté au menu système de la fenêtre principale de l'IDE (le menu qui apparaît lors d'un click sur l'icône située dans le coin supérieur gauche de la fenêtre). Cela permet aussi d'accéder à ce menu à partir de la barre des tâches, en cliquant avec le bouton de droit de la souris sur l'icône correspondant à l'IDE.

Controle de l'exécution

Ces fonctions permettent le contrôle sur le déroulement du programme en cours de débuggage. Le programme peut être stoppé, exécuté pas à pas (ligne par ligne), examiné (voir le contenu des variables à cet instant etc.). Quand le programme est stoppé, la ligne qui va être exécuté est marquée (par défaut en bleu clair) dans le code source correspondant.
L'état du programme est indiqué dans la barre d'état de l'IDE et dans le rapport d'activité.

Commandes du menu permettant le contrôle du programme:

Stop
Stoppe l'exécution du programme et affiche la ligne qui va être exécutée.

Continue
Reprend l'exécution du programme, de manière normale.

Tuer le programme
Force le programme à se terminer et ferme toutes les fenêtres de débuggage associées à ce programme.

Pas
Exécute la ligne du programme actuellement affichée et stoppe de nouveau l'exécution.

Pas <n>
Execute le nombre de lignes indiqué et stoppe l'exécution du programme.

Passer au-delà
Exécute la ligne du programme actuellement affichée et stoppe de nouveau l'exécution, comme un 'Pas' normal. La différence survient si la ligne contient un ou plusieurs appels à des procédures. Dans ce cas, les procédures seront toutes exécutées, sans arrêt, contrairement au mode 'Pas' qui rentre dans chaque procédure. Ceci permet de passer rapidement sur des procédures qui sont connues comme étant correctes.

Sortir
Exécute le reste du code de la procédure en cours d'exécution et s'arrête à sa sortie. Si la ligne courante n'est pas dans une procédure, un 'Pas' normal sera fait.

Points d'arrêt (ligne)

Les points d'arrêt sont une autre manière de contrôler l'exécution d'un programme. Avec la commande "Point d'arrêt" du menu, la ligne courante sera considérée comme un point d'arrêt (ou retire le point d'arrêt si cette ligne en était un). Quand le programme atteint un point d'arrêt, alors l'exécution est stoppée sur cette ligne (la ligne n'a pas encore été exécutée). A noter que si le point se trouve sur une ligne ou aucun code n'est exécutable (commentaire, ligne vide, structure etc.), le programme s'arrêtera sur la prochaine ligne exécutable rencontrée.

Un fois que l'exécution du programme a été interrompue par un point d'arrêt, il est possible d'utiliser n'importe quelle commande du "Contrôle de l'exécution" pour continuer à déboguer le programme.

Les points d'arrêts peuvent être ajoutés ou retirés de manière dynamique pendant l'édition ou pendant l'exécution du programme. La commande "Effacer les points d'arrêt" permettent d'enlever tous les points d'arrêt du fichier source en cours d'édition.

Note: Pour ajouter/retirer un point d'arrêt à l'aide de la souris, il faut maintenir la touche 'Alt' appuyée pendant le clic sur la bordure qui affiche les points d'arrêts (la colonne de numérotation des lignes n'est pas prise en compte).

Points d'arrêts (conditionnel)

En plus des points d'arrêts classiques, le débogueur permet de d'arrêter l'execution du programme si une condition donnée est remplie. Par exemple, il est possible de mettre une condition sur la valeur d'une variable et d'arrêter le programme quand elle atteint une certaine limite. La condition prend la forme d'une expression PureBasic évaluable en vrai ou faux. Tout ce que l'on peut mettre après un If, y compris les opérateur logiques tels que And, Or ou Not est accepté. La plupart des fonctions des bibliothèques Math, Memory et String ainsi que toutes les fonctions de validation de la forme IsXxx() and the XxxID sont disponibles.

Exemples de conditions:
  MaVariable$ <> "Salut" Or Compteur < 0  ; arrête l'execution si 'MaVariable$' n'est plus égale à "Salut" ou si 'Compteur' devient inférieur à zéro
  PeekL(*UneAdresse+500) <> 0             ; arrête l'exécution la valeur de type long contenu à l'adresse données n'est plus égale à zéro
Un point d'arrêt conditionnel peut être ajouter via l'entree "Point d'arret conditionnel" du menu "Debogueur". Ils peuvent se limiter à une procedure particulière, ou ils peuvent être ajouter pour tout le code source. L'entrée "Principal" dans la selection des procédures indique que le point d'arrêt conditionnel devra être évalué seulement en dehors des procedures.

La colonne 'status' affiche le résultat de tous les points d'arrêt conditionnels après leur dernière évaluation. Cela peut être 'vrai', 'faux' ou 'error' si la condition n'est pas une expression valide. Dès qu'une condition est vraie, alors l'execution du programme s'arrête. Cette condition est automatiquement enlevée de la liste, donc si le programme continue, il ne s'arretera pas immédiatement.

Note: La vérification des points d'arrêt conditionnels ralenti l'exécution du programme car les expressions doivent être évaluées à chaque ligne de code. Ils vaut mieux les déclarer uniquement quand c'est vraiment nécessaire, pour garder une exécution rapide du programme. Le fait de limiter un point d'arrêt conditionnel à une procedure permet aussi de limiter l'impact sur la rapidité d'exécution, car l'expression n'est évaluée que lorsque la procédure est appellée.

Variables en cours d'exécution

La valeur d'une variable peut être très rapidement vue pendant que le programme est en cours d'exécution en plaçant le curseur de la souris dessus un bref instant dans le code source. Si la variable est actuellement dans la portée et peut être affichées, sa valeur sera affichée dans une info-bulle.

Les expressions plus complexes (par exemple les champs de tableau array) peuvent être consultés en les sélectionnant avec la souris et en plaçant le curseur de la souris sur la sélection.

Des outils du Debogueur offrent également un certain nombre de façons d'examiner le contenu des variables, tableaux ou des listes chaînées.

Erreurs dans le programme

Si le débogueur rencontre une erreur dans le programme en cours de débuggage, il arrêtera l'exécution et marquera la ligne qui contient l'erreur (par défaut en rouge) et affichera le message d'erreur dans la barre d'état et le rapport d'activité.

A ce moment, il est toujours possible de regarder le contenu des variables, de la mémoire et l'historique des appels des procédures, mais les autres fonctionnalités telles que l'affichage des registres ou l'état de la pile ne sont plus disponibles.
Si l'erreur est considérée comme fatale (comme un accès interdit à une zone mémoire ou une division par 0) il ne sera pas possible de continuer l'exécution du programme. Par contre, si l'erreur est reportée par une commande PureBasic, il est possible de continuer tout de même l'exécution du programme, mais dans ce cas d'autres erreurs anormales peuvent apparaître.

Après une erreur (même fatale), la commande "Tuer le programme" doit etre utilisée pour finir l'exécution du programme et reprendre l'édition du code source. Le programme n'est pas automatiquement tué après une erreur pour permettre au développeur d'utiliser les fonctionnalités du débogueur (comme examiner le contenu des variables) pour essayer de détecter la cause de l'erreur.
Note: il est possible de paramétrer le débogueur pour qu'il termine automatiquement l'exécution du programme en cas d'erreur (voir Paramétrer l'IDE).

Le rapport d'activité

Le rapport d'activité est utilisé pour l'affichage des erreurs de compilation, ainsi que des messages survenant durant le débuggage. Les messages sont toujours affichés dans le rapport d'activé du fichier concerné, donc si une erreur survient dans un fichier inclu, ce dernier sera affiché et un message ajouté dans son rapport d'activité.

Le sous-menu "Rapport d'activité" du menu "Débogueur" contient les commandes pour sa gestion:

Afficher/Cacher
Affiche ou cache le rapport d'activité pour le fichier en cours d'édition.

Effacer
Efface toutes les lignes du rapport d'activité du fichier en cours d'édition.

Copier
Copie le contenu du rapport d'activité dans le presse-papier.

Effacer les erreurs
Une fois que le programme a été tué, les erreurs affichées dans le code sources restent afin de repérer facilement les lignes qui ont causé des problèmes et de les corriger. Cette commande permet d'enlever le surlignage sur les lignes d'erreur. Il est aussi possible de configurer l'IDE pour ôter automatiquement le surlignage des erreurs lorsque le programme se termine (voir Paramétrer l'IDE)

Le débogueur indépendant

Le débogueur indépendant est très similaire à celui intégré à l'IDE et sera seulement expliqué brièvement:

Sur la fenêtre du débogueur sont présents les boutons permettant le contrôle sur l'exécution du programme comme décrit plus haut. Le bouton "Pas" avance d'autant de lignes que défini dans le champ à sa droite. Quand le débogueur est fermé à l'aide du bouton "Quitter" ou en cliquant sur le bouton de fermeture de la fenêtre, le programme en cours de débuggage est immédiatement tué.

La zone de rapport d'activité peut être cachée à l'aide du bouton 'flèche vers le haut' pour rendre la fenêtre de débuggage plus petite.

La zone d'affichage du code source est utilisée pour montrer la ligne en cours d'exécution ainsi que les erreurs ou les points d'arrêt. La liste déroulante située au dessus permet de sélectionner les différents fichiers composants le programme. Les boutons "Mettre point d'arrêt", "Enlever point d'arret" et "Effacer points d'arrêt" permettent de gérer dynamiquement les points d'arrêt dans le fichier source affiché. Dans le code, existe également la fonction de survol (du débogueur intégré) pour visualiser rapidement le contenu d'une variable.

Les outils du débogueur peuvent être affichés à l'aides des boutons situés dans la partie inférieure de la fenêtre. L'utilisation de ces outils est la même qu'avec le débogueur intégré.

Note: Le débogueur indépendant n'a pas de configuration spéciale. Il utilise les paramètres du débogueur et de coloration syntaxique de l'IDE. Donc si un éditeur de code tierce est utilisé pour le développement, il convient de régler ces paramètres à l'aide de l'IDE.

Exécution du débogueur indépendant à partir de la ligne de commande:

Pour exécuter un programme compilé en ligne de commande avec le débogueur activé (option /DEBUGGER (Windows) ou -d (Linux/MacOS X)), le débogueur doit être invoqué comme suit:

pbdebugger <fichier exécutable> <paramètres ligne de commande pour l'exécutable>

Si le programme est exécuté immédiatement après une compilation par ligne de commande, le débogueur indépendant est automatiquement utilisé.

Déboguage à distance avec le débogueur indépendant:

La fonctionnalité de déboguage à distance permet d'utiliser l'interface graphique, à la place du débogueur en mode texte, pour déboguer des programmes qui sont exécutés sur des machines distantes, ou dans des machines virtuelles. La compilation du programme doit être gérée séparément, sur la machine distante ou sur la machine locale (en transférant le fichier compilé sur la machine cible).

Les débogueurs de tous les systèmes supportés par le PureBasic sont compatibles à partir du moment où les versions du compilateur utilisé pour créer le programme et du débogueur sont identiques. Par exemple, il est possible de déboguer un programme s'exécutant sur linux x64 avec un débogueur sous Windows x86. Le programme compilé et le débogueur peuvent tous les deux faire office de client ou de serveur pour la connectivité réseau. Un débogueur ne peut déboguer qu'un seul programme. Les connexions multiples ne sont pas possibles.

Lancer le débogueur en mode réseau:
Les paramètres de la ligne commande concernant le réseau:
  pbdebugger.exe /CONNECT=hote[:port]  [/PASSWORD=motdepasse]
  pbdebugger.exe /LISTEN[=interface][:port]  [/PASSWORD=motdepasse]
Le mode "connect" permet de lancer le débogueur en mode client, pour qu'il se connecte sur un exécutable qui aura été démarré en mode serveur. Le mode "listen" crée un serveur et attend la connexion d'un exécutable. Si l'adresse IP d'une interface locale est spécifiée, alors le serveur ne sera créé que pour cette interface, sinon le serveur sera créé sur toutes les interfaces disponibles. Si le port n'est pas spécifié, le port par défaut sera utilisé (port 10101).

Le paramètre optionnel 'password' active le chiffrement en AES sur le flux réseau. Si le client est démarré sans l'option 'password' mais que le serveur nécessite un mot de passe, alors il sera demandé d'entrer le mot de passe pour pouvoir continuer.

Lancer l'exécutable en mode réseau:
L'exécutable doit être compilé normalement en mode debug (en utilisant les options du compilateur /DEBUGGER or --debugger). Il pourra alors être démarré à partir de la ligne de commande avec les paramètres suivants :
  yourprogram.exe /DEBUGCONNECT=hote[:port]  [/PASSWORD=motdepasse]
  yourprogram.exe /DEBUGLISTEN[=interface][:port]  [/PASSWORD=motdepasse]
Si les options de connexion ne peuvent pas être spécifiées sur la ligne de commande (par exemple parce que le programme lit aussi des paramètres sur la ligne de commande) il existe une alternative en déclarant les variables d'environnement suivantes avant le démarrage du programme (attention à la casse):
  PB_DEBUGGER_Communication=NetworkClient;host[:port][;password]
  PB_DEBUGGER_Communication=NetworkServer[;interface][:port][;password]
Une fois que la connexion réseau est établie entre le débogueur et l'exécutable, la session de déboguage fonctionne de la même manière qu'avec un exécutable local. Si le débogueur est fermé, l'exécutable est fermé aussi. Il n'est pas possible de déconnecter ou de reconnecter le débogueur une fois que la connexion a été établie.

Le débogueur en ligne de commande

Le débogueur en ligne commande ne fait pas partie de l'IDE, il ne sera donc pas expliqué en détail dans cette section.

Lorsque le programme est en cours d'exécution, la combination Ctrl+C dans le terminal permet de le stopper et d'invoquer le débogueur. La commande "help" permet d'avoir un apercu des commandes disponibles et "help <commandname>" affichera une aide sur l'utilisation d'une commande. Sous Windows le débogueur en ligne de commande est utilisé uniquement si l'option /CONSOLE est spécifiée.

Déboguer un programme multi-threadé:

Pour utiliser le débogueur avec un proramme qui utilise des threads, l'option 'Créer un exécutable multi-threadé' doit être activé dans les Options de compilation, sinon les informations affichées par le débogueur concernant les numéros de lignes, les erreurs, les variables locales peuvent être erronnées, à cause des threads.

Les limitations suivantes doivent être prises en compte lors du déboguage d'un programme multi-threadé:

Quand le programme est en cours d'exécution, la visionneuse de variables, l'affichage de la pile ou le débogueur assembleur afficheront uniquement les informations du thread principal. Quand un programme est sur arrêt, ils afficheront les informations sur le thread courant. Donc, pour examiner les variables locales d'un thread, l'exécution doit être arrêtée dans ce thread (en utilisant un point d'arrêt ou CallDebugger). Les commandes 'Pas à pas' du débogueur s'appliquent uniquement au thread où l'exécution est arrêtée.

Si une erreur survient, l'exécution est stoppée dans ce thread, donc toute information affichée par la visonneuse de variables ou l'affichage de la pile sera relative à ce thread.

La 'Liste de visualisation' des variables affiche seulement les variables locales du thread principal.

Quand le débogueur s'arrête dans un thread, l'exécution de tous les autres threads est suspendue.


Utiliser les outils de débogage

Ces outils proposent de nombreuses fonctionnalités pour inspecter le programme en cours de déboguage. Ils ne peuvent pas être utilisés lorsque que le code source est en train d'être édité. Ils sont tous disponibles à partir du débogueur intégré ou du débogueur indépendant. Le débogueur en ligne de commande propose aussi bon nombre de ces fonctionnalités mais uniquement à l'aide de commandes, rendant leurs utilisations moins facile.

Certains de ces outils permettent d'afficher le contenu des variables. Voici comment est présenté l'affichage pour ces données:

Scope
Le scope d'une variable est la zone dans laquelle elle est valide. Un variable peut être globale, locale, partagée, statique ou threadé, en fonction de sa déclaration dans le code source. Le terme 'byref' ("par référence", c'est à dire en utilisant l'adresse) est utilisé pour indiquer un tableau ou une liste chaînée qui a été passé en paramètre d'une procédure.

Type des variables
Le type des variables est indiqué à l'aide d'une icône colorée, pour faciliter leur reconnaissance:
B : Byte
A : Ascii
W : Word
U : Unicode
L : Long
I : Integer
Q : Quad
F : Float
D : Double
S : String (Texte)
Sn : Fixed String (Texte)

Une structure est soit indiquée à l'aide d'un point, ou d'une flèche. Si c'est une flèche, alors le contenu de la structure peut être affiché en double-cliquant sur la ligne. L'icône est alors remplacée par une flèche vers le bas. Une structure représentée par un point ne peut pas être consultée (souvent car il s'agit d'un pointeur vers une structure).

Les tableaux dynamiques à l'intérieur de structures sont représentés avec leurs dimensions. Les listes et les maps à l'intérieur de structures sont représentées avec leur taille et de leur élément courant (s'il existe).

La fenêtre de débug

C'est dans cette fenêtre qu'apparaîtra les résultats de la commande "Debug". Cette commande est un moyen rapide et simple pour afficher des messages destinés au débuggage du programme.

Cette fenêtre sera affichée automatiquement la première fois qu'un message sera émis par le programme. Si elle est fermée, elle ne sera plus affichée automatiquement pour les messages suivants, mais ils seront tout de même enregistrés. Il est possible de copier le contenu de cette fenêtre dans le presse-papier ou de l'enregistrer dans un fichier. Un bouton est aussi présent pour effacer tous les messages précédents.

Le champ en bas de la fenêtre vous permet de saisir une expression qui sera évaluée, et le résultat sera affiché dans la fenêtre du débogueur. Ceci permet de contrôler rapidement la valeur d'une variable ou le champ d'un tableau sans avoir à lancer un des outils de débogage. Pour afficher le résultat de l'expression , appuyez sur la touche [entrée] ou cliquez sur le bouton "Afficher". Si l'expression ne peut pas être évaluée, un message d'erreur est affiché dans la barre d'état.

L'expression peut être n'importe quelle expression PB valide, à l'exception des expressions logiques ou contenant des mots clefs. Elle admet les variables, tableaux, listes chaînées, constantes et aussi quelques commandes des bibliothèques Math, Memory et String.

La fenêtre de surveillance

Elle est utilisée pour surveiller en temps réel les valeurs des variables. Il n'est possible d'afficher que des variables de type basique (pas de structures complètes), cependant ces variables peuvent faire partie d'une structure. Les champs de type tableau, liste ou map faisant partie d'une structure ne peuvent pas être affichés dans la liste de surveillance.

Pour ajouter une variable, il faut choisir sa procédure (si c'est une variable locale) ou "--- Principal ---" si c'est une variable globale, une composante d'un tableau ou d'une liste chaînée. Il suffit d'entrer ensuite le nom de la variable dans le champ correspondant et d'appuyer sur "Ajouter".

Exemples:
  MaVariable$                         - ajoute une variable de type string
  Tableau(1, 5)                       – ajoute une case d'un tableau
  Structure\SousChamp[5]\Valeur       – ajoute un champ d'une structure
  MaListeChainee()\SousChampStructure – ajoute un champ d'une liste chaînée
Il est aussi possible d'ajouter une nouvelle variable à la liste de surveillance à partir du "Visualisateur de variables", en cliquant avec le bouton droit de la souris sur une variable et en sélectionnant "Surveiller".

Dans la liste, les valeurs des variables surveillées seront affichées. Si la valeur est affichée avec "---", cela veut dire qu'elle n'est pas valide à cet endroit du programme (par exemple une variable locale en dehors de la procédure concernée ou une liste chaînée sans élément).

Les variables surveillées sont persistantes entre les sessions de débuggage, et même sauvegardées avec les options de compilation, il n'est donc pas nécessaire de les saisir à chaque fois.

Le visualisateur de variables

Il permet d'examiner les variables, tableaux, listes chaînées et maps présents dans le programme. Des les onglets, la partie supérieure montre les éléments globaux and threadés et la partie inférieure les éléments locaux, partagés et statiques.

Le bouton "Actualiser" permet de visualiser les données actuelles du programme en cours d'exécution. Si le programme est stoppé ou en mode pas à pas, les données sont actualisées automatiquement.

Sous Windows, le contenu du visualisateur de variable peut-être trié par nom, scope ou valeur en cliquant sur l'entête de la colonne appropriée. L'onglet 'Variables'
Cet onglet affiche toutes les variables du programme. En faisant un click-droit sur la variable, il est possible de l'ajouter à la liste de surveillance.

L'onglet 'Tableaux'
Cet onglet affiche tous les tableaux du programme ainsi que leurs dimensions (-1 indique que Dim n'a pas encore été appelé pour ce tableau). En faisant un click-droit sur le tableau, son contenu peut être visualisé dans l'onglet "Voir Tableau/Liste/Map".

L'onglet 'Listes'
Cet onglet affiche toutes les listes du programme, le nombre d'élément ("-" indique que NewList n'a pas encore été appelé), ainsi que l'index actuel de l'élément courant pour chaque liste ("-" indique qu'il n'y a pas d'élément courant). En faisant un click-droit sur la liste, son contenu peut être visualisé dans l'onglet "Voir Tableau/Liste/Map".

L'onglet 'Maps'
Cet onglet affiche toutes les map du programme, le nombre d'élément ("-" indique que NewMap n'a pas encore été appelé), ainsi que la clef de l'élément courant pour chaque map ("-" indique qu'il n'y a pas d'élément courant). En faisant un click-droit sur la map, son contenu peut être visualisé dans l'onglet "Voir Tableau/Liste/Map". L'onglet 'Voir Tableau/Liste/Map'
Cet onglet permet d'afficher les éléments d'un tableau, d'une liste ou d'une map, y compris ceux déclaré dans une structure. Pour ce faire, il faut spécifier le nom du tableau, de la liste chaînee ou de la map en incluant les parenthèses "()" à la fin, choisir le type d'éléments à afficher et appuyer sur "Afficher". A noter que les valeurs ne sont pas automatiquement actualisées quand le programme est en mode pas à pas.

"Afficher tout" montre tous les éléments. "Afficher éléménts non-nuls" affiche seulement les éléments qui ne sont pas égaux à 0. Cela permet d'afficher des gros tableaux/listes plus facilement si seulement quelques éléments sont utilisés. Une structure est considérée comme "nulle" si tous ses champs sont à 0.

"Afficher partiellement" permet d'afficher seulement une partie du tableau, de la liste ou de la map. Pour les tableaux, l'intervalle peut être spécifié séparément pour chaque dimension en utilisant une virgule. Si une dimension n'est pas du tout spécifiée, tous ses éléments seront affichés.
Voici quelques exemples d'intervalles:
  "1-2, 2-5, 2" : la première dimension entre 1 et 2, la deuxième entre 2 et 5, la troisième à 2.
  "1, 2-5"      : la première dimension à 1, la deuxième entre 2 et 5
  "1, , 5"      : la première dimension à 1, tous les éléments de la deuxième dimension, la troisième à 5.
Pour les liste, "Afficher partiellement" accepte une valeur simple ou un intervalle d'éléments (le premier élément a l'index 0).
  "0"     : le premier element
  "1-3"   : du 2eme au 4e element

L'affichage des maps, "Afficher partiellement" est utilisable pour filtrer les clefs des éléments à afficher. Il doit contenir le masque de la clef qui servira de filtre (sans les trémas). Un "?" représente n'importe quel caractère, un "*" représente n'importe quel nombre de caractère. Voici quelques exemples de masque:
  "hat" : affichera seulement l'élément avec la clef "hat".
  "?at" : affichera tous les éléments de 3 lettres se finissant pas "at", comme "bat", "hat" etc.
  "h*t" : affichera tous les élémentes qui commencent pas "h" et se terminent par "t".

Le Profileur

Le profileur est un outil qui permet de compter le nombre d'exécution de chaque ligne de code. Cela permet d'identifier quelles sont les parties les plus utilisées et donc où les optimisations auront le plus d'effet. Le profileur aide aussi à identifier un problème où une portion du code est exécutée trop souvent à cause d'une erreur.

Enregistrement des données
L'enregistrement est contrôlé par les boutons placés dans la fenêtre du profileur : 'Démarrer', 'Arrêter' et 'Mettre à zéro' (pour tout initialiser). Le bouton 'Rafraîchir' permet de mettre à jour le graphe pendant l'exécution du programme. Les données sont automatiquement mises à jour lorsque le programme est stoppé ou en mode pas à pas. Par défaut le profiler enregistre les données dès le début du programme mais cette option peut-être changée dans les Préférences.

Affichage des données
L'enregistrement est affiché sous forme de graphe, avec comme ordonnées les numéros de lignes et en abscisses le nombre d'exécution. Si le programme est réparti sur plusieurs fichiers source, la liste des fichiers est présentée en dessous du graphe. Pour afficher un fichier il suffit de le sélectionner ou de cocher la case à cocher, vous pourrez ainsi afficher les résultats de plusieurs fichiers pour mieux les comparer. Un clic droit sur un des fichiers vous permet de changer sa couleur d'affichage dans le graphe.

Utilisation de la souris dans le graphe
Un clic droit dans le graphe affiche un menu flottant qui autorise à zoomer, montrer la ligne de code sélectionnée dans l'IDE ou le code dans le débogueur. Vous pouvez aussi utiliser les boutons à gauche :

- Flèche : Un clic gauche maintenu permet de faire défiler le graphe.
- Carré : Un clic gauche maintenu permet de sélectionner une zone où faire un zoom.
- Croix : Tant que ce bouton est actif, une croix est affichée et vous aide à lire les numéros de ligne et leur nombre d'appels.
- Zoom : Ces trois boutons permettent de zoomer et d'afficher toutes les lignes.

L'historique des procédures

Cet outil montre les procédures qui ont été appelées pour en arriver à la position actuelle du programme. Chaque élément de la liste représente une procédure, la ligne et le fichier où elle est déclarée ainsi que ses arguments qui ont été utilisés lors de son appel. En cliquant sue le bouton "Variables", il est possible de voir les variables de cette procédure.

Cela permet de tracer facilement, à partir de quelle partie du code une procédure a été appelée. L'historique des procédures ne se met à jour automatiquement que lorsque le programme est arrêté, ou en mode pas à pas. Quand le programme est en cours d'exécution, il est nécessaire d'appuyer sur le bouton "Actualiser" pour mettre à jour la liste.

L'onglet "Statistiques" montre le nombre de fois qu'une procédure a été appelée. Il est possible de réinitialiser un compteur en sélectionnant la procédure puis en appuyant sur "Réinitialiser". De même, en cliquant sur "Réinitialiser tout", tous les compteurs seront remis à 0. Comme pour l'historique des procédures, la mise à jour des compteurs n'est pas automatique quand le programme n'est pas arrété ou en mode pas à pas, il convient d'utiliser le bouton "Actualiser".

Le visualisateur de mémoire

Il permet d'afficher le contenu d'une zone de mémoire arbitraire de votre programme. Une fois les limites inférieures et supérieures renseignées, cliquez sur "Afficher". (vous pouvez utiliser une valeur décimale, un nombre hexadécimal précédé par le caractère '$' ou n'importe quelle autre expression valide, incluant une variable ou un pointeur provenant du code). Si le contenu du second champ commence par le signe '+', alors il est considéré comme relatif au premier champ. Si la zone de mémoire est valide, elle sera affichée. Si la zone complète ou seulement une portion est invalide, alors un message d'erreur sera affiché.

Exemple: "*Buffer + 10" to "+30" affichera les 30 octets dans la mémoire en commençant 10 octets après l'adresse pointée par *Buffer.

La façon de présenter le contenu de la mémoire peut être défini grâce à la liste déroulante située en bas à gauche. Les modes suivants sont disponibles:

Hexadécimal
La mémoire sera affichée en hexadécimal à la manière des visualisateurs hexadécimaux classiques, avec l'adresse de la mémoire à gauche, suivie par le contenu en hexadécimal et la représentation sous forme de caractères dans la colonne de droite.

Tableau Byte/Char/Word/Long/Quad/Float/Double
La mémoire sera montrée sous forme de tableau en fonction du type choisi. Il est possible de configurer ce tableau en mode colonne simple ou multi-colonne dans les préférences (voir Configurer l'IDE)

Texte
Affiche la zone mémoire sous forme de texte, avec tous les caractères de contrôles affichés entre [] (par exemple: "[NULL]" pour le caractère 0). Un retour à la ligne est ajouté après les caractères 'nouvelle ligne' ([LF],[CR]) et [NULL] pour améliorer la lisibilité de la sortie. La zone mémoire peut être interprétée comme une chaîne Ascii, Unicode ou Utf8.

Il est aussi possible d'exporter la zone de mémoire affichée:

Copier (Texte): Copie la zone de mémoire affichée dans le presse-papier.
Enregistrer (Texte): Enregistre la zone de mémoire affichée dans un fichier.
Enregistrer (Binaire): Enregistre la zone de mémoire affichée dans un fichier sous forme binaire.

Le visualisateur de bibliothèque

Le visualisateur de bibliothèque donne des informations à propos des objets PureBasic qui ont été créés avec les bibliothèques qui supportent cette fonctionnalité. Par exemple, elle permet de vérifier rapidement les images actuellement chargées dans le programme, ou quels gadgets ont été créés.

Une fois que le programme est démarré, la liste déroulante en haut de la fenêtre peut être utilisée pour sélectionner la bibliothèque à examiner. La liste de tous les objets de cette bibliothèque apparaîtra et en cliquant sur un objet, des informations relatives à cet objet seront affichées. Certaines bibliothèques affichent même un aperçu de l'objet (sprite, image par exemple).

Si la liste déroulante affiche "Aucune information", cela veut dire que l'exécutable n'a utilisé aucune bibliothèque qui utilise cette fonctionnalité.

Pour l'instant, les bibliothèques suivantes sont supportées:
Thread
Gadget
Window
File
Image
Sprite
Sprite3D
XML

Le débogueur assembleur

Le débogueur assembleur est utile pour les développeurs expérimentés qui veulent pouvoir examiner le contenu des registres CPU ou de la pile (surtout quand de l'assembleur en ligne est utilisé).

La fenêtre des registres est uniquement disponible quand le programme est stoppé, ou en pas à pas. Il est possible de changer le contenu des registres en modifiant les valeurs des champs puis en cliquant sur "Changer".

L'analyse de la pile affiche le contenu de la pile du programme par rapport au registre ESP. Si la position actuelle de la pile n'est pas alignée sur une valeur multiple de 4, il n'est pas possible de la décoder correctement, donc elle sera affichée sous forme hexadécimale.
Si le pointeur est correctement aligné, le contenu de la pile est affiché avec des commentaires par rapports aux valeurs rencontrées (détails des valeurs passées en paramètres des fonctions PureBasic etc.)

L'affichage du contenu de la pile est actualisé automatiquement quand le programme est stoppé ou en mode pas à pas. Il est possible de désactiver cette mise à jour automatisée dans les préférences de l'IDE, dans ce cas un bouton "Actualiser" sera disponible.

Note: Le débogueur assembleur n'est pas pour l'instant disponible sur MacOS X.

Le Purificateur

Le purificateur permet de détecter des erreurs d'écriture dans des zones de mémoire interdites (dépassement de tampon). La plupart de ces erreurs entrainent des crashs ou des comportement inattendus, souvent très difficiles et laborieux à localiser, car ils sont aléatoires.

Pour fonctionner, le purificateur a besoin de données particulières générées par le compilateur, c'est pourquoi il est nécessaire de cocher la case "Activer le purificateur" dans les options de compilation.

Le purificateur détecte les erreurs d'écriture grâce à des valeurs uniques autour des variables locales et globales, des chaînes de caractères et des blocs de mémoire alloués dynamiquement. Ces valeurs uniques sont vérifiées à régulierement, et si une de ces valeurs a changé, alors il y a eu une écriture interdite et une erreur est affichée. Ces vérifications ralentissent considérablement l'exécution du programme, particulièrement pour les gros programmes, c'est pourquoi il est possible de régler l'intervalle des vérifications dans la fenêtre du purificateur:

Variables globales
Défini l'intervalle (en nombre de lignes executées) pour la vérification de l'intégrité des variables globales.

Variables locales
Défini l'intervalle (en nombre de lignes executées) pour la vérification de l'intégrité des variables locales.

Chaînes de caractères
Défini l'intervalle (en nombre de lignes executées) pour la vérification de l'intégrité des chaînes de caractères.

Blocs de données dynamiques
Défini l'intervalle (en nombre de lignes executées) pour la vérification de l'intégrité des blocs de données alloués dynamiquement avec AllocateMemory().


Les outils intégrés

L'IDE PureBasic intègre un grand nombre d'outils intégrés, pour rendre la programmation aisée et productive. La plupart d'entre eux peuvent être affichés dans une fenêtre séparée (accessibles alors par le menu) ou dans la palette d'outils située sur le côté de la zone d'édition.

Pour plus d'informations quand à la configuration de ces outils et comment ils sont affichés, voir Configurer l'IDE.

Outils disponibles pour la palette.

Navigateur de procédures

Cet outil affiche la liste de toutes les procédures déclarées dans le fichier source en cours d'édition. En cliquant sur un élément de cette liste, le curseur changera immédiatement pour aller à la déclaration de cette procédure.

Les macros seront identifiées avec un signe "+" avant le nom.

Il est aussi possible de mettre des commentaires particuliers dans le code qui sera alors aussi affiché dans le navigateur de procédures. Ils ont la forme suivante: ";- <description>". Le ';' démarre le commentaire et le '-' qui le suit immédiatement défini ce type de commentaire. la 'description' sera alors affichée dans la liste et un clique sur cet élément changera la position du curseur pour cette ligne. Ce type de commentaire se distingue dans la liste par l'ajout du caractère '>' devant la description.

La liste des procédures peut être triée, et peut aussi afficher les paramètres de la procédure/macro. Pour ces options, voir Configuration de l'IDE.

Projet

L'outil projet affiche un arbre de tous les fichiers du projet actuellement chargés. Un double-clic sur un fichier l'ouvrira dans l'IDE. Cela permet un accès rapide à tous les fichiers du projet. Un clic-droit sur un fichier ouvre un menu contextuel qui propose davantage d'options:
Ouvrir - Ouvre le fichier dans l'IDE.
Ouvrir avec le visualisateur de fichiers - Ouvre le fichier dans le visualisateur intégré de l'IDE.
Ouvrir avec l'explorateur - Ouvre le fichier dans l'explorateur du système d'exploitation.
Ajouter un nouveau fichier - Ajoute un nouveau fichier au projet.
Retirer du projet - Retire le(s) fichier(s) sélectionné(s) du projet.
Rafraîchir les données de l'auto-complétion - Rescanne tous les fichiers du projet pour actualiser les données de l'auto-complétion.
Explorer

L'outil Explorer affiche une liste de fichiers et de répertoires à partir de laquelle il est possible d'ouvrir rapidement n'importe quel type de fichier, en double-cliquant dessus. Les fichiers 'texte' seront chargés directement dans la zone d'édition et les fichiers binaires seront ouverts par le visualisateur interne de fichiers.

Visualisateur de variables

Le visualisateur de variables peut en fait afficher les variables, tableaux, listes chaînées, constantes, structures et interfaces définis dans le source en cours d'édition, ou dans tous les fichiers ouverts. La configuration de ce qui doit être affiché se fait dans les préférences.
Note: l'affichage des variables est un peu limité pour l'instant. Seules les variables qui sont déclarées par Define, Global, Shared, Protected ou Static seront reconnues.

Modèles de codes

Cet outil permet d'organiser de manière hiérarchisée une liste de petits bouts de code qui sont souvent utilisés. Ils peuvent être insérés rapidement à n'importe quel endroit du fichier en cours d'édition en double-cliquant sur le code voulu.

Choix de couleur

Le sélecteur de couleur vous aide à trouver la valeur de la couleur parfaite pour n'importe quelle tâche. Les méthodes suivantes de choix de couleur sont :

RGB: Sélectionnez une couleur en choisissant les intensités de rouge, de vert et de bleu.
HSV: Sélectionnez une couleur en choisissant la teinte, la saturation et la valeur.
HSL: Sélectionnez une couleur en choisissant la teinte, la saturation et la luminosité.
Roue: Sélectionnez une couleur en utilisant le modèle HSV dans la roue de couleur.
Palette: Sélectionnez une couleur dans une palette prédéfinie.
Nom: Sélectionnez une couleur dans une palette par son nom.

La sélection des couleurs comprend une composante alpha, si l'option "Inclure le canal alpha" est activée. Les composantes individuelles (intensités rouge / vert / bleu ou teinte / saturation / luminosité), ainsi que la représentation hexadécimale de la couleur actuelle peut être vues et modifiées dans les champs de texte.

Le bouton "Insérer Couleur" insère la valeur hexadécimale de la couleur courante dans le code source. Le bouton "Insérer RGB" insère la couleur comme le ferait un appel à la fonction RGB() ou RGBA()dans le code. Le bouton "Ajouter couleur" permet d'ajouter la couleur actuelle dans la zone d'historique. En cliquant sur une couleur dans cette zone, permet à cette couleur de devenir la couleur courante.

Table ASCII

La table ASCII affiche une liste contenant tous les caractères ASCII (de 0 à 255) avec leurs correspondances en décimal, hexadécimal et HTML. En double-cliquant sur une ligne, ce caractère sera inséré dans le code source. Les boutons en dessous de la liste permettent de choisir le format dans lequel le caractère sera inséré.

Outil Aide

L'outil d'aide est une visionneuse alternative pour le guide de reference . Il peut être utilisé pour afficher le manuel de PureBasic à côté du code, que ce soit avec le raccourci F1 ou non. Voir préférences.

Les autres outils intégrés

Visualisateur de structures

Cet outil permet de voir toutes les structures, interfaces et constantes qui sont prédéfinies dans PureBasic. Double-cliquer sur une structure ou une interface affichera la déclaration (le contenu) de l'élément. Il est possible de filtrer l'affichage en choisissant une lettre dans les boutons affichés au dessus de la liste.
Le bouton "Retour" revient à l'affichage précédent le double-clique.
Le bouton "Insérer nom" insère uniquement le nom de l'élément sélectionné.
Le bouton "Insérer copie" insère une copie de la déclaration de l'élément sélectionné.
Le bouton "Insérer" permet d'entrer le nom d'une variable et d'insérer tous les champs de la structure ou interface sélectionnée (en utilisant cette variable comme base).

Visualisateur de fichiers

Le visualisateur de fichiers permet d'afficher plusieurs types de fichiers: textes, images et pages web (Windows seulement). Si un type de fichiers n'est pas reconnu, il sera affiché sous forme hexadécimale. Le bouton "Ouvrir" ouvre un nouveau fichier et le bouton "X" ferme le fichier courant. Les flèches permettent de naviguer parmi les fichiers ouverts.
A noter qu'il est aussi possible d'ouvrir des fichiers dans le visualisateur interne en double-cliquant sur des fichiers binaires dans l'outil 'Explorer' ou sur le mot clef IncludeBinary dans la zone d'édition.

Comparer Fichiers/Dossiers

Cet outil permet de comparer deux fichiers (texte) ou des répertoires et de mettre en évidence leurs différences. L'onglet "Options" peut être utilisé pour ignorer des différences telles que les espaces ou les changements majuscules/minuscules.

Les fichiers sont affichés côte à côte avec les différences marquées de la manière suivante: Les lignes affichées en rouge ont été enlevés dans le fichier, les lignes indiquées en vert ont été ajoutés dans le fichier et les lignes indiquées en jaune ont été modifiées.

Dans la comparaison de répertoires, le contenu des deux répertoires est examiné (avec la possibilité de filtrer la recherche par extension de fichier et d'inclure les sous-répertoires) et les fichiers sont marqués d'une manière similaire: Dossiers en rouge n'existent pas dans le deuxième répertoire, les fichiers en vert sont nouveaux dans le deuxième répertoire et fichiers en jaune ont été modifiés. Un double-clic sur un fichier modifié montre les modifications qui ont été apportées.

Outils accessibles uniquement par le menu

Visual Designer

Le 'Visual Designer' de PureBasic est très utile pour créer des interfaces graphiques pour une application. Ce n'est pas un outil intégré à l'IDE mais un programme séparé, qui a son propre fichier d'aide (voir VisualDesigner.chm dans le répertoire PureBasic pour plus d'informations).


Les outils externes

L'IDE du PureBasic vous permet de configurer des programmes externes pour qu'ils soient appelés directement à partir d'un menu, de raccourcis, de la barre d'outils ou d'évènements "déclencheurs" spéciaux (ex: ouverture de fichier, fermeture etc..). Ceci permet un accès aisé à ces outils tout en programmant.

Vous pouvez également écrire vos propres petits outils en PureBasic pour effectuer des actions spéciales sur le code source que vous êtes en train d'éditer, afin d'automatiser les tâches récurrentes (ex : réorganisation du code, statistiques, etc..). De plus, vous pouvez configurer des visualisateurs de fichiers externes pour remplacer le visualisateur de fichier intégré à l'IDE pour des types particuliers de fichier ou pour tous les fichiers.

La commande "Outils personnalisés" du menu "Outils" ouvre la fenêtre de gestion des outils externes. La liste affiche tous les outils déjà configurés par ordre d'apparition dans le menu "Outils" (les outils ayant l'option 'caché' figurent aussi). Vous pouvez ajouter (bouton Nouveau) et supprimer (bouton Effacer) des outils, ou modifier leur ordre de priorité en cliquant sur les boutons "Vers le haut" / "Vers le bas" après avoir sélectionné un élément.

Chaque outil peut être rapidement activé ou désactivé à partir de la fenêtre "Outils personnalisés" du menu "Outils", en cochant ou décochant la case à gauche du nom de l'outil.

Configurer un outil

Les seuls éléments obligatoires dans la configuration sont la ligne de commande du programme à exécuter et son nom dans la liste du menu "Outils". Tout le reste est optionnel.

Ligne de commande
Contient le chemin et le nom du programme à exécuter.

Arguments
Contient les arguments qui seront passés au programme. Vous pouvez écrire des options fixes, tout comme des mots-clefs spéciaux qui seront remplacés lors de l'exécution du programme) :

%PATH : sera remplacé par le chemin du fichier source en cours d'édition. Il sera vide si le code source n'a pas encore été enregistré.

%FILE : sera remplacé par le nom du fichier source en cours d'édition. Il sera vide si le code source n'a pas encore été enregistré. Si l'outil est destiné à remplacer le visualisateur de fichier intégré, ce mot-clef représentera le fichier à ouvrir.

%TEMPFILE : quand cette option est spécifiée, le fichier source en cours d'édition est enregistré dans un fichier temporaire dont le nom est inséré ici. Ce fichier est créé uniquement pour l'outil et peut être librement modifié ou effacé.

%COMPILEFILE : ce mot-clef est uniquement valide pour les déclencheurs de compilation (voir ci-dessous). Il sera remplacé par le nom du fichier temporaire qui est envoyé au compilateur pour effectuer la compilation. En modifiant ce fichier, il est possible de changer ce qui sera effectivement compilé.

%EXECUTABLE : sera remplacé par le nom de l'exécutable créé par la dernière commande "Créer un exécutable". Pour le déclencheur "Après Compiler/Exécuter", il sera remplacé par le nom du fichier exécutable temporaire créé par le compilateur.

%CURSOR : sera remplacé par la position actuelle du curseur dans le code en cours d'édition, sous la forme : LIGNExCOLONNE.

%SELECTION : sera remplacé par la sélection actuelle sous la forme : LIGNEDEBUTxCOLONNEDEBUTxLIGNEFINxCOLONNEFIN. Il peut être utilisé en conjonction avec %TEMPFILE, si vous voulez que votre outil effectue des actions basées sur le texte sélectionné.

%WORD : sera remplacé par le mot actuellement situé sous le curseur.

Note : pour chaque mot-clef désignant un fichier ou un chemin, il est généralement conseillé de les placer entre "" (ex: "%TEMPFILE") pour s'assurer que les chemins contenant des espaces seront correctement transmis à l'outil. Ces mots-clefs ainsi qu'une brève description peuvent aussi être consultés en cliquant sur le bouton "Info" à droite du champ Arguments.

Dossier de travail
Permet de choisir un répertoire que l'outil utilisera lors de son lancement. Si aucun répertoire n'est indiqué, l'outil utilisera le répertoire du code source en cours d'édition.

Nom
Permet d'attribuer un nom à l'outil. Ce nom s'affichera dans la liste des outils, et si l' outil n'est pas caché, dans le menu "Outils".

Evènement pour déclencher l'outil

Ici vous pouvez choisir quand l'outil devra être lancé. Plusieurs outils peuvent avoir le même déclencheur, ils seront tous executés quand cet évènement déclencheur se produira. L'ordre de leur execution dépend de l'ordre dans lequel ils apparaissent dans la liste des outils.

Menu ou raccourci
L'outil ne sera pas lancé automatiquement. Il sera exécuté à partir d'un raccourci clavier ou d'un menu. Note : pour exécuter un programme à partir de la barre d'outils, il faut lui ajouter un bouton dans Fichier/Préférences/Général/Barre d'outils (voir Configurer l'IDE pour plus d'informations).

Si ce déclencheur est choisi, l'option "Raccourci" devient active et permet d'entrer un raccourci qui lancera cet outil.

Démarrage de l'éditeur
L'outil sera exécuté immédiatement après le démarrage complet de l'IDE.

A la fermeture de l'éditeur
L'outil sera exécuté juste avant que l'IDE ne quitte. Notez que tous les fichiers sources auront déjà été fermés.

Avant Compiler/Exécuter
L'outil sera exécuté juste avant la compilation du fichier source. En utilisant le mot-clef %COMPILEFILE, il est possible de modifier le code à compiler. Ceci permet par exemple de créer un petit pré-processeur pour le code source. Notez que vous devriez activer l'option "Attendre la fin du programme" si vous voulez que les modifications soient prises en compte par le compilateur.

Après Compiler/Exécuter
L'outil sera exécuté juste après la compilation, mais avant que le programme ne soit executé. En utilisant le mot-clef %EXECUTABLE, il est possible de récupérer le nom du fichier qui vient d'être généré. Les modifications sont autorisées, mais si le fichier est effacé, alors une erreur surviendra lorsque l'IDE essaiera d'exécuter le fichier.

Démarrage d'un programme compilé
L'outil sera lancé lorsque la commande "Exécuter" du menu "Compilateur" est activée. L'outil est lancé avant que le programme ne soit exécuté. Le mot-clef %EXECUTABLE est valide ici aussi.

Avant de créer un exécutable
Cet évènement est identique à "Avant Compiler/Exécuter", mais il est déclenché juste avant la création de l'exécutable final.

Après avoir créé un exécutable
L'outil sera lancé une fois que l'exécutable final aura été créé. Le mot-clef %EXECUTABLE peut servir à récupérer le nom de l'exécutable créé et ainsi effectuer des actions dessus (ex: pour le compresser).

Code source chargé
L'outil se lancera à chaque fois qu'un code source sera chargé dans l'IDE. Les mots-clefs %FILE et %PATH sont toujours valides, car le fichier est forcément chargé à partir d'un média (disque, réseau etc..).

Code source enregistré
L'outil se lancera à chaque fois qu'un code source sera enregistré par l'IDE. Les mots-clefs %FILE et %PATH sont toujours valides, car le fichier vient d'être enregistré sur un média (disque, réseau etc.).

Code source fermé
L'outil se lancera à chaque fois qu'un code source sera sur le point d'être fermé. A ce stade le fichier est toujours là, donc vous pouvez obtenir son contenu avec le mot-clef %TEMPFILE. Le mot-clef %FILE sera vide si le fichier n'a jamais été enregistré.

Remplace le visualisateur - Tous les fichiers
L'outil remplacera complètement le visualisateur de fichier intégré. Si on essaie d'ouvrir un fichier qui ne peut être édité dans l'IDE, l'IDE va d'abord essayer les outils externes ayant comme déclencheur ce type de fichier particulier, et si aucun ne correspond, alors le fichier sera géré par cet outil. Utilisez le mot-clef %FILE pour récupérer le nom du fichier qui doit être ouvert.

Note : un seul outil peut être associé à ce déclencheur. Tous les autres outils associés à ce déclencheur seront ignorés.

Remplace le visualisateur - Fichiers inconnus
Cet outil remplacera le visualisateur hexadécimal intégré, qui est normalement utilisé pour ouvrir les fichiers de types inconnus. Il sera executé, lorsque l'extension du fichier est inconnue pour l'IDE, et si aucun autre outil externe n'a été configuré pour gérer ce fichier (si un outil est configuré avec le déclencheur "Remplace le visualisateur - Tous les fichiers", alors cet outil ne sera jamais appelé).

Note : un seul outil peut être associé à ce déclencheur.

Remplace le visualisateur – Fichier spécial
Ce déclencheur permet à l'outil de gérer des extensions de fichiers spécifiques. Il a une plus haute priorité que les évènements "Remplace le visualisateur - Tous les fichiers", "Remplace le visualisateur – Fichiers inconnus" et plus haute également que le visualisateur de fichier intégré. Indiquez les extensions que l'outil doit gérer dans le champ prévu à cet effet, sur la droite. Plusieurs extensions peuvent être attribuées.

Une utilisation courante de ce déclencheur est, par exemple, la configuration d'un programme comme Acrobat Reader pour gérer les fichiers ayant l'extension "pdf". Ce qui permet d'ouvrir facilement ces fichiers à partir de l'Explorateur, du visualisateur de fichier intégré ou en double-cliquant sur le mot-clef "IncludeBinary" dans le source.

Autres options sur le côté droit

Attendre la fin du programme
L'IDE sera complètement bloqué jusqu'à ce que l'outil termine son exécution. Cette option est requise si l'outil doit modifier un fichier source qui doit être rechargé par la suite, ou passé au compilateur par les déclencheurs de compilation.

Démarrer caché
L'outil sera lancé en mode invisible. Ne pas utiliser cette option si le programme nécessite une interaction avec l'utilisateur, car il ne pourra plus être fermé.

Cacher l'éditeur
Uniquement disponible si l'option "Attendre la fin du programme" est activée. Cache l'éditeur pendant l'exécution de l'outil.

Recharger la source à la fin du programme
Uniquement disponible si l'option "Attendre la fin du programme" est activée, et quand le mot-clef %FILE ou %TEMPFILE est utilisé dans le champ "Arguments".

Une fois que l'outil a terminé son exécution, l'IDE rechargera le fichier source dans l'éditeur. Il est possible de choisir si le fichier doit être rechargé dans l'onglet actuel ou dans un nouvel onglet.

Cacher l'outil du menu principal
N'affiche pas l'outil dans la liste du menu "Outils" de l'IDE. C'est utile pour les outils qui doivent uniquement être exécutés à partir de déclencheurs spéciaux, mais pas à partir du menu.

Activer l'outils en fonction d'un fichier source
Les outils avec cet option seront inscrits dans la liste "Exécuter des outils" dans les options du compilateur, et exécutés uniquement pour les sources où il est permis. Notez que lors de la désactivation de l'outil dans la fenêtre "outils de configuration", il sera désactivé au niveau global et ne pourra être lancé depuis une source, même s'il est activée ici.

Cette option n'est valable qu'avec :
- Avant Compiler/Exécuter - Après Compiler/Exécuter - Exécuter Programme compilé - Avant créer Exécutable - Après créer Exécutable - Code source chargé - Code source enregistré - Code source fermé

Extensions des fichiers supportées (ext1,ext2,...)
Uniquement disponible pour le déclencheur "Remplace le visualisateur - Fichier spécial". Permet de saisir la liste des extensions gérées.

Astuces pour l'écriture de vos propres outils de traitement

L'IDE fournit des informations supplémentaires pour les outils sous la forme de variables d'environnement. Elles peuvent être facilement lues par l'outil à l'aide des commandes de la bibliothèque Process.

Voici une liste des variables fournies. Notez que celles qui donnent des informations sur le fichier en cours d'édition ne sont pas accessibles pour les outils exécutés au démarrage ou à la fermeture de l'IDE.
  PB_TOOL_IDE         - Chemin complet et nom de l'exécutable de l'IDE
  PB_TOOL_Compiler    - Chemin complet et nom de l'exécutable du compilateur
  PB_TOOL_Preferences - Chemin complet et nom du fichier des préférences de l'IDE
  PB_TOOL_Language    - Langue actuellement utilisée dans l'IDE
  PB_TOOL_FileList    - Liste de tous les fichiers ouverts dans l'IDE, séparés par un Chr(10)

  PB_TOOL_Debugger    - Ces variables fournissent les paramètres correspondant à ceux de la fenêtre d'options de compilation
  PB_TOOL_InlineASM     pour le source en cours. Elles sont à 1 si l'option
  PB_TOOL_Unicode       est activée, à 0 sinon.
  PB_TOOL_Thread
  PB_TOOL_XPSkin
  PB_TOOL_OnError

  PB_TOOL_SubSystem   - Contenu du champ Bibliothèque Sous-système dans les options de compilation
  PB_TOOL_Executable  - Identique au mot-clef %COMPILEFILE pour la ligne de commande
  PB_TOOL_Cursor      - Identique au mot-clef %CURSOR      pour la ligne de commande
  PB_TOOL_Selection   - Identique au mot-clef %SELECTION   pour la ligne de commande
  PB_TOOL_Word        - Identique au mot-clef %WORD        pour la ligne de commande

  PB_TOOL_MainWindow  - Identifiant système (Handle) de la fenêtre principale de l'IDE
  PB_TOOL_Scintilla   - Identifiant système (Handle) du composant d'édition de code Scintilla pour le source en cours
Quand les mots-clefs %TEMPFILE ou %COMPILEFILE sont utilisés, l'IDE ajoute les options de compilation à la fin du fichier temporaire (sous forme de commentaires), même si l'utilisateur a choisi de ne pas sauver ces options en enregistrant un code source.

Ceci permet à l'outil de lire les options de compilation spécifiques à ce fichier, et de les prendre en compte dans les actions qu'il va effectuer.


Obtenir de l'aide

L'IDE du Purebasic permet l'accés immédiat à l'aide de PureBasic, ainsi qu'aux autres fichiers d'aides disponibles sur la plateforme de développement sans quitter l'éditeur.

Accès rapide à l'aide de référence

En sélectionnant la commande "Aide..." du menu "Aide" ou en utilisant son raccourci clavier (par défaut F1) quand le curseur est sur un mot-clef ou une fonction PureBasic, l'aide sera ouverte à la page correspondante.
Si le mot à la position du curseur n'a pas de rubrique dédiée dans l'aide, la page de référence sera affichée.

Accès rapide à l'aide sur l'API Windows

Il y a deux méthodes pour accéder rapidement à l'aide des fonctions de l'API Windows supportées par PureBasic:

Le Microsoft Plateform SDK

Ce SDK regroupe toute l'aide actuellement disponible pour le développement d'un programme sous Windows. Il contient des informations sur toutes les fonctions API, ainsi que des petits tutoriaux et des discussions techniques sur des points particuliers. De ce fait, il est plutôt conséquent (jusqu'à 400 Mo en fonction des composants installés).
Pour l'intégration avec l'IDE, il est possible d'installer l'édition de "Fevrier 2003" ou de "Windows Server 2003 SP1".

Le SDK peut être téléchargé à partir du lien suivant:
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
A noter qu'il peut aussi être commandé par CD. Par ailleurs, il est aussi fourni dans la plupart des logiciels de développement de Microsoft (comme Visual Studio).

Le fichier d'aide Win32.hlp

Il y a une autre alternative bien plus petite au SDK complet (7.5 Mo). Ce fichier d'aide est très ancien (écrit pour Windows 95), donc il ne contient pas d'informations concernant les API introduites depuis là. Néanmoins, il contient les informations essentielles à propos des API les plus utilisées, qui sont toujours d'actualités car elles n'ont quasiment pas évoluées. Ce fichier est recommandé seulement pour une utilisation occasionnelle des API (et que le SDK n'est pas disponible).

Le fichier peut être téléchargé ici:
http://www.purebasic.com/download/WindowsHelp.zip
Pour l'utiliser à partir de l'IDE, il suffit de créer le sous-répertoire "Help" dans le dossier "PureBasic" et d'y copier le fichier "Win32.hlp".

Accéder à d'autres fichiers d'aide

Pour accéder à d'autres fichiers d'aide à partir de l'IDE, il faudra créer le sous-répertoire "Help" dans le dossier "PureBasic" puis les copier dedans. Ces fichiers apparaîtront alors dans le sous-menu "Aide externe" du menu "Aide" (et dans le menu contextuel de la zone d'édition). Les fichiers .chm et .hlp seront affichés par les visualisateurs Microsoft. L'IDE ouvrira les fichiers d'aide dans le visualisateur interne. Les fichiers tels que les textes seront donc directement consultables. Pour les autres types, il faudra utiliser le menu Configuration des outils pour paramétrer un outil externe qui gérera ce type de fichier. L'aide sera alors affichée en utilisant cet outil.

Par exemple, si des fichiers d'aide sont en pdf, il suffit de paramétrer un outil externe qui ouvrira les pdf et mettre les fichiers pdf dans le sous-répertoire "Help" du dossier "PureBasic". Lorsqu'un de ces fichier d'aide sera sélectionné dans le sous-menu "Aides externes", il sera ouvert en utilisant cet outil.


Configurer l'IDE

L'IDE du PureBasic propose un nombre très conséquent d'options pour qu'il puisse s'adapter aux habitudes des programmeurs qui l'utiliseront. Ces paramètres sont regroupés dans la fenêtre de la commande Préférences du menu "Fichier", et la description de chacune est décrite dans ce document.

Tout changement ne sera effectif uniquement lorsque le bouton "OK" ou "Appliquer" sera utilisé.

Général

Cette section regroupe les options qui influent sur le comportement général de l'IDE.

Ne lancer qu'un éditeur
Si cette option est activée, l'IDE ne pourra être exécuté qu'une seule fois, et toute exécution ultérieure activera l'IDE déjà ouvert. Par exemple cliquer sur un fichier .pb dans l'explorateur ouvrira le fichier dans un nouvel onglet au lieu de lancer une nouvelle instance de l'IDE.

Désactiver l'écran de démarrage
Désactive l'écran "PureBasic" qui est affiché lors du démarrage de l'IDE.

Mémoriser la position des fenêtres
Enregistre la position et la taille des fenêtres de l'IDE lorsqu'elles sont fermées. Pour avoir les fenêtres toujours ouvertes avec les mêmes dimensions, il faudra les placer à l'endroit désiré, activer cette option, puis quitter l'IDE (pour enregistrer les options). Au prochain démarrage, désactiver cette option et les fenêtres utiliseront la taille et la position précédemment enregistrées.

Afficher le contenu lors de l'utilisation des splitters
Si l'ordinateur de développement est rapide, cette option peut être activée, sinon déplacer les splitters peut entrainer un scintillement désagréable.

Recharger automatiquement les derniers fichiers ouverts
Recharge automatiquement tous les fichiers qui étaients ouverts lorsque l'IDE a quitté pour la dernière fois.

Afficher le chemin complet dans le titre de l'IDE
Si cette option est activée, le titre de la fenêtre principale de l'IDE affichera le chemin complet du fichier en cours d'édition, sinon seul le nom de fichier sera affiché.

Nb de fichiers récents
Nombre de fichiers récents à afficher dans le sous-menu "Fichiers récents" du menu "Fichier".

Nb de recherches récentes
Détermine le nombre de mots récents qui seront mémorisés dans les commandes "Rechercher/Remplacer" et "Rechercher dans les fichiers".

Éditeur visuel
Permet de choisir un autre programme pour éditer des interfaces graphiques en PureBasic, lorsque que l'on utilise le menu ou le bouton de la barre d'outils.

Général - Langue

Permet de changer la langue utilisée par l'IDE. La liste déroulante affiche les langues disponibles et des informations relatives à la traduction (ex: la personne qui a fait la traduction et la date).

Général - Raccourcis claviers

Dans cette section il est possible de paramétrer absolument tous les raccourcis pour les commandes de l'IDE. Créer un nouveau raccourci, selectionné le champ de saisie du raccourci, taper directement le raccourci souhaité sur le clavier puis cliquer sur "Appliquer".

A noter que les touches Tab et Shift+Tab sont réservées pour l'indentation des blocs de code et ne peuvent pas être modifiées. De plus certaines combinaisons de touches peuvent avoir un sens particulier pour l'OS et ne pourront pas être utilisées.

Général - Thèmes

Cette section permet de visualiser les thèmes disponibles pour l'IDE et d'en sélectionner un. Par défaut, deux thèmes sont à disposition.

Davantage de thèmes peuvent être facilement ajoutés en créant un fichier zip contenant les images (au format PNG) et un fichier "Theme.prefs" qui décrit le thème. Le fichier zip doit ensuite être copié dans le répertoire "Themes" de PureBasic pour être reconnu par l'IDE. Le fichier "SilkTheme.zip" peut être utilisé comme base pour créer un nouveau thème.

Afficher les icônes dans le menu
Permet d'afficher ou de cacher les icônes dans les menus de l'IDE.

Afficher la barre d'outils principale
Permet d'afficher ou de cacher la barre d'outils principale, pour gagner un peu de place dans la fenêtre d'édition.

Général - Barre d'outils

La barre d'outils est entièrement paramètrable. Pour changer la position des icônes, utiliser les boutons de la section "Position". Pour modifier un bouton ou en ajouter un nouveau, utiliser les boutons de la section "Configuration de l'élément" (les nouveaux éléments sont toujours ajoutés en fin de liste).

Types des éléments:
Séparateur : une barre verticale de séparation.
Espacement : un espace vide de la taille d'une icône.
Icône standard : permet de choisir une icône système (fournie par l'OS) dans la liste déroulante.
Icône de l'IDE : permet de choisir une icône propre à l'IDE dans la liste déroulante.
Fichier icône : permet de choisir une icône à partir d'un fichier spécifié dans le champ à droite (les fichiers PNG sont acceptés sur toutes les plateformes, ainsi que les fichiers icône sous Windows).

Si le type de l'élément n'est pas un "Séparateur" ni un "Espacement", alors il est possible de lui associer une action lorsque le bouton sera pressé:
Elément d'un menu : exécutera la commande correspondante à l'élément du menu spécifié dans la liste déroulante.
Lancer un outil : exécutera l'outil externe spécifié dans la liste déroulante.

La section "Configurations de la barre d'outils" contient les deux configurations de base de la barre d'outils qu'il est possible de choisir et de modifier à convenance.

Editeur

Paramètres qui influent sur l'édition des codes sources

Enregistrement automatique avant 'Compiler/Exécuter'
Enregistre le code source en cours d'édition avant chaque 'Compiler/Exécuter'. A noter que les fichiers inclus ne sont jamais enregistrés automatiquement.

Enregistrement automatique avant 'Créer un exécutable'
Enregistre le code source en cours d'édition avant de créer un fichier exécutable.

Enregistrement automatique de toutes les sources ouvertes
Enregistre toutes les sources et pas seulement la source en cours avec l'une des options de sauvegarde automatique .

Monitor open files for changes on disk (Surveillance des fichiers ouverts)
Surveille tous les fichiers ouverts pour prendre en compte les modifications apportées aux fichiers sur le disque alors qu'ils sont édités dans l'IDE. Si des modifications sont apportées par d'autres programmes, un message d'avertissement s'affiche avec le choix de recharger le fichier à partir du disque.

Mémoriser la position du curseur
Enregistre la position du curseur ainsi que l'état de tous les replis pour le fichier en cours d'édition.

Mémoriser la position des marqueurs
Enregistre la position des marqueurs pour le fichier en cours d'édition.

Toujours cacher le journal d'erreurs
Le journal d'erreurs est montré ou caché en fonction de la configuration de chaque code source. Cette option permet de s'assurer que le journal d'erreurs ne sera jamais affiché si l'utilisateur le souhaite. La partie du menu concernant le journal d'erreur est aussi supprimée.

Enregistrer les options
Permet de déterminer où les options propres à chaque fichier doivent être enregistrées:

à la fin du fichier source
Enregistre les options dans un bloc de commentaire à la fin du fichier. Lorsqu'un fichier contenant ce type de commentaires est ouvert par l'IDE, ils resteront invisibles.

dans un fichier <nomdufichier>.pb.cfg
Crée un fichier .pb.cfg pour chaque fichier enregistré qui contient ces informations.

dans un fichier project.cfg pour chaque répertoire
Crée un fichier nommé project.cfg dans chaque répertoire ou des fichiers PureBasic sont enregistrés. Ce fichier contiendra les options de tous les fichiers du répertoire.

nulle part
Les options ne sont pas enregistrées du tout. Quand les fichiers seront ouverts, ils utiliseront toujours les valeurs par défaut.

Valeur d'une tabulation
Permet de spécifier le nombre d'espace qui seront insérés à chaque tabulation.

Utiliser les vraies tabulations (Ascii 9)
Si cette option est activée, les tabulations utiliseront le caractère 'tab' au lieu des espaces. A noter que si cette option est activée, le champ "Valeur d'une tabulation" défini la taille de la tabulation affichée.

Répertoire par défaut
Défini le répertoire par défaut qui sera utilisé par les commandes "Ouvrir" et "Enregistrer" si aucun fichier n'est ouvert, ou que le fichier en cours d'édition n'a pas encore été enregistré. Il est conseillé de mettre le répertoire où sont principalement stockés les codes sources.

Editeur - Polices/Marges

Utiliser "Sélectionner une police" pour changer la police de caractère utilisée pour l'affichage du code source. Pour assurer une bonne lisibilité du code, la police doit être de taille fixe (c'est à dire que tous les caractères ont la même largeur), si possible même pour les lettres en gras.

Activer la coloration syntaxique
Active ou désactive la coloration des codes sources. Le désactiver rend l'IDE légèrement plus rapide, mais bien moins convivial.

Afficher les mot clefs en gras
Si la police de caractère n'affiche pas les lettres en gras avec la même taille que les lettres normales, il est conseillé de désactiver cette option.

Activer la correction de la casse
Corrige automatiquement les mots clefs PureBasic, les fonctions PureBasic et API ainsi que les constantes prédéfinies pour qu'ils soient exactement comme définis initialement (ex: 'openwindow()' sera automatiquement changé en 'OpenWindow()').

Activer les marqueurs de parenthèses
Active le marquage des parenthèses lorsque le curseur se trouve sur une parenthèse. Cela permet de vérifier rapidement s'il y a le bon nombre de parenthèse, et de savoir à quelle parenthèse fermante correspond la parenthèse ouvrante (et vice-versa).

Activer les marqueurs de mots-clés
Permet de souligner tous les mots-clés en rapport avec le mot-clé actuellement sous le curseur.

Afficher la numérotation des lignes
Affiche ou cache la numérotation des lignes située à gauche de la zone d'édition.

Activer les marqueurs
Active ou désactive la fonctionnalité "Marqueur" du menu d'édition.

Activer la possibilité de replier le code
Active ou désactive la possibilité de replier ou non le code. Si les "replis" et les "marqueurs" sont désactivés, alors la colonne à gauche de la zone d'édition dédiée aux symboles sera cachée.

Editeur - Couleurs

Cette partie permet de modifier les couleurs utilisées par la coloration syntaxique ainsi que les marqueurs du débogueur. Des configurations prédéfinies sont disponibles dans la liste déroulante en bas de la fenêtre (une fois appliquées, elles sont modifiables). Chaque couleur peut être désactivée en utilisant les cases à cocher.

Note : Le modèle de couleur 'Accessibility' a (indépendamment des couleurs à fort contraste) un réglage spécial pour utiliser toujours la couleur système pour la sélection dans l'éditeur. Ceci permet aux applications qui permettent de lire un écran de mieux détecter le texte sélectionné.

Editeur - Couleurs - Mots Clés personnalisés

Dans cette section, une liste de mots-clés personnalisés peuvt être définie. Ces mots-clés peuvent avoir une couleur spéciale qui leur est attribuée dans les options de couleur et l'IDE l'appliquera si cette fonction est activée. Cela permet d'appliquer une couleur particulière aux mots-clés par des outils-préprocesseurs ou des macros, ou tout simplement pour avoir des mots-clés PB colorés différemment.

Notez que ces mots-clés priment alors cela permet de changer la correction de couleur ou la casse même pour les mots-clés PureBasic.

Les mots-clés peuvent être entrés directement dans les préférences ou spécifiés dans un fichier texte avec un mot-clé par ligne. (ou les deux)

Editeur - Replis

Il est possible d'ajouter des mots clefs pour marquer le début et la fin d'un bloc repliable dans le code source. Un nombre illimité de mots clefs peuvent être saisis. Les mots qui sont dans les commentaires sont ignorés sauf si le mot clef employé a pour initiale le symbole commentaire (comme le mot clef par défaut ";{").
Un mot clef ne peut pas contenir d'espace.

Editeur - Indentation

Ici il est possible de paramétrer comment l'éditeur gère l'indentation du code quand la touche "Entrée" est appuyée.

Aucune indentation
Appuyer sur la touche "Entrée" place toujours le curseur au début de la ligne suivante.

Mode bloc
La nouvelle ligne aura la même indentation que la ligne courante.

Sensible au mot-clé
Appuyer sur la touche "Entrée" corrigera l'indentation de la ligne courante et de la nouvelle ligne, en fonction du mot-clé présent sur ces lignes. Les règles pour effectuer cette correction sont spécifiés dans la liste des mots-clés. Ces règles s'appliquent aussi lors d'un "Reformatter sélection" du menu édition.

Afficher les indentations
Affiche des lignes verticales pour visualiser les indentations de chaque ligne. Cela montre plus rapidement les lignes ayant le même niveau d'indentation.

Afficher les espaces
Affiche les caractères d'espacement sous forme de points (espaces) ou flèches (tabulations).

La liste des mots-clés contient les mot-clés qui influencent l'indentation. Le paramètre "Avant" indique le changement d'indentation sur le ligne qui contient le mot-clé, tandis que le paramètre "Après" spécfie le changement à appliquer sur la ligne suivante.

Editeur - Auto-complétion

Afficher toute la liste des mots auto-complétables
Affiche toujours toute la liste des mots qui sont gérés par l'auto-complétion, mais choisi tout le même le mot le plus proche.

Afficher tous les mots commencant par le 1er caractère
Affiche uniquement les mots qui commencent par le premier caractère saisi. Le mot le plus proche est tout de même sélectionné.

Afficher seulement les mots commençant par le terme saisi
Affiche seulement les mots commençant par le terme saisi. Si aucun mot ne correspond, la liste ne sera pas affichée du tout.

Largeur de la liste / Hauteur de la liste
La dimension de la liste d'auto-complétion peut être définie ici (en pixels). Note : C'est les valeurs maximum. La fenêtre de la liste peut être plus petite s'il y a très peu d'éléments à afficher.

Ajout des parenthèses aux fonctions/tableaux/listes
Ajoute automatiquement la parenthèse ouvrante "(" après charque fonction, tableau ou liste insérée par l'auto-complétion. Les fonctions sans paramètres et les listes chainées auront automatiquement les double parenthèses "()" ajoutées.

Ajout d'un espace après les mots-clefs PureBasic suivis d'une expression
Quand un mot clef PureBasic ne peut pas être utilisé tout seul (tel que If, For, While etc.) et nécessite une expression, un espace sera automatiquement ajouté lors de l'auto-complétion.

Ajout du mot clef de fermeture si Tabulation/Entrée est appuyée deux fois
Si la touche 'Entrée' ou 'Tabulation' est appuyée deux fois, le mot clef de fermeture sera automatiquement inséré (ex: "EndSelect" pour "Select", "EndIf " pour "If") après le mot clef lui-même (et après le curseur, dont il possible de continuer l'édition immédiatement après l'auto-complétion).

Afficher automatiquement la fenêtre de complétion pour les champs de structure
Affiche automatiquement la liste d'auto-complétion quand le curseur est juste après une variable associée à une structure ou à une interface et que la touche "\" est entrée. La liste contiendra tous les champs qui composent la structure ou l'interface. Si cette option est désactivée, la liste peut toujours être affichée manuellement en utilisant le raccourci clavier associé (par défaut Ctrl+Espace).

Afficher automatiquement la fenêtre de complétion des fonctions
Affiche automatiquement la liste d'auto-complétion après qu'un nombre de caractères aient été entrés et qu'un ou plusieurs mots peuvent correspondre. Si cette option est désactivée, la liste peut toujours être affichée manuellement en utilisant le raccourci clavier associé (par défaut Ctrl+Espace).

Désactiver l'affichage de la liste dans les commentaires
Désactive l'affichage de la liste d'auto-complétion lorsque que le curseur se situe dans un commentaire.

Désactiver l'affichage de la liste dans les chaînes
Désactive l'affichage de la liste d'auto-complétion lorsque que le curseur se situe dans une chaîne de caractères (entre "").

Caractères requis avant l'affichage de la liste
Permet le configurer le nombre minimum de caractères saisis avant que la liste ne soit automatiquement affichée.

Editeur - Auto-complétion - Eléments affichés

Permet d'ajuster avec précision quels éléments seront affichés dans la liste d'auto-complétion.

Eléments du code source
Eléments défini dans le code source actuel, ou dans les autres sources ouverts (voir ci-dessous).

Eléments prédéfinis
Eléments qui sont prédéfinis par PureBasic, comme les mots-clés, les fonctions ou les constantes.

Ajouter les éléments: du code source courant seulement
Les éléments ajoutés dans la liste de complétion sont seulement récupérés du code source courant.

Ajouter les éléments: du projet courant (si présent)
Les éléments ajoutés dans la liste de complétion sont récupérés à partir du projet courant, s'il y en a un. Les autres code sources du projet n'ont pas à être obligatoirement ouverts dans l'IDE pour que ce soit fonctionnel.

Ajouter les éléments: du projet courant ou de tous les fichiers (si aucun)
Les éléments ajoutés dans la liste de complétion sont récupérés à partir du projet courant, s'il y en a un. Si le code source courant n'appartient pas au projet courant, tous les éléments des codes sources ouverts seront pris en compte.

Ajouter les éléments: de tous les fichiers ouverts
Les éléments ajoutés dans la liste de complétion sont récupérés à partir de tous les fichiers ouverts dans l'IDE.

Compilateur

Cette section permet de configurer un compilateur additionnel qui sera ensuite disponible pour les options compilations. Ainsi, il est possible d'échanger rapidement le compilateur (x86 vers x64 par exemple) ou meme d'utiliser d'anciens compilateurs directement dans le nouvel IDE.

N'importe quel compilateur à partir de la version 4.10 peut être ajouté ici. Le type de processeur supporté n'a pas à être le même que celui de l'IDE, tant que le système d'exploitation est identique. La liste affiche la version du compilateur et son chemin.

Les informations utilisées par l'IDE (pour la coloration syntaxique, l'autocomplétion, le visualisateur de structures) proviennent toujours du compilateur par défaut. Les compilateurs additionnels ne servent que pour la compilation.

Compilateur - Défauts

Cette page permet de régler les options par défaut qui seront utilisées lors de la création d'un nouveau fichier source à l'aide de l'IDE.

Pour une explication des paramètres, voir les options compilations.

Débogueur

Permet de paramétrer le comportement du débogueur intégré ou indépendant. Le débogueur en ligne de commande ne se configure que par l'intermédiaire du terminal.

Type de débogueur
Sélectionne le type du débogueur à utiliser lorsqu'un programme est compilé dans l'IDE.

Enregistrer la position des fenêtres du débogueur
Même fonction que l'option "Mémoriser la position des fenêtres" de la section "Général", mais appliquée aux fenêtres du débogueur.

Garder les fenêtres du débogueur en premier plan
Toutes les fenêtres de débuggage seront au toujours premier plan, même devant les autres applications. Cela peut faciliter le débuggage des applications prenant toute la surface du bureau.

Mettre les fenêtres du débogueur au premier plan quand une est sélectionnée
Avec cette option activée, lorsqu'une fenêtre de débuggage est activée à l'aide de la souris ou du clavier, les autres fenêtres ouvertes sont automatiquement ramenées au premier plan.

Ajouter l'heure dans le rapport d'activité
Ajoute l'heure de chaque évènement dans le rapport d'activité.

Arrêter l'exécution au démarrage du programme
Chaque programme sera stoppé au début de son exécution, pour donner la possibilité de dérouler le programme pas à pas (sans avoir besoin de mettre un point d'arrêt au début de chaque source).

Arrêter l'exécution avant l'arrêt du programme
Chaque programme sera stoppé juste avant de quitter réellement. Cela permet par exemple d'utiliser les outils de débuggage pour examiner les variables ou la memoire avant que le programme ne quitte.

Arrêter le programme après une erreur
Si le programme rencontre une erreur, il sera alors terminé automatiquement et toutes les fenêtres du débogueur seront fermées. Cela permet d'éditer le code immédiatement après une erreur, mais ce n'est plus possible d'examiner le programme pour essayer de déterminer la cause de l'erreur.

Garder les marqueurs d'erreurs après la fin du programme
N'efface pas les marqueurs d'erreurs quand le programme se termine. Cela permet de voir plus clairement ou l'erreur est survenue lors du retour à l'édition du code. Les marqueurs peuvent ensuite être enlevés à l'aide de la commande "Effacer les marqueurs d'erreurs" du sous-menu "Rapport d'activité".

Effacer le rapport d'activité à chaque exécution
Efface le rapport d'activité à chaque fois qu'un programme est exécuté. Cela assure que le rapport ne deviendra pas trop conséquent (cette option est aussi disponible quand le débogueur en ligne de commande est sélectionné).

Delai maximum pour le lancement du débogueur
Indique le temps maximum, en millisecondes, qui sera donné au programme pour s'initialiser. Ce delai évite que le débogueur ne bloque indéfiniment si l'exécutable à déboguer ne peut pas se lancer, pour une raison ou pour une autre.

Débogueur - Configuration des outils

Cela permet de contrôler l'affichage et le comportement des outils intégrés au débogueur. Les options "Afficher les valeurs en hexadecimal" change l'affichage des octets, word ou long du format décimal (base 10) au format hexadécimal (base 16).

Fenêtre de débogage – Ajouter l'heure
Ajoute l'heure à chaque ligne affichée dans la fenêtre de débogage.

Fenêtre de débogage - Affiche les messages de débogage dans le rapport d'activité
Avec cette option activée, une commande Debug dans le code n'ouvrira pas la fenêtre du débogueur, mais affichera les messages de débogage dans le rapport d'activité.

Fenêtre de débogage – Utilise une police personnalisée
Une police personnalisée peut être sélectionnée pour l'affichage dans la fenêtre de débogage. Ce qui permet de choisir une petite police pour afficher plus de données ou de choisir une police avec une taille proportionnelle quand c'est nécessaire.

Profileur - Lancer le profileur au démarrage du programme
Détermine si le profileur commencera l'enregistrement des données au démarrage du programme.

Débogueur ASM – Actualiser automatiquement l'état de la pile
Met à jour automatiquement l'état de la pile à chaque "Pas" ou "Stop" effectués. Si cette option est désactivée, un bouton "Actualiser" sera affiché dans la fenêtre ASM.

Observateur de mémoire – Voir les tableaux en une seule colonne
Si la zone de mémoire est affichée en mode "tableau", cette option indique si ce tableau sera multi-colonnes (avec 16 octets par colonne) ou seulement avec une colonne.

Débogueur - Fenêtres ouvertes

Les fenêtres cochées sur cette page seront ouvertes automatiquement à chaque fois qu'un programme sera lancé avec le débogueur.

Palette d'outils

Gère la configuration des outils internes qui peuvent être affichés dans le panneau latéral. Chaque outil qui est dans la liste des "Outils affichés" sera affiché dans la palette d'outil. Les outils qui ne sont pas présents dans cette liste sont accessibles à partir du menu "Outils". Ils seront ouverts dans une fenêtre indépendante.
Il est préférable de ne mettre que les outils qui sont utilisés très fréquemment dans la palette d'outil, et de mettre le plus utilisé en premier, car c'est celui qui est affiché le premier lorsque l'IDE démarre.

En sélectionnant un outil dans l'une des deux listes, un panneau de configuration spécifique à cet outil (si il y en a un) apparaîtra dans la partie "Configuration".

Les outils suivants peuvent être configurés:

Exploreur
Il est possible de choisir entre un affichage en mode liste ou en mode hierarchique (arbre) et de mémoriser ou non le dernier répertoire affiché (s'il n'est pas mémorisé, alors le "Répertoire par défaut" défini dans les options "Général" sera utilisé)

Navigateur de procédures
"Trier les procédures par nom": trie la liste des procédures par ordre alphabétique (par défaut, les procédures apparaissent dans l'ordre de leurs déclarations)
"Grouper les marqueurs": groupe les marqueurs (";-") entre eux.
"Afficher les arguments des procédures": Affiche le nom de la procédure et tous ses paramètres.

Visualisateur de variables
L'option "Afficher les éléments de tous les fichiers ouverts" détermine si la liste doit contenir les éléments du fichier en cours d'édition, ou de tous les fichiers actuellement ouverts par l'IDE.
De plus, il est possible de sélectionner le type d'éléments qui seront affichés dans le visualisateur de variables.

Help Tool (Outils Aide)
Appuyer sur F1 ouvre l'aide dans le panneau: Spécifie s'il faut ouvrir l'outil d'aide au lieu du visualisateur d'aide lorsque F1 est pressé.

Palette d'outils - Options

L'apparence de la palette d'outil en elle même peut être configurée dans cette section: le côté qui sera utilisé pour afficher la palette (à droite ou à gauche de la zone d'édition), la police de caractères, ainsi que la couleur de fond et d'avant plan utilisée par les outils affichés. La police et les couleurs optionnelles peuvent être désactivées pour utiliser les valeurs par défaut de l'OS.

Ignorer la couleur/police dans les fenêtres indépendantes
Si cette option est activée, les options de couleur/police ne seront appliquées que si l'outil est affiché dans la palette d'outils (ceux ouverts via le menu "Outils" utiliseront la couleur/police par défaut).

Cacher automatiquement la palette d'outils
Pour gagner un peu de place, la palette d'outils peut se cacher automatiquement si la souris ne se trouve pas au dessus d'elle. Pour la faire réapparaître, il suffit de déplacer la souris sur la zone située sur le côté de la zone d'édition.

Délai en millisecondes avant de cacher la palette
Défini un délai (en ms), après lequel la palette d'outils sera cachée si la souris n'est plus au dessus d'elle.

Importer/Exporter

Il est possible d'importer et d'exporter la configuration de l'IDE dans un format indépendant, et de l'importer dans un autre IDE (sous un autre OS par exemple, ou pour le partager avec d'autres utilisateurs).

Pour réaliser une exportation, il faut sélectionner le type des paramètres à exporter, saisir un nom de fichier et cliquer sur le bouton "Enregistrer"

Pour importer des paramètres, il suffit de choisir le nom du fichier et de cliquer sur "Ouvrir". Les paramètres disponibles seront alors affichés, il faudra décocher les paramètres indésirables puis cliquer sur "Importer".

Pour que les nouveaux paramètres prennent effet, il faudra appuyer sur le bouton "Appliquer".

Note: il est possible d'importer les fichiers 'styles' de l'éditeur jaPBe, mais seul les paramètres concernant les couleurs seront importés.


Commutateurs de la ligne de commande

L'IDE de PureBasic permet de modifier les chemins et les fichiers utilisés lors de son lancement. Cela permet de créer plusieurs raccourcis qui vont lancer l'IDE avec une configuration particulière pour chaque utilisateur, ou pour chaque projet.

Les paramètres possibles sont:

  /P <fichier Préférences> charge (et enregistre) la configuration à partir du fichier spécifié.
  /T <Templates file>      charge (et enregistre) les modèles de code à partir du fichier spécifié.
  /A <tools file>          charge (et enregistre) la configuration des outils externes à partir du fichier spécifié.
  /S <Source path>         change l'option "Répertoire principal" des préférences.
  /E <Explorer path>       démarre l'outil 'Explorer' avec le chemin spécifié.
  /L <Line number>         déplace le curseur à la ligne indiqué (seulement dans le dernier fichier chargé).
  /NOEXT                   désactive l'association automatique des fichiers '.pb' dans la base de registre.
  /LOCAL                   place tous les fichiers préférences dans le répertoire de PureBasic au lieu du répertoire personnel de l'utilisateur.
  /PORTABLE                combinaison de /LOCAL et de /NOEXT
Options pour compiler les projets:
  /BUILD <file>            spécifie le fichier de projet à construire
  /TARGET <target>         spécifie la cible à construire (la valeur par défaut est de construire toutes les cibles)
  /QUIET                   cache tous les messages lors de la construction sauf les erreurs
  /READONLY                ne met pas à jour le fichier de projet après la compilation (ni nouvelle date d'accès et ni nouveaux compteurs de construction )
Par défaut, les fichiers utilisés par les paramètres /P /T et /A se trouvent dans le répertoire %APPDATA%\PureBasic\.

Le paramètre /NOEXT est particulièrement utile lorque plusieurs versions de PureBasic cohabitent sur un même système (pour tester les versions bêta par exemple). Ainsi les fichiers .pb seront toujours associés à la même version de PureBasic.
Le paramètre /PORTABLE peut être utilisé afin de garder l'ensemble de la configuration dans le répertoire local pour copier facilement PureBasic sur différents ordinateurs (ou le faire fonctionner depuis une clé USB par exemple).

Il est aussi possible d'ajouter des noms de fichiers à ouvrir sur la ligne de commande (et même de spécifier un masque, par exemple "*.pb" chargera tous les fichiers sources d'un répertoire).


PureBasic - Manuel de référence

L'IDE PureBasic

Débuter avec l'IDE
Gestion des fichiers
Edition du code
Gestion des projets
Compilation d'un programme
Utiliser le débogueur
Utiliser les outils de débogage
Les outils intégrés
Les outils externes
Obtenir de l'aide
Configurer l'IDE
Commutateurs de la ligne de commande

Thèmes généraux

Utiliser l'éditeur visuel
Utiliser le compilateur SHELL
Règles de syntaxe générales
Variables, Types et Opérateurs

Mots clefs de base

Break : Continue
For : Next
ForEach : Next
Gosub : Return
If : Else : EndIf
Repeat : Until
Select : EndSelect
While : Wend
Autres commandes

Tableaux, Listes, Map et Structures

Define
 Dim : ReDim
Enumeration : EndEnumeration
Interface : EndInterface
NewList
NewMap
Structure : EndStructure
With : EndWith

Procédures et portées des variables

Procedure : EndProcedure
Global
Protected
Shared
Static

Mots clefs avancés

Import : EndImport
Macro : EndMacro
Prototype
Pseudotype
Threaded

Thèmes divers

Les objets PureBasic
Numéros et Identifiants (Handles)
Gestion des messages Windows
Pointeurs et accès mémoire
Data (stockage de données)
Commandes de débogage
Les fonctions 'Include'
Les directives du compilateur
Les fonctions du compilateur
L'assembleur en ligne x86
Construire une DLL
Unicode
Sous Systems
Résidents
Utiliser plusieurs versions de PureBasic

Informations supplémentaires

Bases numériques / Table d'équivalence Dec/Bin/Hexa
Formules mathématiques (géométrie 2D)
Table des codes ASCII et leur correspondance
Table des couleurs
Numéros de port (réseau)
Liens internet utiles

Bibliothèques générales

2D Drawing
Array
AudioCD
Cipher
Clipboard
Console
Database
Date
Debugger
Desktop
Drag & Drop
File
FileSystem
Ftp
Font
Gadget
Help
Http
Image
ImagePlugin
Library
Linked List
Mail
Map
Math
Memory
Menu
Misc
Movie
Network
OnError
Packer
Preference
Printer
Process
Regular Expression
Requester
Scintilla
Serial Port
Sort
StatusBar
String
System
SysTray
Thread
Toolbar
Window
XML

Bibliothèques pour les jeux 2D

Joystick
Keyboard
Module
Mouse
Palette
Sprite & Screen
Sprite3D
Sound
SoundPlugin

Bibliothèques pour les jeux 3D

Engine3D
Billboard
Camera
Entity
Entity Animation
Gadget 3D
Joint
Light
Material
Mesh
Node
Node Animation
Particle
Sound 3D
Special Effect
Spline
Static Geometry
Terrain
Text3D
Texture
Vertex Animation
Window 3D

Index des commandes intégrées


PureBasic - Index

A - B - C - D - E - F - G - H - I - J - K - L - M - N - O - P - R - S - T - U - V - W - X - Y - Z

A
ACos
ACosH
AESDecoder
AESEncoder
ASin
ASinH
ATan
ATan2
ATanH
AbortFTPFile
Abs
Add3DArchive
AddBillboard
AddCipherBuffer
AddDate
AddElement
AddEntityAnimationTime
AddGadgetColumn
AddGadgetItem
AddGadgetItem3D
AddKeyboardShortcut
AddMailAttachment
AddMailAttachmentData
AddMailRecipient
AddMapElement
AddMaterialLayer
AddNodeAnimationTime
AddPackFile
AddPackMemory
AddSplinePoint
AddStaticGeometryEntity
AddStatusBarField
AddSubMesh
AddSysTrayIcon
AddTerrainTexture
AddVertexPoseReference
AddWindowTimer
AffectedDatabaseRows
AllocateMemory
Alpha
AlphaBlend
AmbientColor
AntialiasingMode
ApplyEntityForce
ApplyEntityImpulse
ArraySize
Asc
AttachEntityObject
AttachNodeObject
AttachRibbonEffect
AudioCDLength
AudioCDName
AudioCDStatus
AudioCDTrackLength
AudioCDTrackSeconds
AudioCDTracks
AvailableProgramOutput
AvailableScreenMemory
AvailableSerialPortInput
AvailableSerialPortOutput
B
BackColor
Base64Decoder
Base64Encoder
BillboardGroupID
BillboardGroupMaterial
BillboardGroupX
BillboardGroupY
BillboardGroupZ
BillboardHeight
BillboardLocate
BillboardWidth
BillboardX
BillboardY
BillboardZ
Bin
Blue
Box
BoxedGradient
BuildMeshShadowVolume
BuildStaticGeometry
BuildTerrain
ButtonGadget
ButtonGadget3D
ButtonImageGadget
C
CRC32FileFingerprint
CRC32Fingerprint
CalendarGadget
CallCFunction
CallCFunctionFast
CallFunction
CallFunctionFast
CameraBackColor
CameraDirection
CameraDirectionX
CameraDirectionY
CameraDirectionZ
CameraFOV
CameraFixedYawAxis
CameraID
CameraLookAt
CameraPitch
CameraProjectionMode
CameraProjectionX
CameraProjectionY
CameraRange
CameraRenderMode
CameraRoll
CameraViewHeight
CameraViewWidth
CameraViewX
CameraViewY
CameraX
CameraY
CameraYaw
CameraZ
CanvasGadget
CanvasOutput
CatchImage
CatchModule
CatchSound
CatchSprite
CatchXML
ChangeAlphaIntensity
ChangeCurrentElement
ChangeGamma
ChangeSysTrayIcon
CheckBoxGadget
CheckBoxGadget3D
CheckDatabaseNull
CheckFTPConnection
CheckFilename
ChildXMLNode
Chr
Circle
CircularGradient
ClearBillboards
ClearClipboard
ClearConsole
ClearDebugOutput
ClearGadgetItems
ClearGadgetItems3D
ClearList
ClearMap
ClearScreen
ClearSpline
ClipSprite
CloseConsole
CloseCryptRandom
CloseDatabase
CloseFTP
CloseFile
CloseGadgetList
CloseGadgetList3D
CloseHelp
CloseLibrary
CloseNetworkConnection
CloseNetworkServer
ClosePack
ClosePreferences
CloseProgram
CloseScreen
CloseSerialPort
CloseSubMenu
CloseWindow
CloseWindow3D
CocoaMessage
ColorRequester
ComboBoxGadget
ComboBoxGadget3D
CompareMemory
CompareMemoryString
CompositorEffectParameter
CompressMemory
ComputeSpline
ComputerName
ConeTwistJoint
ConicalGradient
ConnectionID
ConsoleColor
ConsoleCursor
ConsoleError
ConsoleLocate
ConsoleTitle
ContainerGadget
ContainerGadget3D
ConvertLocalToWorldPosition
ConvertWorldToLocalPosition
CopyArray
CopyDirectory
CopyEntity
CopyFile
CopyImage
CopyLight
CopyList
CopyMap
CopyMaterial
CopyMemory
CopyMemoryString
CopyMesh
CopySprite
CopyXMLNode
Cos
CosH
CountBillboards
CountCPUs
CountGadgetItems
CountGadgetItems3D
CountLibraryFunctions
CountMaterialLayers
CountProgramParameters
CountRenderedTriangles
CountSplinePoints
CountString
CreateBillboardGroup
CreateCamera
CreateCompositorEffect
CreateCube
CreateCubeMapTexture
CreateCylinder
CreateDirectory
CreateEntity
CreateFTPDirectory
CreateFile
CreateImage
CreateImageMenu
CreateLensFlareEffect
CreateLight
CreateLine3D
CreateMail
CreateMaterial
CreateMenu
CreateMesh
CreateMutex
CreateNetworkServer
CreateNode
CreateNodeAnimation
CreateNodeAnimationKeyFrame
CreatePack
CreatePalette
CreateParticleEmitter
CreatePlane
CreatePopupImageMenu
CreatePopupMenu
CreatePreferences
CreateRegularExpression
CreateRenderTexture
CreateRibbonEffect
CreateSemaphore
CreateSphere
CreateSpline
CreateSprite
CreateSprite3D
CreateStaticGeometry
CreateStatusBar
CreateTerrain
CreateText3D
CreateTexture
CreateThread
CreateToolBar
CreateVertexAnimation
CreateVertexPoseKeyFrame
CreateVertexTrack
CreateWater
CreateXML
CreateXMLNode
CryptRandom
CryptRandomData
CustomFilterCallback
CustomGradient
D
DESFingerprint
DatabaseColumnIndex
DatabaseColumnName
DatabaseColumnSize
DatabaseColumnType
DatabaseColumns
DatabaseDriverDescription
DatabaseDriverName
DatabaseError
DatabaseID
DatabaseQuery
DatabaseUpdate
Date
DateGadget
Day
DayOfWeek
DayOfYear
DefaultPrinter
DefineTerrainTile
Degree
Delay
DeleteDirectory
DeleteElement
DeleteFTPDirectory
DeleteFTPFile
DeleteFile
DeleteMapElement
DeleteXMLNode
DesktopDepth
DesktopFrequency
DesktopHeight
DesktopMouseX
DesktopMouseY
DesktopName
DesktopWidth
DesktopX
DesktopY
DetachEntityObject
DetachNodeObject
DetachRibbonEffect
DirectoryEntryAttributes
DirectoryEntryDate
DirectoryEntryName
DirectoryEntrySize
DirectoryEntryType
DisableEntityBody
DisableGadget
DisableGadget3D
DisableLightShadow
DisableMaterialLighting
DisableMenuItem
DisableToolBarButton
DisableWindow
DisableWindow3D
DisplayAlphaSprite
DisplayPalette
DisplayPopupMenu
DisplayRGBFilter
DisplayShadowSprite
DisplaySolidSprite
DisplaySprite
DisplaySprite3D
DisplayTranslucentSprite
DisplayTransparentSprite
DoubleClickTime
DragFiles
DragImage
DragOSFormats
DragPrivate
DragText
DrawAlphaImage
DrawImage
DrawRotatedText
DrawText
DrawingBuffer
DrawingBufferPitch
DrawingBufferPixelFormat
DrawingFont
DrawingMode
E
EditorGadget
EditorGadget3D
EjectAudioCD
ElapsedMilliseconds
Ellipse
EllipticalGradient
EnableGadgetDrop
EnableGraphicalConsole
EnableHingeJointAngularMotor
EnableManualEntityBoneControl
EnableWindowDrop
EnableWorldCollisions
EnableWorldPhysics
EncodeImage
Engine3DFrameRate
EntityAngularFactor
EntityAnimationBlendMode
EntityAnimationStatus
EntityBonePitch
EntityBoneRoll
EntityBoneX
EntityBoneY
EntityBoneYaw
EntityBoneZ
EntityBoundingBox
EntityCollide
EntityCubeMapTexture
EntityCustomParameter
EntityFixedYawAxis
EntityID
EntityLinearFactor
EntityLookAt
EntityParentNode
EntityPhysicBody
EntityPitch
EntityRenderMode
EntityRoll
EntityVelocity
EntityX
EntityY
EntityYaw
EntityZ
EnvironmentVariableName
EnvironmentVariableValue
Eof
ErrorAddress
ErrorCode
ErrorFile
ErrorLine
ErrorMessage
ErrorRegister
ErrorTargetAddress
EventClient
EventData
EventDropAction
EventDropBuffer
EventDropFiles
EventDropImage
EventDropPrivate
EventDropSize
EventDropText
EventDropType
EventDropX
EventDropY
EventGadget
EventGadget3D
EventMenu
EventServer
EventTimer
EventType
EventType3D
EventWindow
EventWindow3D
ExamineAssembly
ExamineDatabaseDrivers
ExamineDesktops
ExamineDirectory
ExamineEnvironmentVariables
ExamineFTPDirectory
ExamineIPAddresses
ExamineJoystick
ExamineKeyboard
ExamineLibraryFunctions
ExamineMD5Fingerprint
ExamineMouse
ExaminePack
ExaminePreferenceGroups
ExaminePreferenceKeys
ExamineSHA1Fingerprint
ExamineScreenModes
ExamineXMLAttributes
Exp
ExplorerComboGadget
ExplorerListGadget
ExplorerTreeGadget
ExportXML
ExportXMLSize
ExtractRegularExpression
F
FTPDirectoryEntryAttributes
FTPDirectoryEntryDate
FTPDirectoryEntryName
FTPDirectoryEntryRaw
FTPDirectoryEntrySize
FTPDirectoryEntryType
FTPProgress
FetchOrientation
FileBuffersSize
FileID
FileSeek
FileSize
FillArea
FillMemory
FindMapElement
FindString
FinishCipher
FinishDatabaseQuery
FinishDirectory
FinishFTPDirectory
FinishFingerprint
FinishMesh
FirstDatabaseRow
FirstElement
FlipBuffers
FlushFileBuffers
Fog
FontID
FontRequester
FormatDate
FormatXML
Frame3DGadget
Frame3DGadget3D
FreeArray
FreeBillboardGroup
FreeCamera
FreeEffect
FreeEntity
FreeEntityJoints
FreeFont
FreeGadget
FreeGadget3D
FreeIP
FreeImage
FreeJoint
FreeLight
FreeList
FreeMail
FreeMap
FreeMaterial
FreeMemory
FreeMenu
FreeMesh
FreeModule
FreeMovie
FreeMutex
FreeNode
FreeNodeAnimation
FreePalette
FreeParticleEmitter
FreeRegularExpression
FreeSemaphore
FreeSound
FreeSound3D
FreeSpline
FreeSprite
FreeSprite3D
FreeStaticGeometry
FreeStatusBar
FreeTerrain
FreeText3D
FreeTexture
FreeToolBar
FreeXML
FrontColor
G
GadgetHeight
GadgetHeight3D
GadgetID
GadgetID3D
GadgetItemID
GadgetToolTip
GadgetToolTip3D
GadgetType
GadgetType3D
GadgetWidth
GadgetWidth3D
GadgetX
GadgetX3D
GadgetY
GadgetY3D
GetActiveGadget
GetActiveGadget3D
GetActiveWindow
GetActiveWindow3D
GetClientIP
GetClientPort
GetClipboardImage
GetClipboardText
GetCurrentDirectory
GetDatabaseBlob
GetDatabaseDouble
GetDatabaseFloat
GetDatabaseLong
GetDatabaseQuad
GetDatabaseString
GetEntityAnimationLength
GetEntityAnimationTime
GetEntityAnimationWeight
GetEntityAttribute
GetEntityMaterial
GetEnvironmentVariable
GetExtensionPart
GetFTPDirectory
GetFileAttributes
GetFileDate
GetFilePart
GetFunction
GetFunctionEntry
GetGadgetAttribute
GetGadgetAttribute3D
GetGadgetColor
GetGadgetData
GetGadgetData3D
GetGadgetFont
GetGadgetItemAttribute
GetGadgetItemColor
GetGadgetItemData
GetGadgetItemData3D
GetGadgetItemState
GetGadgetItemState3D
GetGadgetItemText
GetGadgetItemText3D
GetGadgetState
GetGadgetState3D
GetGadgetText
GetGadgetText3D
GetHTTPHeader
GetHomeDirectory
GetJointAttribute
GetLightColor
GetMailAttribute
GetMailBody
GetMaterialAttribute
GetMaterialColor
GetMenuItemState
GetMenuItemText
GetMenuTitleText
GetModulePosition
GetModuleRow
GetNodeAnimationKeyFrameTime
GetNodeAnimationLength
GetNodeAnimationTime
GetNodeAnimationWeight
GetPaletteColor
GetPathPart
GetScriptMaterial
GetScriptParticleEmitter
GetScriptTexture
GetSerialPortStatus
GetSoundFrequency
GetSoundPosition
GetTemporaryDirectory
GetTerrainTileHeightAtPoint
GetTerrainTileLayerBlend
GetToolBarButtonState
GetURLPart
GetW
GetWindowColor
GetWindowState
GetWindowTitle
GetWindowTitle3D
GetX
GetXMLAttribute
GetXMLEncoding
GetXMLNodeName
GetXMLNodeOffset
GetXMLNodeText
GetXMLStandalone
GetY
GetZ
GrabDrawingImage
GrabImage
GrabSprite
GradientColor
Green
H
Hex
HideBillboardGroup
HideEffect
HideEntity
HideGadget
HideGadget3D
HideLight
HideMenu
HideParticleEmitter
HideWindow
HideWindow3D
HingeJoint
HingeJointMotorTarget
HostName
Hour
HyperLinkGadget
I
IPAddressField
IPAddressGadget
IPString
ImageDepth
ImageFormat
ImageGadget
ImageGadget3D
ImageHeight
ImageID
ImageOutput
ImageWidth
Infinity
InitAudioCD
InitEngine3D
InitJoystick
InitKeyboard
InitMouse
InitMovie
InitNetwork
InitPalette
InitScintilla
InitSound
InitSprite
InitSprite3D
Inkey
Input
InputEvent3D
InputRequester
InsertElement
InsertString
InstructionAddress
InstructionString
Int
IntQ
IsBillboardGroup
IsCamera
IsDatabase
IsDirectory
IsEffect
IsEntity
IsFile
IsFingerprint
IsFont
IsFtp
IsGadget
IsGadget3D
IsImage
IsInfinity
IsLibrary
IsLight
IsMail
IsMaterial
IsMenu
IsMesh
IsModule
IsMovie
IsNaN
IsNode
IsPalette
IsParticleEmitter
IsProgram
IsRegularExpression
IsScreenActive
IsSerialPort
IsSound
IsSound3D
IsSprite
IsSprite3D
IsStaticGeometry
IsStatusBar
IsSysTrayIcon
IsText3D
IsTexture
IsThread
IsToolBar
IsWindow
IsWindow3D
IsXML
J
JoystickAxisX
JoystickAxisY
JoystickButton
K
KeyboardInkey
KeyboardMode
KeyboardPushed
KeyboardReleased
KillProgram
KillThread
L
LCase
LSet
LTrim
LastElement
Left
Len
LensFlareEffectColor
LibraryFunctionAddress
LibraryFunctionName
LibraryID
LightAttenuation
LightDirection
LightDirectionX
LightDirectionY
LightDirectionZ
LightID
LightLookAt
LightPitch
LightRoll
LightX
LightY
LightYaw
LightZ
Line
LineXY
LinearGradient
ListIconGadget
ListIndex
ListSize
ListViewGadget
ListViewGadget3D
LoadFont
LoadImage
LoadMesh
LoadModule
LoadMovie
LoadPalette
LoadSound
LoadSound3D
LoadSprite
LoadTexture
LoadWorld
LoadXML
Loc
LockMutex
Lof
Log
Log10
M
MD5FileFingerprint
MD5Fingerprint
MDIGadget
MailProgress
MainXMLNode
MakeIPAddress
MapKey
MapSize
MatchRegularExpression
MaterialBlendingMode
MaterialCullingMode
MaterialDepthWrite
MaterialFilteringMode
MaterialFog
MaterialID
MaterialShadingMode
MaterialShininess
MemorySize
MemoryStatus
MemoryStringLength
MenuBar
MenuHeight
MenuID
MenuItem
MenuTitle
MergeLists
MeshFace
MeshID
MeshIndex
MeshPoseCount
MeshPoseName
MeshRadius
MeshVertexColor
MeshVertexCount
MeshVertexNormal
MeshVertexPosition
MeshVertexTextureCoordinate
MessageRequester
Mid
Minute
Mod
ModuleVolume
Month
MouseButton
MouseDeltaX
MouseDeltaY
MouseLocate
MousePick
MouseRayCast
MouseWheel
MouseX
MouseY
MoveBillboard
MoveBillboardGroup
MoveCamera
MoveElement
MoveEntity
MoveEntityBone
MoveLight
MoveMemory
MoveNode
MoveParticleEmitter
MoveText3D
MoveXMLNode
MovieAudio
MovieHeight
MovieInfo
MovieLength
MovieSeek
MovieStatus
MovieWidth
N
NaN
NetworkClientEvent
NetworkServerEvent
NewPrinterPage
NextDatabaseDriver
NextDatabaseRow
NextDirectoryEntry
NextElement
NextEnvironmentVariable
NextFTPDirectoryEntry
NextFingerprint
NextIPAddress
NextInstruction
NextLibraryFunction
NextMapElement
NextPackEntry
NextPreferenceGroup
NextPreferenceKey
NextScreenMode
NextSelectedFileName
NextXMLAttribute
NextXMLNode
NodeAnimationKeyFramePitch
NodeAnimationKeyFramePosition
NodeAnimationKeyFrameRoll
NodeAnimationKeyFrameRotation
NodeAnimationKeyFrameScale
NodeAnimationKeyFrameX
NodeAnimationKeyFrameY
NodeAnimationKeyFrameYaw
NodeAnimationKeyFrameZ
NodeAnimationStatus
NodeFixedYawAxis
NodeID
NodeLookAt
NodePitch
NodeRoll
NodeX
NodeY
NodeYaw
NodeZ
NormalX
NormalY
NormalZ
NormalizeMesh
O
OSVersion
OnErrorCall
OnErrorDefault
OnErrorExit
OnErrorGoto
OpenConsole
OpenCryptRandom
OpenDatabase
OpenDatabaseRequester
OpenFTP
OpenFile
OpenFileRequester
OpenGadgetList
OpenGadgetList3D
OpenHelp
OpenLibrary
OpenNetworkConnection
OpenPack
OpenPreferences
OpenScreen
OpenSerialPort
OpenSubMenu
OpenWindow
OpenWindow3D
OpenWindowedScreen
OptionGadget
OptionGadget3D
OutputDepth
OutputHeight
OutputWidth
P
PackEntryName
PackEntrySize
PackEntryType
PanelGadget
PanelGadget3D
ParentXMLNode
Parse3DScripts
ParseDate
ParticleColorFader
ParticleColorRange
ParticleEmissionRate
ParticleEmitterDirection
ParticleEmitterID
ParticleEmitterX
ParticleEmitterY
ParticleEmitterZ
ParticleMaterial
ParticleSize
ParticleTimeToLive
ParticleVelocity
PathRequester
PauseAudioCD
PauseMovie
PauseSound
PauseThread
PeekA
PeekB
PeekC
PeekD
PeekF
PeekI
PeekL
PeekQ
PeekS
PeekU
PeekW
PickX
PickY
PickZ
PlayAudioCD
PlayModule
PlayMovie
PlaySound
PlaySound3D
Plot
Point
PointJoint
PointPick
PokeA
PokeB
PokeC
PokeD
PokeF
PokeI
PokeL
PokeQ
PokeS
PokeU
PokeW
PopListPosition
PopMapPosition
PostEvent
Pow
PreferenceComment
PreferenceGroup
PreferenceGroupName
PreferenceKeyName
PreferenceKeyValue
PreviousDatabaseRow
PreviousElement
PreviousXMLNode
Print
PrintN
PrintRequester
PrinterOutput
PrinterPageHeight
PrinterPageWidth
ProgramExitCode
ProgramFilename
ProgramID
ProgramParameter
ProgramRunning
ProgressBarGadget
ProgressBarGadget3D
PurifierGranularity
PushListPosition
PushMapPosition
R
RGB
RGBA
RSet
RTrim
Radian
RaiseError
Random
RandomData
RandomSeed
RandomizeArray
RandomizeList
RawKey
RayCast
RayCollide
RayPick
ReAllocateMemory
ReadAsciiCharacter
ReadByte
ReadCharacter
ReadConsoleData
ReadData
ReadDouble
ReadFile
ReadFloat
ReadInteger
ReadLong
ReadPreferenceDouble
ReadPreferenceFloat
ReadPreferenceInteger
ReadPreferenceLong
ReadPreferenceQuad
ReadPreferenceString
ReadProgramData
ReadProgramError
ReadProgramString
ReadQuad
ReadSerialPortData
ReadString
ReadStringFormat
ReadUnicodeCharacter
ReadWord
ReceiveFTPFile
ReceiveHTTPFile
ReceiveNetworkData
Red
RegularExpressionError
ReleaseMouse
ReloadMaterial
RemoveBillboard
RemoveEnvironmentVariable
RemoveGadgetColumn
RemoveGadgetItem
RemoveGadgetItem3D
RemoveKeyboardShortcut
RemoveMailRecipient
RemoveMaterialLayer
RemovePackFile
RemovePreferenceGroup
RemovePreferenceKey
RemoveString
RemoveSysTrayIcon
RemoveWindowTimer
RemoveXMLAttribute
RenameFTPFile
RenameFile
RenderMovieFrame
RenderWorld
ReplaceRegularExpression
ReplaceString
ResetGradientColors
ResetList
ResetMap
ResetMaterial
ResetProfiler
ResizeBillboard
ResizeGadget
ResizeGadget3D
ResizeImage
ResizeMovie
ResizeParticleEmitter
ResizeWindow
ResizeWindow3D
ResolveXMLAttributeName
ResolveXMLNodeName
ResumeAudioCD
ResumeMovie
ResumeSound
ResumeThread
ReverseString
RibbonEffectColor
RibbonEffectWidth
Right
RootXMLNode
RotateBillboardGroup
RotateCamera
RotateEntity
RotateEntityBone
RotateLight
RotateMaterial
RotateNode
RotateSprite3D
Round
RoundBox
RunProgram
S
SHA1FileFingerprint
SHA1Fingerprint
SaveDebugOutput
SaveFileRequester
SaveImage
SaveMesh
SaveRenderTexture
SaveSprite
SaveTerrain
SaveXML
ScaleEntity
ScaleMaterial
ScaleNode
ScaleText3D
ScintillaGadget
ScintillaSendMessage
ScreenDepth
ScreenHeight
ScreenID
ScreenModeDepth
ScreenModeHeight
ScreenModeRefreshRate
ScreenModeWidth
ScreenOutput
ScreenWidth
ScrollAreaGadget
ScrollAreaGadget3D
ScrollBarGadget
ScrollBarGadget3D
ScrollMaterial
Second
SelectElement
SelectedFilePattern
SelectedFontColor
SelectedFontName
SelectedFontSize
SelectedFontStyle
SendFTPFile
SendMail
SendNetworkData
SendNetworkString
SerialPortError
SerialPortID
SerialPortTimeouts
ServerID
SetActiveGadget
SetActiveGadget3D
SetActiveWindow
SetActiveWindow3D
SetClipboardImage
SetClipboardText
SetCurrentDirectory
SetDatabaseBlob
SetDragCallback
SetDropCallback
SetEntityAnimationLength
SetEntityAnimationTime
SetEntityAnimationWeight
SetEntityAttribute
SetEntityMaterial
SetEnvironmentVariable
SetFTPDirectory
SetFileAttributes
SetFileDate
SetFrameRate
SetGUITheme3D
SetGadgetAttribute
SetGadgetAttribute3D
SetGadgetColor
SetGadgetData
SetGadgetData3D
SetGadgetFont
SetGadgetItemAttribute
SetGadgetItemColor
SetGadgetItemData
SetGadgetItemData3D
SetGadgetItemImage
SetGadgetItemState
SetGadgetItemState3D
SetGadgetItemText
SetGadgetItemText3D
SetGadgetState
SetGadgetState3D
SetGadgetText
SetGadgetText3D
SetJointAttribute
SetLightColor
SetMailAttribute
SetMailBody
SetMaterialColor
SetMenuItemState
SetMenuItemText
SetMenuTitleText
SetMeshMaterial
SetModulePosition
SetNodeAnimationLength
SetNodeAnimationTime
SetNodeAnimationWeight
SetOrientation
SetPaletteColor
SetSerialPortStatus
SetSoundFrequency
SetSoundPosition
SetTerrainTileHeightAtPoint
SetTerrainTileLayerBlend
SetToolBarButtonState
SetURLPart
SetWindowCallback
SetWindowColor
SetWindowState
SetWindowTitle
SetWindowTitle3D
SetXMLAttribute
SetXMLEncoding
SetXMLNodeName
SetXMLNodeOffset
SetXMLNodeText
SetXMLStandalone
SetupTerrains
ShortcutGadget
ShowAssemblyViewer
ShowCallstack
ShowDebugOutput
ShowGUI
ShowLibraryViewer
ShowMemoryViewer
ShowProfiler
ShowVariableViewer
ShowWatchlist
Sign
SignalSemaphore
Sin
SinH
SkyBox
SkyDome
SliderJoint
SmartWindowRefresh
SortArray
SortList
SortStructuredArray
SortStructuredList
SoundCone3D
SoundID3D
SoundLength
SoundListenerLocate
SoundPan
SoundRange3D
SoundStatus
SoundVolume
SoundVolume3D
Space
SpinGadget
SpinGadget3D
SplinePointX
SplinePointY
SplinePointZ
SplineX
SplineY
SplineZ
SplitList
SplitterGadget
SpotLightRange
Sprite3DBlendingMode
Sprite3DQuality
SpriteCollision
SpriteDepth
SpriteHeight
SpriteID
SpriteOutput
SpritePixelCollision
SpriteWidth
Sqr
Start3D
StartAESCipher
StartDrawing
StartEntityAnimation
StartNodeAnimation
StartPrinting
StartProfiler
StartSpecialFX
StatusBarHeight
StatusBarID
StatusBarImage
StatusBarProgress
StatusBarText
StickyWindow
Stop3D
StopAudioCD
StopDrawing
StopEntityAnimation
StopModule
StopMovie
StopNodeAnimation
StopPrinting
StopProfiler
StopSound
StopSound3D
StopSpecialFX
Str
StrD
StrF
StrU
StringByteLength
StringField
StringGadget
StringGadget3D
SubMeshCount
Sun
SwapElements
SwitchCamera
SysTrayIconToolTip
T
Tan
TanH
TerrainHeight
TerrainLocate
TerrainMousePick
TerrainPhysicBody
TerrainRenderMode
TerrainTileHeightAtPosition
TerrainTileLayerMapSize
TerrainTilePointX
TerrainTilePointY
TerrainTileSize
Text3DAlignment
Text3DCaption
Text3DColor
Text3DID
TextGadget
TextGadget3D
TextHeight
TextWidth
TextureHeight
TextureID
TextureOutput
TextureWidth
ThreadID
ThreadPriority
ToolBarHeight
ToolBarID
ToolBarImageButton
ToolBarSeparator
ToolBarStandardButton
ToolBarToolTip
TrackBarGadget
TransformMesh
TransformSprite3D
TransparentSpriteColor
TreeGadget
Trim
TruncateFile
TryLockMutex
TrySemaphore
U
UCase
URLDecoder
URLEncoder
UncompressMemory
UncompressPackFile
UncompressPackMemory
UnlockMutex
UpdateEntityAnimation
UpdateMesh
UpdateMeshBoundingBox
UpdateRenderTexture
UpdateSplinePoint
UpdateTerrain
UpdateTerrainTileLayerBlend
UpdateVertexPoseReference
UseAudioCD
UseBriefLZPacker
UseBuffer
UseFLACSoundDecoder
UseGadgetList
UseJCALG1Packer
UseJPEG2000ImageDecoder
UseJPEG2000ImageEncoder
UseJPEGImageDecoder
UseJPEGImageEncoder
UseLZMAPacker
UseODBCDatabase
UseOGGSoundDecoder
UsePNGImageDecoder
UsePNGImageEncoder
UsePostgreSQLDatabase
UseSQLiteDatabase
UseTGAImageDecoder
UseTIFFImageDecoder
UseZipPacker
UserName
V
Val
ValD
ValF
ValQ
VertexPoseReferenceCount
W
WaitProgram
WaitSemaphore
WaitThread
WaitWindowEvent
WaterColor
WebGadget
WebGadgetPath
WindowBounds
WindowEvent
WindowEvent3D
WindowHeight
WindowHeight3D
WindowID
WindowID3D
WindowMouseX
WindowMouseY
WindowOutput
WindowWidth
WindowWidth3D
WindowX
WindowX3D
WindowY
WindowY3D
WorldDebug
WorldGravity
WorldShadows
WriteAsciiCharacter
WriteByte
WriteCharacter
WriteConsoleData
WriteData
WriteDouble
WriteFloat
WriteInteger
WriteLong
WritePreferenceDouble
WritePreferenceFloat
WritePreferenceInteger
WritePreferenceLong
WritePreferenceQuad
WritePreferenceString
WriteProgramData
WriteProgramString
WriteProgramStringN
WriteQuad
WriteSerialPortData
WriteSerialPortString
WriteString
WriteStringFormat
WriteStringN
WriteUnicodeCharacter
WriteWord
X
XMLAttributeName
XMLAttributeValue
XMLChildCount
XMLError
XMLErrorLine
XMLErrorPosition
XMLNodeFromID
XMLNodeFromPath
XMLNodePath
XMLNodeType
XMLStatus
Y
Year
Z
ZoomSprite3D


Aperçu des constantes PureBasic

Constantes | ... est utilisé par les commandes PB suivantes *
#PB_2DDrawing_AllChannels | DrawingMode
#PB_2DDrawing_AlphaBlend DrawAlphaImage
DrawingMode
#PB_2DDrawing_AlphaChannel | DrawingMode
#PB_2DDrawing_AlphaClip | DrawingMode
#PB_2DDrawing_CustomFilter DrawingMode
CustomFilterCallback
#PB_2DDrawing_Default | DrawingMode
#PB_2DDrawing_Gradient DrawingMode
GradientColor
ResetGradientColors
LinearGradient
CircularGradient
EllipticalGradient
BoxedGradient
ConicalGradient
CustomGradient
#PB_2DDrawing_Outlined | DrawingMode
#PB_2DDrawing_Transparent DrawingMode
DrawText
#PB_2DDrawing_XOr | DrawingMode
#PB_3DArchive_FileSystem | Add3DArchive
#PB_3DArchive_Zip | Add3DArchive
#PB_Absolute MoveBillboardGroup
MoveCamera
MoveEntityBone
MoveEntity
ScaleEntity
FileSeek
MoveLight
MoveNode
ScaleNode
MoveParticleEmitter
MoveText3D
ScaleText3D
#PB_All FreeCamera
CloseDatabase
FreeEntity
CloseFile
FreeFont
CloseFTP
FreeGadget
FreeImage
FreeJoint
CloseLibrary
FreeLight
FreeMail
FreeMenu
FreeMesh
FreeModule
FreeMovie
FreeNode
FreeNodeAnimation
ClosePack
FreeParticleEmitter
FreeRegularExpression
CloseSerialPort
PauseSound
ResumeSound
SetSoundFrequency
SoundVolume
FreeSound3D
FreeEffect
FreeSpline
FreeStaticGeometry
FreeStatusBar
RemoveSysTrayIcon
FreeTerrain
FreeText3D
FreeTexture
FreeToolBar
CloseWindow
CloseWindow3D
FreeXML
#PB_AntialiasingMode_None | AntialiasingMode
#PB_AntialiasingMode_x2 | AntialiasingMode
#PB_AntialiasingMode_x4 | AntialiasingMode
#PB_AntialiasingMode_x6 | AntialiasingMode
#PB_Any GrabDrawingImage
CreateBillboardGroup
CreateCamera
ExamineMD5Fingerprint
ExamineSHA1Fingerprint
StartAESCipher
GetClipboardImage
OpenDatabase
OpenDatabaseRequester
EventDropImage
CopyEntity
CreateEntity
CreateFile
OpenFile
ReadFile
ExamineDirectory
LoadFont
OpenFTP
Gadget
AddGadgetItem
ButtonImageGadget
ButtonGadget
CalendarGadget
CanvasGadget
CheckBoxGadget
ComboBoxGadget
ContainerGadget
DateGadget
EditorGadget
ExplorerComboGadget
ExplorerListGadget
ExplorerTreeGadget
Frame3DGadget
HyperLinkGadget
ImageGadget
IPAddressGadget
ListIconGadget
ListViewGadget
MDIGadget
OptionGadget
PanelGadget
ProgressBarGadget
ScrollBarGadget
ScrollAreaGadget
ShortcutGadget
SpinGadget
SplitterGadget
StringGadget
TextGadget
TrackBarGadget
TreeGadget
WebGadget
ButtonGadget3D
CheckBoxGadget3D
ComboBoxGadget3D
ContainerGadget3D
EditorGadget3D
Frame3DGadget3D
ImageGadget3D
ListViewGadget3D
OptionGadget3D
PanelGadget3D
ProgressBarGadget3D
ScrollBarGadget3D
ScrollAreaGadget3D
SpinGadget3D
StringGadget3D
TextGadget3D
CatchImage
CopyImage
CreateImage
GrabImage
LoadImage
PointJoint
HingeJoint
ConeTwistJoint
SliderJoint
OpenLibrary
CopyLight
CreateLight
CreateMail
CopyMaterial
CreateMaterial
CreateMenu
CreateImageMenu
CreatePopupMenu
CreatePopupImageMenu
CreateMesh
CopyMesh
LoadMesh
MeshID
CreateLine3D
CreateCube
CreateSphere
CreateCylinder
CreatePlane
CatchModule
LoadModule
LoadMovie
CreateNetworkServer
CreateNode
CreateNodeAnimation
CreatePack
OpenPack
CreatePalette
LoadPalette
CreateParticleEmitter
GetScriptParticleEmitter
CreateRegularExpression
ScintillaGadget
OpenSerialPort
CatchSound
LoadSound
LoadSound3D
CreateCompositorEffect
CreateRibbonEffect
CreateLensFlareEffect
CatchSprite
CopySprite
CreateSprite
GrabSprite
LoadSprite
CreateSprite3D
CreateStaticGeometry
CreateStatusBar
AddSysTrayIcon
CreateTerrain
CreateText3D
CreateTexture
CreateRenderTexture
CreateCubeMapTexture
LoadTexture
CreateToolBar
OpenWindow
OpenWindow3D
CreateXML
LoadXML
CatchXML
Handles
Purebasic_objects
#PB_Array | Compilerfunctions
#PB_Ascii ReadString
ReadStringFormat
WriteString
WriteStringFormat
WriteStringN
CompareMemoryString
FillMemory
MemoryStringLength
PeekS
PokeS
SendNetworkString
WriteSerialPortString
Bin
Hex
StringByteLength
StrU
CreateXML
LoadXML
CatchXML
GetXMLEncoding
SetXMLEncoding
Compilerfunctions
#PB_BillboardGroup | ResetMaterial
#PB_Button_Default | ButtonGadget
#PB_Button_Image | ButtonImageGadget
#PB_Button_Left | ButtonGadget
#PB_Button_MultiLine | ButtonGadget
#PB_Button_PressedImage | ButtonImageGadget
#PB_Button_Right | ButtonGadget
#PB_Button_Toggle ButtonImageGadget
ButtonGadget
GetGadgetState
SetGadgetState
#PB_Byte FillMemory
Bin
Hex
StrU
Compilerfunctions
#PB_Calendar_Bold GetGadgetItemState
SetGadgetItemState
#PB_Calendar_Borderless | CalendarGadget
#PB_Calendar_Maximum | CalendarGadget
#PB_Calendar_Minimum | CalendarGadget
#PB_Calendar_Normal GetGadgetItemState
SetGadgetItemState
#PB_Camera_Orthographic | CameraProjectionMode
#PB_Camera_Perspective | CameraProjectionMode
#PB_Camera_Plot | CameraRenderMode
#PB_Camera_Textured | CameraRenderMode
#PB_Camera_Wireframe | CameraRenderMode
#PB_Canvas_Alt | CanvasGadget
#PB_Canvas_Border | CanvasGadget
#PB_Canvas_ClipMouse | CanvasGadget
#PB_Canvas_Command | CanvasGadget
#PB_Canvas_Control | CanvasGadget
#PB_Canvas_DrawFocus | CanvasGadget
#PB_Canvas_Input | CanvasGadget
#PB_Canvas_Keyboard | CanvasGadget
#PB_Canvas_LeftButton | CanvasGadget
#PB_Canvas_MiddleButton | CanvasGadget
#PB_Canvas_RightButton | CanvasGadget
#PB_Canvas_Shift | CanvasGadget
#PB_Character FillMemory
Compilerfunctions
#PB_CheckBox_Center | CheckBoxGadget
#PB_CheckBox_Checked GetGadgetState
SetGadgetState
#PB_CheckBox_Inbetween GetGadgetState
SetGadgetState
#PB_CheckBox_Right | CheckBoxGadget
#PB_CheckBox_ThreeState CheckBoxGadget
GetGadgetState
SetGadgetState
#PB_CheckBox_Unchecked GetGadgetState
SetGadgetState
#PB_Cipher_CBC AESEncoder
AESDecoder
StartAESCipher
#PB_Cipher_Decode | StartAESCipher
#PB_Cipher_ECB AESEncoder
AESDecoder
StartAESCipher
#PB_Cipher_Encode | StartAESCipher
#PB_Cipher_NoPadding | Base64Encoder
#PB_Cipher_URL | Base64Encoder
#PB_ComboBox3D_Editable | ComboBoxGadget3D
#PB_ComboBox_Editable | ComboBoxGadget
#PB_ComboBox_Image AddGadgetItem
ComboBoxGadget
#PB_ComboBox_LowerCase | ComboBoxGadget
#PB_ComboBox_UpperCase | ComboBoxGadget
#PB_Compiler_Console | Compilerdirectives
#PB_Compiler_DLL | Compilerdirectives
#PB_Compiler_Date | Compilerdirectives
#PB_Compiler_Debugger | Compilerdirectives
#PB_Compiler_EnableExplicit | Compilerdirectives
#PB_Compiler_EnumerationValue | Enumerations
#PB_Compiler_Executable | Compilerdirectives
#PB_Compiler_ExecutableFormat | Compilerdirectives
#PB_Compiler_File | Compilerdirectives
#PB_Compiler_FilePath | Compilerdirectives
#PB_Compiler_Home | Compilerdirectives
#PB_Compiler_InlineAssembly | Compilerdirectives
#PB_Compiler_IsIncludeFile | Compilerdirectives
#PB_Compiler_IsMainFile | Compilerdirectives
#PB_Compiler_Line | Compilerdirectives
#PB_Compiler_LineNumbering | Compilerdirectives
#PB_Compiler_OS | Compilerdirectives
#PB_Compiler_Procedure | Compilerdirectives
#PB_Compiler_Processor | Compilerdirectives
#PB_Compiler_Thread | Compilerdirectives
#PB_Compiler_Unicode | Compilerdirectives
#PB_Compiler_Version | Compilerdirectives
#PB_ConeTwistJoint_SwingSpan | ConeTwistJoint
#PB_ConeTwistJoint_SwingSpan2 | ConeTwistJoint
#PB_ConeTwistJoint_TwistSpan | ConeTwistJoint
#PB_Constant | Compilerfunctions
#PB_Container_BorderLess | ContainerGadget
#PB_Container_Double | ContainerGadget
#PB_Container_Flat | ContainerGadget
#PB_Container_Raised | ContainerGadget
#PB_Container_Single | ContainerGadget
#PB_Cursor_Arrows | CanvasGadget
#PB_Cursor_Busy | CanvasGadget
#PB_Cursor_Cross | CanvasGadget
#PB_Cursor_Default | CanvasGadget
#PB_Cursor_Denied | CanvasGadget
#PB_Cursor_Hand | CanvasGadget
#PB_Cursor_IBeam | CanvasGadget
#PB_Cursor_Invisible | CanvasGadget
#PB_Cursor_LeftDownRightUp | CanvasGadget
#PB_Cursor_LeftRight | CanvasGadget
#PB_Cursor_LeftUpRightDown | CanvasGadget
#PB_Cursor_UpDown | CanvasGadget
#PB_Database_Blob | DatabaseColumnType
#PB_Database_Double | DatabaseColumnType
#PB_Database_Float | DatabaseColumnType
#PB_Database_Long | DatabaseColumnType
#PB_Database_ODBC OpenDatabase
OpenDatabaseRequester
#PB_Database_PostgreSQL OpenDatabase
OpenDatabaseRequester
#PB_Database_Quad | DatabaseColumnType
#PB_Database_SQLite OpenDatabase
OpenDatabaseRequester
#PB_Database_String | DatabaseColumnType
#PB_Date_Accessed DirectoryEntryDate
GetFileDate
SetFileDate
#PB_Date_CheckBox DateGadget
GetGadgetState
SetGadgetState
#PB_Date_Created DirectoryEntryDate
GetFileDate
SetFileDate
#PB_Date_Day | AddDate
#PB_Date_Hour | AddDate
#PB_Date_Maximum | DateGadget
#PB_Date_Minimum | DateGadget
#PB_Date_Minute | AddDate
#PB_Date_Modified DirectoryEntryDate
GetFileDate
SetFileDate
#PB_Date_Month | AddDate
#PB_Date_Second | AddDate
#PB_Date_UpDown | DateGadget
#PB_Date_Week | AddDate
#PB_Date_Year | AddDate
#PB_Default FileBuffersSize
GetGadgetFont
SetGadgetFont
MaterialFilteringMode
ClipSprite
TransparentSpriteColor
UseBuffer
#PB_DirectoryEntry_Directory | DirectoryEntryType
#PB_DirectoryEntry_File | DirectoryEntryType
#PB_Double | Compilerfunctions
#PB_Drag_Copy DragText
DragImage
DragFiles
DragPrivate
DragOSFormats
EnableGadgetDrop
EnableWindowDrop
EventDropAction
SetDragCallback
SetDropCallback
#PB_Drag_Enter | SetDropCallback
#PB_Drag_Finish | SetDropCallback
#PB_Drag_Leave | SetDropCallback
#PB_Drag_Link DragText
DragImage
DragFiles
DragPrivate
DragOSFormats
EnableGadgetDrop
EnableWindowDrop
EventDropAction
SetDragCallback
SetDropCallback
#PB_Drag_Move DragText
DragImage
DragFiles
DragPrivate
DragOSFormats
EnableGadgetDrop
EnableWindowDrop
EventDropAction
SetDragCallback
SetDropCallback
#PB_Drag_None DragText
DragImage
DragFiles
DragPrivate
DragOSFormats
EnableGadgetDrop
EnableWindowDrop
SetDragCallback
SetDropCallback
#PB_Drag_Update | SetDropCallback
#PB_Drop_Files EnableGadgetDrop
EnableWindowDrop
EventDropType
EventDropFiles
SetDropCallback
#PB_Drop_Image EnableGadgetDrop
EnableWindowDrop
EventDropType
EventDropImage
SetDropCallback
#PB_Drop_Private DragPrivate
EnableGadgetDrop
EnableWindowDrop
EventDropType
EventDropPrivate
SetDropCallback
#PB_Drop_Text EnableGadgetDrop
EnableWindowDrop
EventDropType
EventDropText
SetDropCallback
#PB_Editor3D_ReadOnly | EditorGadget3D
#PB_Editor_BuildCount | Ide_compiler
#PB_Editor_CompileCount | Ide_compiler
#PB_Editor_ReadOnly | EditorGadget
#PB_Editor_WordWrap | EditorGadget
#PB_Engine3D_Average | Engine3DFrameRate
#PB_Engine3D_Current | Engine3DFrameRate
#PB_Engine3D_DebugLog | InitEngine3D
#PB_Engine3D_DebugOutput | InitEngine3D
#PB_Engine3D_EnableCG | InitEngine3D
#PB_Engine3D_Maximum | Engine3DFrameRate
#PB_Engine3D_Minimum | Engine3DFrameRate
#PB_Engine3D_NoLog | InitEngine3D
#PB_Engine3D_Reset | Engine3DFrameRate
#PB_Entity | ResetMaterial
#PB_EntityAnimation_Average | EntityAnimationBlendMode
#PB_EntityAnimation_Cumulative | EntityAnimationBlendMode
#PB_EntityAnimation_Manual | StartEntityAnimation
#PB_EntityAnimation_Once | StartEntityAnimation
#PB_EntityAnimation_Started | EntityAnimationStatus
#PB_EntityAnimation_Stopped | EntityAnimationStatus
#PB_EntityAnimation_Unknown | EntityAnimationStatus
#PB_Entity_BoxBody | EntityPhysicBody
#PB_Entity_CapsuleBody | EntityPhysicBody
#PB_Entity_CastShadow WorldShadows
EntityRenderMode
#PB_Entity_ConvexHullBody | EntityPhysicBody
#PB_Entity_CylinderBody | EntityPhysicBody
#PB_Entity_DisplaySkeleton | EntityRenderMode
#PB_Entity_Friction GetEntityAttribute
SetEntityAttribute
#PB_Entity_LocalBoundingBox | EntityBoundingBox
#PB_Entity_MassCenterX | GetEntityAttribute
#PB_Entity_MassCenterY | GetEntityAttribute
#PB_Entity_MassCenterZ | GetEntityAttribute
#PB_Entity_MaxBoundingBoxX | EntityBoundingBox
#PB_Entity_MaxBoundingBoxY | EntityBoundingBox
#PB_Entity_MaxBoundingBoxZ | EntityBoundingBox
#PB_Entity_MaxVelocity | SetEntityAttribute
#PB_Entity_MinBoundingBoxX | EntityBoundingBox
#PB_Entity_MinBoundingBoxY | EntityBoundingBox
#PB_Entity_MinBoundingBoxZ | EntityBoundingBox
#PB_Entity_None | EntityPhysicBody
#PB_Entity_Restitution GetEntityAttribute
SetEntityAttribute
#PB_Entity_SphereBody | EntityPhysicBody
#PB_Entity_StaticBody | EntityPhysicBody
#PB_Entity_Velocity | GetEntityAttribute
#PB_Entity_VelocityX | GetEntityAttribute
#PB_Entity_VelocityY | GetEntityAttribute
#PB_Entity_VelocityZ | GetEntityAttribute
#PB_Entity_WorldBoundingBox | EntityBoundingBox
#PB_Event3D_ActivateWindow | WindowEvent3D
#PB_Event3D_CloseWindow | WindowEvent3D
#PB_Event3D_Gadget EventGadget3D
EventType3D
WindowEvent3D
#PB_Event3D_MoveWindow | WindowEvent3D
#PB_Event3D_SizeWindow | WindowEvent3D
#PB_EventType3D_Change StringGadget3D
EventType3D
#PB_EventType3D_Focus StringGadget3D
EventType3D
#PB_EventType3D_LostFocus StringGadget3D
EventType3D
#PB_EventType_Change AddGadgetColumn
ComboBoxGadget
EditorGadget
ExplorerListGadget
ExplorerTreeGadget
ListIconGadget
SpinGadget
StringGadget
TreeGadget
EventType
#PB_EventType_DownloadEnd | WebGadget
#PB_EventType_DownloadProgress | WebGadget
#PB_EventType_DownloadStart | WebGadget
#PB_EventType_DragStart DragText
DragImage
DragFiles
DragPrivate
DragOSFormats
ExplorerListGadget
ExplorerTreeGadget
ImageGadget
ListIconGadget
TreeGadget
EventType
#PB_EventType_Focus CanvasGadget
ComboBoxGadget
StringGadget
EventType
#PB_EventType_Input | CanvasGadget
#PB_EventType_KeyDown | CanvasGadget
#PB_EventType_KeyUp | CanvasGadget
#PB_EventType_LeftButtonDown | CanvasGadget
#PB_EventType_LeftButtonUp | CanvasGadget
#PB_EventType_LeftClick CanvasGadget
ExplorerListGadget
ExplorerTreeGadget
ImageGadget
ListIconGadget
ListViewGadget
TreeGadget
EventType
#PB_EventType_LeftDoubleClick CanvasGadget
ExplorerListGadget
ExplorerTreeGadget
ImageGadget
ListIconGadget
ListViewGadget
TreeGadget
EventType
#PB_EventType_LostFocus CanvasGadget
ComboBoxGadget
StringGadget
EventType
#PB_EventType_MiddleButtonDown | CanvasGadget
#PB_EventType_MiddleButtonUp | CanvasGadget
#PB_EventType_MouseEnter | CanvasGadget
#PB_EventType_MouseLeave | CanvasGadget
#PB_EventType_MouseMove | CanvasGadget
#PB_EventType_MouseWheel | CanvasGadget
#PB_EventType_PopupMenu | WebGadget
#PB_EventType_PopupWindow | WebGadget
#PB_EventType_RightButtonDown | CanvasGadget
#PB_EventType_RightButtonUp | CanvasGadget
#PB_EventType_RightClick CanvasGadget
ExplorerListGadget
ExplorerTreeGadget
ImageGadget
ListIconGadget
TreeGadget
ScintillaGadget
EventType
#PB_EventType_RightDoubleClick CanvasGadget
ExplorerListGadget
ExplorerTreeGadget
ImageGadget
ListIconGadget
TreeGadget
EventType
#PB_EventType_StatusChange | WebGadget
#PB_EventType_TitleChange | WebGadget
#PB_Event_ActivateWindow | WindowEvent
#PB_Event_CloseWindow MDIGadget
WindowEvent
Residents
#PB_Event_DeactivateWindow | WindowEvent
#PB_Event_FirstCustomValue | PostEvent
#PB_Event_Gadget EventGadget
EventType
WindowEvent
#PB_Event_GadgetDrop DragPrivate
EnableGadgetDrop
EventDropAction
EventDropType
EventDropText
EventDropImage
EventDropFiles
EventDropPrivate
EventDropBuffer
EventDropSize
EventDropX
EventDropY
WindowEvent
#PB_Event_LeftClick | WindowEvent
#PB_Event_LeftDoubleClick | WindowEvent
#PB_Event_MaximizeWindow | WindowEvent
#PB_Event_Menu EventMenu
WindowEvent
#PB_Event_MinimizeWindow | WindowEvent
#PB_Event_MoveWindow | WindowEvent
#PB_Event_Repaint CanvasGadget
WindowEvent
WindowOutput
#PB_Event_RestoreWindow | WindowEvent
#PB_Event_RightClick | WindowEvent
#PB_Event_SizeWindow MDIGadget
WindowEvent
#PB_Event_SysTray AddSysTrayIcon
EventType
WindowEvent
#PB_Event_Timer AddWindowTimer
EventTimer
WindowEvent
#PB_Event_WindowDrop DragPrivate
EnableWindowDrop
EventDropAction
EventDropType
EventDropText
EventDropImage
EventDropFiles
EventDropPrivate
EventDropBuffer
EventDropSize
EventDropX
EventDropY
WindowEvent
#PB_Explorer_Accessed | AddGadgetColumn
#PB_Explorer_AlwaysShowSelection ExplorerListGadget
ExplorerTreeGadget
#PB_Explorer_Attributes | AddGadgetColumn
#PB_Explorer_AutoSort ExplorerListGadget
ExplorerTreeGadget
#PB_Explorer_BorderLess ExplorerListGadget
ExplorerTreeGadget
#PB_Explorer_ColumnWidth ExplorerListGadget
GetGadgetItemAttribute
SetGadgetItemAttribute
#PB_Explorer_Created | AddGadgetColumn
#PB_Explorer_Directory GetGadgetState
GetGadgetItemState
#PB_Explorer_DisplayMode | ExplorerListGadget
#PB_Explorer_DrivesOnly | ExplorerComboGadget
#PB_Explorer_Editable | ExplorerComboGadget
#PB_Explorer_File GetGadgetState
GetGadgetItemState
#PB_Explorer_FullRowSelect | ExplorerListGadget
#PB_Explorer_GridLines ExplorerListGadget
ExplorerTreeGadget
#PB_Explorer_HeaderDragDrop | ExplorerListGadget
#PB_Explorer_LargeIcon | ExplorerListGadget
#PB_Explorer_List | ExplorerListGadget
#PB_Explorer_Modified | AddGadgetColumn
#PB_Explorer_MultiSelect | ExplorerListGadget
#PB_Explorer_Name | AddGadgetColumn
#PB_Explorer_NoButtons | ExplorerTreeGadget
#PB_Explorer_NoDirectoryChange | ExplorerListGadget
#PB_Explorer_NoDriveRequester ExplorerListGadget
ExplorerTreeGadget
#PB_Explorer_NoFiles ExplorerListGadget
ExplorerTreeGadget
#PB_Explorer_NoFolders | ExplorerListGadget
#PB_Explorer_NoLines | ExplorerTreeGadget
#PB_Explorer_NoMyDocuments ExplorerComboGadget
ExplorerListGadget
ExplorerTreeGadget
#PB_Explorer_NoParentFolder | ExplorerListGadget
#PB_Explorer_NoSort | ExplorerListGadget
#PB_Explorer_Report | ExplorerListGadget
#PB_Explorer_Selected | GetGadgetItemState
#PB_Explorer_Size | AddGadgetColumn
#PB_Explorer_SmallIcon | ExplorerListGadget
#PB_Explorer_Type | AddGadgetColumn
#PB_FTP_Directory | FTPDirectoryEntryType
#PB_FTP_Error | FTPProgress
#PB_FTP_ExecuteAll | FTPDirectoryEntryAttributes
#PB_FTP_ExecuteGroup | FTPDirectoryEntryAttributes
#PB_FTP_ExecuteUser | FTPDirectoryEntryAttributes
#PB_FTP_File | FTPDirectoryEntryType
#PB_FTP_Finished | FTPProgress
#PB_FTP_ReadAll | FTPDirectoryEntryAttributes
#PB_FTP_ReadGroup | FTPDirectoryEntryAttributes
#PB_FTP_ReadUser | FTPDirectoryEntryAttributes
#PB_FTP_Started | FTPProgress
#PB_FTP_WriteAll | FTPDirectoryEntryAttributes
#PB_FTP_WriteGroup | FTPDirectoryEntryAttributes
#PB_FTP_WriteUser | FTPDirectoryEntryAttributes
#PB_FileSystem_Archive DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_Compressed DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_ExecAll DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_ExecGroup DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_ExecUser DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_Force CopyDirectory
DeleteDirectory
#PB_FileSystem_Hidden DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_Link DirectoryEntryAttributes
GetFileAttributes
#PB_FileSystem_Normal DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_ReadAll DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_ReadGroup DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_ReadOnly DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_ReadUser DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_Recursive CopyDirectory
DeleteDirectory
#PB_FileSystem_System DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_WriteAll DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_WriteGroup DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_WriteUser DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_File_Append | OpenFile
#PB_File_IgnoreEOL | ReadString
#PB_File_NoBuffering CreateFile
OpenFile
ReadFile
#PB_File_SharedRead CreateFile
OpenFile
ReadFile
#PB_File_SharedWrite CreateFile
OpenFile
#PB_Float | Compilerfunctions
#PB_FontRequester_Effects | FontRequester
#PB_Font_Bold LoadFont
SelectedFontStyle
#PB_Font_HighQuality | LoadFont
#PB_Font_Italic LoadFont
SelectedFontStyle
#PB_Font_StrikeOut LoadFont
SelectedFontStyle
#PB_Font_Underline LoadFont
SelectedFontStyle
#PB_Frame3D_Double | Frame3DGadget
#PB_Frame3D_Flat | Frame3DGadget
#PB_Frame3D_Single | Frame3DGadget
#PB_Function | Compilerfunctions
#PB_GadgetType3D_Button | GadgetType3D
#PB_GadgetType3D_CheckBox | GadgetType3D
#PB_GadgetType3D_ComboBox | GadgetType3D
#PB_GadgetType3D_Container | GadgetType3D
#PB_GadgetType3D_Editor | GadgetType3D
#PB_GadgetType3D_Frame3D | GadgetType3D
#PB_GadgetType3D_Image | GadgetType3D
#PB_GadgetType3D_ListView | GadgetType3D
#PB_GadgetType3D_Option | GadgetType3D
#PB_GadgetType3D_Panel | GadgetType3D
#PB_GadgetType3D_ProgressBar | GadgetType3D
#PB_GadgetType3D_ScrollArea | GadgetType3D
#PB_GadgetType3D_ScrollBar | GadgetType3D
#PB_GadgetType3D_Spin | GadgetType3D
#PB_GadgetType3D_String | GadgetType3D
#PB_GadgetType3D_Text | GadgetType3D
#PB_GadgetType3D_Unknown | GadgetType3D
#PB_GadgetType_Button | GadgetType
#PB_GadgetType_ButtonImage | GadgetType
#PB_GadgetType_Calendar | GadgetType
#PB_GadgetType_Canvas | GadgetType
#PB_GadgetType_CheckBox | GadgetType
#PB_GadgetType_ComboBox | GadgetType
#PB_GadgetType_Container | GadgetType
#PB_GadgetType_Date | GadgetType
#PB_GadgetType_Editor | GadgetType
#PB_GadgetType_ExplorerCombo | GadgetType
#PB_GadgetType_ExplorerList | GadgetType
#PB_GadgetType_ExplorerTree | GadgetType
#PB_GadgetType_Frame3D | GadgetType
#PB_GadgetType_HyperLink | GadgetType
#PB_GadgetType_IPAddress | GadgetType
#PB_GadgetType_Image | GadgetType
#PB_GadgetType_ListIcon | GadgetType
#PB_GadgetType_ListView | GadgetType
#PB_GadgetType_MDI | GadgetType
#PB_GadgetType_Option | GadgetType
#PB_GadgetType_Panel | GadgetType
#PB_GadgetType_ProgressBar | GadgetType
#PB_GadgetType_Scintilla | GadgetType
#PB_GadgetType_ScrollArea | GadgetType
#PB_GadgetType_ScrollBar | GadgetType
#PB_GadgetType_Shortcut | GadgetType
#PB_GadgetType_Spin | GadgetType
#PB_GadgetType_Splitter | GadgetType
#PB_GadgetType_String | GadgetType
#PB_GadgetType_Text | GadgetType
#PB_GadgetType_TrackBar | GadgetType
#PB_GadgetType_Tree | GadgetType
#PB_GadgetType_Unknown | GadgetType
#PB_GadgetType_Web | GadgetType
#PB_Gadget_BackColor CalendarGadget
ContainerGadget
DateGadget
EditorGadget
ExplorerListGadget
ExplorerTreeGadget
GetGadgetColor
GetGadgetItemColor
ListIconGadget
ListViewGadget
MDIGadget
ProgressBarGadget
ScrollAreaGadget
SetGadgetColor
SetGadgetItemColor
SpinGadget
StringGadget
TextGadget
TreeGadget
#PB_Gadget_ContainerCoordinate GadgetX
GadgetY
#PB_Gadget_FrontColor CalendarGadget
DateGadget
EditorGadget
ExplorerListGadget
ExplorerTreeGadget
GetGadgetColor
GetGadgetItemColor
HyperLinkGadget
ListIconGadget
ListViewGadget
ProgressBarGadget
SetGadgetColor
SetGadgetItemColor
SpinGadget
StringGadget
TextGadget
TreeGadget
#PB_Gadget_GrayTextColor CalendarGadget
DateGadget
GetGadgetColor
SetGadgetColor
#PB_Gadget_LineColor ExplorerListGadget
ExplorerTreeGadget
GetGadgetColor
ListIconGadget
SetGadgetColor
TreeGadget
#PB_Gadget_ScreenCoordinate GadgetX
GadgetY
#PB_Gadget_TitleBackColor CalendarGadget
DateGadget
GetGadgetColor
SetGadgetColor
#PB_Gadget_TitleFrontColor CalendarGadget
DateGadget
GetGadgetColor
SetGadgetColor
#PB_Gadget_WindowCoordinate GadgetX
GadgetY
#PB_HingeJoint_LowerLimit | HingeJoint
#PB_HingeJoint_UpperLimit | HingeJoint
#PB_Hyperlink_Underline | HyperLinkGadget
#PB_Ignore PurifierGranularity
ResizeGadget
ResizeGadget3D
ResizeImage
AddStatusBarField
StatusBarProgress
OpenWindow
ResizeWindow
WindowBounds
OpenWindow3D
ResizeWindow3D
#PB_Image3D_Border | ImageGadget3D
#PB_ImagePlugin_BMP ImageFormat
SaveImage
SaveSprite
#PB_ImagePlugin_ICON | ImageFormat
#PB_ImagePlugin_JPEG EncodeImage
ImageFormat
SaveImage
SaveSprite
#PB_ImagePlugin_JPEG2000 EncodeImage
ImageFormat
SaveImage
SaveSprite
#PB_ImagePlugin_PNG EncodeImage
ImageFormat
SaveImage
SaveSprite
#PB_ImagePlugin_TGA | ImageFormat
#PB_ImagePlugin_TIFF | ImageFormat
#PB_Image_Border | ImageGadget
#PB_Image_DisplayFormat | GetClipboardImage
#PB_Image_FloydSteinberg EncodeImage
SaveImage
#PB_Image_InternalDepth | ImageDepth
#PB_Image_OriginalDepth | ImageDepth
#PB_Image_Raised | ImageGadget
#PB_Image_Raw | ResizeImage
#PB_Image_Smooth | ResizeImage
#PB_Image_Transparent | CreateImage
#PB_InputRequester_Password | InputRequester
#PB_Input_Eof | Input
#PB_Integer FillMemory
SortStructuredArray
SortStructuredList
Compilerfunctions
#PB_Interface | Compilerfunctions
#PB_Key_0 | KeyboardPushed
#PB_Key_1 | KeyboardPushed
#PB_Key_2 | KeyboardPushed
#PB_Key_3 | KeyboardPushed
#PB_Key_4 | KeyboardPushed
#PB_Key_5 | KeyboardPushed
#PB_Key_6 | KeyboardPushed
#PB_Key_7 | KeyboardPushed
#PB_Key_8 | KeyboardPushed
#PB_Key_9 | KeyboardPushed
#PB_Key_A | KeyboardPushed
#PB_Key_Add | KeyboardPushed
#PB_Key_All | KeyboardPushed
#PB_Key_Apostrophe | KeyboardPushed
#PB_Key_B | KeyboardPushed
#PB_Key_Back InputEvent3D
KeyboardPushed
#PB_Key_BackSlash | KeyboardPushed
#PB_Key_C | KeyboardPushed
#PB_Key_Capital | KeyboardPushed
#PB_Key_Comma | KeyboardPushed
#PB_Key_D | KeyboardPushed
#PB_Key_Decimal | KeyboardPushed
#PB_Key_Delete InputEvent3D
KeyboardPushed
#PB_Key_Divide | KeyboardPushed
#PB_Key_Down InputEvent3D
KeyboardPushed
#PB_Key_E | KeyboardPushed
#PB_Key_End | KeyboardPushed
#PB_Key_Equals | KeyboardPushed
#PB_Key_Escape | KeyboardPushed
#PB_Key_F | KeyboardPushed
#PB_Key_F1 | KeyboardPushed
#PB_Key_F10 | KeyboardPushed
#PB_Key_F11 | KeyboardPushed
#PB_Key_F12 | KeyboardPushed
#PB_Key_F2 | KeyboardPushed
#PB_Key_F3 | KeyboardPushed
#PB_Key_F4 | KeyboardPushed
#PB_Key_F5 | KeyboardPushed
#PB_Key_F6 | KeyboardPushed
#PB_Key_F7 | KeyboardPushed
#PB_Key_F8 | KeyboardPushed
#PB_Key_F9 | KeyboardPushed
#PB_Key_G | KeyboardPushed
#PB_Key_Grave | KeyboardPushed
#PB_Key_H | KeyboardPushed
#PB_Key_Home | KeyboardPushed
#PB_Key_I | KeyboardPushed
#PB_Key_Insert | KeyboardPushed
#PB_Key_J | KeyboardPushed
#PB_Key_K | KeyboardPushed
#PB_Key_L | KeyboardPushed
#PB_Key_Left InputEvent3D
KeyboardPushed
#PB_Key_LeftAlt | KeyboardPushed
#PB_Key_LeftBracket | KeyboardPushed
#PB_Key_LeftControl | KeyboardPushed
#PB_Key_LeftShift | KeyboardPushed
#PB_Key_M | KeyboardPushed
#PB_Key_Minus | KeyboardPushed
#PB_Key_Multiply | KeyboardPushed
#PB_Key_N | KeyboardPushed
#PB_Key_NumLock | KeyboardPushed
#PB_Key_O | KeyboardPushed
#PB_Key_P | KeyboardPushed
#PB_Key_Pad0 | KeyboardPushed
#PB_Key_Pad1 | KeyboardPushed
#PB_Key_Pad2 | KeyboardPushed
#PB_Key_Pad3 | KeyboardPushed
#PB_Key_Pad4 | KeyboardPushed
#PB_Key_Pad5 | KeyboardPushed
#PB_Key_Pad6 | KeyboardPushed
#PB_Key_Pad7 | KeyboardPushed
#PB_Key_Pad8 | KeyboardPushed
#PB_Key_Pad9 | KeyboardPushed
#PB_Key_PadComma | KeyboardPushed
#PB_Key_PadEnter | KeyboardPushed
#PB_Key_PageDown | KeyboardPushed
#PB_Key_PageUp | KeyboardPushed
#PB_Key_Pause | KeyboardPushed
#PB_Key_Period | KeyboardPushed
#PB_Key_Q | KeyboardPushed
#PB_Key_R | KeyboardPushed
#PB_Key_Return InputEvent3D
KeyboardPushed
#PB_Key_Right InputEvent3D
KeyboardPushed
#PB_Key_RightAlt | KeyboardPushed
#PB_Key_RightBracket | KeyboardPushed
#PB_Key_RightControl | KeyboardPushed
#PB_Key_RightShift | KeyboardPushed
#PB_Key_S | KeyboardPushed
#PB_Key_Scroll | KeyboardPushed
#PB_Key_SemiColon | KeyboardPushed
#PB_Key_Slash | KeyboardPushed
#PB_Key_Space | KeyboardPushed
#PB_Key_Subtract | KeyboardPushed
#PB_Key_T | KeyboardPushed
#PB_Key_Tab | KeyboardPushed
#PB_Key_U | KeyboardPushed
#PB_Key_Up InputEvent3D
KeyboardPushed
#PB_Key_V | KeyboardPushed
#PB_Key_W | KeyboardPushed
#PB_Key_X | KeyboardPushed
#PB_Key_Y | KeyboardPushed
#PB_Key_Z | KeyboardPushed
#PB_Keyboard_AllowSystemKeys | KeyboardMode
#PB_Keyboard_International | KeyboardMode
#PB_Keyboard_Qwerty | KeyboardMode
#PB_Label | Compilerfunctions
#PB_LensFlare_BurstColor | LensFlareEffectColor
#PB_LensFlare_CircleColor | LensFlareEffectColor
#PB_LensFlare_HaloColor | LensFlareEffectColor
#PB_Light_DiffuseColor GetLightColor
SetLightColor
#PB_Light_Directional | CreateLight
#PB_Light_Point | CreateLight
#PB_Light_SpecularColor GetLightColor
SetLightColor
#PB_Light_Spot CreateLight
SpotLightRange
#PB_LinkedList | Compilerfunctions
#PB_ListIcon_AlwaysShowSelection | ListIconGadget
#PB_ListIcon_CheckBoxes GetGadgetItemState
ListIconGadget
SetGadgetItemState
#PB_ListIcon_Checked GetGadgetItemState
ListIconGadget
SetGadgetItemState
#PB_ListIcon_ColumnWidth GetGadgetItemAttribute
ListIconGadget
SetGadgetItemAttribute
#PB_ListIcon_DisplayMode | ListIconGadget
#PB_ListIcon_FullRowSelect | ListIconGadget
#PB_ListIcon_GridLines | ListIconGadget
#PB_ListIcon_HeaderDragDrop | ListIconGadget
#PB_ListIcon_Inbetween GetGadgetItemState
SetGadgetItemState
#PB_ListIcon_LargeIcon | ListIconGadget
#PB_ListIcon_List | ListIconGadget
#PB_ListIcon_MultiSelect | ListIconGadget
#PB_ListIcon_Report | ListIconGadget
#PB_ListIcon_Selected GetGadgetItemState
ListIconGadget
SetGadgetItemState
#PB_ListIcon_SmallIcon | ListIconGadget
#PB_ListIcon_ThreeState GetGadgetItemState
ListIconGadget
SetGadgetItemState
#PB_ListView_ClickSelect | ListViewGadget
#PB_ListView_Multiselect | ListViewGadget
#PB_List_After MoveElement
MergeLists
#PB_List_Before MoveElement
MergeLists
#PB_List_First MoveElement
MergeLists
#PB_List_Last MoveElement
MergeLists
#PB_Local MoveBillboardGroup
MoveCamera
MoveEntityBone
MoveEntity
MoveLight
MoveNode
MoveParticleEmitter
MoveText3D
#PB_Long FillMemory
Bin
Hex
StrU
Compilerfunctions
#PB_MDI_Arrange | SetGadgetState
#PB_MDI_AutoSize | MDIGadget
#PB_MDI_BorderLess | MDIGadget
#PB_MDI_Cascade | SetGadgetState
#PB_MDI_Image | MDIGadget
#PB_MDI_Next | SetGadgetState
#PB_MDI_NoScrollBars | MDIGadget
#PB_MDI_Previous | SetGadgetState
#PB_MDI_TileHorizontally | SetGadgetState
#PB_MDI_TileImage | MDIGadget
#PB_MDI_TileVertically | SetGadgetState
#PB_Mail_Bcc AddMailRecipient
RemoveMailRecipient
#PB_Mail_Cc AddMailRecipient
RemoveMailRecipient
#PB_Mail_Connected | MailProgress
#PB_Mail_Custom GetMailAttribute
SetMailAttribute
#PB_Mail_Date GetMailAttribute
SetMailAttribute
#PB_Mail_Error | MailProgress
#PB_Mail_Finished | MailProgress
#PB_Mail_From GetMailAttribute
SetMailAttribute
#PB_Mail_Subject GetMailAttribute
SetMailAttribute
#PB_Mail_To AddMailRecipient
RemoveMailRecipient
#PB_Mail_XMailer GetMailAttribute
SetMailAttribute
#PB_Map | Compilerfunctions
#PB_Map_ElementCheck | AddMapElement
#PB_Map_NoElementCheck | AddMapElement
#PB_Material_Add AddMaterialLayer
MaterialBlendingMode
#PB_Material_AlphaBlend AddMaterialLayer
MaterialBlendingMode
#PB_Material_AmbientColor GetMaterialColor
SetMaterialColor
#PB_Material_Animated ScrollMaterial
RotateMaterial
#PB_Material_Anisotropic | MaterialFilteringMode
#PB_Material_AntiClockWiseCull | MaterialCullingMode
#PB_Material_Bilinear | MaterialFilteringMode
#PB_Material_ClockWiseCull | MaterialCullingMode
#PB_Material_Color | MaterialBlendingMode
#PB_Material_DepthWrite | GetMaterialAttribute
#PB_Material_DiffuseColor GetMaterialColor
SetMaterialColor
#PB_Material_Fixed ScrollMaterial
RotateMaterial
#PB_Material_Flat | MaterialShadingMode
#PB_Material_Gouraud | MaterialShadingMode
#PB_Material_Lighting | GetMaterialAttribute
#PB_Material_Modulate | AddMaterialLayer
#PB_Material_NoCulling | MaterialCullingMode
#PB_Material_None Parse3DScripts
CreateEntity
MaterialFilteringMode
#PB_Material_Phong | MaterialShadingMode
#PB_Material_Point | MaterialShadingMode
#PB_Material_Replace | AddMaterialLayer
#PB_Material_SelfIlluminationColor GetMaterialColor
SetMaterialColor
#PB_Material_ShadingMode | GetMaterialAttribute
#PB_Material_Shininess | GetMaterialAttribute
#PB_Material_Solid | MaterialShadingMode
#PB_Material_SpecularColor GetMaterialColor
SetMaterialColor
#PB_Material_TextureRotate | GetMaterialAttribute
#PB_Material_TextureUScale | GetMaterialAttribute
#PB_Material_TextureUScroll | GetMaterialAttribute
#PB_Material_TextureVScale | GetMaterialAttribute
#PB_Material_TextureVScroll | GetMaterialAttribute
#PB_Material_Trilinear | MaterialFilteringMode
#PB_Material_Wireframe | MaterialShadingMode
#PB_Memory_NoClear AllocateMemory
ReAllocateMemory
#PB_Menu_About | MenuItem
#PB_Menu_ModernLook CreateImageMenu
CreatePopupImageMenu
#PB_Menu_Preferences | MenuItem
#PB_Menu_Quit | MenuItem
#PB_Mesh_Dynamic CreateMesh
UpdateMesh
#PB_Mesh_LineList CreateMesh
AddSubMesh
MeshIndex
#PB_Mesh_LineStrip CreateMesh
AddSubMesh
MeshIndex
#PB_Mesh_PointList CreateMesh
AddSubMesh
#PB_Mesh_Static | CreateMesh
#PB_Mesh_TriangleFan CreateMesh
AddSubMesh
#PB_Mesh_TriangleList CreateMesh
AddSubMesh
#PB_Mesh_TriangleStrip CreateMesh
AddSubMesh
#PB_MessageRequester_Cancel | MessageRequester
#PB_MessageRequester_No | MessageRequester
#PB_MessageRequester_Ok | MessageRequester
#PB_MessageRequester_Yes | MessageRequester
#PB_MessageRequester_YesNo | MessageRequester
#PB_MessageRequester_YesNoCancel | MessageRequester
#PB_MouseButton_Left | MouseButton
#PB_MouseButton_Middle | MouseButton
#PB_MouseButton_Right | MouseButton
#PB_Movie_Rendered PlayMovie
RenderMovieFrame
#PB_NetworkEvent_Connect | NetworkServerEvent
#PB_NetworkEvent_Data NetworkClientEvent
NetworkServerEvent
ReceiveNetworkData
SendNetworkString
#PB_NetworkEvent_Disconnect CloseNetworkConnection
NetworkClientEvent
NetworkServerEvent
#PB_NetworkEvent_None NetworkClientEvent
NetworkServerEvent
#PB_Network_IPv4 CreateNetworkServer
ExamineIPAddresses
IPString
OpenNetworkConnection
#PB_Network_IPv6 CreateNetworkServer
ExamineIPAddresses
IPString
NextIPAddress
OpenNetworkConnection
#PB_Network_TCP CreateNetworkServer
OpenNetworkConnection
#PB_Network_UDP CreateNetworkServer
OpenNetworkConnection
#PB_NodeAnimation_Linear | CreateNodeAnimation
#PB_NodeAnimation_LinearRotation | CreateNodeAnimation
#PB_NodeAnimation_Once | StartNodeAnimation
#PB_NodeAnimation_SphericalRotation | CreateNodeAnimation
#PB_NodeAnimation_Spline | CreateNodeAnimation
#PB_NodeAnimation_Started | NodeAnimationStatus
#PB_NodeAnimation_Stopped | NodeAnimationStatus
#PB_OSFunction | Compilerfunctions
#PB_OS_AmigaOS | Compilerdirectives
#PB_OS_Linux | Compilerdirectives
#PB_OS_Linux_2_2 | OSVersion
#PB_OS_Linux_2_4 | OSVersion
#PB_OS_Linux_2_6 | OSVersion
#PB_OS_Linux_Future | OSVersion
#PB_OS_MacOS | Compilerdirectives
#PB_OS_MacOSX_10_0 | OSVersion
#PB_OS_MacOSX_10_1 | OSVersion
#PB_OS_MacOSX_10_2 | OSVersion
#PB_OS_MacOSX_10_3 | OSVersion
#PB_OS_MacOSX_10_4 | OSVersion
#PB_OS_MacOSX_10_5 | OSVersion
#PB_OS_MacOSX_10_6 | OSVersion
#PB_OS_MacOSX_Future | OSVersion
#PB_OS_Windows | Compilerdirectives
#PB_OS_Windows_2000 | OSVersion
#PB_OS_Windows_7 | OSVersion
#PB_OS_Windows_95 | OSVersion
#PB_OS_Windows_98 | OSVersion
#PB_OS_Windows_Future | OSVersion
#PB_OS_Windows_ME | OSVersion
#PB_OS_Windows_NT3_51 | OSVersion
#PB_OS_Windows_NT_4 | OSVersion
#PB_OS_Windows_Server_2003 | OSVersion
#PB_OS_Windows_Server_2008 | OSVersion
#PB_OS_Windows_Vista | OSVersion
#PB_OS_Windows_XP | OSVersion
#PB_OnError_Breakpoint ErrorCode
RaiseError
#PB_OnError_DivideByZero | ErrorCode
#PB_OnError_EAX | ErrorRegister
#PB_OnError_EBP | ErrorRegister
#PB_OnError_EBX | ErrorRegister
#PB_OnError_ECX | ErrorRegister
#PB_OnError_EDI | ErrorRegister
#PB_OnError_EDX | ErrorRegister
#PB_OnError_ESI | ErrorRegister
#PB_OnError_ESP | ErrorRegister
#PB_OnError_Flags | ErrorRegister
#PB_OnError_Floatingpoint ErrorCode
RaiseError
#PB_OnError_IllegalInstruction ErrorCode
RaiseError
#PB_OnError_InvalidMemory ErrorCode
ErrorTargetAddress
RaiseError
#PB_OnError_PriviledgedInstruction ErrorCode
RaiseError
#PB_OnError_R15 | ErrorRegister
#PB_OnError_R8 | ErrorRegister
#PB_OnError_R9 | ErrorRegister
#PB_OnError_RAX | ErrorRegister
#PB_OnError_RBP | ErrorRegister
#PB_OnError_RBX | ErrorRegister
#PB_OnError_RCX | ErrorRegister
#PB_OnError_RDI | ErrorRegister
#PB_OnError_RDX | ErrorRegister
#PB_OnError_RSI | ErrorRegister
#PB_OnError_RSP | ErrorRegister
#PB_OnError_cr | ErrorRegister
#PB_OnError_ctx | ErrorRegister
#PB_OnError_lr | ErrorRegister
#PB_OnError_r0 | ErrorRegister
#PB_OnError_r1 | ErrorRegister
#PB_OnError_r2 | ErrorRegister
#PB_OnError_r31 | ErrorRegister
#PB_OnError_xer | ErrorRegister
#PB_Packer_BriefLZ CompressMemory
CreatePack
OpenPack
UncompressMemory
#PB_Packer_CompressedSize | PackEntrySize
#PB_Packer_Directory | PackEntryType
#PB_Packer_File | PackEntryType
#PB_Packer_JCALG1 | UncompressMemory
#PB_Packer_LZMA CompressMemory
CreatePack
OpenPack
UncompressMemory
#PB_Packer_UncompressedSize | PackEntrySize
#PB_Packer_Zip CompressMemory
OpenPack
UncompressMemory
#PB_Panel3D_ItemHeight | PanelGadget3D
#PB_Panel3D_ItemWidth | PanelGadget3D
#PB_Panel3D_TabHeight | PanelGadget3D
#PB_Panel_ItemHeight | PanelGadget
#PB_Panel_ItemWidth | PanelGadget
#PB_Panel_TabHeight | PanelGadget
#PB_Parent MoveBillboardGroup
MoveCamera
MoveEntityBone
MoveEntity
MoveLight
MoveNode
MoveParticleEmitter
MoveText3D
#PB_ParticleEmitter | ResetMaterial
#PB_Particle_Box | CreateParticleEmitter
#PB_Particle_Point | CreateParticleEmitter
#PB_PixelFormat_15Bits | DrawingBufferPixelFormat
#PB_PixelFormat_16Bits | DrawingBufferPixelFormat
#PB_PixelFormat_24Bits_BGR | DrawingBufferPixelFormat
#PB_PixelFormat_24Bits_RGB | DrawingBufferPixelFormat
#PB_PixelFormat_32Bits_BGR | DrawingBufferPixelFormat
#PB_PixelFormat_32Bits_RGB | DrawingBufferPixelFormat
#PB_PixelFormat_8Bits | DrawingBufferPixelFormat
#PB_PixelFormat_ReversedY | DrawingBufferPixelFormat
#PB_PointJoint_Damping | PointJoint
#PB_PointJoint_Tau | PointJoint
#PB_Preference_GroupSeparator CreatePreferences
OpenPreferences
#PB_Preference_NoSpace CreatePreferences
OpenPreferences
#PB_Procedure | Compilerfunctions
#PB_Processor_PowerPC | Compilerdirectives
#PB_Processor_mc68000 | Compilerdirectives
#PB_Processor_x64 | Compilerdirectives
#PB_Processor_x86 | Compilerdirectives
#PB_Program_Connect | RunProgram
#PB_Program_Eof CloseProgram
WriteProgramData
WriteProgramString
WriteProgramStringN
#PB_Program_Error ReadProgramError
RunProgram
#PB_Program_Hide | RunProgram
#PB_Program_Open | RunProgram
#PB_Program_Read AvailableProgramOutput
ProgramRunning
ReadProgramData
ReadProgramString
RunProgram
#PB_Program_Wait | RunProgram
#PB_Program_Write CloseProgram
RunProgram
WriteProgramData
WriteProgramString
WriteProgramStringN
#PB_ProgressBar3D_Maximum | ProgressBarGadget3D
#PB_ProgressBar3D_Minimum | ProgressBarGadget3D
#PB_ProgressBar_Maximum | ProgressBarGadget
#PB_ProgressBar_Minimum | ProgressBarGadget
#PB_ProgressBar_Smooth | ProgressBarGadget
#PB_ProgressBar_Vertical | ProgressBarGadget
#PB_Quad Bin
Hex
StrU
Compilerfunctions
#PB_RegularExpression_AnyNewLine | CreateRegularExpression
#PB_RegularExpression_DotAll | CreateRegularExpression
#PB_RegularExpression_Extended | CreateRegularExpression
#PB_RegularExpression_MultiLine | CreateRegularExpression
#PB_RegularExpression_NoCase | CreateRegularExpression
#PB_Relative MoveBillboardGroup
MoveCamera
MoveEntityBone
MoveEntity
ScaleEntity
FileSeek
MoveLight
MoveNode
ScaleNode
MoveParticleEmitter
MoveText3D
ScaleText3D
#PB_Requester_MultiSelection | OpenFileRequester
#PB_Round_Down | Round
#PB_Round_Nearest | Round
#PB_Round_Up | Round
#PB_Screen_NoSynchronization OpenScreen
OpenWindowedScreen
#PB_Screen_SmartSynchronization OpenScreen
OpenWindowedScreen
#PB_Screen_WaitSynchronization OpenScreen
OpenWindowedScreen
#PB_ScrollArea3D_InnerHeight | ScrollAreaGadget3D
#PB_ScrollArea3D_InnerWidth | ScrollAreaGadget3D
#PB_ScrollArea3D_X | ScrollAreaGadget3D
#PB_ScrollArea3D_Y | ScrollAreaGadget3D
#PB_ScrollArea_BorderLess | ScrollAreaGadget
#PB_ScrollArea_Center | ScrollAreaGadget
#PB_ScrollArea_Flat | ScrollAreaGadget
#PB_ScrollArea_InnerHeight MDIGadget
ScrollAreaGadget
#PB_ScrollArea_InnerWidth MDIGadget
ScrollAreaGadget
#PB_ScrollArea_Raised | ScrollAreaGadget
#PB_ScrollArea_Single | ScrollAreaGadget
#PB_ScrollArea_X | ScrollAreaGadget
#PB_ScrollArea_Y | ScrollAreaGadget
#PB_ScrollBar3D_Maximum | ScrollBarGadget3D
#PB_ScrollBar3D_Minimum | ScrollBarGadget3D
#PB_ScrollBar3D_PageLength | ScrollBarGadget3D
#PB_ScrollBar3D_Vertical | ScrollBarGadget3D
#PB_ScrollBar_Maximum | ScrollBarGadget
#PB_ScrollBar_Minimum | ScrollBarGadget
#PB_ScrollBar_PageLength | ScrollBarGadget
#PB_ScrollBar_Vertical | ScrollBarGadget
#PB_SerialPort_Break | SerialPortError
#PB_SerialPort_CTS | GetSerialPortStatus
#PB_SerialPort_DCD | GetSerialPortStatus
#PB_SerialPort_DSR | GetSerialPortStatus
#PB_SerialPort_DTR | SetSerialPortStatus
#PB_SerialPort_EOFSent | SerialPortError
#PB_SerialPort_EvenParity | OpenSerialPort
#PB_SerialPort_Frame | SerialPortError
#PB_SerialPort_IOE | SerialPortError
#PB_SerialPort_MarkParity | OpenSerialPort
#PB_SerialPort_NoHandshake | OpenSerialPort
#PB_SerialPort_NoParity | OpenSerialPort
#PB_SerialPort_OddParity | OpenSerialPort
#PB_SerialPort_OverRun | SerialPortError
#PB_SerialPort_RI | GetSerialPortStatus
#PB_SerialPort_RTS | SetSerialPortStatus
#PB_SerialPort_RtsCtsHandshake | OpenSerialPort
#PB_SerialPort_RtsHandshake | OpenSerialPort
#PB_SerialPort_RxOver | SerialPortError
#PB_SerialPort_RxParity | SerialPortError
#PB_SerialPort_SpaceParity | OpenSerialPort
#PB_SerialPort_TXD | SetSerialPortStatus
#PB_SerialPort_TxFull | SerialPortError
#PB_SerialPort_WaitingCTS | SerialPortError
#PB_SerialPort_WaitingDSR | SerialPortError
#PB_SerialPort_WaitingRLSD | SerialPortError
#PB_SerialPort_XoffCharacter GetSerialPortStatus
SetSerialPortStatus
#PB_SerialPort_XoffReceived | SerialPortError
#PB_SerialPort_XoffSent | SerialPortError
#PB_SerialPort_XonCharacter GetSerialPortStatus
SetSerialPortStatus
#PB_SerialPort_XonXoffHandshake | OpenSerialPort
#PB_Shadow_Additive | WorldShadows
#PB_Shadow_Modulative | WorldShadows
#PB_Shadow_None | WorldShadows
#PB_Shadow_TextureAdditive | WorldShadows
#PB_Shorcut_Tab | AddKeyboardShortcut
#PB_Shortcut_ | CanvasGadget
#PB_Shortcut_0 | AddKeyboardShortcut
#PB_Shortcut_1 | AddKeyboardShortcut
#PB_Shortcut_2 | AddKeyboardShortcut
#PB_Shortcut_3 | AddKeyboardShortcut
#PB_Shortcut_4 | AddKeyboardShortcut
#PB_Shortcut_5 | AddKeyboardShortcut
#PB_Shortcut_6 | AddKeyboardShortcut
#PB_Shortcut_7 | AddKeyboardShortcut
#PB_Shortcut_8 | AddKeyboardShortcut
#PB_Shortcut_9 | AddKeyboardShortcut
#PB_Shortcut_A | AddKeyboardShortcut
#PB_Shortcut_Add | AddKeyboardShortcut
#PB_Shortcut_All | RemoveKeyboardShortcut
#PB_Shortcut_Alt | AddKeyboardShortcut
#PB_Shortcut_Apps | AddKeyboardShortcut
#PB_Shortcut_B | AddKeyboardShortcut
#PB_Shortcut_Back | AddKeyboardShortcut
#PB_Shortcut_C | AddKeyboardShortcut
#PB_Shortcut_Capital | AddKeyboardShortcut
#PB_Shortcut_Clear | AddKeyboardShortcut
#PB_Shortcut_Command | AddKeyboardShortcut
#PB_Shortcut_Control | AddKeyboardShortcut
#PB_Shortcut_D | AddKeyboardShortcut
#PB_Shortcut_Decimal | AddKeyboardShortcut
#PB_Shortcut_Delete | AddKeyboardShortcut
#PB_Shortcut_Divide | AddKeyboardShortcut
#PB_Shortcut_Down | AddKeyboardShortcut
#PB_Shortcut_E | AddKeyboardShortcut
#PB_Shortcut_End | AddKeyboardShortcut
#PB_Shortcut_Escape | AddKeyboardShortcut
#PB_Shortcut_Execute | AddKeyboardShortcut
#PB_Shortcut_F | AddKeyboardShortcut
#PB_Shortcut_F1 | AddKeyboardShortcut
#PB_Shortcut_F10 | AddKeyboardShortcut
#PB_Shortcut_F11 | AddKeyboardShortcut
#PB_Shortcut_F12 | AddKeyboardShortcut
#PB_Shortcut_F13 | AddKeyboardShortcut
#PB_Shortcut_F14 | AddKeyboardShortcut
#PB_Shortcut_F15 | AddKeyboardShortcut
#PB_Shortcut_F16 | AddKeyboardShortcut
#PB_Shortcut_F17 | AddKeyboardShortcut
#PB_Shortcut_F18 | AddKeyboardShortcut
#PB_Shortcut_F19 | AddKeyboardShortcut
#PB_Shortcut_F2 | AddKeyboardShortcut
#PB_Shortcut_F20 | AddKeyboardShortcut
#PB_Shortcut_F21 | AddKeyboardShortcut
#PB_Shortcut_F22 | AddKeyboardShortcut
#PB_Shortcut_F23 | AddKeyboardShortcut
#PB_Shortcut_F24 | AddKeyboardShortcut
#PB_Shortcut_F3 | AddKeyboardShortcut
#PB_Shortcut_F4 | AddKeyboardShortcut
#PB_Shortcut_F5 | AddKeyboardShortcut
#PB_Shortcut_F6 | AddKeyboardShortcut
#PB_Shortcut_F7 | AddKeyboardShortcut
#PB_Shortcut_F8 | AddKeyboardShortcut
#PB_Shortcut_F9 | AddKeyboardShortcut
#PB_Shortcut_G | AddKeyboardShortcut
#PB_Shortcut_H | AddKeyboardShortcut
#PB_Shortcut_Help | AddKeyboardShortcut
#PB_Shortcut_Home | AddKeyboardShortcut
#PB_Shortcut_I | AddKeyboardShortcut
#PB_Shortcut_Insert | AddKeyboardShortcut
#PB_Shortcut_J | AddKeyboardShortcut
#PB_Shortcut_K | AddKeyboardShortcut
#PB_Shortcut_L | AddKeyboardShortcut
#PB_Shortcut_Left | AddKeyboardShortcut
#PB_Shortcut_LeftWindows | AddKeyboardShortcut
#PB_Shortcut_M | AddKeyboardShortcut
#PB_Shortcut_Menu | AddKeyboardShortcut
#PB_Shortcut_Multiply | AddKeyboardShortcut
#PB_Shortcut_N | AddKeyboardShortcut
#PB_Shortcut_Next | AddKeyboardShortcut
#PB_Shortcut_Numlock | AddKeyboardShortcut
#PB_Shortcut_O | AddKeyboardShortcut
#PB_Shortcut_P | AddKeyboardShortcut
#PB_Shortcut_Pad0 | AddKeyboardShortcut
#PB_Shortcut_Pad1 | AddKeyboardShortcut
#PB_Shortcut_Pad2 | AddKeyboardShortcut
#PB_Shortcut_Pad3 | AddKeyboardShortcut
#PB_Shortcut_Pad4 | AddKeyboardShortcut
#PB_Shortcut_Pad5 | AddKeyboardShortcut
#PB_Shortcut_Pad6 | AddKeyboardShortcut
#PB_Shortcut_Pad7 | AddKeyboardShortcut
#PB_Shortcut_Pad8 | AddKeyboardShortcut
#PB_Shortcut_Pad9 | AddKeyboardShortcut
#PB_Shortcut_Pause | AddKeyboardShortcut
#PB_Shortcut_Print | AddKeyboardShortcut
#PB_Shortcut_Prior | AddKeyboardShortcut
#PB_Shortcut_Q | AddKeyboardShortcut
#PB_Shortcut_R | AddKeyboardShortcut
#PB_Shortcut_Return | AddKeyboardShortcut
#PB_Shortcut_Right | AddKeyboardShortcut
#PB_Shortcut_RightWindows | AddKeyboardShortcut
#PB_Shortcut_S | AddKeyboardShortcut
#PB_Shortcut_Scroll | AddKeyboardShortcut
#PB_Shortcut_Select | AddKeyboardShortcut
#PB_Shortcut_Separator | AddKeyboardShortcut
#PB_Shortcut_Shift | AddKeyboardShortcut
#PB_Shortcut_Snapshot | AddKeyboardShortcut
#PB_Shortcut_Space | AddKeyboardShortcut
#PB_Shortcut_Subtract | AddKeyboardShortcut
#PB_Shortcut_T | AddKeyboardShortcut
#PB_Shortcut_Tab | AddKeyboardShortcut
#PB_Shortcut_U | AddKeyboardShortcut
#PB_Shortcut_Up | AddKeyboardShortcut
#PB_Shortcut_V | AddKeyboardShortcut
#PB_Shortcut_W | AddKeyboardShortcut
#PB_Shortcut_X | AddKeyboardShortcut
#PB_Shortcut_Y | AddKeyboardShortcut
#PB_Shortcut_Z | AddKeyboardShortcut
#PB_SliderJoint_LowerLimit | SliderJoint
#PB_SliderJoint_UpperLimit | SliderJoint
#PB_Sort_Ascending SortArray
SortList
SortStructuredArray
SortStructuredList
#PB_Sort_Ascii SortStructuredArray
SortStructuredList
#PB_Sort_Byte SortStructuredArray
SortStructuredList
#PB_Sort_Character SortStructuredArray
SortStructuredList
#PB_Sort_Descending SortArray
SortList
SortStructuredArray
SortStructuredList
#PB_Sort_Double SortStructuredArray
SortStructuredList
#PB_Sort_Float SortStructuredArray
SortStructuredList
#PB_Sort_Long SortStructuredArray
SortStructuredList
#PB_Sort_NoCase SortArray
SortList
SortStructuredArray
SortStructuredList
#PB_Sort_Quad SortStructuredArray
SortStructuredList
#PB_Sort_String SortStructuredArray
SortStructuredList
#PB_Sort_Unicode SortStructuredArray
SortStructuredList
#PB_Sort_Word SortStructuredArray
SortStructuredList
#PB_Sound3D_Loop | PlaySound3D
#PB_Sound_Frame GetSoundPosition
SetSoundPosition
SoundLength
#PB_Sound_Loop | PlaySound
#PB_Sound_Millisecond GetSoundPosition
SetSoundPosition
SoundLength
#PB_Sound_MultiChannel GetSoundPosition
SetSoundPosition
PauseSound
ResumeSound
PlaySound
GetSoundFrequency
SetSoundFrequency
SoundStatus
SoundPan
SoundVolume
StopSound
#PB_Sound_Paused | SoundStatus
#PB_Sound_Playing | SoundStatus
#PB_Sound_Stopped | SoundStatus
#PB_Sound_Streaming CatchSound
GetSoundPosition
SetSoundPosition
LoadSound
PauseSound
ResumeSound
SoundLength
LoadSound3D
#PB_Sound_Unknown | SoundStatus
#PB_Spin3D_Maximum | SpinGadget3D
#PB_Spin3D_Minimum | SpinGadget3D
#PB_Spin_Maximum | SpinGadget
#PB_Spin_Minimum | SpinGadget
#PB_Spin_Numeric | SpinGadget
#PB_Spin_ReadOnly | SpinGadget
#PB_Splitter_FirstFixed | SplitterGadget
#PB_Splitter_FirstGadget | SplitterGadget
#PB_Splitter_FirstMinimumSize | SplitterGadget
#PB_Splitter_SecondFixed | SplitterGadget
#PB_Splitter_SecondGadget | SplitterGadget
#PB_Splitter_SecondMinimumSize | SplitterGadget
#PB_Splitter_Separator | SplitterGadget
#PB_Splitter_Vertical | SplitterGadget
#PB_Sprite3D_BilinearFiltering | Sprite3DQuality
#PB_Sprite3D_NoFiltering | Sprite3DQuality
#PB_Sprite_Alpha CatchSprite
CopySprite
DisplayAlphaSprite
DisplayShadowSprite
DisplaySolidSprite
GrabSprite
LoadSprite
SpriteOutput
#PB_Sprite_AlphaBlending CatchSprite
CopySprite
CreateSprite
LoadSprite
DisplaySprite3D
#PB_Sprite_Memory CatchSprite
CopySprite
CreateSprite
GrabSprite
LoadSprite
StartSpecialFX
#PB_Sprite_Texture CatchSprite
CopySprite
CreateSprite
GrabSprite
LoadSprite
CreateSprite3D
#PB_StatusBar_BorderLess StatusBarImage
StatusBarProgress
StatusBarText
#PB_StatusBar_Center StatusBarImage
StatusBarText
#PB_StatusBar_Raised StatusBarImage
StatusBarProgress
StatusBarText
#PB_StatusBar_Right StatusBarImage
StatusBarText
#PB_String | Compilerfunctions
#PB_String3D_Numeric | StringGadget3D
#PB_String3D_Password | StringGadget3D
#PB_String3D_ReadOnly | StringGadget3D
#PB_String_BorderLess | StringGadget
#PB_String_CaseSensitive CompareMemoryString
FindString
RemoveString
ReplaceString
#PB_String_Equal | CompareMemoryString
#PB_String_Greater | CompareMemoryString
#PB_String_InPlace | ReplaceString
#PB_String_Lower | CompareMemoryString
#PB_String_LowerCase | StringGadget
#PB_String_MaximumLength | StringGadget
#PB_String_NoCase CompareMemoryString
FindString
RemoveString
ReplaceString
#PB_String_Numeric | StringGadget
#PB_String_Password | StringGadget
#PB_String_ReadOnly | StringGadget
#PB_String_UpperCase | StringGadget
#PB_Structure | Compilerfunctions
#PB_Structure_AlignC | Structures
#PB_System_CPUs | CountCPUs
#PB_System_FreePhysical | MemoryStatus
#PB_System_FreeSwap | MemoryStatus
#PB_System_FreeVirtual | MemoryStatus
#PB_System_PageSize | MemoryStatus
#PB_System_ProcessCPUs | CountCPUs
#PB_System_TotalPhysical | MemoryStatus
#PB_System_TotalSwap | MemoryStatus
#PB_System_TotalVirtual | MemoryStatus
#PB_Terrain_CastShadows | TerrainRenderMode
#PB_Terrain_Lightmap | SetupTerrains
#PB_Terrain_LowLODShadows | TerrainRenderMode
#PB_Terrain_NormalMapping | SetupTerrains
#PB_Text3D_Bottom | Text3DAlignment
#PB_Text3D_HorizontallyCentered | Text3DAlignment
#PB_Text3D_Left | Text3DAlignment
#PB_Text3D_Top | Text3DAlignment
#PB_Text3D_VerticallyCentered | Text3DAlignment
#PB_Text_Border | TextGadget
#PB_Text_Center | TextGadget
#PB_Text_Right | TextGadget
#PB_Texture_AutomaticUpdate CreateRenderTexture
UpdateRenderTexture
#PB_Texture_CameraViewPort | CreateRenderTexture
#PB_Texture_ManualUpdate | CreateRenderTexture
#PB_ToolBarIcon_Copy | ToolBarStandardButton
#PB_ToolBarIcon_Cut | ToolBarStandardButton
#PB_ToolBarIcon_Delete | ToolBarStandardButton
#PB_ToolBarIcon_Find | ToolBarStandardButton
#PB_ToolBarIcon_Help | ToolBarStandardButton
#PB_ToolBarIcon_New | ToolBarStandardButton
#PB_ToolBarIcon_Open | ToolBarStandardButton
#PB_ToolBarIcon_Paste | ToolBarStandardButton
#PB_ToolBarIcon_Print | ToolBarStandardButton
#PB_ToolBarIcon_PrintPreview | ToolBarStandardButton
#PB_ToolBarIcon_Properties | ToolBarStandardButton
#PB_ToolBarIcon_Redo | ToolBarStandardButton
#PB_ToolBarIcon_Replace | ToolBarStandardButton
#PB_ToolBarIcon_Save | ToolBarStandardButton
#PB_ToolBarIcon_Undo | ToolBarStandardButton
#PB_ToolBar_Normal ToolBarImageButton
ToolBarStandardButton
#PB_ToolBar_Toggle GetToolBarButtonState
SetToolBarButtonState
ToolBarImageButton
ToolBarStandardButton
#PB_TrackBar_Maximum | TrackBarGadget
#PB_TrackBar_Minimum | TrackBarGadget
#PB_TrackBar_Ticks | TrackBarGadget
#PB_TrackBar_Vertical | TrackBarGadget
#PB_Tree_AlwaysShowSelection | TreeGadget
#PB_Tree_CheckBoxes GetGadgetItemState
SetGadgetItemState
TreeGadget
#PB_Tree_Checked GetGadgetItemState
SetGadgetItemState
#PB_Tree_Collapsed GetGadgetItemState
SetGadgetItemState
#PB_Tree_Expanded GetGadgetItemState
SetGadgetItemState
#PB_Tree_Inbetween GetGadgetItemState
SetGadgetItemState
#PB_Tree_NoButtons | TreeGadget
#PB_Tree_NoLines | TreeGadget
#PB_Tree_Selected GetGadgetItemState
SetGadgetItemState
#PB_Tree_SubLevel GetGadgetItemAttribute
TreeGadget
#PB_Tree_ThreeState | TreeGadget
#PB_URL_Parameters GetURLPart
SetURLPart
#PB_URL_Password GetURLPart
SetURLPart
#PB_URL_Path GetURLPart
SetURLPart
#PB_URL_Port GetURLPart
SetURLPart
#PB_URL_Protocol GetURLPart
SetURLPart
#PB_URL_Site GetURLPart
SetURLPart
#PB_URL_User GetURLPart
SetURLPart
#PB_UTF16 | WriteSerialPortString
#PB_UTF16BE ReadStringFormat
WriteStringFormat
#PB_UTF32 ReadStringFormat
WriteStringFormat
#PB_UTF32BE ReadStringFormat
WriteStringFormat
#PB_UTF8 ReadString
ReadStringFormat
WriteString
WriteStringFormat
WriteStringN
CompareMemoryString
MemoryStringLength
PeekS
PokeS
SendNetworkString
WriteSerialPortString
StringByteLength
CreateXML
LoadXML
CatchXML
GetXMLEncoding
SetXMLEncoding
#PB_Unicode ReadString
ReadStringFormat
WriteString
WriteStringFormat
WriteStringN
CompareMemoryString
FillMemory
MemoryStringLength
PeekS
PokeS
SendNetworkString
Bin
Hex
StringByteLength
StrU
CreateXML
LoadXML
CatchXML
GetXMLEncoding
SetXMLEncoding
Compilerfunctions
#PB_Variable | Compilerfunctions
#PB_Web_Back | WebGadget
#PB_Web_BlockPopupMenu | WebGadget
#PB_Web_BlockPopups | WebGadget
#PB_Web_Busy | WebGadget
#PB_Web_Forward | WebGadget
#PB_Web_HtmlCode SetGadgetItemText
WebGadget
#PB_Web_Mozilla | WebGadget
#PB_Web_NavigationCallback | WebGadget
#PB_Web_PageTitle | WebGadget
#PB_Web_Progress | WebGadget
#PB_Web_ProgressMax | WebGadget
#PB_Web_Refresh | WebGadget
#PB_Web_ScrollX | WebGadget
#PB_Web_ScrollY | WebGadget
#PB_Web_SelectedText | WebGadget
#PB_Web_StatusMessage | WebGadget
#PB_Web_Stop | WebGadget
#PB_Window3D_BorderLess | OpenWindow3D
#PB_Window3D_Invisible | OpenWindow3D
#PB_Window3D_SizeGadget | OpenWindow3D
#PB_Window_BorderLess | OpenWindow
#PB_Window_Borderless | AddGadgetItem
#PB_Window_FrameCoordinate WindowHeight
WindowWidth
WindowX
WindowY
#PB_Window_InnerCoordinate WindowHeight
WindowWidth
WindowX
WindowY
#PB_Window_Invisible | OpenWindow
#PB_Window_Maximize GetWindowState
OpenWindow
SetWindowState
#PB_Window_MaximizeGadget | OpenWindow
#PB_Window_Minimize GetWindowState
OpenWindow
SetWindowState
#PB_Window_MinimizeGadget | OpenWindow
#PB_Window_NoActivate HideWindow
OpenWindow
#PB_Window_NoGadgets UseGadgetList
OpenWindow
#PB_Window_Normal GetWindowState
SetWindowState
#PB_Window_ScreenCentered | OpenWindow
#PB_Window_Screencentered | AddGadgetItem
#PB_Window_SizeGadget | OpenWindow
#PB_Window_SystemMenu | OpenWindow
#PB_Window_TitleBar | OpenWindow
#PB_Window_Tool | OpenWindow
#PB_Window_WindowCentered AddGadgetItem
OpenWindow
#PB_Word FillMemory
Bin
Hex
StrU
Compilerfunctions
#PB_World MoveBillboardGroup
MoveCamera
MoveEntityBone
MoveEntity
MoveLight
MoveNode
MoveParticleEmitter
MoveText3D
#PB_World_DebugBody | WorldDebug
#PB_World_DebugEntity | WorldDebug
#PB_World_DebugNone | WorldDebug
#PB_World_TerrainPick MousePick
RayPick
#PB_World_UnderWater | CreateWater
#PB_World_WaterCaustics | CreateWater
#PB_World_WaterFoam | CreateWater
#PB_World_WaterGodRays | CreateWater
#PB_World_WaterHighQuality | CreateWater
#PB_World_WaterLowQuality | CreateWater
#PB_World_WaterMediumQuality | CreateWater
#PB_World_WaterPick MousePick
RayPick
#PB_World_WaterSmooth | CreateWater
#PB_World_WaterSun CreateWater
Sun
#PB_XML_Aborted | XMLStatus
#PB_XML_AsyncEntity | XMLStatus
#PB_XML_AttributeExternalEntityRef | XMLStatus
#PB_XML_BadCharacterRef | XMLStatus
#PB_XML_BinaryEntityRef | XMLStatus
#PB_XML_CData XMLNodeType
GetXMLNodeText
CreateXMLNode
CopyXMLNode
MoveXMLNode
#PB_XML_CantChangeFeatures | XMLStatus
#PB_XML_Comment XMLNodeType
GetXMLNodeText
CreateXMLNode
CopyXMLNode
MoveXMLNode
#PB_XML_CutNewline | FormatXML
#PB_XML_CutSpace | FormatXML
#PB_XML_DTD XML
XMLNodeType
#PB_XML_DublicateAttribute | XMLStatus
#PB_XML_EntityDeclaredInPE | XMLStatus
#PB_XML_ExternalEntityHandling | XMLStatus
#PB_XML_FeatureRequiresDTD | XMLStatus
#PB_XML_Finished | XMLStatus
#PB_XML_IncompletePE | XMLStatus
#PB_XML_IncorrectEncoding | XMLStatus
#PB_XML_Instruction XMLNodeType
GetXMLNodeName
SetXMLNodeName
#PB_XML_InvalidToken | XMLStatus
#PB_XML_JunkAfterDocElement | XMLStatus
#PB_XML_LinuxNewline | FormatXML
#PB_XML_MacNewline | FormatXML
#PB_XML_MisplacedXML | XMLStatus
#PB_XML_NoDeclaration SaveXML
ExportXML
#PB_XML_NoElements | XMLStatus
#PB_XML_NoMemory | XMLStatus
#PB_XML_Normal XMLNodeType
GetXMLNodeText
GetXMLNodeName
SetXMLNodeName
GetXMLAttribute
SetXMLAttribute
RemoveXMLAttribute
ExamineXMLAttributes
CreateXMLNode
CopyXMLNode
MoveXMLNode
#PB_XML_NotStandalone | XMLStatus
#PB_XML_NotSuspended | XMLStatus
#PB_XML_ParamEntityRef | XMLStatus
#PB_XML_PartialCharacter | XMLStatus
#PB_XML_PublicID | XMLStatus
#PB_XML_ReFormat | FormatXML
#PB_XML_ReIndent | FormatXML
#PB_XML_RecursiveEntityRef | XMLStatus
#PB_XML_ReduceNewline | FormatXML
#PB_XML_ReduceSpace | FormatXML
#PB_XML_ReservedNamespaceURI | XMLStatus
#PB_XML_ReservedPrefixXML | XMLStatus
#PB_XML_ReservedPrefixXMLNS | XMLStatus
#PB_XML_Root XMLNodeType
CreateXMLNode
#PB_XML_StandaloneNo GetXMLStandalone
SetXMLStandalone
#PB_XML_StandaloneUnset GetXMLStandalone
SetXMLStandalone
#PB_XML_StandaloneYes GetXMLStandalone
SetXMLStandalone
#PB_XML_StreamEnd | CatchXML
#PB_XML_StreamNext | CatchXML
#PB_XML_StreamStart | CatchXML
#PB_XML_StringFormat SaveXML
ExportXML
#PB_XML_Success | XMLStatus
#PB_XML_Suspended | XMLStatus
#PB_XML_SuspendedPE | XMLStatus
#PB_XML_Syntax | XMLStatus
#PB_XML_TagMismatch | XMLStatus
#PB_XML_TextDeclaration | XMLStatus
#PB_XML_UnboundPrefix | XMLStatus
#PB_XML_UnclosedCDataSection | XMLStatus
#PB_XML_UnclosedToken | XMLStatus
#PB_XML_UndeclaringPrefix | XMLStatus
#PB_XML_UndefinedEntity | XMLStatus
#PB_XML_UnexpectedState | XMLStatus
#PB_XML_UnknownEncoding | XMLStatus
#PB_XML_WindowsNewline | FormatXML
#PB_XML_XMLDeclaration | XMLStatus
#PB_Xml_Normal | MainXMLNode
#PB_Xml_Root | RootXMLNode
* Filtrées par rapport à la description du manuel.


2DDrawing

PureBasic - 2DDrawing

Généralités

La bibliothèque 2DDrawing contient toutes les commandes permettant de dessiner en deux dimensions sur une surface prédéfinie, que ce soit une fenêtre, un écran ou même une imprimante. Vous pourrez ainsi tracer un trait, un rectangle, un cercle, une ellipse, créer des dégradés de formes diverses et écrire du texte.

Les dessins commencent toujours après avoir appelé la fonction StartDrawing() et se terminent lorsque StopDrawing() est appelé.

Sommaire des commandes

BackColor
Box
BoxedGradient
Circle
CircularGradient
ConicalGradient
CustomFilterCallback
CustomGradient
DrawAlphaImage
DrawImage
DrawRotatedText
DrawText
DrawingBuffer
DrawingBufferPitch
DrawingBufferPixelFormat
DrawingFont
DrawingMode
Ellipse
EllipticalGradient
FillArea
FrontColor
GrabDrawingImage
GradientColor
Line
LineXY
LinearGradient
OutputDepth
OutputHeight
OutputWidth
Plot
Point
ResetGradientColors
RoundBox
StartDrawing
StopDrawing
TextHeight
TextWidth

Exemple

2DDrawing.pb
2DDrawingAlpha.pb
MDI_ImageViewer.pb
DirectScreenDrawing.pb
Win32_API.pb

OS Supportés

Tous

Guide de référence - Index


BackColor()

Syntaxe

BackColor(Couleur)
Description
Définit la couleur d'arrière plan.

Arguments

Couleur La couleur à appliquer.

Les fonctions RGB() ou RGBA() peuvent être utilisées pour définir facilement une couleur.

C'est le mode de dessin qui indique si la transparence (canal alpha) est prise en compte.

Un tableau avec les couleurs les plus courantes est disponible ici.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

FrontColor(), RGB(), RGBA(), DrawingMode()

OS Supportés

Tous


Box()

Syntaxe

Box(x, y, Largeur, Hauteur [, Couleur])
Description
Dessine un rectangle sur la surface de dessin en cours.

Arguments

x, y, Largeur, Hauteur Position et dimension du rectangle.
Couleur (optionnel) La couleur du rectangle.

Si le paramètre 'Couleur' n'est pas spécifié, la couleur fixée par la fonction FrontColor() sera utilisée.

Les fonctions RGB() ou RGBA() peuvent être utilisées pour définir facilement une couleur.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le mode de remplissage est controlé par DrawingMode().

Exemple

  If OpenWindow(0, 0, 0, 200, 200, "Rectangles", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      y = 0
      For x = 0 To 95 Step 10
        Box(x, y, 200-2*x, 200-2*y, RGB(Random(255), Random(255), Random(255)))
        y + 10        ; C'est équivalent à 'y = y + 10'
      Next x
      StopDrawing()
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

RoundBox(), Line(), Circle(), Ellipse() FrontColor(), RGB(), RGBA(), DrawingMode()


BoxedGradient()

Syntaxe

BoxedGradient(x, y, Largeur, Hauteur)
Description
Crée un dégradé de forme rectangulaire.

Arguments

x, y, Largeur, Hauteur Position et taille du rectangle.

Le dégradé de couleur va de la couleur d'arrière plan au centre du rectangle à la couleur d'avant plan à son contour.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Des couleurs additionnelles peuvent être ajoutées au dégradé avec GradientColor().

Note: Cette commande a un effet uniquement sur des surfaces de type ImageOutput() et CanvasOutput(). Le dégradé est dessiné uniquement si le mode #PB_2DDrawing_Gradient est activé avec DrawingMode().

Exemple

  If OpenWindow(0, 0, 0, 400, 200, "BoxedGradient Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 400, 200, $FFFFFF)

      DrawingMode(#PB_2DDrawing_Gradient)
      BackColor($00FFFF)
      FrontColor($FF0000)

      BoxedGradient(0, 0, 200, 200)
      Circle(100, 100, 100)
      BoxedGradient(225, -100, 150, 400)
      Circle(300, 100, 100)

      StopDrawing()
      ImageGadget(0, 0, 0, 400, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

GradientColor(), ResetGradientColors(),
LinearGradient(), CircularGradient(),
EllipticalGradient(), ConicalGradient(), CustomGradient(),
DrawingMode()


Circle()

Syntaxe

Circle(x, y, Rayon [, Couleur])
Description
Dessine un cercle sur la surface de dessin en cours.

Arguments

x, y | Position du centre du cercle.
Rayon | Le rayon du cercle. Attention, le centre du cercle n'est pas inclu dans le rayon.
Couleur (optionnel) La couleur du cercle.

Si le paramètre 'Couleur' n'est pas spécifié, la couleur fixée par la fonction FrontColor() sera utilisée.

Les fonctions RGB() ou RGBA() peuvent être utilisées pour définir facilement une couleur.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le mode de remplissage est controllé par DrawingMode().

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  If OpenWindow(0, 0, 0, 200, 200, "Cercles", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 200, 200, RGB(255, 255, 255))
      For Radius = 100 To 10 Step -10
        Circle(100, 100, Radius, RGB(Random(255), Random(255), Random(255)))
      Next
      StopDrawing()
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

Box(), RoundBox(), Line(), Ellipse() FrontColor(), RGB(), RGBA(), DrawingMode()


CircularGradient()

Syntaxe

CircularGradient(x, y, Rayon)
Description
Crée un dégradé circulaire autour d'un point.

Arguments

x, y | Position du point autour duquel est appliqué la couleur d'arrière plan.
Rayon | Distance autour de 'x,y' à laquelle est appliqué la couleur d'avant plan.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Des couleurs additionnelles peuvent être ajoutées au dégradé avec GradientColor().

Note: Cette commande a un effet uniquement sur des surfaces de type ImageOutput() et CanvasOutput(). Le dégradé est dessiné uniquement si le mode #PB_2DDrawing_Gradient est activé avec DrawingMode().

Exemple

  If OpenWindow(0, 0, 0, 400, 200, "CircularGradient Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 400, 200, $FFFFFF)

      DrawingMode(#PB_2DDrawing_Gradient)
      BackColor($00FFFF)
      FrontColor($FF0000)

      CircularGradient(100, 100, 100)
      Circle(100, 100, 100)
      CircularGradient(350, 100, 75)
      Circle(300, 100, 100)

      StopDrawing()
      ImageGadget(0, 0, 0, 400, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

GradientColor(), ResetGradientColors(),
LinearGradient(), EllipticalGradient(),
BoxedGradient(), ConicalGradient(), CustomGradient(),
DrawingMode()


ConicalGradient()

Syntaxe

ConicalGradient(x, y, Angle.f)
Description
Crée un dégradé de forme conique autour d'un point.

Arguments

x, y Position du centre du cône.
Angle.f L'angle de départ du dégradé en degré.

Le dégradé de couleur va de la couleur d'arrière plan à partir de l'angle spécifié, puis change jusqu'à la couleur d'avant plan dans le sens des aiguilles d'une montre en revenant à l'angle spécifié.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Des couleurs additionnelles peuvent être ajoutées au dégradé avec GradientColor().

Note: Cette commande a un effet uniquement sur des surfaces de type ImageOutput() et CanvasOutput(). Le dégradé est dessiné uniquement si le mode #PB_2DDrawing_Gradient est activé avec DrawingMode().

Exemple

  If OpenWindow(0, 0, 0, 400, 200, "ConicalGradient", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 400, 200, $FFFFFF)

      DrawingMode(#PB_2DDrawing_Gradient)
      BackColor($00FFFF)
      FrontColor($FF0000)

      ConicalGradient(100, 100, 0.0)
      Circle(100, 100, 100)
      ConicalGradient(300, 0, 90.0)
      Circle(300, 100, 100)

      StopDrawing()
      ImageGadget(0, 0, 0, 400, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

GradientColor(), ResetGradientColors(),
LinearGradient(), CircularGradient(),
EllipticalGradient(), BoxedGradient(), CustomGradient(),
DrawingMode()


CustomFilterCallback()

Syntaxe

CustomFilterCallback(@FiltreCallback())
Description
Spécifie une procédure qui sera appelée pour chaque pixel affiché par une opération de dessin en mode #PB_2DDrawing_CustomFilter.

Arguments

@FiltreCallback() L'adresse de la procédure.

La procedure doit avoir la forme suivante:
  Procedure CustomCallback(x, y, SourceColor, TargetColor)
    ;
    ; Calcul de  'Couleur' à partir des entrées
    ;
    ProcedureReturn Couleur
  EndProcedure
La procédure sera appelée pour chaque pixel affiché par les commandes telles que Line(), Box() ou DrawText().

'SourceColor' représente la couleur donnée à l'opération de dessin, et 'TargetColor' représente la couleur du pixel aux coordonnées x,y de la surface de dessin.
Ces deux couleurs sont toujours en 32-bit (avec canal alpha) indépendamment de la résolution de la surface de dessin.
La procédure calculera la nouvelle couleur du pixel à afficher et la renverra.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette procédure sera appelée de nombreuse fois (pour chaque pixel à appeler), donc elle devra être la plus courte et la plus optimisée possible, sinon l'impact sur les performances de dessin sera conséquent.

Note: le mode de dessin #PB_2DDrawing_CustomFilter fonctionne uniquement avec ImageOutput() et CanvasOutput().

Exemple

  Procedure FilterCallback(x, y, SourceColor, TargetColor)
    ; Ne modifie que la composante rouge de la Source
    ProcedureReturn RGBA(Red(SourceColor), Green(TargetColor), Blue(TargetColor), Alpha(TargetColor))
  EndProcedure

  UseJPEGImageDecoder()

  If OpenWindow(0, 0, 0, 400, 200, "CustomFilterCallback Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    LoadImage(1, #PB_Compiler_Home + "examples/sources/data/clouds.jpg")

    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      DrawImage(ImageID(1), 0, 0, 400, 200)

      DrawingMode(#PB_2DDrawing_CustomFilter)
      CustomFilterCallback(@FilterCallback())
      Circle(100, 100, 100, $0000FF)
      Circle(300, 100, 100, $000000)

      StopDrawing()
      ImageGadget(0, 0, 0, 400, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

DrawingMode(), CustomGradient()


CustomGradient()

Syntaxe

CustomGradient(@GradientCallback())
Description
Crée un dégradé d'une forme arbitraire.

Arguments

@GradientCallback() L'adresse de la procedure de callback.

La procédure doit avoir la forme suivante:
  Procedure.f GradientCallback(x, y)
    ;
    ; Renvoie une valeur entre 0.0 et 1.0 pour définir le dégradé à la position x,y
    ;
    ProcedureReturn 1.0
  EndProcedure
La procédure sera appelée pour chaque pixel affiché par l'opération de dessin.
La procédure doit retourner une valeur comprise entre 0.0 and 1.0 (pas une valeur de couleur) pour définir la valeur du dégradé à une position donnée.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Par défaut, la valeur 0.0 représente la couleur d'arrière plan et la valeur 1.0 représente la couleur d'avant plan.

Des couleurs additionnelles peuvent être ajoutées au dégradé avec GradientColor().

Cette procédure sera appelée de nombreuse fois (pour chaque pixel à appeler), donc elle devra être la plus courte et la plus optimisée possible, sinon l'impact sur les performances de dessin sera conséquent.

Note: Cette commande a un effet uniquement sur des surfaces de type ImageOutput() et CanvasOutput(). Le dégradé est dessiné uniquement si le mode #PB_2DDrawing_Gradient est activé avec DrawingMode().

Exemple

  Procedure.f GradientCallback(x, y)
    ProcedureReturn Sin(x * 0.1) * Sin(y * 0.1) ; Valeur comprise entre 0 et 1
  EndProcedure

  If OpenWindow(0, 0, 0, 400, 200, "CustomGradient Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 400, 200, $FFFFFF)

      DrawingMode(#PB_2DDrawing_Gradient)
      BackColor($00FFFF)
      FrontColor($FF0000)

      CustomGradient(@GradientCallback())
      Circle(100, 100, 100)
      Circle(300, 100, 100)

      StopDrawing()
      ImageGadget(0, 0, 0, 400, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

GradientColor(), ResetGradientColors(),
LinearGradient(), CircularGradient(),
EllipticalGradient(), BoxedGradient(), ConicalGradient(),
DrawingMode()


DrawAlphaImage()

Syntaxe

DrawAlphaImage(ImageID, x, y [, ConstAlpha])
Description
Affiche une image transparente sur la surface de dessin en cours.

Arguments

ImageID Le numéro d'identification de l'image.

L'ImageID' peut être obtenu facilement en utilisant la fonction ImageID() de la bibliothèque Image.
x, y La position du coin en haut et à gauche de l'image.
ConstAlpha (optionnel) Le coefficient de transparence de l'image.

Sa valeur varie de 0 (complètement transparente) à 255 (complètement opaque). De fait, même les images qui n'ont pas de canal alpha peuvent être affichées de manière transparente.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

L'image sera fusionnée avec le fond du dessin en tenant compte de son canal alpha (même si le mode de dessin actuel n'est pas #PB_2DDrawing_AlphaBlend).

Cette commande fonctionne sur toutes les surfaces de dessin, même celles qui ne supportent pas les options de transparence (alpha blending) de DrawingMode().

L'image sera affichée dans sa taille originale.
ResizeImage() peuvent être utilisé pour changer la taille d'une image.

Cette commande ne peut pas être utilisée pour afficher une icône (chargée à partir d'un fichier '.ico').

Voir aussi

DrawImage(), ImageID()


DrawImage()

Syntaxe

DrawImage(ImageID, x, y [, Largeur, Hauteur])
Description
Affiche une image sur la surface de dessin en cours.

Arguments

ImageID Le numéro d'identification de l'image.

L'ImageID' peut être obtenu facilement en utilisant la fonction ImageID() de la bibliothèque Image.
x, y La position du coin en haut et à gauche de l'image.
Largeur, Hauteur (optionnel) La taille de l'image.

Si ces paramètres ne sont pas spécifiés alors l'image sera redimensionnée en temps réel avant d'être affichée. La taille de l'image originale n'est pas modifiée.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

L'image sera transparente si le mode d'affichage courant DrawingMode() est utilisé avec une des options d'alpha-blending (transparence) sinon l'image est simplement copiée sur la surface de dessin en cours. Pour dessiner une image en utilisant la transparence, voir la commande DrawAlphaImage().


DrawRotatedText()

Syntaxe

DrawRotatedText(x, y, Texte$, Angle.f [, Couleur])
Description
Affiche une chaîne de caractères avec un angle donné sur la surface de dessin en cours.

Arguments

x, y L'emplacement du coin en haut et à gauche du texte.

C'est aussi le centre de rotation du texte.
Texte$ | Le texte à dessiner.
Angle.f | L'angle de rotation en degrés (sens anti-horaire).
Couleur (optionnel) La couleur du texte.

Si ce paramètre n'est pas spécifié alors la couleur par défaut FrontColor() sera utilisée.

Cette couleur peut être au format RGB() ou RGBA().

Le fond du texte est toujours transparent.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  If OpenWindow(0, 0, 0, 200, 200, "DrawRotatedText Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 200, 200, RGB(255, 255, 255))
      For Angle = 0 To 360 Step 45
        DrawRotatedText(100, 100, "Hello World!", Angle, RGB(0, 0, 0))
      Next Angle
      StopDrawing()
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

DrawText(), DrawingFont(), FrontColor()


DrawText()

Syntaxe

Resultat = DrawText(x, y, Texte$ [, CouleurTexte [, CouleurFond]])
Description
Affiche une chaîne de caractères sur la surface de dessin en cours.

Arguments

x, y | Position du texte.
Texte$ | Le texte à afficher.
CouleurTexte (optionnel) Couleur du texte.

Si le paramètre n'est pas précisé, la couleur définie par FrontColor() sera utilisée par défaut.

Les fonctions RGB() ou RGBA() peuvent être utilisées pour définir facilement une couleur.
CouleurFond (optionnel) Couleur de fond.

Si le paramètre n'est pas précisé, la couleur définie par FrontColor() sera utilisée par défaut.

Les fonctions RGB() ou RGBA() peuvent être utilisées pour définir facilement une couleur.

DrawingMode() peut être utilisée pour afficher un fond coloré ou transparent.

DrawingFont() peut être utilisée pour changer la police de caractères.

Si le DrawingMode() courant utilise l'option #PB_2DDrawing_Transparent alors ce paramètre est ignoré et le fond est transparent.
Si DrawingMode() est configuré pour avoir un fond opaque et que le mode de dessin courant utilise le canal alpha alors le texte est d'abord mélangé au fond et ensuite appliqué sur la zone de dessin.

Valeur de retour

Renvoie la nouvelle position en x du curseur texte, juste après le dernier caractère affiché, ceci pour faciliter la concaténation de textes si nécessaire.

Exemple

  If OpenWindow(0, 0, 0, 200, 200, "DrawText Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      DrawingMode(#PB_2DDrawing_Transparent)
      Box(0, 0, 200, 200, RGB(255, 255, 255))
      For i = 1 To 30
        DrawText(Random(200), Random(200), "Hello World!", RGB(Random(255), Random(255), Random(255)))
      Next i
      StopDrawing()
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

DrawRotatedText(), DrawingFont(), FrontColor(), BackColor()


DrawingBuffer()

Syntaxe

AdresseMemoire = DrawingBuffer()
Description
Renvoie l'adresse mémoire du buffer de dessin, ce qui permet la manipulation des pixels directement en mémoire.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie l'adresse des pixels si l'accès direct est possible ou zéro sinon.

Remarques

Cela peut correspondre directement à la mémoire vidéo si la sortie est ScreenOutput() ou SpriteOutput() et permet des manipulations très rapide des pixels.
Avec ImageOutput() cette commande permet l'accès direct aux pixels de l'image.

Cette fonction doit être appelée à chaque fois que l'accès au buffer est nécessaire.

Note: Cette commande est destinée aux programmeurs chevronnés. Pour obtenir plus d'informations sur le buffer, les commandes suivantes peuvent être utilisées : DrawingBufferPixelFormat() et DrawingBufferPitch().

Exemple

DirectScreenDrawing.pb

Voir aussi

DrawingBufferPixelFormat(), DrawingBufferPitch()


DrawingBufferPitch()

Syntaxe

Resultat = DrawingBufferPitch()
Description
Renvoie la longueur réelle d'une ligne du buffer courant, en octets.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la longueur en octets d'une ligne de la surface de dessin, y compris toutes les données annexes de chaque pixel.

Note: Pour des raisons d'alignement, le résultat peut donc être plus grand que la largeur de ligne en pixels.

Remarques

Cette fonction est nécessaire lors des accès directs en mémoire vidéo pour passer d'une ligne à la suivante.

DrawingBuffer() doit être appelé avant d'utiliser cette fonction.

Voir aussi

DrawingBuffer(), DrawingBufferPixelFormat()


DrawingBufferPixelFormat()

Syntaxe

Resultat = DrawingBufferPixelFormat()
Description
Renvoie le format vidéo courant.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Il peut être la combinaison d'une des valeurs suivantes:
  #PB_PixelFormat_8Bits       : 1 octet par pixel, palettisé
  #PB_PixelFormat_15Bits      : 2 octets par pixel
  #PB_PixelFormat_16Bits      : 2 octets par pixel
  #PB_PixelFormat_24Bits_RGB  : 3 octets par pixel (RRGGBB)
  #PB_PixelFormat_24Bits_BGR  : 3 octets par pixel (BBGGRR)
  #PB_PixelFormat_32Bits_RGB  : 4 octets par pixel (RRGGBB)
  #PB_PixelFormat_32Bits_BGR  : 4 octets par pixel (BBGGRR)
  #PB_PixelFormat_ReversedY   : Les lignes sont inversées en hauteur (la dernière ligne est la première)

Remarques

DrawingBuffer() doit être appelé avant d'utiliser cette fonction.

Exemple

Les exemples suivants montre comment gérer différents formats:
  If DrawingBufferPixelFormat() = #PB_PixelFormat_32Bits_RGB | #PB_PixelFormat_ReversedY
    ; RGB 32-bit en mode inversé
  EndIf

  If DrawingBufferPixelFormat() = #PB_PixelFormat_32Bits_RGB
    ; RGB 32-bit
  EndIf

  If DrawingBufferPixelFormat() & #PB_PixelFormat_32Bits_RGB
    ; RGB 32-bit (mode inversé ou non)
  EndIf

Voir aussi

StartDrawing(), DrawingBufferPitch()


DrawingFont()

Syntaxe

DrawingFont(PoliceID)
Description
Change la police de caractères de la surface de dessin en cours.

Arguments

PoliceID Le numéro d'identification de la police à utiliser.

Il peut être obtenu par la fonction FontID() de la bibliothèque 'Font'.

Remarques

Tous les textes affichés ensuite le seront avec cette nouvelle police.
Avant d'utiliser cette fonction, la police doit être chargée à l'aide de la fonction LoadFont().

Voir aussi

LoadFont(), FontID()


DrawingMode()

Syntaxe

DrawingMode(Mode)
Description
Change le mode d'affichage pour les textes et les dessins.

Arguments

Mode Mode peut être une combinaison des valeurs suivantes:

#PB_2DDrawing_Default
C'est le mode de dessin par défaut quand StartDrawing() est appelé.
Le texte est affiché avec un fond solide et les formes géométriques sont pleines.
Si la surface de dessin gère un canal alpha, les opérations de dessin n'affecteront que les composantes couleurs et laisseront le canal alpha inchangé.

#PB_2DDrawing_Transparent
Si ce mode est activé alors le fond du texte affiché avec DrawText() sera transparent.

#PB_2DDrawing_XOr
Active le mode XOR. Toutes les couleurs des graphiques seront inversées par rapport à la couleur du fond. La couleur courante n'a plus d'importance et n'est pas prise en compte. Ce mode ne peut pas être combiné avec les mode alpha ci-dessous.

Note: Ce mode ne fonctionne pas avec la sortie PrinterOutput().

#PB_2DDrawing_Outlined
Si ce mode est activé, seuls les contours des figures géométriques seront dessinés (les figures ne seront pas pleines). Ceci s'applique aux commandes telles que Circle()(), Box(), etc.

Note: Les modes suivants ne fonctionnent qu'avec ImageOutput() et CanvasOutput(). Ils sont ignorés pour toutes les autres sorties:

#PB_2DDrawing_AlphaBlend
Les opérations de dessin seront fusionnées avec le fond en utilisant le canal alpha pour gérer la transparence de chaque pixel. RGBA() peut être utilisé pour définir une couleur qui intègre un degré de transparence pour les commandes comme FrontColor(), Box(), DrawText() etc.

#PB_2DDrawing_AlphaClip
Les opérations de dessin seront fusionnées avec le fond en utilisant le canal alpha pour gérer la transparence de chaque pixel, comme avec le mode #PB_2DDrawing_AlphaBlend mode, mais avec la différence que le fond agit comme un masque. Cela signifie que les zones du fond qui étaient transparentes avant la fusion le resteront après. Si la surface de dessin ne gère pas de canal alpha, alors ce mode agit exactement comme #PB_2DDrawing_AlphaBlend.

#PB_2DDrawing_AlphaChannel
Les opérations de dessin ne modifieront que les valeurs du canal alpha de la surface de dessin. Toutes les informations concernant les couleurs seront ignorées. Par exemple, dessiner un cercle avec une couleur RGBA(0, 0, 0, 0) fera un 'trou' en forme de cercle dans la surface, car cette zone sera alors complètement transparente. Si la surface de dessin n'a pas de canal alpha alors les opérations de dessin n'auront aucun effet dans ce mode.

#PB_2DDrawing_AllChannels
Les opérations de dessin modifieront les composantes couleurs ainsi que les valeurs du canal alpha de la surface de dessin. Il n'y a plus de mélange lors des opérations de dessin. Ce mode est équivalent à l'enchainement des modes #PB_2DDrawing_Default et de #PB_2DDrawing_AlphaChannel. Si la surface de dessin n'a pas de canal alpha, alors ce mode est identique à #PB_2DDrawing_Default.

#PB_2DDrawing_Gradient
Ce mode permet de dessiner un dégradé à la place d'une couleur solide. La forme du dégradé peut être modifiée à l'aide des commandes telles que LinearGradient(), CircularGradient() etc. Les couleurs qui composeront le dégradé peuvent être définies avec GradientColor(). Les paramètres de couleur spécifiés pour chaque opération de dessin seront ignorés dans ce mode. Il est possible de combiner ce mode avec les modes alpha ci-dessus pour avoir des dégradés semi-transparents.

#PB_2DDrawing_CustomFilter
Dans ce mode, la couleur de chaque pixel pourra être définie par la procédure spécifiée par CustomFilterCallback(). Cela permet d'implémenter des rendus complètement libres tout en utilisant des formes géométriques pour le dessin.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Pour utiliser plusieurs modes en même temps, il suffit d'utiliser l'opérateur '|' (OR). Exemple pour des dessins détourés en mode 'xor':
  DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_XOr)

Voir aussi

FrontColor(), BackColor()


Ellipse()

Syntaxe

Ellipse(x, y, RayonX, RayonY [, Couleur])
Description
Dessine une ellipse sur la surface de dessin en cours.

Arguments

x, y La position du centre de l'ellipse.
RayonX, RayonY Dimension de l'ellipse.

RayonX est le demi grand axe de l'ellipse et RayonY est le demi petit axe de l'ellipse.
Attention, le centre l'ellipse qui est un pixel, n'est pas inclu dans ces valeurs.
Couleur (optionnel) Couleur de l'ellipse.

Si ce paramètre n'est pas spécifié, la couleur fixée par la fonction FrontColor() sera utilisée.

Les fonctions RGB() ou RGBA() peuvent être utilisées pour définir facilement une couleur.

Le mode de remplissage est controllé par DrawingMode().

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  If OpenWindow(0, 0, 0, 200, 200, "Ellipse Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 200, 200, RGB(255, 255, 255))
      For radius=50 To 10 Step -10
        Ellipse(100, 100, radius*2, radius, RGB(Random(255), Random(255), Random(255)))
      Next radius
      StopDrawing()
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

Box(), RoundBox(), Line(), Circle() FrontColor(), RGB(), RGBA(), DrawingMode()


EllipticalGradient()

Syntaxe

EllipticalGradient(x, y, RayonX, RayonY)
Description
Crée un dégradé de forme elliptique autour d'un point.

Arguments

x, y | Position du point autour duquel est appliqué la couleur d'arrière plan.
RayonX, RayonY | Distances en X et en Y autour de 'x,y' auxquelles est appliqué la couleur d'avant plan.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Des couleurs additionnelles peuvent être ajoutées au dégradé avec GradientColor().

Note: Cette commande a un effet uniquement sur des surfaces de type ImageOutput() et CanvasOutput(). Le dégradé est dessiné uniquement si le mode #PB_2DDrawing_Gradient est activé avec DrawingMode().

Exemple

  If OpenWindow(0, 0, 0, 400, 200, "EllipticalGradient Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 400, 200, $FFFFFF)

      DrawingMode(#PB_2DDrawing_Gradient)
      BackColor($00FFFF)
      FrontColor($FF0000)

      EllipticalGradient(100, 100, 150, 50)
      Circle(100, 100, 100)
      EllipticalGradient(300, 100, 50, 150)
      Circle(300, 100, 100)

      StopDrawing()
      ImageGadget(0, 0, 0, 400, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

GradientColor(), ResetGradientColors(),
LinearGradient(), CircularGradient(),
BoxedGradient(), ConicalGradient(), CustomGradient(),
DrawingMode()


FillArea()

Syntaxe

FillArea(x, y, CouleurBord [, Couleur])
Description
Remplit une zone de dessin avec une couleur définie.

Arguments

x, y Le remplissage commence à la position x,y.
CouleurBord Le remplissage s'arrête quand il rencontre la couleur 'CouleurBord'.

Si défini avec la valeur -1 alors la zone est remplie avec la couleur trouvée en 'x,y' jusqu'à ce qu'une couleur différente soit rencontrée.

Sur les images en 32-bit, le canal alpha est ignoré pour savoir si un pixel fait office de bordure ou non.
Couleur (optionnel) Couleur de remplissage.

Si le paramètre n'est pas précisé, la couleur définie par FrontColor() sera utilisée par défaut.

Les fonctions RGB() ou RGBA() peuvent être utilisées pour définir facilement une couleur.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette commande ne fonctionne pas avec PrinterOutput().

Exemple

  If OpenWindow(0, 0, 0, 300, 300, "FillArea", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 300, 300) And StartDrawing(ImageOutput(0))
      Box(0, 0, 300, 300, RGB(255, 255, 255))

      Circle(150, 150, 125 ,$00FF00)
      Circle(150, 150, 120 ,$FF0000)
      LineXY(30, 150, 270, 150, $FFFFFF)
      FillArea(150, 155, -1, $0000FF) ; Remplacez -1 par $00FF00 et comparez le résultat.

      StopDrawing()
      ImageGadget(0, 0, 0, 300, 300, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

FrontColor()


FrontColor()

Syntaxe

FrontColor(Couleur)
Description
Fixe la couleur d'avant plan.

Arguments

Couleur La nouvelle couleur d'avant plan à utiliser.

Les fonctions RGB() ou RGBA() peuvent être utilisées pour définir facilement une couleur.

L'utilisation de la transparence (canal alpha) dépend du mode de dessin.

Un tableau avec les couleurs les plus courantes est disponible ici.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

BackColor(), RGB(), RGBA(), DrawingMode()


GrabDrawingImage()

Syntaxe

Resultat = GrabDrawingImage(#Image, x, y, Largeur, Hauteur)
Description
Crée une nouvelle image en copiant une zone de la surface dessin en cours.

Arguments

#Image Le numéro de la nouvelle image.

Si #PB_Any est utilisé pour le paramètre '#Image', le numéro de la nouvelle image sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur Position et taille de la zone à copier.

La nouvelle image aura les même dimensions.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé comme paramètre "#Image" alors le numéro de la nouvelle image est retourné dans 'Resultat'.

Remarques

Cette commande ne fonctionne pas avec PrinterOutput().

Toute partie de la zone spécifiée qui se trouve en dehors de la surface de dessin sera indéfinie dans l'image créée. De même, si la sortie est WindowOutput(), toute partie de la fenêtre qui n'est pas visible à l'écran peut être indéfinie dans l'image créée.

Voir aussi

GrabImage()


GradientColor()

Syntaxe

GradientColor(Position.f, Couleur)
Description
Ajoute une couleur au spectre du dégradé.

Arguments

Position.f La position de la couleur dans le dégradé.

C'est une valeur de type float comprise entre 0.0 et 1.0.
Couleur La couleur à ajouter.

Les fonctions RGB() ou RGBA() peuvent être utilisées pour définir facilement une couleur.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Par défaut, le dégradé de couleur va de la couleur de fond à la position 0.0 à la couleur d'avant plan à la position 1.0.

Avec cette commande, des couleurs intermédiaires peuvent être ajoutées, et les couleurs à 0.0 et 1.0 remplacées.

La commande ResetGradientColors() permet de revenir au dégradé par défaut, si nécessaire.

Les commandes suivantes peuvent être utilisées pour indiquer la forme du dégradé :
- LinearGradient()
- CircularGradient()
- EllipticalGradient()
- BoxedGradient()
- ConicalGradient()
- CustomGradient()

Note: Cette commande a un effet uniquement sur des surface de type ImageOutput() et CanvasOutput(). Le dégradé est dessiné uniquement si le mode #PB_2DDrawing_Gradient est activé avec DrawingMode().

Exemple

  If OpenWindow(0, 0, 0, 400, 200, "GradientColor Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 400, 200, $FFFFFF)

      DrawingMode(#PB_2DDrawing_Gradient)
      BackColor($0000FF)
      GradientColor(0.4, $00FFFF)
      GradientColor(0.6, $FFFF00)
      FrontColor($FF0000)

      LinearGradient(0, 0, 200, 200)
      Circle(100, 100, 100)
      LinearGradient(350, 100, 250, 100)
      Circle(300, 100, 100)

      StopDrawing()
      ImageGadget(0, 0, 0, 400, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

ResetGradientColors(),
LinearGradient(), CircularGradient(), EllipticalGradient(),
BoxedGradient(), ConicalGradient(), CustomGradient(),
DrawingMode()


Line()

Syntaxe

Line(x, y, Largeur, Hauteur [, Couleur])
Description
Trace une ligne sur la surface de dessin en cours.

Arguments

x, y L'origine de la ligne.
Largeur, Hauteur Dimension de la ligne.

Ces valeurs incluent le point d'origine 'x,y'.

Une hauteur de '1' dessine une ligne horizontale tandis qu'une hauteur de '0' ne dessinera rien du tout.
Couleur (optionnel) Couleur de la ligne.

Si ce paramètre n'est pas spécifié, la couleur fixée par la fonction FrontColor() sera utilisée.

Les fonctions RGB() ou RGBA() peuvent être utilisées pour définir facilement une couleur.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Pour dessiner une ligne avec des coordonnées de départ et de fin de ligne, utilisez la fonction LineXY().

Exemple

  If OpenWindow(0, 0, 0, 200, 200, "Line Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 200, 200, RGB(255, 255, 255))
      For Width = 1 To 180 Step 5
        Line(10, 10, Width, 180, RGB(Random(255), Random(255), Random(255)))
      Next Width
      StopDrawing()
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

LineXY(), Box(), RoundBox(), Ellipse(), Circle() FrontColor(), RGB(), RGBA()


LineXY()

Syntaxe

LineXY(x1, y1, x2, y2 [, Couleur])
Description
Trace une ligne sur la surface de dessin en cours en fonction de ses coordonnées de début et de fin.

Arguments

x1, y1 | Position du point de départ.
x2, y2 | Position du point d'arrivé.
Couleur (optionnel) Couleur de la ligne.

Si ce paramètre n'est pas spécifié, la couleur fixée par la fonction FrontColor() sera utilisée.

Les fonctions RGB() ou RGBA() peuvent être utilisées pour définir facilement une couleur.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Pour dessiner une ligne en fonction de ses dimensions, utilisez la fonction Line().

Exemple

  If OpenWindow(0, 0, 0, 200, 200, "LineXY Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 200, 200, RGB(255, 255, 255))
      For Angle = 0 To 360 Step 3
        LineXY(100, 100, 100+Cos(Angle)*90, 100+Sin(Angle)*90, RGB(Random(255), Random(255), Random(255)))
      Next Angle
      StopDrawing()
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

Line(), Box(), RoundBox(), Ellipse(), Circle() FrontColor(), RGB(), RGBA()


LinearGradient()

Syntaxe

LinearGradient(x1, y1, x2, y2)
Description
Crée un dégradé linéaire entre deux points.

Arguments

x1, y1 | La positon à laquelle est appliqué la couleur d'arrière plan.
x2, y2 | La positon à laquelle est appliqué la couleur d'avant plan.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

il est possible d'ajouter des couleurs au dégradé avec GradientColor().

Note: Cette commande a un effet uniquement sur des surfaces de type ImageOutput() et CanvasOutput(). Le dégradé est dessiné uniquement si le mode #PB_2DDrawing_Gradient est activé avec DrawingMode().

Exemple

  If OpenWindow(0, 0, 0, 400, 200, "LinearGradient Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 400, 200, $FFFFFF)

      DrawingMode(#PB_2DDrawing_Gradient)
      BackColor($00FFFF)
      FrontColor($FF0000)

      LinearGradient(0, 0, 200, 200)
      Circle(100, 100, 100)
      LinearGradient(350, 100, 250, 100)
      Circle(300, 100, 100)

      StopDrawing()
      ImageGadget(0, 0, 0, 400, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

GradientColor(), ResetGradientColors(),
CircularGradient(), EllipticalGradient(),
BoxedGradient(), ConicalGradient(), CustomGradient(),
DrawingMode()


OutputDepth()

Syntaxe

Resultat = OutputDepth()
Description
Renvoie le niveau (profondeur) de couleurs de la surface de dessin en cours.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la profondeur de couleur en bits par pixel.

Remarques

Ce niveau est mesuré en nombre de plans-couleurs que l'image possède.
Par exemple, une surface dont les couleurs sont codées sur 24-bit (16 millions de couleurs possibles) renverra la valeur 24.
Une surface en 256 couleurs renverra 8 (codage sur 8-bit).
Une surface en noir et blanc renverra 1.

Voir aussi

OutputWidth(), OutputHeight()


OutputHeight()

Syntaxe

Resultat = OutputHeight()
Description
Renvoie la hauteur (en pixels) de la surface de dessin courante.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la largeur de la surface de dessin, en pixels.

Voir aussi

OutputWidth(), OutputDepth()


OutputWidth()

Syntaxe

Resultat = OutputWidth()
Description
Renvoie la largeur (en pixels) de la surface de dessin en cours.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la largeur de la surface de dessin, en pixels.

Voir aussi

OutputHeight(), OutputDepth()


Plot()

Syntaxe

Plot(x, y [, Couleur])
Description
Affiche un point sur la surface de dessin en cours.

Arguments

x, y Position du point (pixel).

Les coordonnées x, y doivent être obligatoirement à l'intérieur de la surface de dessin, car il n'y a pas de contrôle pour des raisons de rapidité.
OutputWidth() et OutputHeight() peuvent être utilisés pour cela.
Couleur (optionnel) Couleur du point.

Si ce paramètre n'est pas spécifié, la couleur fixée par la fonction FrontColor() sera utilisée.

Les fonctions RGB() ou RGBA() peuvent être utilisées pour définir facilement une couleur.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  If OpenWindow(0, 0, 0, 200, 200, "Plot Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      For x = 0 To 199
        For y = 0 To 199
          Plot(x, y, RGB(Random(255), Random(255), Random(255)))
        Next y
      Next x
      StopDrawing()
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

Point(), FrontColor()


Point()

Syntaxe

Couleur = Point(x, y)
Description
Renvoie dans la couleur d'un point de la surface de dessin en cours.

Arguments

x, y Position du point (pixel).

Les coordonnées x, y doivent être obligatoirement à l'intérieur de la surface de dessin, car il n'y a pas de contrôle pour des raisons de rapidité.
OutputWidth() et OutputHeight() peuvent être utilisés pour cela.

Valeur de retour

Renvoie la couleur du pixel.

Cette couleur contiendra une valeur alpha uniquement si la zone de dessin est en 32-bit et que le DrawingMode() est configuré sur un des modes alpha (transparence). Sinon la valeur alpha de la couleur sera égale à zéro.

Remarques

Cette commande ne fonctionne pas avec PrinterOutput().

Voir aussi

Plot(), Red(), Green(), Blue(), Alpha()


ResetGradientColors()

Syntaxe

ResetGradientColors()
Description
Retire toutes les couleurs personnalisées du dégradé et revient au dégradé par défaut qui part de couleur de fond jusqu'à la couleur d'avant plan.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

La commande GradientColor() peut être utilisée pour ajouter des couleurs au dégradé.

Note: Cette commande a un effet uniquement sur des surfaces de type ImageOutput() et CanvasOutput(). Le dégradé est dessiné uniquement si le mode #PB_2DDrawing_Gradient est activé avec DrawingMode().

Voir aussi

GradientColor(),
LinearGradient(), CircularGradient(), EllipticalGradient(),
BoxedGradient(), ConicalGradient(), CustomGradient(),
DrawingMode()


RoundBox()

Syntaxe

RoundBox(x, y, Largeur, Hauteur, ArrondiX, ArrondiY [, Couleur])
Description
Dessine un rectangle aux coins arrondis sur la surface de dessin en cours.

Arguments

x, y, Largeur, Hauteur | Position et dimension du rectangle.
ArrondiX, ArrondiY | Le rayon de l'arrondi des coins.
Couleur (optionnel) La couleur du rectangle.

Si le paramètre 'Couleur' n'est pas spécifié, la couleur fixée par la fonction FrontColor() sera utilisée.

Les fonctions RGB() ou RGBA() peuvent être utilisées pour définir facilement une couleur.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le mode de remplissage est controllé par DrawingMode().

Exemple

  If OpenWindow(0, 0, 0, 200, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      y = 0
      For x = 0 To 95 Step 10
        RoundBox(x, y, 200-2*x, 200-2*y, 20, 20, RGB(Random(255), Random(255), Random(255)))
        y + 10
      Next x
      StopDrawing()
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

Box(), Line(), Circle(), Ellipse() FrontColor(), RGB(), RGBA(), DrawingMode()


StartDrawing()

Syntaxe

Resultat = StartDrawing(OutputID)
Description
Change la surface de dessin par celle mentionnée par 'OutputID'. Après avoir utilisé cette fonction, toutes les commandes de dessin seront exécutées sur la nouvelle surface.

Arguments

OutputID Les dessins seront rendus directement sur:
  WindowOutput()  : La fenêtre.
  ScreenOutput()  : L'écran (utile pour les jeux).
  SpriteOutput()  : Le sprite (utile pour les jeux).
  ImageOutput()   : L'image (voir aussi CreateImage())
  PrinterOutput() : L'imprimante.
  CanvasOutput()  : Le CanvasGadget().
  TextureOutput() : La texture (pour les jeux 3D).

Valeur de retour

Renvoie une valeur non nulle si le dessin est possible ou zéro si l'opération a échoué.

Remarques

Lorsque tous les dessins sont terminés, la fonction StopDrawing() doit être appelée.

Le 'Resultat' doit être toujours testé avant de continuer avec les opérations de dessins pour être sûr que la surface est disponible.

La couleur d'arrière plan est le noir (ie: RGB(0,0,0)) et la couleur d'avant plan est le blanc (ie: RGB(255,255,255)).

Si "Activer la gestion des Threads" est coché dans les options du compilateur alors chaque thread a sa propre surface de dessin, ce qui signifie que deux threads peuvent dessiner sur des surfaces de dessin différentes en même temps.

Voir aussi

StopDrawing()


StopDrawing()

Syntaxe

StopDrawing()
Description
Lorsque tous les affichages graphiques ont été réalisés, cette fonction doit être appelée afin de terminer le dessin et libérer les ressources.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

Une application graphique typique doit toujours ressembler à cela:
  If StartDrawing(WindowOutput(0))
    Box(10,10,20,20)
    Line(30,50,100,100)
    ; ....
    StopDrawing()
  EndIf

Voir aussi

StartDrawing()


TextHeight()

Syntaxe

Hauteur = TextHeight(Texte$)
Description
Renvoie la hauteur (en pixels) d'une chaîne de caractère sur la surface de dessin en cours avec la police de caractères actuelle.

Arguments

Texte$ Le texte à mesurer.

Valeur de retour

Renvoie la hauteur du texte donné en pixels.

Voir aussi

TextWidth(), DrawingFont()


TextWidth()

Syntaxe

Longueur = TextWidth(Texte$)
Description
Renvoie la longueur (en pixels) d'une chaîne de caractère sur la surface de dessin en cours avec la police de caractères actuelle.

Arguments

Texte$ Le texte à mesurer.

Valeur de retour

Renvoie la longueur du texte donné en pixels.

Voir aussi

TextHeight(), DrawingFont()


Array

PureBasic - Array

Généralités

Un tableau permet de stocker des éléments de manière indexée. Contrairement à une liste ou à une map, les éléments sont alloués de façon contiguë en mémoire. C'est pourquoi il n'est pas possible d'insérer ou d'effacer un élément rapidement. D'un autre côté, il permet d'accéder à n'importe quel élément quasiment instantanément.

Pour manipuler un tableau, il doit d'abord être déclaré avec le mot clé Dim.

Les tableaux peuvent être triés avec SortArray() ou SortStructuredArray() et peuvent également être mélangés de façon aléatoire en utilisant RandomizeArray().

Sommaire des commandes

ArraySize
CopyArray
FreeArray

Exemple

Array.pb

OS Supportés

Tous

Guide de référence - Index


ArraySize()

Syntaxe

Resultat = ArraySize(Tableau() [, Dimension])
Description
Renvoie la taille d'un tableau, telle qu'elle a été spécifiée lors de sa déclaration avec Dim ou ReDim.

Arguments

Tableau() Le tableau à tester.
Dimension (optionnel) Pour les tableaux à multi-dimensions, le paramètres facultatif 'Dimension' permet de renvoyer la taille d'une dimension donnée.

La première dimension commence à 1.

Valeur de retour

Renvoie la taille de la dimension du tableau.

Si le tableau n'est pas encore déclarée ou si son allocation a échoué, il retournera -1.

Exemple

  Dim MyArray.l(10)
  Debug ArraySize(MyArray()) ; affichera '10'

  Dim MultiArray.l(10, 20, 30)
  Debug ArraySize(MultiArray(), 2) ; affichera '20'

Exemple

  Dim Test.q(99999999999999999)

  If ArraySize(Test()) <> -1
    Test(12345) = 123  ; tout se passe bien
  Else
    Debug "Le tableau 'Test()' ne peut être initialisé."
  EndIf

Voir aussi

ListSize(), MapSize()


CopyArray()

Syntaxe

Resultat = CopyArray(TableauSource(), TableauDestination())
Description
Copie un tableau.

Arguments

TableauSource() Le tableau à copier.
TableauDestination() La copie du tableau source.

Tous les éléments qui se trouvaient auparavant dans ce tableau seront supprimés.

Ce tableau doit être du même type (natif ou structuré) et avoir le même nombre de dimensions que TableauSource().

Valeur de retour

Renvoie une valeur non nulle si la copie a réussi ou zéro si elle a échoué.

Exemple

  Dim Numbers(5)
  Dim NumbersCopy(10)

  Numbers(0) = 128
  Numbers(5) = 256

  Debug "Taille du tableau avant copie: "+Str(ArraySize(NumbersCopy())) ; affichera 10

  CopyArray(Numbers(), NumbersCopy())

  Debug "Taille du tableau après copie: "+Str(ArraySize(NumbersCopy())) ; affichera 5
  Debug NumbersCopy(0)
  Debug NumbersCopy(5)

Voir aussi

CopyList(), CopyMap()


FreeArray()

Syntaxe

FreeArray(Tableau())
Description
Détruit un tableau et libère toutes les ressources associées.

Arguments

Tableau() Le tableau à libérer.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Pour continuer à l'utiliser, Dim doit être appelé.

Voir aussi

FreeList(), FreeMap()


AudioCD

PureBasic - AudioCD

Généralités

Les CDs Audio sont un bon moyen d'écouter de la musique en qualité Hi-Fi pendant que l'on joue ou travaille sur son ordinateur, sans que cela pénalise trop les performances de la machine. Cette bibliothèque propose toutes les fonctions nécessaires pour gérer facilement la lecture de CDs Audio dans un programme PureBasic.

Sommaire des commandes

AudioCDLength
AudioCDName
AudioCDStatus
AudioCDTrackLength
AudioCDTrackSeconds
AudioCDTracks
EjectAudioCD
InitAudioCD
PauseAudioCD
PlayAudioCD
ResumeAudioCD
StopAudioCD
UseAudioCD

Exemple

AudioCD.pb

OS Supportés

Tous

Guide de référence - Index


AudioCDLength()

Syntaxe

Duree = AudioCDLength()
Description
Renvoie la durée totale d'un CD-Audio en secondes.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la durée en secondes.

Voir aussi

AudioCDTrackLength(), UseAudioCD()

OS Supportés

Windows, MacOS X


AudioCDName()

Syntaxe

Lecteur$ = AudioCDName()
Description
Renvoie le nom du lecteur de CD (dépendant de l'O.S.) où est placé le CD-Audio.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie une chaîne contenant le nom. Par exemple, le nom retourné peut être 'D:\' dans un système Windows, si le lecteur de CD occupe la position 'D:\' dans le système

Voir aussi

UseAudioCD()


AudioCDStatus()

Syntaxe

Etat = AudioCDStatus()
Description
Renvoie l'état actuel du lecteur de CD.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

La variable 'Etat' peut prendre les valeurs suivantes:
  -1 : Lecteur de CD non prêt (vide ou avec tiroir ouvert)
   0 : Lecteur de CD arrêté (mais un CD est à l'intérieur et détecté)
  >0 : Plage audio en cours de lecture.

Voir aussi

UseAudioCD()


AudioCDTrackLength()

Syntaxe

Resultat = AudioCDTrackLength(NumeroPiste)
Description
Renvoie la longueur d'une piste.

Arguments

NumeroPiste Le numéro de la piste demandée.

La première piste est indexée à 1.

Valeur de retour

Renvoie la durée en secondes.

Voir aussi

AudioCDTracks(), UseAudioCD()


AudioCDTrackSeconds()

Syntaxe

Secondes = AudioCDTrackSeconds()
Description
Renvoie le nombre de secondes écoulées en lecture depuis le début de la piste.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le nombre de secondes écoulées depuis le début de la piste.

Voir aussi

AudioCDTrackLength(), AudioCDTracks(), UseAudioCD()


AudioCDTracks()

Syntaxe

NombrePistes = AudioCDTracks()
Description
Renvoie le nombre total de pistes du CD.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le nombre de pistes.

Voir aussi

UseAudioCD()


EjectAudioCD()

Syntaxe

EjectAudioCD(Etat)
Description
Ouvre ou ferme le tiroir du lecteur de CD.

Arguments

Etat
  'Etat' = 1 : Le tiroir est ouvert.
  'Etat' <> 1: Le tiroir est fermé.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

UseAudioCD()

OS Supportés

Windows, Linux


InitAudioCD()

Syntaxe

Resultat = InitAudioCD()
Description
Tente d'initialiser les ressources nécessaires pour exécuter les fonctions CD audios.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Si Resultat = 0, l'intialisation a échoué ou n'a pas trouvé de lecteur de CD, sinon, 'Resultat' contient le nombre de lecteurs de CD reconnus par le système.

Remarques

Cette fonction doit être appelée avant toute autre fonction de la bibliothèque CD-Audio.

Voir aussi

UseAudioCD()


PauseAudioCD()

Syntaxe

PauseAudioCD()
Description
Interrompt la lecture du CD-Audio (Pause).

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

La lecture peut être reprise en appelant la fonction ResumeAudioCD().

Voir aussi

UseAudioCD()


PlayAudioCD()

Syntaxe

PlayAudioCD(PlageDebut, PlageFin)
Description
Commence la lecture du CD-Audio.

Arguments

PlageDebut | La première plage lue porte le numéro 1.
PlageFin | La dernière plage à jouer.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

AudioCDTracks(), UseAudioCD()


ResumeAudioCD()

Syntaxe

ResumeAudioCD()
Description
Reprend la lecture du CD après un pause demandée par la fonction PauseAudioCD().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

UseAudioCD()


StopAudioCD()

Syntaxe

StopAudioCD()
Description
Arrête la lecture du CD-Audio en cours.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

UseAudioCD()


UseAudioCD()

Syntaxe

UseAudioCD(LecteurCD)
Description
Sélectionne le lecteur CD auquel les commandes AudioCD s'appliquent.

Arguments

LecteurCD Le lecteur à utiliser.

Le premier lecteur a le numéro 0.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Il est possible de jouer plusieurs CD en même temps.

Comme la fonction InitAudioCD() nous permet de savoir combien de lecteurs de CD sont reconnus par le système, UseAudioCD() permet de changer le lecteur CD en cours.

La quantité d'unités disponibles dans le système est renvoyée par la fonction InitAudioCD()

Voir aussi

InitAudioCD()


Billboard

PureBasic - Billboard

Généralités

Les 'Billboards' sont des surfaces planes rectangulaires (composées de 2 triangles) qui sont toujours orientées face à la caméra. Ils sont très utiles pour afficher un grand nombre de petits éléments tels que la pluie, la neige, des arbres, de la végétation etc.

Les billboards sont gérés par groupe et chaque groupe contient ses propres billboards ayant (principalement) une taille commune afin d'accélérer la gestion d'un grand nombre d'objets.

La commande InitEngine3D() doit être appelée avec succès avant de pouvoir utiliser les commandes relatives aux billboards.

Sommaire des commandes

AddBillboard
BillboardGroupID
BillboardGroupMaterial
BillboardGroupX
BillboardGroupY
BillboardGroupZ
BillboardHeight
BillboardLocate
BillboardWidth
BillboardX
BillboardY
BillboardZ
ClearBillboards
CountBillboards
CreateBillboardGroup
FreeBillboardGroup
HideBillboardGroup
IsBillboardGroup
MoveBillboard
MoveBillboardGroup
RemoveBillboard
ResizeBillboard
RotateBillboardGroup

Exemple

Billboard.pb
BillboardGrass.pb

OS Supportés

Tous

Guide de référence - Index


AddBillboard()

Syntaxe

AddBillboard(#Billboard, #BillboardGroup, x, y, z)
Description
Ajoute un billboard à un groupe de billboard.

Arguments

#Billboard | Numéro du nouveau billboard.
#BillboardGroup | Numéro du groupe de billboard auquel le nouveau billboard sera attaché.
x, y, z | Coordonnée du nouveau billboard (relative à la position du groupe dans la scène 3D).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateBillboardGroup(), BillboardLocate(), BillboardX(), BillboardY(), BillboardZ(), MoveBillboard(), RemoveBillboard()


BillboardGroupID()

Syntaxe

BillboardGroupID = BillboardGroupID(#BillboardGroup)
Description
Renvoie l'identifiant unique d'un groupe de billboard.

Arguments

#BillboardGroup Le numéro du groupe de billboards à identifier.

Valeur de retour

Renvoie l'identifiant unique de '#BillboardGroup'.

Remarques

Cette fonction est très utile quand une fonction d'une autre bibliothèque nécessite l'identifiant d'un 'BillboardGroup'.

Voir aussi

CreateBillboardGroup(), IsBillboardGroup()


BillboardGroupMaterial()

Syntaxe

BillboardGroupMaterial(#BillboardGroup, MatiereID)
Description
Affecte une matière à un groupe de billboards.

Arguments

#BillboardGroup Numéro du groupe de billboards.
MatiereID Numéro de la matière à assigner au groupe de billboards (et par conséquent aux billboards).

Peut être facilement récupérée à l'aide de la commande MaterialID().

Cette matière sera utilisée par tous les billboards du groupe.
Un groupe de billboards ne peut avoir qu'une seule matière affectée à la fois.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateBillboardGroup()


BillboardGroupX()

Syntaxe

Resultat = BillboardGroupX(#BillboardGroup)
Description
Renvoie la position absolue en X du groupe de billboards.

Arguments

#BillboardGroup Numéro du groupe de billboards.

Valeur de retour

La position absolue en X du groupe de billboards dans la scène 3D.

Voir aussi

CreateBillboardGroup(), BillboardGroupY(), BillboardGroupZ()


BillboardGroupY()

Syntaxe

Resultat = BillboardGroupY(#BillboardGroup)
Description
Renvoie la position absolue en Y du groupe de billboards.

Arguments

#BillboardGroup Numéro du groupe de billboards.

Valeur de retour

La position absolue en Y du groupe de billboards dans la scène 3D.

Voir aussi

CreateBillboardGroup(), BillboardGroupX(), BillboardGroupZ()


BillboardGroupZ()

Syntaxe

Resultat = BillboardGroupZ(#BillboardGroup)
Description
Renvoie la position absolue en Z du groupe de billboards.

Arguments

#BillboardGroup Numéro du groupe de billboards.

Valeur de retour

La position absolue en Z du groupe de billboards dans la scène 3D.

Voir aussi

CreateBillboardGroup(), BillboardGroupX(), BillboardGroupY()


BillboardHeight()

Syntaxe

Resultat = BillboardHeight(#Billboard, #BillboardGroup)
Description
Renvoie la hauteur d'un billboard au sein d'un groupe de billboards.

Arguments

#Billboard | Numéro du billboard.
#BillboardGroup | Numéro du groupe de billboards.

Valeur de retour

La hauteur du billboard exprimée dans la même unité que celle utilisée par le monde 3D.

Voir aussi

BillboardWidth(), ResizeBillboard()


BillboardLocate()

Syntaxe

BillboardLocate(#Billboard, #BillboardGroup, x, y, z)
Description
Déplace un billboard de manière absolue.

Arguments

#Billboard | Numéro du billboard à déplacer.
#BillboardGroup | Numéro du groupe de billboards qui contient le billboard à déplacer.
x, y, z | La nouvelle position du billboard.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

La position réelle du billboard dans le monde 3D est relative à la position du groupe de billboards. Pour déplacer un billboard par rapport à sa position actuelle, utilisez la commande MoveBillboard().

Voir aussi

MoveBillboard(), BillboardX(), BillboardY(), BillboardZ()


BillboardWidth()

Syntaxe

Resultat = BillboardWidth(#Billboard, #BillboardGroup)
Description
Renvoie la largeur d'un billboard au sein d'un groupe de billboards.

Arguments

#Billboard | Numéro du billboard.
#BillboardGroup | Numéro du groupe de billboards.

Valeur de retour

La largeur du billboard exprimée dans la même unité que celle utilisée par le monde 3D.

Voir aussi

BillboardHeight(), ResizeBillboard()


BillboardX()

Syntaxe

Resultat = BillboardX(#Billboard, #BillboardGroup)
Description
Renvoie la position en X du billboard au sein d'un groupe de billboards.

Arguments

#Billboard | Numéro du billboard.
#BillboardGroup | Numéro du groupe de billboards.

Valeur de retour

La position en X du billboard dans le groupe de billboards.

Voir aussi

BillboardY(), BillboardZ(), BillboardLocate(), MoveBillboard()


BillboardY()

Syntaxe

Resultat = BillboardY(#Billboard, #BillboardGroup)
Description
Renvoie la position en Y du billboard au sein d'un groupe de billboards.

Arguments

#Billboard | Numéro du billboard.
#BillboardGroup | Numéro du groupe de billboards.

Valeur de retour

La position en Y du billboard dans le groupe de billboards.

Voir aussi

BillboardX(), BillboardZ(), BillboardLocate(), MoveBillboard()


BillboardZ()

Syntaxe

Resultat = BillboardZ(#Billboard, #BillboardGroup)
Description
Renvoie la position en Z du billboard au sein d'un groupe de billboards.

Arguments

#Billboard | Numéro du billboard.
#BillboardGroup | Numéro du groupe de billboards.

Valeur de retour

La position en Z du billboard dans le groupe de billboards.

Voir aussi

BillboardX(), BillboardY(), BillboardLocate(), MoveBillboard()


ClearBillboards()

Syntaxe

ClearBillboards(#BillboardGroup)
Description
Détruit tous les billboards contenus dans un groupe de billboards.

Arguments

#BillboardGroup Numéro du groupe de billboards.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

AddBillboard(), CountBillboards()


CountBillboards()

Syntaxe

Resultat = CountBillboards(#BillboardGroup)
Description
Renvoie le nombre de billboards contenus dans un groupe de billboards.

Arguments

#BillboardGroup Numéro du groupe de billboards.

Valeur de retour

Le nombre de billboards contenus dans le groupe spécifié.

Voir aussi

AddBillboard(), ClearBillboards()


CreateBillboardGroup()

Syntaxe

Resultat = CreateBillboardGroup(#BillboardGroup, MatiereID, LargeurBillboard, HauteurBillboard [, x, y, z [, MasqueVisibilité]])
Description
Créé un nouveau groupe de billboards vide.

Arguments

#BillboardGroup Le numéro du nouveau BillboardGroup.

Si #PB_Any est utilisé à la place de '#BillboardGroup' alors un numéro autogénéré sera renvoyé dans 'Resultat'.

MatiereID La matière specifiée par 'MatiereID' sera affectée au groupe et par conséquent utilisée par tous les billboards que le groupe contiendra.

La valeur 'MatiereID' peut être facilement récupérée à l'aide de la commande MaterialID().

LargeurBillboard, HauteurBillboard Les dimensions par défaut (en unité monde) des futurs billboards.

Bien que la taille de chaque futur billboard pourra être definie indépendamment à l'aide de la commande ResizeBillboard(), il est important de garder à l'esprit que des problèmes de performances peuvent très rapidement apparaître si tous les billboards d'un même groupe n'ont pas la même taille.

x, y, z (optionnel) La position absolue du nouveau groupe de billboards dans le monde 3D.
MasqueVisibilité (optionnel) Un masque pour choisir sur quelle caméra le groupe de billboards doit être affiché.

Si ce masque correspond au masque spécifié dans CreateCamera() alors l'entité sera affichée sur la caméra.

Voir CreateEntity() pour construire des masques appropriés.

Si ce paramètre est omis alors le groupe de billboards sera visible par toutes les caméras.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Remarques

Si le #BillboardGroup est déjà utilisé alors il sera automatiquement détruit (ainsi que tous ses billboards) et remplacé par le nouveau.

Voir aussi

FreeBillboardGroup(), HideBillboardGroup(), IsBillboardGroup(), BillboardGroupID(), AddBillboard()


FreeBillboardGroup()

Syntaxe

FreeBillboardGroup(#BillboardGroup)
Description
Détruit un groupe de billboards ainsi que tous les billboards qu'il contenait.

Arguments

#BillboardGroup Numéro du groupe de billboards à détruire.

Si @ PB_All est spécifié, tous les autres groupes de billboards sont libérés.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Un groupe détruit ne doit plus être utilisé par les commandes relatives aux groupes de billboards.

Tous les groupes de billboards restants sont automatiquement supprimés quand le programme se termine.

Voir aussi

CreateBillboardGroup(), HideBillboardGroup(), IsBillboardGroup(), BillboardGroupID(), AddBillboard()


HideBillboardGroup()

Syntaxe

HideBillboardGroup(#BillboardGroup, Etat)
Description
Cache ou affiche un groupe de billboards ainsi que tous les billboards qu'il contient.

Arguments

#BillboardGroup Numéro du groupe de billboards à afficher ou à cacher.
Etat Le nouvel état du groupe de billboards:
  1: Le groupe est caché.
  0: Le groupe est affiché.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateBillboardGroup(), FreeBillboardGroup(), IsBillboardGroup(), BillboardGroupID(), AddBillboard()


IsBillboardGroup()

Syntaxe

Resultat = IsBillboardGroup(#BillboardGroup)
Description
Teste si le #BillboardGroup est correctement initialisé.

Arguments

#BillboardGroup Numéro du groupe de billboards

Valeur de retour

Renvoie une valeur non nulle si l'objet est valide.

Remarques

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.

C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

CreateBillboardGroup(), FreeBillboardGroup(), HideBillboardGroup(), BillboardGroupID(), AddBillboard()


MoveBillboard()

Syntaxe

MoveBillboard(#Billboard, #BillboardGroup, x, y, z)
Description
Déplace un billboard à l'intérieur d'un groupe de manière relative à sa position actuelle. Pour effectuer un déplacement absolu, il convient d'utiliser la commande BillboardLocate().

Arguments

#Billboard | Numéro du billboard.
#BillboardGroup | Numéro du groupe de billboards.
x, y, z | Valeur du déplacement en X, Y et Z relatif à la position actuelle du billboard.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

BillboardLocate(), BillboardX(), BillboardY(), BillboardZ()


MoveBillboardGroup()

Syntaxe

MoveBillboardGroup(#BillboardGroup, x, y, z [, Mode])
Description
Déplace un groupe de billboards de manière relative à sa position actuelle.

Arguments

#BillboardGroup | Numéro du groupe de billboards à déplacer.
x, y, z | Nouvelle position du groupe de billboards.
Mode (optionnel) Peut être une des valeurs suivantes:
  #PB_Relative: Déplacement relatif, à partir de la position actuelle du groupe de billboards (par défaut).
  #PB_Absolute: Déplacement absolu à la position spécifiée.
combinée avec l'une des valeurs suivantes:
  #PB_Local : Déplacement local.
  #PB_Parent: Déplacement par rapport à la position du parent.
  #PB_World : Déplacement par rapport au monde.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateBillboardGroup(), FreeBillboardGroup(), HideBillboardGroup(), BillboardGroupID(), AddBillboard()


RemoveBillboard()

Syntaxe

RemoveBillboard(#Billboard, #BillboardGroup)
Description
Détruit un billboard d'un groupe de billboards.

Arguments

#Billboard | Numéro du billboard à détruire.
#BillboardGroup | Numéro du groupe de billboards qui contient le billboard à détruire.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

AddBillboard(), ClearBillboards(), CountBillboards()


ResizeBillboard()

Syntaxe

ResizeBillboard(#Billboard, #BillboardGroup, Largeur, Hauteur)
Description
Redimensionne un billboard.

Arguments

#Billboard | Numéro du billboard à redimensionner.
#BillboardGroup | Numéro du groupe de billboards qui contient le billboard à redimensionner.
Largeur, Hauteur Les nouvelles dimensions du billboard.

Eviter de redimensionner séparément chaque billboard d'un groupe car il peut y avoir de lourdes conséquences au niveau des perfomances si la taille utilisée n'est pas celle par défaut (spécifié par CreateBillboardGroup()).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

BillboardHeight(), BillboardWidth(), CreateBillboardGroup()


RotateBillboardGroup()

Syntaxe

RotateBillboardGroup(#BillboardGroup, x, y, z [, Mode])
Description
Effectue une rotation d'un groupe de billboards.

Arguments

#BillboardGroup | Numéro du groupe de billboards qui contient le billboard à tourner.
x, y, z | Angles x,y,z spécifiés en degrés.
Mode (optionnel)
  PB_Absolute: Rotation absolue (par défaut).
  PB_Relative: Rotation relative basée sur la rotation précédente du #BillboardGroup.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

BillboardGroupMaterial(), BillboardGroupID()


Camera

PureBasic - Camera

Généralités

Les caméras sont utilisées pour se déplacer dans un monde en 3D. Il est possible de les utiliser comme des caméras réelles. On peut déplacer une caméra, la faire pivoter, modifier le champs de vision, etc.

Au moins une caméra est nécessaire pour effecter un rendu du monde 3D sur un écran, mais plusieurs caméras peuvent être utilisées en même temps pour afficher le monde sous des angles de vue différents (rétroviseurs, split-screen...).

La commande InitEngine3D() doit être appelée avec succès avant de pouvoir utiliser les commandes relatives aux caméras.

Sommaire des commandes

CameraBackColor
CameraDirection
CameraDirectionX
CameraDirectionY
CameraDirectionZ
CameraFOV
CameraFixedYawAxis
CameraID
CameraLookAt
CameraPitch
CameraProjectionMode
CameraProjectionX
CameraProjectionY
CameraRange
CameraRenderMode
CameraRoll
CameraViewHeight
CameraViewWidth
CameraViewX
CameraViewY
CameraX
CameraY
CameraYaw
CameraZ
CreateCamera
FreeCamera
IsCamera
MoveCamera
RotateCamera
SwitchCamera

Exemple

Camera.pb
CameraProjection.pb
CameraTrack.pb
CameraView.pb
CheckObjectVisibility.pb
CheckObjectVisibility2.pb
VisibilityMask.pb

OS Supportés

Tous

Guide de référence - Index


CameraBackColor()

Syntaxe

CameraBackColor(#Camera, Couleur)
Description
Change la couleur de fond d'une caméra.

Arguments

#Camera La caméra à utiliser.
Couleur Nouvelle couleur de fond.

La fonction RGB() peut être utilisée pour obtenir une couleur valide.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Par défaut, une caméra nouvellement crée a une couleur de fond noire.

Voir aussi

CreateCamera()


CameraDirection()

Syntaxe

CameraDirection(#Camera, x, y, z)
Description
Change la direction d'une caméra.

Arguments

#Camera La caméra à utiliser.
x, y, z La nouvelle direction.

C'est un vecteur généralement compris entre -1.0 et 1.0, sinon il sera automatiquement normalisé.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

La position de la caméra reste inchangée.

Voir aussi

CameraDirectionX(), CameraDirectionY(), CameraDirectionZ()


CameraDirectionX()

Syntaxe

Resultat = CameraDirectionX(#Camera)
Description
Renvoie la direction 'x' de la caméra.

Arguments

#Camera La caméra à utiliser.

Valeur de retour

Renvoie le vecteur de direction 'x' de la caméra.
Cette valeur est généralement comprise entre -1.0 et 1.0, sinon il sera automatiquement normalisé.

Voir aussi

CameraDirection(), CameraDirectionY(), CameraDirectionZ()


CameraDirectionY()

Syntaxe

Resultat = CameraDirectionY(#Camera)
Description
Renvoie la direction 'y' de la caméra.

Arguments

#Camera La caméra à utiliser.

Valeur de retour

Retourne le vecteur de direction 'y' de la caméra.
Cette valeur est généralement comprise entre -1.0 et 1.0, sinon il sera automatiquement normalisé.

Voir aussi

CameraDirection(), CameraDirectionX(), CameraDirectionZ()


CameraDirectionZ()

Syntaxe

Resultat = CameraDirectionZ(#Camera)
Description
Renvoie la direction 'z' de la caméra.

Arguments

#Camera La caméra à utiliser.

Valeur de retour

Retourne le vecteur de direction 'z' de la caméra.
Cette valeur est généralement comprise entre -1.0 et 1.0, sinon il sera automatiquement normalisé.

Voir aussi

CameraDirection(), CameraDirectionX(), CameraDirectionY()


CameraFOV()

Syntaxe

CameraFOV(#Camera, Angle)
Description
Modifie le champs de vision d'une caméra (FOV: Field Of Vision) pour permettre une vue plus ou moins large de la scène.

Arguments

#Camera La caméra à utiliser.
Angle Le nouveau champs de vision en degrés.

Un angle supérieur à 90° donnera un effet de type grand-angle (ou fish-eye).
Un angle inférieur à 30° donnera un effet rétréci (téléscopique) à la scène.
Les valeurs 'normales' sont comprises entre 45° et 60°.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CameraRange()


CameraFixedYawAxis()

Syntaxe

CameraFixedYawAxis(#Camera, Activer [, VecteurX, VecteurY, VecteurZ])
Description
Change l'axe fixe de lacet d'une caméra.

Arguments

#Camera La caméra à utiliser.
Activer Active ou désactive l'utilisation d'un axe de lacet personnalisé.
  #True : Un nouveau vecteur doit être spécifié.
  #False: La caméra fera un lacet autour de son propre axe Y.
VecteurX, VecteurY, VecteurZ (optionnel) Direction du nouvel axe de lacet.

Généralement le vecteur a une valeur comprise entre -1.0 et 1.0, sinon il sera automatiquement normalisé).

Le paramètre "Activer" doit être sur #True pour avoir un effet.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le comportement par défaut de la caméra est un lacet autour de son propre axe Y.

Voir aussi

CameraYaw()


CameraID()

Syntaxe

CameraID = CameraID(#Camera)
Description
Renvoie l'identifiant unique d'une caméra.

Arguments

#Camera La caméra à utiliser.

Valeur de retour

Renvoie le numéro de la caméra.

Remarques

Cette fonction est très utile quand une fonction d'une autre bibliothèque nécessite l'identifiant d'une caméra.

Voir aussi

CreateCamera(), IsCamera()


CameraLookAt()

Syntaxe

CameraLookAt(#Camera, x, y, z)
Description
Spécifie le point (dans l'unité du monde) qui fait face à une caméra.

Arguments

#Camera | La caméra à utiliser.
x, y, z | La caméra pointe vers la position 'x, y, z'.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

La position et l'orientation de la caméra ne sont pas modifiées.


CameraPitch()

Syntaxe

Resultat = CameraPitch(#Camera [, Mode])
Description
Renvoie le tangage d'une caméra.

Arguments

#Camera La caméra à utiliser.
Mode (optionnel) Peut être une des valeurs suivantes:
  #True : La valeur brute, mais elle ne peut pas être utilisée avec RotateCamera() pour récupérer la même orientation (par défaut).
  #False: Le tangage est ajusté, de sorte qu'il peut être réutiliser avec RotateCamera() pour récupérer la même orientation.

Valeur de retour

La valeur du tangage de la caméra.
Valeur entre -180.0 et 180.0 degrés.

Voir aussi

CameraYaw(), CameraRoll()


CameraProjectionMode()

Syntaxe

CameraProjectionMode(#Camera, Mode)
Description
Change le mode de projection utilisé par une caméra.

Arguments

#Camera La caméra à utiliser.
Mode Le paramètre 'Mode' représente la façon dont le monde sera projeté:
  #PB_Camera_Perspective : Rend la scène en tenant compte de la perspective
  #PB_Camera_Orthographic: Rend la scène sans perspective (plat, pas de profondeur)

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CameraProjectionX(), CameraProjectionY(),


CameraProjectionX()

Syntaxe

Resultat = CameraProjectionX(#Camera, x, y, z)
Description
Renvoie la position 'x' d'un point 3D vu par une caméra.

Arguments

#Camera | La caméra à utiliser.
x, y, z | Les coordonnées du point.

Valeur de retour

Renvoie la position 'x', en pixels, d'un point 3D vu par la caméra.
Si ce point est en dehors du champ de vision de la caméra alors 'Resultat' = -1.

Remarques

Cette fonction est très utile pour mapper des points 3D sur un écran 2D.

Voir aussi

CameraProjectionMode(), CameraProjectionY()


CameraProjectionY()

Syntaxe

Resultat = CameraProjectionY(#Camera, x, y, z)
Description
Renvoie la position 'y' d'un point 3D vu par une caméra.

Arguments

#Camera | La caméra à utiliser.
x, y, z | Les coordonnées du point.

Valeur de retour

Renvoie la position 'y', en pixels, d'un point 3D vu par la caméra.
Si ce point est en dehors du champ de vision de la caméra alors 'Resultat' = -1.

Remarques

Cette fonction est très utile pour mapper des points 3D sur un écran 2D.

Voir aussi

CameraProjectionMode(), CameraProjectionX()


CameraRange()

Syntaxe

CameraRange(#Camera, Proche, Lointain)
Description
Modifie les valeurs du champ de vision d'une caméra.

Arguments

#Camera | La caméra à utiliser.
Proche | Indique la distance la plus proche de la caméra à partir de laquelle la scène sera rendue.
Lointain | Indique la distance maximale jusqu'à laquelle la scène sera rendue.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CameraLookAt()


CameraRenderMode()

Syntaxe

CameraRenderMode(#Camera, Mode)
Description
Change le mode de rendu d'une caméra.

Arguments

#Camera La caméra à utiliser.
Mode La manière dont le monde doit être rendu:
  #PB_Camera_Plot     : Rend la scène en mode points (seuls les sommets des objets sont visibles)
  #PB_Camera_Wireframe: Rend la scène en mode ligne (seuls les triangles des objets sont visibles)
  #PB_Camera_Textured : Rend la scène avec un maximum de détails (textures, transparence etc..)

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Quand vous créez une nouvelle caméra avec CreateCamera(), le mode de rendu par défaut se fait avec un niveau de détails et de textures maximum.

Voir aussi

CameraProjectionMode()


CameraRoll()

Syntaxe

Resultat = CameraRoll(#Camera [, Mode])
Description
Renvoie le roulis d'une caméra.

Arguments

#Camera La caméra à utiliser.
Mode (optionnel) Peut être une des valeurs suivantes:
  #True : La valeur brute, mais elle ne peut pas être utilisée avec RotateCamera() pour récupérer la même orientation (par défaut).
  #False: Le roulis est ajusté, de sorte qu'il peut être réutiliser avec RotateCamera() pour récupérer la même orientation.

Valeur de retour

La valeur du roulis de la caméra.
Valeur entre -180.0 et 180.0 degrés.

Voir aussi

CameraYaw(), CameraPitch()


CameraViewHeight()

Syntaxe

Resultat = CameraViewHeight(#Camera)
Description
Renvoie la hauteur de l'image affichée par une caméra.

Arguments

#Camera La caméra à utiliser.

Valeur de retour

Renvoie la hauteur (en pixels) de l'image affichée par la caméra.

Voir aussi

CameraViewWidth(), CameraViewX(), CameraViewY()


CameraViewWidth()

Syntaxe

Resultat = CameraViewWidth(#Camera)
Description
Renvoie la largeur de l'image affichée par une caméra.

Arguments

#Camera La caméra à utiliser.

Valeur de retour

Renvoie la largeur (en pixels) de l'image affichée par la caméra.

Voir aussi

CameraViewHeight(), CameraViewX(), CameraViewY()


CameraViewX()

Syntaxe

Resultat = CameraViewX(#Camera)
Description
Renvoie la position en 'x' de l'image affichée par une caméra.

Arguments

#Camera La caméra à utiliser.

Valeur de retour

Renvoie la position en 'x' (en pixels) de l'image affichée par la caméra.

Voir aussi

CameraViewY(), CameraViewHeight(), CameraViewWidth()


CameraViewY()

Syntaxe

Resultat = CameraViewY(#Camera)
Description
Renvoie la position en 'y' de l'image affichée par une caméra.

Arguments

#Camera La caméra à utiliser.

Valeur de retour

Renvoie la position en 'y' (en pixels) de l'image affichée par la caméra.

Voir aussi

CameraViewX(), CameraViewHeight(), CameraViewWidth()


CameraX()

Syntaxe

Resultat = CameraX(#Camera)
Description
Renvoie la position courante d'une caméra dans le monde 3D.

Arguments

#Camera La caméra à utiliser.

Valeur de retour

Renvoie la position en 'x' de la caméra.

Voir aussi

CameraY(), CameraZ(), MoveCamera()


CameraY()

Syntaxe

Resultat = CameraY(#Camera)
Description
Renvoie la position courante d'une caméra dans le monde 3D.

Arguments

#Camera La caméra à utiliser.

Valeur de retour

Renvoie la position en 'y' de la caméra.

Voir aussi

CameraX(), CameraZ(), MoveCamera()


CameraYaw()

Syntaxe

Resultat = CameraYaw(#Camera [, Mode])
Description
Renvoie le lacet d'une caméra.

Arguments

#Camera La caméra à utiliser.
Mode (optionnel) Peut être une des valeurs suivantes:
  #True : La valeur brute, mais elle ne peut pas être utilisée avec RotateCamera() pour récupérer la même orientation (par défaut).
  #False: Le lacet est ajusté, de sorte qu'il peut être réutiliser avec RotateCamera() pour récupérer la même orientation.

Valeur de retour

La valeur du lacet de la caméra.
Valeur entre -180.0 et 180.0 degrés.

Voir aussi

CameraPitch(), CameraRoll()


CameraZ()

Syntaxe

Resultat = CameraZ(#Camera)
Description
Renvoie la position courante d'une caméra dans le monde 3D.

Arguments

#Camera La caméra à utiliser.

Valeur de retour

Renvoie la position en 'z' de la caméra.

Voir aussi

CameraX(), CameraY(), MoveCamera()


CreateCamera()

Syntaxe

Resultat = CreateCamera(#Camera, x, y, Largeur, Hauteur[, MasqueVisibilite])
Description
Crée une nouvelle caméra dans le monde courant.

Arguments

#Camera Numéro de la nouvelle caméra.
#PB_Any peut être utiliser pour autogénérer ce numéro.

x, y La position en pourcentage sur l'écran de l'arête gauche du début de l'affichage de cette caméra.
  0%  : Le bord gauche de l'écran
  100%: Le bord droit de l'écran.
Largeur, Hauteur Le pourcentage en largeur et hauteur de l'écran, utilisé pour l'affichage de la caméra.

MasqueVisibilite (optionnel) Un masque pour sélectionner les entités et les billboards à afficher par la caméra.

La caméra définit son propre masque, et si l'entité ou le billboard masqué correspond, alors il sera affiché.

Par défaut, les entités et les billboards n'ont pas de masque, ce qui signifie qu'ils seront toujours affichés par toutes les caméras.

Valeur de retour

Renvoie zéro si la caméra n'a pas pu être crée.

Si #PB_Any est utilisé à la place du paramètre '#Camera' alors le nouveau numéro de la caméra sera retourné dans 'Resultat'.

Remarques

Positions et tailles sont celles de l'affichage à l'écran, pas la position et la taille de la caméra dans le monde.

Au contraire des autres commandes graphiques, les coordonnées et les dimensions ne sont pas exprimées en pixels mais en pourcentages, de 0 à 100 (les nombres flottants peuvent être utilisés pour un placement plus précis).
Cela peut sembler bizarre, mais les applications 3D se doivent de faire abstraction de leur résolution, et il est donc préférable de raisonner en pourcentages plutôt qu'en pixels.
Ainsi, la taille d'une caméra (50% par exemple) en 640*480 aura la même dimension que sur un écran en 1600*1200.

Si la #Camera était déjà créée, elle est automatiquement effacée et remplacée par la nouvelle.

Les caméras peuvent se chevaucher.
Il est par exemple possible de créer une caméra principale qui prend tout l'écran et d'afficher une caméra plus petite à l'intérieure de la première qui affichera un autre endroit du monde.
Pour arriver à ce résultat, l'ordre de création est très important: les caméras destinées à être affichées en sur-impression doivent être créées après les autres.

Exemple

  CreateCamera(0, 0, 0, 100, 100) ; Crée une caméra qui prend tout l'écran

  CreateCamera(0, 0,  0, 100, 50) ; Crée une caméra qui ne prend que 50% de la hauteur (effet Split-Screen pour 2 joueurs)
  CreateCamera(1, 0, 50, 100, 50) ; Crée la deuxieme caméra de 50% de hauteur mais dans la partie basse de l'écran

  CreateCamera(0, 0, 0, 100, 100) ; Crée une caméra qui prend tout l'écran
  CreateCamera(1, 25, 0, 50, 10)  ; Avec un effet rétroviseur (miroir).
                                  ; Notez que le rétroviseur est le dernier, de sorte qu'il est affiché en haut de la caméra plein écran

Voir aussi

FreeCamera()


FreeCamera()

Syntaxe

FreeCamera(#Camera)
Description
Supprime une caméra et libère la mémoire asociée.

Arguments

#Camera La caméra à libérer.

Si #PB_All est spécifié, toutes les caméras restantes sont libérées.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

La caméra ne doit pas être utilisée (en utilisant son numéro avec une fonction de cette bibliothèque) après l'appel de cette fonction, à moins de la créer à nouveau.

Toutes les caméras restantes sont automatiquement libérées lorsque le programme se termine.

Voir aussi

CreateCamera()


IsCamera()

Syntaxe

Resultat = IsCamera(#Camera)
Description
Teste si une caméra est correctement initialisée.

Arguments

#Camera La caméra à tester.

Valeur de retour

Si le 'Résultat' est différent de zéro alors cet objet est valide.

Remarques

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.

C'est la fonction idéale pour vérifier qu'une caméra est correctement initialisée.

Voir aussi

CameraID(), CreateCamera()


MoveCamera()

Syntaxe

MoveCamera(#Camera, x, y, z [, Mode])
Description
Déplace une caméra dans le monde 3D.

Arguments

#Camera | La caméra à déplacer.
x, y, z | La nouvelle position de la caméra.
Mode (optionnel) Peut être une des valeurs suivantes:
  #PB_Relative: Déplacement relatif, à partir de la position actuelle de la caméra (par défaut).
  #PB_Absolute: Déplacement absolu à la position spécifiée.
combinée avec l'une des valeurs suivantes:
  #PB_Local : Déplacement local.
  #PB_Parent: Déplacement par rapport à la position du parent.
  #PB_World : Déplacement par rapport au monde.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le déplacement est relatif à la position et la direction actuelles de la caméra.

Voir aussi

CameraX(), CameraY(), CameraZ(), RotateCamera()


RotateCamera()

Syntaxe

RotateCamera(#Camera, x, y, z [, Mode])
Description
Effectue une rotation d'une caméra.

Arguments

#Camera La caméra à tourner.
x, y, z Valeur des angles en x,y,z.
Tous les angles sont en degrés, de 0 à 360 degrés.
Mode (optionnel)
  PB_Absolute: Rotation absolue (par défaut).
  PB_Relative: Rotation relative basée sur la rotation précédente.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CameraPitch(), CameraRoll(), CameraYaw(), MoveCamera()


SwitchCamera()

Syntaxe

SwitchCamera(#Camera, #NouvelleCamera)
Description
Echange une caméra avec une autre.

Arguments

#Camera | La caméra à échanger.
#NouvelleCamera | La nouvelle caméra à afficher.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateCamera()


Cipher

PureBasic - Cipher

Généralités

La bibliothèque Cipher est un jeu de fonctions utiles pour le chiffrement ou l'encodage des données. Par exemple la signature MD5 (Message Digest 5) est utilisée dans de nombreux domaines en raison de sa résistance aux piratage: Linux, BSD et Unix utilisent ce système comme voie alternative pour le codage des mots de passe sur disque.

Vous pourrez crypter des fichiers, des données en mémoires, des mots de passe... Vous pourrez aussi calculer le 'checksum' d'un fichier ou de données en mémoire.

Sommaire des commandes

AESDecoder
AESEncoder
AddCipherBuffer
Base64Decoder
Base64Encoder
CRC32FileFingerprint
CRC32Fingerprint
CloseCryptRandom
CryptRandom
CryptRandomData
DESFingerprint
ExamineMD5Fingerprint
ExamineSHA1Fingerprint
FinishCipher
FinishFingerprint
IsFingerprint
MD5FileFingerprint
MD5Fingerprint
NextFingerprint
OpenCryptRandom
SHA1FileFingerprint
SHA1Fingerprint
StartAESCipher

Exemple

Cipher.pb

OS Supportés

Tous

Guide de référence - Index


AESDecoder()

Syntaxe

Resultat = AESDecoder(*Entrée, *Sortie, Taille, *Cle, Bits, *VecteurInitialisation [, Mode])
Description
Décode les données du tampon d'entrée en utilisant l'algorithme AES dans le tampon de sortie.

Arguments

*Entree Le tampon d'entrée avec les données en clair.
*Sortie Le tampon de sortie qui reçoit les données codées.
Il doit être différent du tampon d'entrée.
Taille Le nombre d'octets à encoder.
Au moins 16 octets sinon des données de rembourrage doivent être ajoutées dans le tampon d'entrée avant le codage, afin d'obtenir ces 16 octets minimum.
*Cle Un tampon contenant la clé de codage.
  Sa taille dépend du paramètre 'Bits':
    l6 octets pour le cryptage 128 bits
    24 octets pour le cryptage 192 bits
    32 octets pour le cryptage 256 bits
Bits La taille de la clé utilisée par le chiffrement.
Les valeurs valides sont 128, 192 et 256.
*VecteurInitialisation Est un bloc tampon de données aléatoires, utilisé pour initialiser le chiffrement afin d'empêcher toute violation de décodage (uniquement nécessaire si vous utilisez le mode #PB_Cipher_CBC). Le contenu de ce bloc doit correspondre à celui qui a été utilisé pour encoder les données.
  Sa taille dépend du paramètre 'Bits':
    l6 octets pour le cryptage 128 bits
    24 octets pour le cryptage 192 bits
    32 octets pour le cryptage 256 bits
Mode (optionnel)
  #PB_Cipher_CBC: Mode par défaut (Cipher Block Chaining). Besoin de '*VecteurInitialisation'.
                  Recommandé car plus sûr que le mode ECB.
  #PB_Cipher_ECB: Mode Alternatif (Electronic CodeBook). Pas besoin de '*VecteurInitialisation'
                  ni de chaînage(chaque bloc est codé indépendamment). Cryptage moins puissant que CBC.

Valeur de retour

Renvoie une valeur non nulle si le décodage a réussie sinon elle renvoie une valeur nulle.

Remarques

Pour plus d'informations à propos de AES et voir des exemples: AESEncoder().

Voir aussi

AESEncoder(), StartAESCipher()


AESEncoder()

Syntaxe

Resultat = AESEncoder(*Entree, *Sortie, Taille, *Cle, Bits, *VecteurInitialisation [, Mode])
Description
Encode les données du tampon d'entrée en utilisant l'algorithme AES dans le tampon de sortie.

Arguments

*Entree | Le tampon d'entrée avec les données en clair.
*Sortie Le tampon de sortie qui reçoit les données codées.
Il doit être différent du tampon d'entrée.
Taille Le nombre d'octets à encoder.
Au moins 16 octets sinon des données de rembourrage doivent être ajoutées dans le tampon d'entrée avant le codage, afin d'obtenir ces 16 octets minimum.
*Cle Un tampon contenant la clé de codage.
  Sa taille dépend du paramètre 'Bits':
    l6 octets pour le cryptage 128 bits
    24 octets pour le cryptage 192 bits
    32 octets pour le cryptage 256 bits
Bits La taille de la clé utilisée par le chiffrement.
Les valeurs valides sont 128, 192 et 256.
*VecteurInitialisation | Est un bloc tampon de données aléatoires de l6 octets, utilisé pour initialiser le chiffrement afin d'empêcher toute violation de décodage (uniquement nécessaire si vous utilisez le mode #PB_Cipher_CBC).
Mode (optionnel)
  #PB_Cipher_CBC: Mode par défaut (Cipher Block Chaining). Besoin de '*VecteurInitialisation'.
                  Recommandé car plus sûr que le mode ECB.
  #PB_Cipher_ECB: Mode Alternatif (Electronic CodeBook). Pas besoin de '*VecteurInitialisation'
                  ni de chaînage(chaque bloc est codé indépendamment). Cryptage moins puissant que CBC.

Valeur de retour

Renvoie une valeur non nulle si l'encodage a réussie sinon elle renvoie une valeur nulle.

Remarques

AES est un algorithme de chiffrement de l'industrie qui a un bon équilibre entre la vitesse et la sécurité. Voici l'introduction wikipedia sur AES: "En cryptographie, le Advanced Encryption Standard (AES) est une norme de cryptage adopté par le gouvernement des États-Unis. La norme comprend trois chiffrements par bloc, AES-128, AES-192 et AES-256. Chaque chiffrement AES a une taille de bloc de 128 bits, avec des tailles de clés de 128, 192 et 256 bits, respectivement. Les chiffrements AES ont été analysés de façon approfondie et sont maintenant utilisés dans le monde entier.

PureBasic utilise une mise en œuvre conforme à la RFC de l'AES. Plus d'informations peuvent être trouvées dans le RFC 3602 : http://www.ietf.org/rfc/rfc3602.txt.

Exemple: CBC

  ; Devrait être compiler en mode ascii
  ;
  String$ = "Hello voici un test pour AES"

  *CipheredString   = AllocateMemory(Len(String$)+1) ; Espace pour la chaîne de caractère avec son
  *DecipheredString = AllocateMemory(Len(String$)+1) ; caractère null de fin de chaîne (mode ASCII)

  If AESEncoder(@String$, *CipheredString, Len(String$), ?Key, 128, ?InitializationVector)
    Debug "Codé : "+PeekS(*CipheredString)

    AESDecoder(*CipheredString, *DecipheredString, Len(String$), ?Key, 128, ?InitializationVector)
    Debug "Décodé : "+PeekS(*DecipheredString)
  EndIf

  DataSection
    Key:
      Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06

    InitializationVector:
      Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
  EndDataSection

Exemple: ECB

  ; Devrait être compiler en mode ascii
  ;
  String$ = "Hello voici un test pour AES"

  *CipheredString   = AllocateMemory(Len(String$)+1) ; Espace pour la chaîne de caractère avec son
  *DecipheredString = AllocateMemory(Len(String$)+1) ; caractère null de fin de chaîne (mode ASCII)

  If AESEncoder(@String$, *CipheredString, Len(String$), ?Key, 128, 0, #PB_Cipher_ECB)
    Debug "Codé : "+PeekS(*CipheredString)

    AESDecoder(*CipheredString, *DecipheredString, Len(String$), ?Key, 128, 0, #PB_Cipher_ECB)
    Debug "Décodé : "+PeekS(*DecipheredString)
  EndIf

  DataSection
    Key:
      Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06
  EndDataSection

Voir aussi

AESDecoder(), StartAESCipher()


AddCipherBuffer()

Syntaxe

AddCipherBuffer(#Cipher, *Entree, *Sortie, Taille)
Description
Ajoute de nouvelles données au chiffrement démarré avec StartAESCipher() et copie les données cryptée dans le tampon de sortie.

Arguments

#Cipher | Le chiffrement auquel les données doivent être ajoutées.
*Entree | Le tampon d'entrée.
*Sortie | Le tampon de sortie.
Taille La taille des données à chiffrer.
Il s'agit de la quantité d'octets qui sera lue à partir du tampon d'entrée et également écrite dans le tampon de sortie.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

StartAESCipher(), FinishCipher(), AESDecoder(), AESEncoder()


Base64Decoder()

Syntaxe

Resultat = Base64Decoder(*TamponSource, LongueurSource, *TamponDestination, LongueurDestination)
Description
Décode un tampon codé en Base64.

Arguments

*TamponSource | Le tampon contenant les données codées.
LongueurSource | La taille de la mémoire tampon d'entrée.
*TamponDestination | Le tampon de sortie où les données seront copiées.
LongueurDestination La taille de la mémoire tampon de sortie.
La mémoire tampon de sortie peut être jusqu'à 33% plus petite que le tampon d'entrée, avec une taille minimale de 64 octets.
Il est recommandé de faire un tampon légèrement plus grand, par exemple 30%, pour éviter les débordements.

Valeur de retour

Renvoie la longueur des données décodées en octets.

Exemple

  Exemple$ = "Voici une phrase !"
  Decoded$ = Space(1024)
  Encoded$ = Space(1024)

  Debug Base64Encoder(@Exemple$, StringByteLength(Exemple$), @Encoded$, 1024)
  Debug Encoded$

  Debug Base64Decoder(@Encoded$, StringByteLength(Encoded$), @Decoded$, 1024)
  Debug Decoded$

Voir aussi

Base64Encoder()


Base64Encoder()

Syntaxe

Resultat = Base64Encoder(*TamponSource, LongueurSource, *TamponDestination, LongueurDestination [, Options])
Description
Encode le contenu d'un tampon avec l'algorithme Base64.

Arguments

*TamponSource | Le tampon contenant les données à coder.
LongueurSource | La taille de la mémoire tampon d'entrée.
*TamponDestination | Le tampon de sortie où les données codées seront copiées.
LongueurDestination La taille de la mémoire tampon de sortie.
La mémoire tampon de sortie peut être jusqu'à 33% plus petite que le tampon d'entrée, avec une taille minimale de 64 octets.
Il est recommandé de faire un tampon légèrement plus grand, par exemple 30%, pour éviter les débordements.
Options (optionnel) Peut être une combinaison de:
  #PB_Cipher_NoPadding: Il ne sera pas plus insérer de '=' à la fin de la mémoire tampon.
  #PB_Cipher_URL      : Utilisation d'un codage légèrement différent, principalement utilisé
                         dans les URLs. Les caractères '+' et '/' seront respectivement codés
                         en '-' et '_'.

Valeur de retour

Renvoie la longueur des données codées en octets.

Remarques

Il est largement utilisé dans les programmes de messagerie mais peut également être utile dans toute application nécessitant un encodage basé sur le code ASCII seul (7 bits, caractères 32 à 127) pour les fichiers binaires.

Exemple

  Exemple$ = "Ceci est une chaîne !"
  Decoded$ = Space(1024)
  Encoded$ = Space(1024)

  Debug Base64Encoder(@Exemple$, StringByteLength(Exemple$), @Encoded$, 1024)
  Debug Encoded$

  Debug Base64Decoder(@Encoded$, StringByteLength(Encoded$), @Decoded$, 1024)
  Debug Decoded$

Voir aussi

Base64Decoder()


CRC32FileFingerprint()

Syntaxe

Resultat = CRC32FileFingerprint(Fichier$ [, Decalage [, Longueur]]))
Description
Renvoie la somme de contrôle CRC32 d'un fichier.

Arguments

Fichier$ | Le fichier à utiliser.
Decalage (optionnel) | Le décalage (en octets) à partir du début du fichier avant de lancer le calcul d'empreinte.
Longueur (optionnel) | La longueur (en octets) à utiliser pour le calcul d'empreinte.

Valeur de retour

Renvoie le checksum du fichier.
Si le fichier est introuvable ou si une erreur s'est produite, le résultat sera nul.

Remarques

CRC32 est un codage 32 bits qui n'est pas conçu pour le stockage de mot de passe car il est facilement piratable, mais utilisable pour des contrôles rapides d'intégrité des données.
Le principal avantage de l'algorithme CRC32 sur le hachage MD5 ou autre est sa très grande vitesse.

Voir aussi

CRC32Fingerprint(), MD5FileFingerprint(), SHA1FileFingerprint()


CRC32Fingerprint()

Syntaxe

Resultat = CRC32Fingerprint(*Tampon, Taille, [ValeurInitiale])
Description
Calcul la somme de contrôle CRC32 correspondant au contenu d'un tampon.

Arguments

*Tampon | Le tampon contenant les données.
Taille | Taille du tampon.
ValeurInitiale (optionnel) | Peut être utilisé pour transmettre la somme de contrôle d'un tampon précédent. Le résultat sera alors la somme de contrôle des deux tampons, comme si elle était calculée d'un tampon en continu. De cette façon, le calcul de la somme de contrôle d'une grande quantité de données peut être décomposé en un certain nombre de calculs utilisant des petits tampons.

Valeur de retour

Renvoie le 'checksum'.

Remarques

CRC32 est un codage 3 bits inadapté pour le stockage des mots de passe car il est facilement piratable, mais utilisable plutôt pour le contrôle rapide d'intégrité des données. Par exemple les fichiers zip utilisent un CRC32 à la fin de chaque fichier pour s'assurer que le zip n'est pas corrompu. L'avantage principal du CRC32 par rapport au MD5 ou à d'autres algorithmes de signature est sa rapidité d'exécution.

Exemple

  *MemoireID = AllocateMemory(500)    ; *MemoireID contient l'adresse de la zone mémoire.
  If *MemoireID
    PokeS(*MemoireID, "Cette chaîne est placée dans la zone mémoire")
    Taille = MemoryStringLength(*MemoireID)

    CRC32 = CRC32Fingerprint(*MemoireID, Taille) ; Calcul du checksum en 1 étape.
    Debug "CRC32 checksum = " + Str(CRC32)

    Part1 = CRC32Fingerprint(*MemoireID, Taille/2) ; Calcul le checksum en 2 étapes.
    CRC32 = CRC32Fingerprint(*MemoireID + Taille/2, Taille/2, Part1)
    Debug "CRC32 checksum = " + Str(CRC32)

    FreeMemory(*MemoireID)  ; La mémoire peut aussi être libérée automatiquement à la fin du programme.
  EndIf

Voir aussi

CRC32FileFingerprint(), MD5Fingerprint(), SHA1Fingerprint()


CloseCryptRandom()

Syntaxe

CloseCryptRandom()
Description
Libère les ressources utilisées par le générateur de nombre pseudo-aléatoire précédemment initialisé avec OpenCryptRandom().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

OpenCryptRandom(), CryptRandom(), CryptRandomData()


CryptRandom()

Syntaxe

Resultat = CryptRandom(Maximum)
Description
Renvoie un nombre aléatoire (entier) qui se trouve entre 0 (inclu) et la valeur maximale du générateur pseudo-aléatoire cryptographique.

Arguments

Maximum Valeur maximale renvoyé par la fonction.
Ne peut pas dépasser la valeur maximale d'un long: 2147483647.

Valeur de retour

Renvoie le nombre aléatoire généré.

Remarques

Le générateur doit d'abord être ouvert avec la commande OpenCryptRandom().

Important: Utiliser une valeur 'Maximum' qui est égale à une puissance de deux peut causer des probabilités plus élevés pour certaines valeurs, favorisant les attaques statistiques. C'est la conséquence de la division du nombre généré pour qu'il soit dans la plage spécifiée.

Pour générer des quantités plus importantes de nombres aléatoires, utilisez la commande CryptRandomData(). Pour une génération beaucoup plus rapide, mais moins robuste, utilisez la commande Random().

Voir aussi

OpenCryptRandom(), CryptRandomData(), CloseCryptRandom(), Random()


CryptRandomData()

Syntaxe

Resultat = CryptRandomData(*Tampon, Longueur)
Description
Remplit une mémoire tampon avec des données aléatoires provenant du générateur pseudo-aléatoire cryptographique .

Arguments

*Tampon | Le tampon à remplir.
Longueur | La taille de la mémoire tampon en octets.

Valeur de retour

Renvoie une valeur non nulle si les données aléatoires ont été générés avec succès et zéro sinon.

Remarques

Le générateur doit d'abord être ouvert avec la commande OpenCryptRandom().

Pour une génération de données beaucoup plus rapide, mais moins robuste, utilisez la commande RandomData().

Exemple

  *Cle = AllocateMemory(16)

  If OpenCryptRandom() And *Cle
    CryptRandomData(*Cle, 16)

    Texte$ = "Clé crée :"
    For i = 0 To 15
      Texte$ + " " + RSet(Hex(PeekB(*Cle+i), #PB_Byte), 2, "0")
    Next i

    CloseCryptRandom()
  Else
    Texte$ = "La création de clé n'est pas disponible"
  EndIf

  MessageRequester("Exemple", Texte$)

Voir aussi

OpenCryptRandom(), CryptRandom(), CloseCryptRandom() RandomData()


DESFingerprint()

Syntaxe

Resultat$ = DESFingerprint(MotDePasse$, Cle$)
Description
Renvoie un mot de passe crypté avec l'algorithme DES.

Arguments

MotDePasse$ Le mot de passe à crypter.
Il peut contenir jusqu'à 8 caractères au maximum, les autres caractéres sont tout simplement ignorés.
MD5Fingerprint() peut être utilisé pour traité un tampon plus grand.
Cle$ Clé de cryptage.
Le paramètre est également appelé 'Salt' (grain de sel), bien connu des utilisateurs de Linux/Unix/BSD. Lorsque l'on utilise une clé de 2 caractères, cette fonction renvoie une chaîne 'Salt2', compatible avec tout mot de passe standard Linux (/etc/passwd). Cette commande est basée sur la fonction open-source 'crypt()'.

Valeur de retour

Renvoie le mot de passe crypté.

Remarques

Cet algorithme est basé sur la méthode de chiffrement DES (Data Encryption Standard) pour générer une chaîne de 13 caractères. Cette chaîne est unique et non réversible entrainant une grande difficulté pour la décoder lorsque le mot de passe est correctement choisi.

Exemple

  Debug DESFingerprint("Mot de passe", "Key007")
  Debug DESFingerprint("Nouveau mot de passe", "Key007")

Voir aussi

MD5Fingerprint(), SHA1Fingerprint()


ExamineMD5Fingerprint()

Syntaxe

Resultat = ExamineMD5Fingerprint(#Fingerprint)
Description
Initialise le calcul d'un code MD5 (Message Digest 5).

Contrairement à la commande MD5Fingerprint(), le calcul peut s'effectuer en plusieurs étapes, sans avoir à charger préalablement l'intégralité des données nécessaires au MD5.

Arguments

#Fingerprint L'identifiant de ce calcul.

Si #PB_Any est utilisé pour le paramètre '#Fingerprint', le numéro du calcul sera renvoyé dans 'Resultat'.

Valeur de retour

Renvoie la valeur #FingerPrint si #PB_Any a été utilisé pour ce paramètre.

Remarques

NextFingerprint() permet d'ajouter des blocs de données au calcul et FinishFingerprint() le terminera et renverra le code MD5.

Pour plus d'informations sur l'algorithme MD5: MD5Fingerprint().

Exemple

  *Buffer = AllocateMemory(200)
  If *Buffer
    PokeS(*Buffer, "Le renard brun rapide saute sur le chien paresseux.")
    Size = MemoryStringLength(*Buffer)

    If ExamineMD5Fingerprint(1)                  ; démarre le calcul
      NextFingerprint(1, *Buffer, Size/2)        ; calcule la partie 1
      NextFingerprint(1, *Buffer+Size/2, Size/2) ; calcule la partie 2

      MD5$ = FinishFingerprint(1)                ; termine le calcul
      Debug "MD5 checksum = " + MD5$

      MD5$ = MD5Fingerprint(*Buffer, Size)       ; comparaison avec le calcul en une seule étape
      Debug "MD5 checksum = " + MD5$
    EndIf

    FreeMemory(*Buffer)
  EndIf

Voir aussi

MD5Fingerprint(), MD5FileFingerprint(), SHA1Fingerprint(), CRC32Fingerprint()


ExamineSHA1Fingerprint()

Syntaxe

Resultat = ExamineSHA1Fingerprint(#Fingerprint)
Description
Initialise le calcul d'un code SHA1 (Secure Hash Algorithm 1).

Contrairement à la commande SHA1Fingerprint(), le calcul peut s'effectuer en plusieurs étapes, sans avoir à charger préalablement l'intégralité des données nécessaires au SHA1.

Arguments

#Fingerprint L'identifiant de ce calcul.

Si #PB_Any est utilisé pour le paramètre '#Fingerprint', le numéro du calcul sera renvoyé dans 'Resultat'.

Valeur de retour

Renvoie la valeur #FingerPrint si #PB_Any a été utilisé pour ce paramètre.

Remarques

NextFingerprint() permet d'ajouter des blocs de données au calcul et FinishFingerprint() le terminera et renverra le code SHA1.

Pour plus d'informations sur l'algorithme SHA1: SHA1Fingerprint().

Exemple

  *Buffer = AllocateMemory(200)
  If *Buffer
    PokeS(*Buffer, "Le renard brun rapide saute sur le chien paresseux.")
    Size = MemoryStringLength(*Buffer)

    If ExamineSHA1Fingerprint(1)                 ; démarre le calcul
      NextFingerprint(1, *Buffer, Size/2)        ; calcul de la partie 1
      NextFingerprint(1, *Buffer+Size/2, Size/2) ; calcul de la partie 2

      SHA1$ = FinishFingerprint(1)               ; temine le calcul
      Debug "SHA1 checksum = " + SHA1$

      SHA1$ = SHA1Fingerprint(*Buffer, Size)     ; comparaison avec le calcul en une seule étape
      Debug "SHA1 checksum = " + SHA1$
    EndIf

    FreeMemory(*Buffer)
  EndIf

Voir aussi

SHA1Fingerprint(), SHA1FileFingerprint(), MD5Fingerprint(), CRC32Fingerprint()


FinishCipher()

Syntaxe

Resultat = FinishCipher(#Cipher)
Description
Met fin au flux de cryptage préalablement ouvert avec StartAESCipher().

Arguments

#Cipher The cipher à fermer.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette commande devrait être appelée pour clore un calcul de chiffrement même si le chiffre n'est plus nécessaire car elle effacera toutes les données liées au calcul de chiffrement.

Voir aussi

StartAESCipher(), AddCipherBuffer()


FinishFingerprint()

Syntaxe

Resultat$ = FinishFingerprint(#Fingerprint)
Description
Termine le calcul commencé avec ExamineMD5Fingerprint() ou ExamineSHA1Fingerprint() et renvoie la signature générée dans 'Resultat$'.

Arguments

#FingerPrint L'identifiant du calcul à terminer.

Valeur de retour

Renvoie la somme de contrôle ('checksum') sous forme de chaîne de caractères au format identique à MD5Fingerprint() ou SHA1Fingerprint().

Remarques

Cette commande doit toujours être appelée pour terminer un calcul, même si la signature n'est plus nécessaire, car elle libère toutes les données associées au calcul.

Voir ExamineMD5Fingerprint() ou ExamineSHA1Fingerprint() pour un exemple d'utilisation.

Voir aussi

ExamineMD5Fingerprint(), ExamineSHA1Fingerprint(), NextFingerprint()


IsFingerprint()

Syntaxe

Resultat = IsFingerprint(#Fingerprint)
Description
Teste la validité d'une '#Fingerprint' calculée préalablement avec ExamineMD5Fingerprint() ou ExamineSHA1Fingerprint().

Arguments

#FingerPrint L'identifiant du calcul de contrôle à tester.

Valeur de retour

Renvoie une valeur non nul si le calcul de contrôle est valide et zéro sinon.

Remarques

Cette fonction a été conçue pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

ExamineMD5Fingerprint(), ExamineSHA1Fingerprint()


MD5FileFingerprint()

Syntaxe

Resultat$ = MD5FileFingerprint(Fichier$ [, Decalage [, Longueur]]))
Description
Renvoie un code MD5 (Message Digest 5) d'un fichier.

Arguments

Fichier$ | Le nom du fichier à utiliser.
Decalage (optionnel) | Le décalage (en octets) à partir du début du fichier avant de lancer le calcul de somme de contrôle.
Longueur (optionnel) | La longueur (en octets) à utiliser pour le calcul de la somme de contrôle.

Valeur de retour

Renvoie le code MD5 (Message Digest 5) de 32 caractères correspondant à un identifiant unique du fichier, si le calcul a été un succès.

Si le fichier est introuvable ou une erreur s'est produite, le résultat sera vide.

Remarques

Voir MD5Fingerprint() pour plus d'informations sur l'algorithme MD5.

Voici une courte présentation basée sur la RFC 1321 concernant MD5:

L'algorithme prend en entrée un message de longueur arbitraire et produit une signature sur 128-bit ou "message digest" à partir des données en entrée. Il est supposé qu'il est irréaliste de calculer deux messages ayant la même signature ou de prédéterminer le "message digest" d'une entrée donnée. L'algorithme MD5 est prévu pour les applications traitant les signatures numériques.'

Les codes MD5 sont souvent utilisés pour le chiffrement des mots de passe, donnant une protection normalisée et élevée. Vous pourrez trouver plus d'informations sur la RFC 1321 sur : http://www.ietf.org/rfc/rfc1321.txt.

Voir aussi

MD5Fingerprint(), ExamineMD5Fingerprint(), SHA1FileFingerprint(), CRC32FileFingerprint()


MD5Fingerprint()

Syntaxe

Resultat$ = MD5Fingerprint(*Tampon, Taille)
Description
Renvoie un code MD5 (Message Digest 5) des données contenues dans un tampon.

Arguments

*Tampon | Le tampon contenant les données.
Taille | La taille du tampon.

Valeur de retour

Renvoie un code MD5 (Message Digest 5) de 32 caractères des données contenues dans le tampon.

Remarques

Voici une courte présentation basée sur la RFC 1321 concernant MD5:

L'algorithme prend en entrée un message de longueur arbitraire et produit une signature sur 128 bits ou "message digest" à partir des données en entrée. Il est supposé qu'il est irréaliste de calculer deux messages ayant la même signature ou de prédéterminer le "message digest" d'une entrée donnée. L'algorithme MD5 est prévu pour les applications traitant les signatures numériques.'

Les codes MD5 sont souvent utilisés pour le chiffrement des mots de passe, donnant une protection normalisée et élevée. Vous pourrez trouver plus d'informations sur la RFC 1321 sur : http://www.ietf.org/rfc/rfc1321.txt.

Exemple: (Une chaîne en tant que tampon mémoire)

  test.s = "Ceci est un test avec une chaîne!"
  Debug MD5Fingerprint(@test, Len(test))

Exemple: (Avec un tampon mémoire)

  *MemoryID = AllocateMemory(500)    ; *MemoryID contient l'adresse du bloc mémoire
  If *MemoryID
    PokeS(*MemoryID, "Nous sauvegardons cette chaine dans le bloc mémoire")
    MD5$ = MD5Fingerprint(*MemoryID, MemorySize(*MemoryID))
    Debug "MD5 Fingerprint = " + MD5$
    FreeMemory(*MemoryID)  ; Facultatif, c'est fait automatiquement à la fin du programme.
  EndIf

Voir aussi

MD5FileFingerprint(), ExamineMD5Fingerprint(), SHA1Fingerprint(), CRC32Fingerprint()


NextFingerprint()

Syntaxe

NextFingerprint(#Fingerprint, *Tampon, Taille)
Description
Ajoute de novelles données au calcul commencé par ExamineMD5Fingerprint() ou ExamineSHA1Fingerprint().

Arguments

#FingerPrint | L'identifiant du calcul en cours.
*Tampon | Le tampon qui contient les nouvelles données à ajouter au calcul.
Taille | Le nombre d'octets à ajouter au calcul.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Voir ExamineMD5Fingerprint() ou ExamineSHA1Fingerprint() pour un exemple d'utilisation.

Voir aussi

ExamineMD5Fingerprint(), ExamineSHA1Fingerprint(), FinishFingerprint()


OpenCryptRandom()

Syntaxe

Resultat = OpenCryptRandom()
Description
Initialise l'accès au générateur de nombre pseudo-aléatoire.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie une valeur différente de zéro si le générateur est correctement initialisé. Si le retour est zéro, alors il n'y a pas de générateur pseudo-aléatoire robuste disponible dans le système.

Remarques

Les commandes CryptRandom() et CryptRandomData() peuvent être utilisées pour lire les données disponibles.

Ce générateur est très robuste, assez pour être utilisé à des fins de cryptographie, comme la génération de clés pour la commande AESEncoder(). La source des données du générateur est "/dev/urandom" sous Linux et MacOS X, et la "Microsoft Cryptography API" sous Windows. Il est néanmoins bien plus lent que la fonction Random() classique.

Consultez CryptRandomData() pour un exemple d'utilisation.

Voir aussi

CryptRandom(), CryptRandomData(), CloseCryptRandom()


SHA1FileFingerprint()

Syntaxe

Resultat$ = SHA1FileFingerprint(Fichier$ [, Decalage [, Longueur]]))
Description
Renvoie un code SHA1 (Secure Hash Algorithm 1) pour un fichier.

Arguments

Fichier$ | Le fichier à utiliser.
Decalage (optionnel) | Le décalage (en octets) à partir du début du fichier avant de lancer le calcul de hachage.
Longueur (optionnel) | La longueur (en octets) à utiliser pour le calcul de hachage.

Valeur de retour

Renvoie le code SHA1 (Secure Hash Algorithm 1) de 40 caractères correspondant au contenu du fichier. Si le fichier n'existe pas ou qu'une erreur est survenue, 'Resultat$' sera vide.

Remarques

Pour plus d'informations sur l'algorithme SHA1: SHA1Fingerprint().

Voir aussi

SHA1Fingerprint(), ExamineSHA1Fingerprint(), MD5FileFingerprint(), CRC32FileFingerprint()


SHA1Fingerprint()

Syntaxe

Resultat$ = SHA1Fingerprint(*Tampon, Taille)
Description
Renvoie un code SHA1 (Secure Hash Algorithm 1) des données contenues dans un tampon.

Arguments

*Tampon | Le tampon contenant les données.
Taille | La taille du tampon.

Valeur de retour

Renvoie un code SHA1 (Secure Hash Algorithm 1) sous la forme d'une chaîne de caractères de 40 caractères.

Remarques

SHA1 est souvent utiliser pour vérifé qu'un contenu n'a pas été altéré (lors d'un téléchargement par exemple). De plus il est quasiment impossible de modifier un contenu de tel manière qu'il produise le même code SHA1 que le contenu original. Voici une courte présentation basée sur la RFC 3174 concernant SHA1: SHA-1 est considéré comme sécurisé car il est impossible à l'aide d'un ordinateur de créer un message qui correspond à un code SHA-1 donné, ou de trouver deux messages différents qui produisent le même code SHA-1. Toute altération du message conduira à un code SHA-1 différent avec une très forte probabilité.'
Plus d'informations sur la RFC 3174:
http://www.ietf.org/rfc/rfc3174.txt.

SHA1FileFingerprint() peut être utilisé pour calculer la signature SHA-1 d'un fichier.
ExamineSHA1Fingerprint() peut être utilisé pour calculer une signature SHA-1 en plusieurs étapes.

Exemple: (en utilisant une chaîne de caractères)

  Test$ = "Voici un texte !"
  Debug SHA1Fingerprint(@Test$, StringByteLength(Test$))

Exemple: (en utilisant un tampon mémoire)

  *Buffer = AllocateMemory(500)
  If *Buffer
    PokeS(*Buffer, "Le renard brun et rapide ssaute sur le chien paresseux.")
    SHA1$ = SHA1Fingerprint(*Buffer, MemorySize(*Buffer))
    Debug "SHA1 Fingerprint = " + SHA1$
    FreeMemory(*Buffer)  ; aurait été aussi libérée automatiquement à la fin du programme.
  EndIf

Voir aussi

SHA1FileFingerprint(), ExamineSHA1Fingerprint(), MD5Fingerprint(), CRC32Fingerprint()


StartAESCipher()

Syntaxe

Resultat = StartAESCipher(#Cipher, *Cle, Bits, *VecteurInitialisation, Mode)
Description
Initialise un flux de chiffrement AES.

Arguments

#Cipher L'identifiant du nouveau chiffrement.

#PB_Any peut être utilisé pour générer automatiquement ce numéro.
*Cle Un tampon contenant la clé de décodage.
   Sa taille dépend du paramètre 'Bits':
     l6 octets pour le cryptage 128 bits.
     24 octets pour le cryptage 196 bits.
     32 octets pour le cryptage 256bit.
Bits La taille de la clé utilisée par le chiffrement.
Les valeurs valides sont 128, 192 et 256.
*VecteurInitialisation Est un bloc de données aléatoires, utilisé pour initialiser le chiffrement et pour empêcher toute violation de décodage (uniquement nécessaire si vous utilisez le mode #PB_Cipher_CBC).
   Sa taille dépend du paramètre 'Bits':
     l6 octets pour le cryptage 128 bits.
     24 octets pour le cryptage 196 bits.
     32 octets pour le cryptage 256bit.
Mode Peut être une combinaison de:
  #PB_Cipher_Decode: Le flux est utilisé pour décoder les données.
  #PB_Cipher_Encode: Le flux est utilisé pour encoder les données.

avec

  #PB_Cipher_CBC: Mode par défaut (Cipher Block Chaining). Besoin de '*VecteurInitialisation'.
                  Recommandé car plus sûr que le mode ECB.
  #PB_Cipher_ECB: Mode alternatif(Electronic CodeBook). Pas besoin de '*VecteurInitialisation'
                   ni de chainage(chaque bloc est codé indépendamment). Cryptage moins puissant que CBC.

Valeur de retour

Si #PB_Any a été utilisé pour le paramètre #Cipher alors un numéro généré automatiquement est retourné.

Remarques

Les nouveaux tampons à encoder ou à décoder peuvent être ajoutés avec AddCipherBuffer().

Une fois le codage terminé, FinishCipher() doit être appelé.

Pour plus d'information à propos de AES, voir AESEncoder().

Voir aussi

AddCipherBuffer(), FinishCipher(), AESEncoder(), AESDecoder()


Clipboard

PureBasic - Clipboard

Généralités

Le presse-papier (clipboard) est le moyen standard pour partager des informations entre les applications lancées depuis le système d'exploitation. Par exemple lorsque l'on coupe un texte dans un éditeur, il est envoyé dans le presse-papier et peut ensuite être retrouvé et déposé par un autre éditeur de texte. PureBasic permet de copier et récupérer facilement du texte et des images dans le presse-papier du système.

Sommaire des commandes

ClearClipboard
GetClipboardImage
GetClipboardText
SetClipboardImage
SetClipboardText

Exemple

Clipboard.pb

OS Supportés

Tous

Guide de référence - Index


ClearClipboard()

Syntaxe

ClearClipboard()
Description
Efface le presse-papier.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Toute information préalablement stockée est totalement effacée et ne peut plus être retrouvée.

Voir aussi

SetClipboardImage(), SetClipboardText()


GetClipboardImage()

Syntaxe

Resultat = GetClipboardImage(#Image [, Profondeur])
Description
Crée une nouvelle image à partir du contenu du presse-papier (si une image est disponible).

Arguments

#Image Numéro de la nouvelle image.

Si #PB_Any est utilisé pour le paramètre '#Image', le numéro de la nouvelle image sera renvoyé dans 'Resultat'.
Profondeur (optionnel) Si ce paramètre est omis ou égal à #PB_Image_DisplayFormat, le format de l'image sera le même que celui du bureau (écran).
Dans ce mode, les images sont plus rapide à afficher, mais il peut y avoir des pertes au niveaux des couleurs, par exemple si l'image est en 32-bit alors que le bureau est en 16-bit.

Les valeurs valides sont: 24 bits (par défaut) ou 32 bits.

Valeur de retour

Si un probleme est survenu, ou qu'aucune image n'est disponible alors zéro est renvoyé dans 'Resultat'.

Si #PB_Any est utilisé pour le paramètre '#Image', le numéro de la nouvelle image sera renvoyé dans 'Resultat'.

Remarques

Lors de la manipulation des images riches en couleurs, il est conseillé d'utiliser une profondeur de 24 ou 32-bit pour éviter une perte d'information.

L'image ainsi obtenue peut être détruite à l'aide de la commande FreeImage().

Pour plus d'information sur les images, voir la bibliothèque Image.

Voir aussi

SetClipboardImage(), GetClipboardText()


GetClipboardText()

Syntaxe

Texte$ = GetClipboardText()
Description
Renvoie le texte actuellement stocké dans le presse-papier.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le texte stocké dans le presse-papier ou une chaîne vide sinon.

Voir aussi

SetClipboardText(), GetClipboardImage()


SetClipboardImage()

Syntaxe

SetClipboardImage(#Image)
Description
Met une copie d'une image dans le presse-papier.

Arguments

#Image Numéro de l'image à mettre dans le presse-papier.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Si une image est déjà présente dans le presse-papier, elle sera remplacée par cette '#Image'.

Une image est créée à l'aide des commandes du type CreateImage() et LoadImage().

Exemple

  If CreateImage(0,26,20)
    StartDrawing(ImageOutput(0))
      Box(0,0,26,20,RGB(255,255,255))
      Circle(13,10,5,RGB(255,0,0))
    StopDrawing()
    SetClipboardImage(0)
  EndIf

  ; Maintenant ouvrez un logiciel de dessin (par exemple 'Paint')
  ; et collez le contenu du presse-papier (Edition puis Coller),
  ; et vous verrez le drapeau japonais ;-)

Voir aussi

GetClipboardImage(), SetClipboardText(), ClearClipboard()


SetClipboardText()

Syntaxe

SetClipboardText(Texte$)
Description
Place un texte dans le presse-papier.

Arguments

Texte$ Le texte à placer dans le presse-papier

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Si le presse-papier contient déjà un texte celui-ci est remplacé.

Voir aussi

GetClipboardText(), SetClipboardImage(), ClearClipboard()


Console

PureBasic - Console

Généralités

La bibliothèque Console permet de créer une application en mode console. On utilise ce mode pour créer des programmes de petite taille ne nécessitant pas d'interface utilisateur avancé, ou pour une utilisation dans des scripts (ligne de commande). Ces instructions sont également utiles pour le programmeur lors du déboggage d'application en permettant d'afficher des informations sur la console sans interrompre le cours du programme.

Si votre programme est destiné à être une application console pure (pas une application fenêtrée qui ouvre une console), alors vous devez vous rappeler de régler le format de fichier exécutable sur "console" lorsque vous compilez votre programme. Voir le menu Compilateur\Options du compilateur\Options de compilation\Format de l'éxecutable.

Vous devriez commencer avec la fonction OpenConsole(), puisque vous devez utiliser cette fonction pour ouvrir une console.

Attention, ces programmes ne sont pas de véritables programmes MS-DOS ! Il faut donc les ouvrir à partir de Windows 95 ou plus.

Sommaire des commandes

ClearConsole
CloseConsole
ConsoleColor
ConsoleCursor
ConsoleError
ConsoleLocate
ConsoleTitle
EnableGraphicalConsole
Inkey
Input
OpenConsole
Print
PrintN
RawKey
ReadConsoleData
WriteConsoleData

Exemple

Console.pb

OS Supportés

Tous

Guide de référence - Index


ClearConsole()

Syntaxe

ClearConsole()
Description
Efface tout le contenu de la console.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le fond d'écran est déterminé par ConsoleColor().
La console doit être en mode graphique.

Exemple

  If OpenConsole()
    EnableGraphicalConsole(1)

    PrintN("Vous ne me verrez jamais")
    ClearConsole()

    PrintN("Appuyez sur [Entree] pour quitter")
    Input()
  EndIf

Voir aussi

EnableGraphicalConsole(), ConsoleColor()

OS Supportés

Windows


CloseConsole()

Syntaxe

CloseConsole()
Description
Ferme la console.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Une fois que la console est fermée il n'est plus possible d'utiliser les fonctions de cette bibliothèque.
La console se ferme automatiquement à la fin de l'exécution du programme.

Exemple

  For i = 0 To 4
    If OpenConsole()
      PrintN("C'est la console #"+Str(i))
      PrintN("Appuyez sur [Entree] pour quitter")
      Input()
      CloseConsole()
    EndIf
  Next

Voir aussi

OpenConsole()


ConsoleColor()

Syntaxe

ConsoleColor(CouleurTexte, CouleurFond)
Description
Change les couleurs utilisées par l'écran texte.

Arguments

CouleurTexte Couleur du texte:
   0 - Noir (fond par défaut)
   1 - Bleu foncé
   2 - Vert foncé
   3 - Bleu-vert
   4 - Rouge foncé
   5 - Magenta foncé
   6 - Brun
   7 - Gris clair (couleur texte par defaut)
   8 - Gris foncé
   9 - Bleu
  10 - Vert
  11 - Cyan
  12 - Rouge
  13 - Magenta
  14 - Jaune
  15 - Blanc
CouleurFond Couleur de fond:
   0 - Noir (fond par défaut)
   1 - Bleu foncé
   2 - Vert foncé
   3 - Bleu-vert
   4 - Rouge foncé
   5 - Magenta foncé
   6 - Brun
   7 - Gris clair (couleur texte par defaut)
   8 - Gris foncé
   9 - Bleu
  10 - Vert
  11 - Cyan
  12 - Rouge
  13 - Magenta
  14 - Jaune
  15 - Blanc

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Tous les caractères affichés après l'appel de cette fonction utiliseront ces nouvelles couleurs.

Exemple

  If OpenConsole()
    For CouleurTexte = 0 To 15
      For CouleurFond = 0 To 15
        ConsoleColor(CouleurTexte, CouleurFond)
        Print(Right(Hex(CouleurFond), 1))
      Next

      PrintN("")
    Next

    ConsoleColor(7, 0)
    PrintN("Appuyez sur [Entree] pour quitter")
    Input()
  EndIf

OS Supportés

Windows


ConsoleCursor()

Syntaxe

ConsoleCursor(Hauteur)
Description
Change le curseur.

Arguments

Hauteur La nouvelle hauteur du curseur.

Cette valeur peut aller de 0 à 10.
  Par exemple:
  0 : Curseur invisible
  1 : Curseur souligné
  5 : Curseur demi-pavé
  10: Curseur pavé

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Par défaut, le curseur est représenté par un soulignement clignotant dans les consoles sous le système d'exploitation Windows. Notez que vous devrez peut-être mettre la fenêtre de la console en mode plein écran pour voir l'effet réel de cette fonction.

La console doit être en mode graphique.

Exemple

  If OpenConsole()
    EnableGraphicalConsole(1)

    For HauteurCurseur=0 To 10
      ConsoleCursor(HauteurCurseur)
      PrintN("Appuyez sur [Entree] pour augmenter la hauteur du curseur")
      Input()
    Next

    PrintN("Appuyez sur [Entree] pour quitter")
    Input()
  EndIf

Voir aussi

EnableGraphicalConsole()

OS Supportés

Windows


ConsoleError()

Syntaxe

ConsoleError(Message$)
Description
Envoie une chaîne de caractères vers la sortie 'Erreur' (stderr) du programme.

Arguments

Message$ Chaîne de caractères avec un retour à la ligne.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette sortie peut être lue par exemple avec la commande ReadProgramError() de la bibliothèque Process.

Voir aussi

Print(), PrintN()


ConsoleLocate()

Syntaxe

ConsoleLocate(x, y)
Description
Déplace le curseur.

Arguments

x, y Les nouvelles coordonnées du curseur (commence à 0).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

La console doit être en mode graphique.

Exemple

  If OpenConsole()
    EnableGraphicalConsole(1)

    For i = 0 To 200
      ConsoleLocate(Random(79), Random(24))
      Print("*")
    Next

    ConsoleLocate(30, 10)
    PrintN("Appuyez sur [Entree] pour quitter")
    Input()
  EndIf

Voir aussi

EnableGraphicalConsole()

OS Supportés

Windows


ConsoleTitle()

Syntaxe

ConsoleTitle(Titre$)
Description
Change le titre de la console.

Sous Windows, le titre de la console est aussi le texte affiché dans la barre de démarrage et dans le gestionnaire de tâches représentant votre application console.

Arguments

Titre$ Le nouveau titre de fenêtre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  If OpenConsole()
    ConsoleTitle("Ceci est le titre de la console")
    PrintN("Appuyez sur [Entree] pour quitter")
    Input()
  EndIf

Voir aussi

EnableGraphicalConsole()

OS Supportés

Windows


EnableGraphicalConsole()

Syntaxe

EnableGraphicalConsole(Mode)
Description
Change la manière d'afficher les caractères dans la console: Texte/Graphique.

Arguments

Mode
  0: Mode texte
  1: Mode graphique

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le mode par défaut de la console est le mode texte, ce qui implique que le texte ne peut pas être positionné arbitrairement dans la console. Cependant, les redirections (pipes) fonctionnent correctement, ce qui peut être utile si le programme est destiné à être utilisé dans des scripts.

Quand le mode graphique est activé, les commandes comme ClearConsole() ou ConsoleLocate() sont disponibles, et le texte peut être positionné n'importe où dans la console, ce qui permet de faire des jeux ou des applications console (qui peuvent par exemple être accédées à distance via telnet ou ssh).
Attention: La redirection (pipes) ne fonctionne pas si la console est en mode graphique.

Exemple

  If OpenConsole()
    EnableGraphicalConsole(1)
    ConsoleLocate(7, 8)
    PrintN("Appuyez sur [Entree] pour quitter")
    Input()
  EndIf

Voir aussi

ConsoleLocate(), ConsoleColor(), ClearConsole()

OS Supportés

Windows


Inkey()

Syntaxe

Caractere$ = Inkey()
Description
Renvoie un caractère si une touche du clavier est appuyée.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Retourne une chaîne contenant le caractère correspondant à la touche enfoncée ou une chaîne vide si la touche ne correspond à aucun caractère (touche de fonction..).

Remarques

- Cette commande ne bloque pas l'exécution du programme.

- Si des touches spéciales (non-ascii) doivent être gérées, RawKey() peut être appelé après Inkey().

- Les codes ASCII et les valeurs numériques présentées ici peuvent changer en fonction de la page de code clavier chargée pendant le boot.

- Un tableau contenant les valeurs ascii est disponible ici.

Exemple

  If OpenConsole()
    PrintN("Appuyez sur [Echap] pour quitter")

    Repeat
      KeyPressed$ = Inkey()

      If KeyPressed$ <> ""
        PrintN("Vous avez appuye sur : " + KeyPressed$)
        PrintN("Son identifiant numerique est : "+Str(RawKey()))
      ElseIf RawKey()
        PrintN("Vous avez appuye sur une touche qui n'est pas alpha-numerique.")
        PrintN("Son identifiant numerique est : "+Str(RawKey()))
      Else
        Delay(20) ; Evite de monopoliser tout le temps processeur. Utile pour un OS multi-tâches.
      EndIf

    Until KeyPressed$ = Chr(27) ; Attends jusqu'à ce que la touche [Echap] soit appuyée
  EndIf

Voir aussi

RawKey(), Input()


Input()

Syntaxe

Chaine$ = Input()
Description
Saisie une ligne complète de caractères.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la chaîne saisie par l'utilisateur avant d'appuyer sur la touche 'Entrée'.

Remarques

Cette commande bloque le programme et attend jusqu'à ce que l'utilisateur appuie sur la touche entrée. Si la console est en mode graphique la ligne saisie ne peut pas dépasser la largeur de la console.

Si la console n'est pas en mode graphique, une valeur de retour spéciale #PB_Input_Eof (égale à Chr(4)) sera reçue si l'utilisateur tape Ctrl+D dans la console, ou si la redirection d'un fichier vers la console est terminée.

Pour des raisons de compatibilité avec les autres applications console sous Windows, #PB_Input_Eof est aussi reçu quand l'utilisateur tape Ctrl+Z dans la console.

Si une entrée binaire est nécessaire, ReadConsoleData() peut être utilisé en mode non graphique.

Exemple

If OpenConsole()
    Print("Entrez votre nom et appuyez sur [Entree]: ")
    name$=Input()

    ; L'appui sur la touche [Entree] n'est pas pris en compte par la console
    ; donc nous devons utiliser PrintN("") pour aller à la ligne
    PrintN("")

    PrintN("Bonjour, "+name$+", enchante.")
    PrintN("Appuyez sur [Entree] pour quitter")
    Input()
    CloseConsole()
EndIf
End

Voir aussi

Inkey(), RawKey()


OpenConsole()

Syntaxe

Resultat = OpenConsole([Titre$])
Description
Ouvre une fenêtre console.
Cette fonction doit être appelée avant toute autre opération sur la console.

Arguments

Titre$ (optionnel) Le titre de la nouvelle fenêtre console.
Sous Windows, la présence d'un titre permet la sauvegarde des paramètres de la console, comme la police, la couleur, etc. Il n'a aucun effet sur les autres OS.

Valeur de retour

Si le résultat est 0, l'ouverture a échoué et tous les appels aux fonctions de la bibliothèque doivent être inhibés.

Remarques

Une seule console peut être ouverte au même moment sous PureBasic.

La console peut être fermée en utilisant la commande CloseConsole().

La commande EnableGraphicalConsole() permet de permuter entre le mode texte et le mode graphique.

Sous Microsoft Windows, deux formats d'exécution sont disponibles: Win32 et Console. Si vous souhaitez créer une application standard sur console, telle que 'dir', 'del', etc vous devez compiler l'exécutable en utilisant le format Console du (menu Compilateur: Compilateur\Options du compilateur\Options de compilation\Format de l'éxecutable de l'éditeur de PureBasic). Sous Linux ou OS X, cette commande n'a pas d'effet, car il n'y a pas de format spécial 'console' pour les exécutables.

Exemple

  OpenConsole()
  PrintN("Ce programme quittera dans 5 secondes...")
  Delay(5000)

Voir aussi

CloseConsole(), EnableGraphicalConsole()


Print()

Syntaxe

Print(Texte$)
Description
Affiche un texte sur la console sans retour de ligne à la fin.

Arguments

Texte$ Le texte à afficher.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Si la console est en mode graphique, la longueur de Texte$ ne peut pas dépasser la largeur de la console, sinon le texte sera tronqué. Pour modifier la position du curseur, utilisez la commande ConsoleLocate().
Pour changer la couleur du texte affiché, utilisez la commande ConsoleColor().

Une fois le 'Texte$' affiché, le curseur est automatiquement déplacé après le dernier caractère. Si le texte dépasse la largeur de la console, il est automatiquement coupé et affiché sur la ligne suivante. Si la console est remplie, le texte est automatiquement déplacé vers le haut.

Pour afficher des données binaires en mode non-graphique (par exemple lors d'une redirection), la commande WriteConsoleData() peut être utilisée.

Exemple

  If OpenConsole()
    Print("C'est une longue chaîne de caractere. ")
    Print("Celle-ci se place immediatement apres la première... ")
    Print("C'est parce que le curseur se place en fin de chaîne, sans retour a la ligne. ")

    PrintN("Appuyez sur [Entree] pour quitter")
    Input()
  EndIf

Voir aussi

PrintN(), Input()


PrintN()

Syntaxe

PrintN(Texte$)
Description
Affiche un texte sur la console avec un retour de ligne à la fin.

Arguments

Texte$ Le texte à afficher.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Si la console est en mode graphique, la longueur de Texte$ ne peut pas dépasser la largeur de la console, sinon le texte sera tronqué. Pour modifier la position du curseur, utilisez la commande ConsoleLocate().
Pour changer la couleur du texte affiché, utilisez la commande ConsoleColor().

Une fois le 'Texte$' affiché, le curseur est automatiquement déplacé après le dernier caractère. Si le texte dépasse la largeur de la console, il est automatiquement coupé et affiché sur la ligne suivante. Si la console est remplie, le texte est automatiquement déplacé vers le haut.

Pour afficher des données binaires en mode non-graphique (par exemple lors d'une redirection), la commande WriteConsoleData() peut être utilisée.

Exemple

  If OpenConsole()
    PrintN("C'est la premiere ligne..")
    PrintN("..suivie de la deuxieme..")
    PrintN(".. et de la troisieme !")

    PrintN("Appuyez sur [Entree] pour quitter")
    Input()
    CloseConsole()
  EndIf

Voir aussi

Print(), Input()


RawKey()

Syntaxe

Resultat = RawKey()
Description
Renvoie l'identifiant numérique ('key code') de la touche capturée lors du dernier appel de la commande Inkey(). Cela permet de gérer les touches qui n'ont pas de caractères ASCII associés (par exemple F1, F2, les flèches etc.).

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le code de la dernière touche préssée.

Remarques

Les touches alpha-numériques ne sont pas les seules à avoir une correspondance dans la table ASCII, par exemple la touche 'Echap' a la valeur ASCII 27, la touche 'Entrée' la valeur ASCII 13 , la touche 'Tab' a la valeur ASCII 9 et la touche 'Retour Arrière' a la valeur ASCII 8 , etc.

Voir les codes ASCII ici.

Exemple

  If OpenConsole()
    PrintN("Appuyez sur [Echap] pour quitter")

    Repeat
      KeyPressed$ = Inkey()

      If KeyPressed$ <> ""

        PrintN("Vous avez appuye sur : " + KeyPressed$)
        PrintN("Son identifiant numerique est : "+Str(RawKey()))

      ElseIf RawKey()

        PrintN("Vous avez appuye sur une touche qui n'est pas alpha-numerique.")
        PrintN("Son identifiant numerique est : "+Str(RawKey()))

      Else
        Delay(20) ; Evite de monopoliser tout le temps processeur. Utile pour un OS multi-tâches.
      EndIf

    Until KeyPressed$ = Chr(27) ; Attends jusqu'à ce que la touche [Echap] soit appuyée
 EndIf

Voir aussi

Inkey(), Input()

OS Supportés

Windows


ReadConsoleData()

Syntaxe

Resultat = ReadConsoleData(*Buffer, Taille)
Description
Lit l'entrée de la console de manière binaire.

Arguments

*Buffer | La mémoire tampon dans laquelle les données doivent être lues.
Size | La quantité maximale de données (en octets) à lire.

Valeur de retour

Renvoie le nombre d'octets lu à partir de l'entrée.

Si la valeur zéro est renvoyée alors il n'y a plus de données à lire (un indicateur de fin de fichier a été reçu).

Remarques

Cette commande fonctionne uniquement si le console n'est pas en mode graphique. Elle est utile pour lire des données qui ne sont pas basées sur des lignes de texte (à l'inverse de la commande Input()) ou des données qui on été redirigées vers le programme à travers un 'pipe'.

La commande lit le nombre d'octets specifié par le paramètre 'Taille' dans le '*Buffer' qui devra être auparavant alloué avec AllocateMemory.

Cette commande est bloquante, ce qui signifie que si aucune données n'est disponible en entrée, alors le programme attendra l'arrivée d'une donnée.

Exemple

  ; Ce programme lit une image passée en paramètre depuis une console et l'affiche dans une fenêtre.
  ; Il faut le compiler et créer un exécutable, ensuite le lancer de cette façon "MonExecutable < image.bmp"
  ;
  ; (Dans les options du compilateur sélectionnez "Console" pour le "format de l'exécutable" !)
  ; (Fonctionne seulement avec des BMP ou des icônes à moins d'utiliser un décodeur d'images (voir ImagePlugin))
  ;
  OpenConsole()
  TotalSize = 0
  BufferFree = 10000
  *Buffer = AllocateMemory(BufferFree)

  Repeat
    ReadSize = ReadConsoleData(*Buffer+TotalSize, BufferFree) ; Lit un bloc de données
    TotalSize + ReadSize
    BufferFree - ReadSize
    If BufferFree < 100  ; Redimensionne le buffer s'il n'est pas assez grand
      BufferFree = 10000
      *Buffer = ReAllocateMemory(*Buffer, TotalSize+10000)
    EndIf
  Until ReadSize = 0 ; Une fois que 0 est retourné, il n'y a plus rien à lire

  If TotalSize > 0 ; affiche l'image si tout se passe bien
    If CatchImage(0, *Buffer, TotalSize)
      If OpenWindow(0, 0, 0, ImageWidth(0), ImageHeight(0), "Image", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
        ImageGadget(0, 0, 0, ImageWidth(0), ImageHeight(0), ImageID(0))
        Repeat
        Until WaitWindowEvent() = #PB_Event_CloseWindow
        End
      EndIf
    EndIf
  EndIf
  MessageRequester("Erreur", "Ce n'est pas une image valide.")

Voir aussi

WriteConsoleData(), AllocateMemory()


WriteConsoleData()

Syntaxe

Resultat = WriteConsoleData(*Buffer, Taille)
Description
Ecrit le contenu binaire d'un buffer dans la sortie standard de la console.

Arguments

*Buffer | La mémoire tampon dans laquelle les données doivent être lues.
Taille | La quantité maximale de données (en octets) à écrire.

Valeur de retour

Renvoie le nombre d'octets réellement écrit dans la sortie standard de la console.

Remarques

Cette commande fonctionne uniquement si le console n'est pas en mode graphique.

Elle est utile pour écrire autre chose que du texte dans la console, ce qui peut être intéressant lorsqu'elle est ensuite redirigée vers un fichier ou un autre programme.

Voir aussi

ReadConsoleData()


Database

PureBasic - Database

Généralités

La bibliothèque database est un jeu d'instructions simple pour l'accès à SQLite, PostgreSQL ou à tous types de bases de données (Oracle, MySQL, Access, etc..) via l'API commune ODBC. La bibliothèque est basée sur des requêtes SQL pour lire / écrire des données dans une base. Il est donc recommandé de disposer d'une documentation si nécessaire.

Voici quelques liens concernant la syntaxe SQL:
Tutorial SQL W3Schools
Commandes SQL de SQLite
Manuel de PostgreSQL

L'environnement de gestion des bases de données est initialisé à l'aide des commandes UseODBCDatabase(), UseSQLiteDatabase() et UseSQLiteDatabase(), et UsePostgreSQLDatabase().

Note : Sous Windows, avant d'employer cette bibliothèque il est nécessaire d'établir une « source de données utilisateur », ce qui rend votre base de données disponible par l'intermédiaire d'ODBC et utilisable avec cette bibliothèque. Pour plus d'informations, référez vous au document d'aide de l'ODBC de Windows.

Sommaire des commandes

AffectedDatabaseRows
CheckDatabaseNull
CloseDatabase
DatabaseColumnIndex
DatabaseColumnName
DatabaseColumnSize
DatabaseColumnType
DatabaseColumns
DatabaseDriverDescription
DatabaseDriverName
DatabaseError
DatabaseID
DatabaseQuery
DatabaseUpdate
ExamineDatabaseDrivers
FinishDatabaseQuery
FirstDatabaseRow
GetDatabaseBlob
GetDatabaseDouble
GetDatabaseFloat
GetDatabaseLong
GetDatabaseQuad
GetDatabaseString
IsDatabase
NextDatabaseDriver
NextDatabaseRow
OpenDatabase
OpenDatabaseRequester
PreviousDatabaseRow
SetDatabaseBlob
UseODBCDatabase
UsePostgreSQLDatabase
UseSQLiteDatabase

Exemple

Database.pb

OS Supportés

Tous

Guide de référence - Index


AffectedDatabaseRows()

Syntaxe

Resultat = AffectedDatabaseRows(#BaseDeDonnees)
Description
Renvoie le nombre de lignes affectées par la dernière opération DatabaseUpdate() .

Arguments

#BaseDeDonnees La base de données à utiliser.

Valeur de retour

Renvoie le nombre de lignes affectées par la dernière opération DatabaseUpdate().

Voir aussi

DatabaseUpdate()


CheckDatabaseNull()

Syntaxe

Texte$ = CheckDatabaseNull(#BaseDeDonnees, Colonne)
Description
Vérifie si le contenu d'un champs est vide.

Arguments

#BaseDeDonnees La base de données à utiliser.
Colonne La colonne à utiliser.

DatabaseColumnIndex() est disponible pour obtenir l'index d'une colonne.

Valeur de retour

Renvoie #True si la colonne est vide, #False sinon.

Remarques

Cette commande n'est valide qu'après un succès de FirstDatabaseRow(), PreviousDatabaseRow() ou NextDatabaseRow().

Pour connaître le type d'un champ il faut utiliser DatabaseColumnType().

Note: Cette commande peut être appelée seulement une fois par colonne (il faut stocker le résultat dans une variable si il doit être utilisé plusieurs fois, car un nouvel appel sur la même colonne renverrait une valeur erronée). C'est une limitation de la technologie ODBC.

Voir aussi

GetDatabaseBlob(),
GetDatabaseDouble(),
GetDatabaseFloat(),
GetDatabaseLong(),
GetDatabaseQuad()


CloseDatabase()

Syntaxe

CloseDatabase(#BaseDeDonnees)
Description
Ferme une base de données et les connexions / transactions si elles existent.

Arguments

#BaseDeDonnees La base de données à fermer.

Si #PB_All est spécifié, toutes les bases de données restantes sont fermées.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Aucune opération ne peut plus être faite sur la base concernée.

Toutes les bases de données restant ouvertes sont automatiquement fermées quand le programme se termine.

Voir aussi

OpenDatabase(), OpenDatabaseRequester()


DatabaseColumnIndex()

Syntaxe

Resultat = DatabaseColumnIndex(#BaseDeDonnees, NomColonne$)
Description
Renvoie l'index (le numéro) de la colonne après l'exécution d'une requête avec DatabaseQuery() dans la base de données.

Arguments

#BaseDeDonnees | La base de données à utiliser.
NomColonne$ | Le nom de la colonne.

Valeur de retour

Renvoie l'index de la colonne spécifiée.
Ceci n'est valable qu'après avoir exécuté une requête avec DatabaseQuery().

Remarques

Cela peut être utile pour utiliser des commandes telles que GetDatabaseLong() qui requiert un indice de colonne.

Voir aussi

DatabaseQuery(), GetDatabaseBlob(), GetDatabaseDouble(), GetDatabaseFloat(), GetDatabaseString(), GetDatabaseQuad()


DatabaseColumnName()

Syntaxe

Texte$ = DatabaseColumnName(#BaseDeDonnees, Colonne)
Description
Renvoie le nom d'un champ.

Arguments

#BaseDeDonnees La base de données à utiliser.
Colonne Le champs à utiliser.

DatabaseColumnIndex() est disponible pour obtenir l'index d'une colonne.

Valeur de retour

Renvoie le nom de la colonne.

Voir aussi

DatabaseColumns(), DatabaseColumnType(), DatabaseColumnSize()


DatabaseColumnSize()

Syntaxe

Resultat = DatabaseColumnSize(#BaseDeDonnees, Colonne)
Description
Renvoie la taille d'un champs.

Arguments

#BaseDeDonnees | La base de données à utiliser.
Colonne | Le champs à utiliser.

Valeur de retour

Renvoie la taille de la colonne en octets.

Remarques

C'est particulièrement utile quand la taille de la colonne peut changer en fonction des enregistrements, comme une colonne de type blob ou string.

Voir aussi

DatabaseColumns(), DatabaseColumnType(), DatabaseColumnName()


DatabaseColumnType()

Syntaxe

Resultat = DatabaseColumnType(#BaseDeDonnees, Colonne)
Description
Renvoie le type d'un champ.

Arguments

#BaseDeDonnees | La base de données à utiliser.
Colonne | Le champs à utiliser.

Valeur de retour

Renvoie le type de donnée du champ.

Si le résultat est nul, le type est indéterminé ou la commande a échoué (impossibilité de retrouver le type).

Les valeur du type peuvent être:
  #PB_Database_Long  : Format numérique         :  Long (.l) sous PureBasic
  #PB_Database_String: Format chaîne            :  String (.s) sous PureBasic
  #PB_Database_Float : Format numérique flottant:  Float (.f) sous PureBasic
  #PB_Database_Double: Format numérique double  :  Double (.d) sous PureBasic
  #PB_Database_Quad  : Format numérique quad    :  Quad (.q) sous PureBasic
  #PB_Database_Blob  : Format blob

Voir aussi

DatabaseColumns(), DatabaseColumnName(), DatabaseColumnSize()


DatabaseColumns()

Syntaxe

Resultat = DatabaseColumns(#BaseDeDonnees)
Description
Renvoie le nombre de champs.

Arguments

#BaseDeDonnees La base de données à utiliser.

Valeur de retour

Renvoie le nombre de colonnes de la base de données.

Voir aussi

DatabaseColumnName(), DatabaseColumnType(), DatabaseColumnSize()


DatabaseDriverDescription()

Syntaxe

Texte$ = DatabaseDriverDescription()
Description
Renvoie la description du pilote en cours d'examen avec ExamineDatabaseDrivers().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la description du pilote.

Remarques

Les pilotes sont listés d'après les commandes ExamineDatabaseDrivers() et NextDatabaseDriver().

C'est une commande spécifique aux bases de données ODBC.
Les bases de données SQLite ne supportent pas cette commande.

Voir aussi

ExamineDatabaseDrivers(), NextDatabaseDriver(), DatabaseDriverName()


DatabaseDriverName()

Syntaxe

Texte$ = DatabaseDriverName()
Description
Renvoie le nom du pilote en cours d'examen avec ExamineDatabaseDrivers().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le nom du pilote.

Remarques

Les pilotes sont listés d'après les commandes ExamineDatabaseDrivers() et NextDatabaseDriver().

C'est une commande spécifique aux bases de données ODBC.
Les bases de données SQLite ne supportent pas cette commande.

Voir aussi

ExamineDatabaseDrivers(), NextDatabaseDriver(), DatabaseDriverDescription()


DatabaseError()

Syntaxe

Erreur$ = DatabaseError()
Description
Renvoie la dernière erreur survenue.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la dernière erreur survenue lors de l'exécution d'une commande sur la base de données.

Remarques

C'est particulièrement utile avec les commandes suivantes: OpenDatabase(), DatabaseQuery() et DatabaseUpdate().

Exemple

  ; D'abord, il faudra se connecter à une base de données qui contient une table 'employee'
  ;
  If DatabaseQuery(#BaseDeDonnees, "SELECT * FROM employee") ; Récupère tous les enregistrements de la table 'employee'
    ; ...
    FinishDatabaseQuery(#BaseDeDonnees)
  Else
    MessageRequester("Erreur", "Impossible d'executer la requete: "+DatabaseError())
  EndIf

Voir aussi

DatabaseQuery(), DatabaseUpdate()


DatabaseID()

Syntaxe

DatabaseID = DatabaseID(#BaseDeDonnees)
Description
Renvoie l'identifiant unique d'une base de données dans le système d'exploitation.

Arguments

#BaseDeDonnees La base de données à utiliser.

Valeur de retour

Renvoie l'identifiant de la connexion à la base de données.

Remarques

Cette fonction est utile quand une autre bibliothèque nécessite la référence de la #BaseDeDonnees.

Voir aussi

OpenDatabase()()


DatabaseQuery()

Syntaxe

Resultat = DatabaseQuery(#BaseDeDonnees, Requete$)
Description
Exécute une requête SQL.

Arguments

#BaseDeDonnees | La base de données à utiliser.
Requete$ | La requête à exécuter.

Valeur de retour

Renvoie une valeur non nulle si la requête a réussi ou zéro si elle a échoué (en raison d'une erreur SQL ou une requête mal formaté).

Remarques

Si une requête n'a pas abouti, la description exacte de l'erreur peut être récupérée grâce à DatabaseError(), sinon NextDatabaseRow() peut être utilisé pour lister les enregistrements renvoyés. Cette commande affecte toujours NextDatabaseRow() même si aucun enregistrement n'est retourné par la requête. Il est conseillé d'utiliser DatabaseUpdate() quand une requête ne renvoie jamais d'enregistrement.

Une fois que les résultats de la requête ne sont plus nécessaires, FinishDatabaseQuery() doit être appelée pour libérer toutes les ressources de la requête.

Exemple

  ; D'abord, il faudra se connecter à une base de données qui contient une table 'employee'
  ;
  If DatabaseQuery(#BaseDeDonnees, "SELECT * FROM employee") ; Recupère tous les enregistrements de la table 'employee'

    While NextDatabaseRow(#BaseDeDonnees) ; Enumeration des enregistrements
      Debug GetDatabaseString(#BaseDeDonnees, 0) ; Affichage du contenu du premier champ
    Wend

    FinishDatabaseQuery(#BaseDeDonnees)
  EndIf


DatabaseUpdate()

Syntaxe

Resultat = DatabaseUpdate(#BaseDeDonnees, Requete$)
Description
Exécute une requête SQL sans avoir à retourner tous les enregistrements.

Arguments

#BaseDeDonnees | La base de données à utiliser.
Requete$ | La requête à exécuter.

Valeur de retour

Renvoie une valeur non nulle si la requête a réussi ou zéro si elle a échoué (en raison d'une erreur SQL ou une requête mal formaté).

Remarques

Cette fonction est similaire à DatabaseQuery() mais sans affecter la fonction NextDatabaseRow(), il est donc possible d'utiliser cette commande tout en conservant les enregistrements obtenus par DatabaseQuery(). Par contre, il n'est pas possible d'effectuer des sélections ('SELECT' en SQL) ou d'autres types de requêtes qui renvoient des enregistrements.
Cette fonction est utile pour mettre à jour des enregistrements dans la base de données.
En cas d'erreur, le texte d'erreur peut être récupéré par DatabaseError().

Exemple

  ; D'abord, il faudra se connecter à une base de données qui contient une table 'employee'
  ;
  If DatabaseQuery(#BaseDeDonnees, "SELECT * FROM employee") ; Recupère tous les enregistrements de la table 'employee'

    While NextDatabaseRow(#BaseDeDonnees) ; Enumération des enregistrements

      ; Mise à jour du champs 'checked'  pour chaque enregistrement, en assumant  que le champ 'id'
      ; est le premier de la table 'employee'
      ;
      DatabaseUpdate("UPDATE employee SET checked=1 WHERE id="+GetDatabaseString(#BaseDeDonnees, 0))
    Wend

    FinishDatabaseQuery(#BaseDeDonnees)
  EndIf

Voir aussi

DatabaseQuery()


ExamineDatabaseDrivers()

Syntaxe

Resultat = ExamineDatabaseDrivers()
Description
Examine les pilotes de bases de données disponibles dans le système.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Si ODBC n'est pas installé ou qu'aucun pilote n'est disponible, la valeur retournée est 0, sinon NextDatabaseDriver() peut être utilisé pour lister tous les pilotes.

Remarques

C'est une commande spécifique aux bases de données ODBC.
Les bases de données SQLite ne supportent pas cette commande.

Voir aussi

NextDatabaseDriver(), DatabaseDriverName(), DatabaseDriverDescription()


FinishDatabaseQuery()

Syntaxe

FinishDatabaseQuery(#BaseDeDonnees)
Description
Termine la requête SQL en cours et libère les ressources associées.

Arguments

#BaseDeDonnees La base de données à utiliser.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Les requêtes comme FirstDatabaseRow() ou NextDatabaseRow() ne peuvent plus être utilisées.

Exemple

  ; D'abord, il faudra se connecter à une base de données qui contient une table 'employee'
  ;
  If DatabaseQuery(#BaseDeDonnees, "SELECT * FROM employee") ; Recupère tous les enregistrements de la table 'employee'

    While NextDatabaseRow(#BaseDeDonnees) ; Enumération des enregistrements
      Debug GetDatabaseString(#BaseDeDonnees, 0) ; Affiche le contenu du premier champ
    Wend

    FinishDatabaseQuery(#BaseDeDonnees)
  EndIf

Voir aussi

DatabaseQuery()


FirstDatabaseRow()

Syntaxe

Resultat = FirstDatabaseRow(#BaseDeDonnees)
Description
Récupère les informations relatives au premier enregistrement d'une base de données.

Arguments

#BaseDeDonnees La base de données à utiliser.

Valeur de retour

Si le résultat est 0, aucun enregistrement n'est disponible.

Remarques

Pour accéder aux informations à l'intérieur de l'enregistrement on peut utiliser GetDatabaseLong(), GetDatabaseFloat() et GetDatabaseString().

Voir aussi

NextDatabaseRow(), PreviousDatabaseRow(), GetDatabaseLong()


GetDatabaseBlob()

Syntaxe

Resultat = GetDatabaseBlob(#BaseDeDonnees, Colonne, *Memoire, TailleMemoire)
Description
Renvoie le contenu d'un champs sous forme de pointeur mémoire vers un blob.

Arguments

#BaseDeDonnees | La base de données à utiliser.
Colonne La colonne à utiliser.
L'index commence à 0.

DatabaseColumnIndex() est disponible pour obtenir l'index d'une colonne.
*Memoire | L'adresse du blob.
TailleMemoire | La taille du blob en octets.

Valeur de retour

Si 'Resultat' est zéro alors le blob ne peut pas être récupéré ou son contenu est vide.

Remarques

DatabaseColumnType() permet de déterminer le type d'une colonne et DatabaseColumnSize() permet de déterminer la taille du blob.

Note: Cette commande peut être appelée seulement une fois par colonne (il faut stocker le résultat dans une variable s'il doit être utilisé plusieurs fois, car un nouvel appel sur la même colonne renverrait une valeur erronée). C'est une limitation de la technologie ODBC.

Voir aussi

GetDatabaseDouble(),
GetDatabaseFloat(),
GetDatabaseLong(),
GetDatabaseString(),
GetDatabaseQuad()


GetDatabaseDouble()

Syntaxe

Resultat.d = GetDatabaseDouble(#BaseDeDonnees, Colonne)
Description
Renvoie le contenu d'un champ au format numérique 'double'.

Arguments

#BaseDeDonnees La base de données à utiliser.
Colonne La colonne à utiliser.

DatabaseColumnIndex() est disponible pour obtenir l'index d'une colonne.

Valeur de retour

Renvoie une valeur numérique d'un nombre à virgule flottante et en double précision.

Remarques

Cette commande n'est valide qu'après un succès de FirstDatabaseRow(), PreviousDatabaseRow() ou NextDatabaseRow().

Pour connaître le type d'un champ il faut utiliser DatabaseColumnType().

Note: Cette commande peut être appelée seulement une fois par colonne (il faut stocker le résultat dans une variable si il doit être utilisé plusieurs fois, car un nouvel appel sur la même colonne renverrait une valeur erronée). C'est une limitation de la technologie ODBC.

Voir aussi

GetDatabaseBlob(),
GetDatabaseFloat(),
GetDatabaseLong(),
GetDatabaseString(),
GetDatabaseQuad()


GetDatabaseFloat()

Syntaxe

Resultat.f = GetDatabaseFloat(#BaseDeDonnees, Colonne)
Description
Renvoie le contenu d'un champ au format numérique 'float'.

Arguments

#BaseDeDonnees La base de données à utiliser.
Colonne La colonne à utiliser.

DatabaseColumnIndex() est disponible pour obtenir l'index d'une colonne.

Valeur de retour

Renvoie une valeur numérique à virgule flottante et en simple précision.

Remarques

Cette commande n'est valide qu'après un succès de FirstDatabaseRow(), PreviousDatabaseRow() ou NextDatabaseRow().

Pour connaître le type d'un champ il faut utiliser DatabaseColumnType().

Note: Cette commande peut être appelée seulement une fois par colonne (il faut stocker le résultat dans une variable si il doit être utilisé plusieurs fois, car un nouvel appel sur la même colonne renverrait une valeur erronée). C'est une limitation de la technologie ODBC.

Voir aussi

GetDatabaseBlob(),
GetDatabaseDouble(),
GetDatabaseLong(),
GetDatabaseString(),
GetDatabaseQuad()


GetDatabaseLong()

Syntaxe

Resultat = GetDatabaseLong(#BaseDeDonnees, Colonne)
Description
Renvoie le contenu d'un champ au format numérique 'long'.

Arguments

#BaseDeDonnees La base de données à utiliser.
Colonne La colonne à utiliser.

DatabaseColumnIndex() est disponible pour obtenir l'index d'une colonne.

Valeur de retour

Renvoie une valeur numérique entière (sur 4 octets).

Remarques

Cette commande n'est valide qu'après un succès de FirstDatabaseRow(), PreviousDatabaseRow() ou NextDatabaseRow().

Pour connaître le type d'un champ il faut utiliser DatabaseColumnType().

Note: Cette commande peut être appelée seulement une fois par colonne (il faut stocker le résultat dans une variable si il doit être utilisé plusieurs fois, car un nouvel appel sur la même colonne renverrait une valeur erronée). C'est une limitation de la technologie ODBC.

Voir aussi

GetDatabaseBlob(),
GetDatabaseDouble(),
GetDatabaseFloat(),
GetDatabaseString(),
GetDatabaseQuad()


GetDatabaseQuad()

Syntaxe

Resultat.q = GetDatabaseQuad(#BaseDeDonnees, Colonne)
Description
Renvoie le contenu d'un champ au format numérique 'quad'.

Arguments

#BaseDeDonnees La base de données à utiliser.
Colonne La colonne à utiliser.

DatabaseColumnIndex() est disponible pour obtenir l'index d'une colonne.

Valeur de retour

Renvoie une valeur numérique entière (sur 8 octets).

Remarques

Cette commande n'est valide qu'après un succès de FirstDatabaseRow(), PreviousDatabaseRow() ou NextDatabaseRow().

Pour connaître le type d'un champ il faut utiliser DatabaseColumnType().

Note: Cette commande peut être appelée seulement une fois par colonne (il faut stocker le résultat dans une variable si il doit être utilisé plusieurs fois, car un nouvel appel sur la même colonne renverrait une valeur erronée). C'est une limitation de la technologie ODBC.

Voir aussi

GetDatabaseBlob(),
GetDatabaseDouble(),
GetDatabaseFloat(),
GetDatabaseString(),
GetDatabaseLong()


GetDatabaseString()

Syntaxe

Texte$ = GetDatabaseString(#BaseDeDonnees, Colonne)
Description
Renvoie le contenu d'un champ au format chaîne de caractère.

Arguments

#BaseDeDonnees La base de données à utiliser.
Colonne La colonne à utiliser.

DatabaseColumnIndex() est disponible pour obtenir l'index d'une colonne.

Valeur de retour

Renvoie une chaîne de caractère.

Remarques

Cette commande n'est valide qu'après un succès de FirstDatabaseRow(), PreviousDatabaseRow() ou NextDatabaseRow().

Pour connaître le type d'un champ il faut utiliser DatabaseColumnType().

Note: Cette commande peut être appelée seulement une fois par colonne (il faut stocker le résultat dans une variable si il doit être utilisé plusieurs fois, car un nouvel appel sur la même colonne renverrait une valeur erronée). C'est une limitation de la technologie ODBC.

Voir aussi

GetDatabaseBlob(),
GetDatabaseDouble(),
GetDatabaseFloat(),
GetDatabaseLong(),
GetDatabaseQuad()


IsDatabase()

Syntaxe

Resultat = IsDatabase(#BaseDeDonnees)
Description
Teste si une base de données est correctement initialisée.

Arguments

#BaseDeDonnees La base de données à utiliser.

Valeur de retour

Si le 'Résultat' est différent de zéro alors cet objet est valide.

Remarques

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.
C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

OpenDatabase(), OpenDatabaseRequester()


NextDatabaseDriver()

Syntaxe

Resultat = NextDatabaseDriver()
Description
Renvoie les informations sur le prochain pilote de base de données.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Si le résultat est nul, il n'y a plus aucun pilote suivant disponible.

Remarques

Cette commande doit être appelée après ExamineDatabaseDrivers().
Pour obtenir les informations sur le pilote, utiliser DatabaseDriverName() et DatabaseDriverDescription().

Les bases de données SQLite ne supportent pas cette commande.

Voir aussi

ExamineDatabaseDrivers(), DatabaseDriverName(), DatabaseDriverDescription()


NextDatabaseRow()

Syntaxe

Resultat = NextDatabaseRow(#BaseDeDonnees)
Description
Renvoie les informations relatives à l'enregistrement suivant.

Arguments

#BaseDeDonnees La base de données à utiliser.

Valeur de retour

Si le résultat est 0, il n'y a plus d'enregistrement suivant (fin de fichier).

Remarques

Pour accéder aux informations à l'intérieur de l'enregistrement, utilisez GetDatabaseLong(), GetDatabaseFloat() et GetDatabaseString().

Voir aussi

GetDatabaseBlob(),
GetDatabaseDouble(),
GetDatabaseFloat(),
GetDatabaseLong(),
GetDatabaseQuad(),
GetDatabaseString()


OpenDatabase()

Syntaxe

Resultat = OpenDatabase(#BaseDeDonnees, NomBaseDeDonnes$, Utilisateur$, MotdePasse$ [, Plugin])
Description
Ouvrir une base de données.

Arguments

#BaseDeDonnees La base de données à utiliser.

Si #PB_Any est utilisé pour le paramètre '#BaseDeDonnees', le numéro de la nouvelle base de données sera renvoyé dans 'Resultat'.
NomBaseDeDonnes$ | Le nom de la base de données à ouvrir.
Utilisateur$ | Le nom d'utilisateur de connexion.
MotdePasse$ Le mot de passe de connexion.

Le mot de passe peut être une chaîne nulle si aucun mot de passe n'est requis.
Plugin (optionnel)
  #PB_Database_ODBC      : La base de données utilisera ODBC (UseODBCDatabase() doit avoir été appelé).
  #PB_Database_SQLite    : La base de données utilisera SQLite (UseSQLiteDatabase() doit avoir été appelé).
  #PB_Database_PostgreSQL: La base de données utilisera PostgreSQL (UsePostgreSQLDatabase() doit avoir été appelé).
Si 'Plugin' n'est pas spécifié, le premier plugin (ODBC, SQLite ou PostgreSQL) enregistré sera utilisé.

Valeur de retour

Renvoie une valeur non nulle en cas de connexion ou zéro sinon. Dans ce cas, la base n'a pas pu être trouvée ou le compte utilisateur n'est pas valable et la description exacte de l'erreur peut être récupérée grâce à DatabaseError()).

Si #PB_Any a été utilisé pour le paramètre #BaseDeDonnees,le nombre généré est retourné.

Remarques

Pour déclarer une base de données ODBC, lire le document d'aide de Windows.

Si une autre base de données a déjà été ouverte sous le même numéro, la base précédement gérée par ce numéro est automatiquement fermée.

Voir aussi

OpenDatabaseRequester(), CloseDatabase(), UseODBCDatabase(), UseSQLiteDatabase(), UsePostgreSQLDatabase()


OpenDatabaseRequester()

Syntaxe

Resultat = OpenDatabaseRequester(#BaseDeDonnees [, Plugin])
Description
Ouvre la boite de dialogue standard Windows ODBC pour sélectionner une base de données.

Arguments

#BaseDeDonnees La base de données à utiliser.
Plugin (optionnel)
  #PB_Database_ODBC      : La base de données utilisera ODBC (UseODBCDatabase() doit avoir été appelé).
  #PB_Database_SQLite    : La base de données utilisera SQLite (UseSQLiteDatabase() doit avoir été appelé).
  #PB_Database_PostgreSQL: La base de données utilisera PostgreSQL (UsePostgreSQLDatabase() doit avoir été appelé).
Si 'Plugin' n'est pas spécifié, le premier plugin (ODBC, SQLite ou PostgreSQL) enregistré sera utilisé.

Valeur de retour

Renvoie une valeur non nulle en cas de connexion ou zéro sinon. Dans ce cas, la base n'a pas pu être trouvée ou le compte utilisateur n'est pas valable et la description exacte de l'erreur peut être récupérée grâce à DatabaseError()).

Si #PB_Any a été utilisé pour le paramètre #BaseDeDonnees,le nombre généré est retourné.

Remarques

C'est une commande spécifique aux bases de données ODBC. Les bases de données SQLite ne supportent pas cette commande.

Note: cette commande n'est pas supportée sur Linux et MacOS X, elle retournera zéro.

Voir aussi

OpenDatabase(), CloseDatabase(),


PreviousDatabaseRow()

Syntaxe

Resultat = PreviousDatabaseRow(#BaseDeDonnees)
Description
Renvoie les informations relatives à l'enregistrement précédent.

Arguments

#BaseDeDonnees La base de données à utiliser.

Valeur de retour

Si le résultat est 0, il n'y a plus d'enregistrement précédent disponible (début de fichier).

Remarques

Si cette commande renvoie 0 même s'il y a des enregistrements avant l'enregistrement courant, alors cette commande n'est pas supportée par le driver ODBC. En effet, un driver ODBC n'est pas obligé d'implémenter cette commande (contrairement à NextDatabaseRow()) pour être conforme à la norme ODBC. Bien entendu, si cette commande fonctionne correctement avec un driver, elle fonctionnera correctement sur tous les ordinateurs utilisant ce driver.

C'est une commande spécifique aux bases de données ODBC. Les bases de données SQLite ne supportent pas cette commande.

Voir aussi

GetDatabaseBlob(),
GetDatabaseDouble(),
GetDatabaseFloat(),
GetDatabaseLong(),
GetDatabaseQuad(),
GetDatabaseString()


SetDatabaseBlob()

Syntaxe

SetDatabaseBlob(#BaseDeDonnees, Index, *Memoire, TailleMemoire)
Description
Indique le blob à insérer lors de la prochaine utilisation de DatabaseUpdate().

Arguments

#BaseDeDonnees | La base de données à utiliser.
Index Commence à 0 et indique sur lequel des paramètres non-définis, le blob doit-être associé.
La syntaxe SQL pour spécifier un paramètre indéfini varie en fonction de la base de données.
Pour voir comment procéder, consulter les exemples ci-dessous.
*Memoire | L'adresse du blob.
TailleMemoire | La taille du blob en octets.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple: SQLite et ODBC

  ; SQLite et ODBC partagent la même syntaxe pour insérer un blob. C'est indiqué par le caractère '?'
  ;
  ; La base de données doit être connectée et avoir une table PHOTOS avec 3 colonnes (BLOB, VARCHAR(255), BLOB)
  ;
  SetDatabaseBlob(0, 0, ?Picture, PictureLength)
  SetDatabaseBlob(0, 1, ?SmallPicture, SmallPictureLength)
  DatabaseUpdate(0, "INSERT INTO PHOTOS (picture, name, small_picture) values (?, 'my description', ?);")

Exemple: PostgreSQL

  ; PostgreSQL utilise une autre syntaxe: $1, $2.. dans la requête pour indiquer les paramètres non-définis
  ;
  ; La base de données doit être connectée et avoir une table PHOTOS avec 3 colonnes (BYTEA, VARCHAR(255), BYTEA)
  ;
  SetDatabaseBlob(0, 0, ?Picture, PictureLength)
  SetDatabaseBlob(0, 1, ?SmallPicture, SmallPictureLength)
  DatabaseUpdate(0, "INSERT INTO PHOTOS (picture, name, small_picture) values ($1, 'my description', $2);")
Note: PostgreSQL utilise le type 'BYTEA' pour stocker les blobs. La conversion nécessaire pour stocker du binaire dans ce type de colonne rend souvent le blob très volumineux. Un bon moyen d'éviter cela est de l'encoder précédemment avec Base64Encoder() avant de l'insérer dans la base de données.

Voir aussi

DatabaseUpdate(), GetDatabaseBlob()


UseODBCDatabase()

Syntaxe

Resultat = UseODBCDatabase()
Description
Initialise l'environnement de base de données ODBC pour un usage ultérieur.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Si le résultat est 0 ODBC n'est pas disponible ou dans une version non compatible (ODBC 3.0 ou supérieur est requis) et tous les appels de fonctions de base de données doivent être inhibés.

Remarques

Une fois l'environnement initialisé, une base de données doit être ouvert en utilisant OpenDatabase() utilisant un nom de base de données ODBC enregistré comme base de données ou OpenDatabaseRequester() avant d'utiliser toutes les autres fonctions des bases de données.

Il peut être utile de lister les pilotes (drivers) disponibles sur la machine à l'aide de la commande ExamineDatabaseDrivers().

Exemple

  UseODBCDatabase()

  If OpenDatabase(0, "MySQL-ODBC", "mysql", "mysql")
    Debug "Connecté à MySQL"
  Else
    Debug "Pas de Connexion : " + DatabaseError()
  EndIf

Voir aussi

OpenDatabase(), UseSQLiteDatabase(), UsePostgreSQLDatabase()


UsePostgreSQLDatabase()

Syntaxe

UsePostgreSQLDatabase()
Description
Initialise l'environnement de base de données PostgreSQL pour un usage ultérieur.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

PostgreSQL est un serveur de base de données très puissant qui supporte les bases de données très grandes, et une gestion des accès concurrents avancée. Il est réellement libre d'utilisation même dans un projet commercial, contrairement à MySQL qui nécessite une licence pour l'utiliser dans un programme non-GPL. Il n'y a pas de pilotes supplémentaires à installer, tout ce qui est nécessaire à la connexion au serveur PostgreSQL est présent. Pour plus d'informations à propos de PostgreSQL: http://www.postgresql.org.

Une connexion à PostgreSQL doit être établie à l'aide de la fonction OpenDatabase() avant de pouvoir utiliser les autres fonctions relatives aux bases de données. Des commandes spécifiques à PostgresSQL peuvent être passées dans le paramètre 'NomBaseDeDonnes$' de OpenDatabase():
  - host: Nom d'ordinateur hôte pour se connecter.
  - hostaddr: Adresse IP de l'ordinateur hôte pour se connecter.
  - port: Numéro du port à utiliser pour la connexion.
  - dbname: Le nom de la base de données. Par défaut, le même nom que l'utilisateur.
  - connect_timeout: Attente maximum pour la connexion, en seconde (nombre décimal entier). Zéro ou non spécifié indique une attente infinie.
                     Il n'est pas recommandé d'utiliser une attente inférieure à 2 secondes.

Exemple

  UsePostgreSQLDatabase()

  ; Le serveur doit tourner sur la machine locale.
  ;
  If OpenDatabase(0, "host=localhost port=5432", "postgres", "postgres")
    Debug "Connected to PostgreSQL"
  Else
    Debug "Connection failed: "+DatabaseError()
  EndIf

Voir aussi

OpenDatabase(), UseSQLiteDatabase(), UseODBCDatabase()


UseSQLiteDatabase()

Syntaxe

UseSQLiteDatabase()
Description
Initialise l'environnement de base de données SQLite pour un usage ultérieur.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

SQLite est un gestionnaire de base de données sans serveur, utilisant un fichier comme stockage. Il n'y a rien à déployer ou à configurer, il est tout de suite opérationnel. SQLite est largement utilisé dans l'industrie et est considéré comme un des meilleurs gestionnaire de base de données embarqué. Pour plus d'informations: http://www.sqlite.org.

Pour créer une nouvelle base de données vide, il suffit de créer un fichier vide à l'aide de CreateFile(). Les commandes SQL sont maintenant disponibles pour créer les tables et insérer des enregistrements.

La base SQLite doit être ouverte avec OpenDatabase() avant de pouvoir utiliser les commandes de cette bibliothèque.

Exemple

  UseSQLiteDatabase()

  Filename$ = OpenFileRequester("Choisissez le nom d'un fichier", "PureBasic.sqlite", "*.sqlite|*.sqlite", 0)

  If CreateFile(0, Filename$)
    Debug "Fichier de base de donnees cree"
    CloseFile(0)
  EndIf

  If OpenDatabase(0, Filename$, "", "")
    Debug "Connecté à PureBasic.sqlite"
    If DatabaseUpdate(0, "CREATE TABLE info (test VARCHAR(255));")
      Debug "Table cree"
    EndIf
  EndIf

Voir aussi

OpenDatabase(), UsePostgreSQLDatabase(), UseODBCDatabase()


Date

PureBasic - Date

Généralités

La bibliothèque Date permet de gérer le temps et les dates depuis 1970 jusqu'à 2038, en utilisant le modèle Unix (nombre de secondes écoulées depuis le 1er janvier 1970).

Note: Seulement entre le 01 janvier 1970 à 00h 00m 00s et le 19 janvier 2038 à 03h 14m 07s.

Sommaire des commandes

AddDate
Date
Day
DayOfWeek
DayOfYear
FormatDate
Hour
Minute
Month
ParseDate
Second
Year

Exemple

Date.pb

OS Supportés

Tous

Guide de référence - Index


AddDate()

Syntaxe

Date = AddDate(Date, Plage, Valeur)
Description
Ajouter une quantité de temps à une date.

Arguments

Date | La date à utiliser.
Plage
  #PB_Date_Year   : Ajoute 'Valeur' années à la date
  #PB_Date_Month  : Ajoute 'Valeur' mois à la date
  #PB_Date_Week   : Ajoute 'Valeur' semaines à la date
  #PB_Date_Day    : Ajoute 'Valeur' jours à la date
  #PB_Date_Hour   : Ajoute 'Valeur' heures à la date
  #PB_Date_Minute : Ajoute 'valeur' minutes à la date
  #PB_Date_Second : Ajoute 'valeur' secondes à la date
Note: l'utilisation de #PB_Date_Month peut entrainer un arroundi automatique du jour si nécessaire: ajouter un mois au '31 mars 2008' renverra '30 avril 2008', car il n'y a pas 31 jours en avril.
Valeur | La quantité à ajouter à la date.

Valeur de retour

Renvoie la nouvelle date.

Exemple

  Debug FormatDate("%dd/%mm/%yyyy", AddDate(Date(), #PB_Date_Year, 2)) ; Renvoie la date courante augmentée de 2 ans

Voir aussi

Date(), FormatDate()


Date()

Syntaxe

Date = Date([Annee, Mois, Jour, Heure, Minute, Seconde])
Description
Renvoie la valeur du temps système (nombre de secondes écoulées depuis le '01/01/1970 0:00:00').

Arguments

Annee, Mois, Jour, Heure, Minute, Seconde (optionnel)
Si les variables Annee, Mois, Jour, Heure, Minute et Seconde sont spécifiées, la représentation en secondes de cette date est retournée.

Valeur de retour

Renvoie le nombre de secondes écoulée.

Exemple

  Debug Date() / (3600*24*365)  ; Affiche le nombre d'années depuis 01/01/1970 et maintenant
  Debug Date(1999, 12, 31, 23, 59, 59)  ; Affiche '946684799' (nombre de secondes entre 01/01/1970 0:00:00 et 12/31/1999 23:59:59)
Note: Le temps et les dates supportées vont de '1970-01-01, 00:00:00' pour le minimum à '2038-01-19, 03:14:07' pour le maximum.

Voir aussi

FormatDate(), Year(), Month(), Day(), Hour(), Minute(), Second()


Day()

Syntaxe

Resultat = Day(Date)
Description
Renvoie la valeur du jour correspondant à la date.

Arguments

Date La date à utiliser.

Valeur de retour

Renvoie le jour.
Le résultat est toujours compris entre 1 et 31.

Exemple

  Debug Day(Date(2012, 10, 3, 0, 0, 0))  ; Le résultat est '3'.

Voir aussi

Date(), Year(), Month(), Hour(), Minute(), Second()


DayOfWeek()

Syntaxe

Resultat = DayOfWeek(Date)
Description
Renvoie le rang du jour de la semaine.

Arguments

Date La date à utiliser.

Valeur de retour

Renvoie le rang du jour de la semaine.
Le résultat est toujours compris entre 0 et 6.
  0 : Dimanche
  1 : Lundi
  2 : Mardi
  3 : Mercredi
  4 : Jeudi
  5 : Vendredi
  6 : Samedi

Exemple

  Debug DayOfWeek(Date(2006, 10, 30, 0, 0, 0))  ; Renvoie '1' pour Lundi.

Voir aussi

FormatDate(), Year(), Month(), Day(), Hour(), Minute(), Second()


DayOfYear()

Syntaxe

Resultat = DayOfYear(Date)
Description
Renvoie le nombre de jours écoulés depuis le début de l'année d'une date spécifiée.

Arguments

Date La date à utiliser.

Valeur de retour

Renvoie le nombre de jours écoulés depuis le début de l'année d'une date spécifiée.
Le résultat est toujours compris entre 1 et 366.

Exemple

  Debug DayOfYear(Date(2002, 2, 1, 0, 0, 0))  ; Le résultat est '32'. (31 jours pour janvier + 1)

Voir aussi

FormatDate(), Year(), Month(), Day(), Hour(), Minute(), Second()


FormatDate()

Syntaxe

Texte$ = FormatDate(Masque$, Date)
Description
Renvoie la représentation de la date correspondant au masque spécifié. Masque$ est une chaîne indiquant comment formater la date. Il est possible d'utiliser les identifiants suivants:

Arguments

Masque$ Est une chaîne de caractères indiquant comment formater la date.
  %yyyy: Sera remplacé par la valeur de l'année sur 4 chiffres.
  %yy: Sera remplacé par la valeur de l'année sur 2 chiffres.
  %mm: Sera remplacé par la valeur du mois sur 2 chiffres.
  %dd: Sera remplacé par la valeur du jour sur 2 chiffres.
  %hh: Sera remplacé par la valeur de l'heure sur 2 chiffres.
  %ii: Sera remplacé par la valeur des minutes sur 2 chiffres.
  %ss: Sera remplacé par la valeur des secondes sur 2 chiffres.
Date La date à utiliser.

Valeur de retour

Renvoie la date sous forme de chaîne de caractère correspondant au masque spécifié.

Exemple

  Debug FormatDate("A=%yyyy, M= %mm, J=%dd", Date()) ; Affiche la date sous la forme
                                                     ; "A=2012, M=12, J=21"

  Debug FormatDate("%dd/%mm/%yyyy", Date())          ; Affiche la date sous la forme
                                                     ;  "21/12/2012"

  Debug FormatDate("%hh:%ii:%ss", Date())  ; affiche le temps selon un format 00:00:00
Note: Le temps et les dates supportées vont de '1970-01-01, 00:00:00' pour le minimum à '2038-01-19, 03:14:07' pour le maximum.

Voir aussi

Date(), ParseDate()


Hour()

Syntaxe

Resultat = Hour(Date)
Description
Renvoie la valeur de l'heure correspondant à la date spécifiée.

Arguments

Date La date à utiliser.

Valeur de retour

Renvoie l'heure.
Le résultat est toujours compris entre 0 et 23.

Exemple

  Debug Hour(Date(1970, 1, 1, 11, 3, 45))  ; Le résultat est '11'.


Minute()

Syntaxe

Resultat = Minute(Date)
Description
Renvoie la valeur des minutes correspondant à la date spécifiée.

Arguments

Date La date à utiliser.

Valeur de retour

Renvoie les minutes.
Le résultat est toujours compris entre 0 et 59.

Exemple

  Debug Minute(Date(1970, 1, 1, 11, 3, 45))  ; Le résultat est '3'.

Voir aussi

FormatDate(), Year(), Month(), Day(), Hour(), Second()


Month()

Syntaxe

Resultat = Month(Date)
Description
Renvoie la valeur du mois correspondant à une date spécifiée.

Arguments

Date La date à utiliser.

Valeur de retour

Renvoie le mois.
Le résultat est toujours compris entre 1 et 12.

Exemple

  Debug Month(Date(2002, 10, 3, 0, 0, 0))  ; Le résultat est '10'.

Voir aussi

FormatDate(), Year(), Day(), Hour(), Minute(), Second()


ParseDate()

Syntaxe

Date = ParseDate(Masque$, Date$)
Description
Transforme une date donnée sous forme de chaîne de caractères en valeur date numérique.

Arguments

Masque$ Est une chaîne de caractères indiquant comment formater la date.
  %yyyy: sera remplacé par la valeur de l'année sur 4 chiffres.
  %yy: sera remplacé par la valeur de l'année sur 2 chiffres.
  %mm: sera remplacé par la valeur du mois sur 2 chiffres.
  %dd: sera remplacé par la valeur du jour sur 2 chiffres.
  %hh: sera remplacé par la valeur de l'heure sur 2 chiffres.
  %ii: sera remplacé par la valeur des minutes sur 2 chiffres.
  %ss: sera remplacé par la valeur des secondes sur 2 chiffres.
Date$ La date à tester.

Note: Doit contenir au moins un séparateur entre chaque partie de la date (par exemple, une barre oblique).

Valeur de retour

Renvoie la date représentant la chaîne à analyser.

Si la date est incorrecte, la valeur retournée est -1.

Cette fonction est particulièrement utile pour retrouver et traiter des dates stockées, dans un fichier de type journal d'évènements par exemple.

Exemple

  Debug ParseDate("%yy/%mm/%dd", "02/12/01") ; Renvoie la date numérique correspondant à "02/12/01"

Voir aussi

Date(), FormatDate()


Second()

Syntaxe

Resultat = Second(Date)
Description
Renvoie la valeur des secondes correspondant à la date spécifiée.

Arguments

Date La date à utiliser.

Valeur de retour

Renvoie les secondes.
Le résultat est toujours compris entre 0 et 59.

Exemple

  Debug Second(Date(1970, 1, 1, 11, 3, 45))  ; Le résultat est '45'.

Voir aussi

FormatDate(), Year(), Month(), Day(), Hour(), Minute()


Year()

Syntaxe

Resultat = Year(Date)
Description
Renvoie la valeur de l'année correspondant à la date spécifiée.

Arguments

Date La date à utiliser.

Valeur de retour

Renvoie l'année.
Le résultat est toujours compris entre 1970 et 2034.

Exemple

  Debug Year(Date(2002, 10, 3, 0, 0, 0))  ; Le résultat est '2002'.

Voir aussi

FormatDate(), Month(), Day(), Hour(), Minute(), Second()


Debugger

PureBasic - Debugger

Généralités

La bibliothèque 'Debugger' fournit les fonctions nécessaires au contrôle du débogueur, par exemple pour vider le contenu de la fenêtre de déboguage, ou pour ouvrir le visualisateur de mémoire à une adresse mémoire donnée. Tous les outils de déboguage mentionnés dans cette bibliothèque sont décrits dans le chapitre outils de déboguage.

Les fonctions de cette bibliothèque ne sont compilées dans l'exécutable que si le débogueur est activé. Si le débogueur est désactivé, les appels sont complètement ignorés et ne sont pas intégrés dans l'exécutable final.

Il y a aussi des mots clés spécifiques au contrôle du débogueur à partir du code.

Sommaire des commandes

ClearDebugOutput
PurifierGranularity
ResetProfiler
SaveDebugOutput
ShowAssemblyViewer
ShowCallstack
ShowDebugOutput
ShowLibraryViewer
ShowMemoryViewer
ShowProfiler
ShowVariableViewer
ShowWatchlist
StartProfiler
StopProfiler

OS Supportés

Tous

Guide de référence - Index


ClearDebugOutput()

Syntaxe

ClearDebugOutput()
Description
Efface le contenu de la fenêtre de déboguage.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  ; Montre 10 valeurs dans le debugger tout les 500 ms
  Repeat
    ClearDebugOutput()
    For i = 1 To 10
      Debug x
      x + 1
    Next i

    Delay(500)
  ForEver

Voir aussi

Débogueur interne, Debug, ShowDebugOutput(), SaveDebugOutput()


PurifierGranularity()

Syntaxe

PurifierGranularity(VariablesGlobales, VariablesLocales, ChainesDeCarateres, BlocsDynamiques)
Description
Modifie l'intervalle de vérification d'intégrité des données par le purificateur.

Arguments

VariablesGlobales | Vérification des variables globales.
VariablesLocales | Vérification des variables locales.
ChainesDeCarateres | Vérification des chaînes de caratères.
BlocsDynamiques | Vérification des blocs dynamiques

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Chaque valeur représente le nombre de lignes qui sont exécutées entre chaque type de vérification.
La valeur #PB_Ignore ne changera pas la valeur courante.
Une valeur nulle desactivera complètement la vérification.

Exemple

  ; Désactive la vérification des chaînes de caractères en mémoire ainsi que l'allocation mémoire toutes les 10 lignes
  PurifierGranularity(#PB_Ignore, #PB_Ignore, 0, 10)

Voir aussi

Débogueur interne


ResetProfiler()

Syntaxe

ResetProfiler()
Description
Réinitialise le compteur pour le profileur.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

Débogueur interne,
ShowProfiler(),
StartProfiler(),
StopProfiler()


SaveDebugOutput()

Syntaxe

SaveDebugOutput(NomFichier$)
Description
Enregistre le contenu de la fenêtre de déboguage dans un fichier.

Arguments

NomFichier$ Le nom du fichier dans lequel sera enregistré le contenu de la fenêtre du débogueur.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Il n'y a pas d'erreur rapportée si le fichier ne peut pas être enregistré.

Exemple

  For i = 1 To 100
    Debug Random(i)
  Next i
  SaveDebugOutput("C:\log.txt")

Voir aussi

Débogueur interne, Debug, ShowDebugOutput(), ClearDebugOutput()


ShowAssemblyViewer()

Syntaxe

ShowAssemblyViewer()
Description
Ouvre la fenêtre assembleur ou la ramène au premier plan si elle était déjà ouverte.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

Débogueur interne


ShowCallstack()

Syntaxe

ShowCallstack()
Description
Ouvre la fenêtre d'historique des procédures ou la ramène au premier plan si elle était déjà ouverte.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

Débogueur interne


ShowDebugOutput()

Syntaxe

ShowDebugOutput()
Description
Ouvre la fenêtre de déboguage ou la ramène au premier plan si elle était déjà ouverte.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

Débogueur interne, Debug, ClearDebugOutput(), SaveDebugOutput()


ShowLibraryViewer()

Syntaxe

ShowLibraryViewer([Bibliotheque$ [, #Objet]])
Description
Ouvre le visualisateur de bibliothèques ou le ramène au premier plan si il était déjà ouvert.

Arguments

Bibliotheque$ (optionnel) Le visualisateur montre tous les objets de cette Bibliotheque$.
Sans cette option, le visualisateur n'affiche aucune bibliothèque en particulier.
#Objet (optionnel) Le visualisateur affichera seulement cette entrée de la 'Bibliotheque$'.
Sans cette option, le visualisateur n'affiche aucun objet en particulier.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
    DrawingMode(#PB_2DDrawing_Transparent)
    Box(0, 0, 200, 200, RGB(255, 255, 255))
    For i = 1 To 30
      DrawText(Random(200), Random(200), "Hello le Monde !", RGB(Random(255), Random(255), Random(255)))
    Next i
    StopDrawing()

    ShowLibraryViewer("Image", 0)  ; Montre l'image
    CallDebugger                   ; Stoppe le programme qui ne se termine pas correctement
  EndIf

Voir aussi

Débogueur interne


ShowMemoryViewer()

Syntaxe

ShowMemoryViewer([*Buffer, Longueur])
Description
Ouvre le visualisateur de mémoire ou le ramène au premier plan si il était déjà ouvert.

Arguments

*Buffer, Longueur (optionnel) Si une zone mémoire représentée par '*Buffer' de longueur 'Longueur' est spécifié alors cette zone mémoire sera affichée dans le visualisateur de mémoire.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  *Memory = AllocateMemory(1000)
  If *Memory
    RandomData(*Memory, 1000)       ; Remplir la mémoire avec des données

    ShowMemoryViewer(*Memory, 1000) ; Ouvrir le visualisateur de mémoire
    CallDebugger                    ; Stoppe le programme qui ne se termine pas correctement
  EndIf

Voir aussi

Débogueur interne


ShowProfiler()

Syntaxe

ShowProfiler()
Description
Ouvre la fenêtre de profilage ou la ramène au premier plan si elle était déjà ouverte.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

Débogueur interne,
ResetProfiler(),
StartProfiler(),
StopProfiler()


ShowVariableViewer()

Syntaxe

ShowVariableViewer()
Description
Ouvre la fenêtre des variables ou la ramène au premier plan si elle était déjà ouverte.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

Débogueur interne


ShowWatchlist()

Syntaxe

ShowWatchlist()
Description
Ouvre la fenêtre de surveillance ou la ramène au premier plan si elle était déjà ouverte.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

Débogueur interne


StartProfiler()

Syntaxe

StartProfiler()
Description
Démarre le décomptage des lignes exécutées enregistré par le profileur.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

Débogueur interne,
ShowProfiler(),
ResetProfiler(),
StopProfiler()


StopProfiler()

Syntaxe

StopProfiler()
Description
Arrête le décomptage des lignes exécutées enregistré par le profileur.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

Débogueur interne,
ShowProfiler(),
ResetProfiler(),
StartProfiler()


Desktop

PureBasic - Desktop

Généralités

La bibliothèque desktop permet d'obtenir des informations sur l'environnement de travail de l'utilisateur: Le bureau.
Ces informations sont les dimensions, résolutions, position du curseur, etc.

Il est intéressant de signaler que vous avez la possibilité d'utiliser plusieurs écrans (moniteurs) simultanément.

Sommaire des commandes

DesktopDepth
DesktopFrequency
DesktopHeight
DesktopMouseX
DesktopMouseY
DesktopName
DesktopWidth
DesktopX
DesktopY
ExamineDesktops

Exemple

Desktop.pb

OS Supportés

Tous

Guide de référence - Index


DesktopDepth()

Syntaxe

Profondeur = DesktopDepth(#Bureau)
Description
Renvoie la profondeur des couleurs d'un bureau.

Arguments

#Bureau Le numéro du bureau à tester.

Le bureau principal a toujours la valeur 0.

Valeur de retour

Renvoie l'une des valeurs suivantes, en bits par pixels: 1, 2, 4, 8, 15, 16, 24 ou 32.

Remarques

ExamineDesktops() doit être appelée avant cette commande pour mettre à jour les informations concernant les bureaux.

Exemple

  ExamineDesktops()
  MessageRequester("Information d'affichage", "Résolution = "+Str(DesktopWidth(0))+"x"+Str(DesktopHeight(0))+"x"+Str(DesktopDepth(0)))

Voir aussi

ExamineDesktops(),
DesktopFrequency(),
DesktopHeight(), DesktopName(), DesktopWidth()


DesktopFrequency()

Syntaxe

Taux = DesktopFrequency(#Bureau)
Description
Renvoie le taux de rafraîchissement d'un bureau.

Arguments

#Bureau Le numéro du bureau à tester.

Le bureau principal a toujours la valeur 0.

Valeur de retour

Renvoie le taux de rafraîchissement en Hertz du bureau.

Si Taux vaut 0 alors la fréquence matérielle par défaut est utilisée, ou la fréquence réelle n'a pu être déterminée.

Remarques

ExamineDesktops() doit être appelée avant cette commande pour mettre à jour les informations concernant les bureaux.

Note: sous Linux, cette fonction renvoie toujours 0.

Exemple

  ExamineDesktops()
  Frequency = DesktopFrequency(0)
  If Frequency = 0
    MessageRequester("Information d'affichage", "Il n'y a aucun réglage utilisateur, le taux de rafraîchissement par défaut du matériel est utilisé.")
  Else
    MessageRequester("Information d'affichage", "taux de rafraîchissement du bureau: "+Str(Frequency)+" Hz.")
  EndIf

Voir aussi

ExamineDesktops(),
DesktopDepth(),
DesktopHeight(), DesktopName(), DesktopWidth()

OS Supportés

Windows, MacOS X


DesktopHeight()

Syntaxe

Hauteur = DesktopHeight(#Bureau)
Description
Renvoie la hauteur d'un bureau.

Arguments

#Bureau Le numéro du bureau à tester.

Le bureau principal a toujours la valeur 0.

Valeur de retour

Renvoie la hauteur en pixels du bureau.

Remarques

ExamineDesktops() doit être appelée avant cette commande pour mettre à jour les informations concernant les bureaux.

Exemple

  ExamineDesktops()
  MessageRequester("Information d'affichage", "Résolution = "+Str(DesktopWidth(0))+"x"+Str(DesktopHeight(0))+"x"+Str(DesktopDepth(0)))

Voir aussi

ExamineDesktops(),
DesktopDepth(), DesktopX(), DesktopY(),
DesktopWidth()


DesktopMouseX()

Syntaxe

Resultat = DesktopMouseX()
Description
Renvoie la position absolue en X de la souris sur le bureau.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la position absolue en X en pixels de la souris à partir du coin supérieur gauche du moniteur principal.

La coordonnée est négative si la souris est sur un moniteur à gauche de l'écran principal.

Exemple

  If OpenWindow(0, 0, 0, 300, 30, "Position de la souris sur le bureau", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget(0, 10, 6, 200, 20, "")

    Repeat
      Event = WindowEvent()

      If Event = 0 ; Il n'y a plus d'événement dans la file d'attente, libère le processeur quelques millisecondes pour le multi-tâches
        SetGadgetText(0, "Coordonnées : "+Str(DesktopMouseX())+","+Str(DesktopMouseY()))
        Delay(20)
      EndIf

    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

DesktopMouseY(), DesktopX(), DesktopWidth(), WindowMouseX()


DesktopMouseY()

Syntaxe

Resultat = DesktopMouseY()
Description
Renvoie la position absolue en Y de la souris sur le bureau.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la position absolue en Y en pixels de la souris à partir du coin supérieur gauche du moniteur principal.

La coordonnée est négative si la souris est sur un moniteur en dessous de l'écran principal.

Exemple

  If OpenWindow(0, 0, 0, 300, 30, "Position de la souris sur le bureau", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget(0, 10, 6, 200, 20, "")

    Repeat
      Event = WindowEvent()

      If Event = 0 ; Il n'y a plus d'événement dans la file d'attente, libère le processeur quelques millisecondes pour le multi-tâches
        SetGadgetText(0, "Coordonnées : "+Str(DesktopMouseX())+","+Str(DesktopMouseY()))
        Delay(20)
      EndIf

    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

DesktopMouseX(), DesktopY(), DesktopHeight(), WindowMouseY()


DesktopName()

Syntaxe

Nom$ = DesktopName(#Bureau)
Description
Renvoie le nom d'un bureau.

Arguments

#Bureau Le numéro du bureau à tester.

Le bureau principal a toujours la valeur 0.

Valeur de retour

Renvoie le nom du bureau , si il existe, une chaîne vide sinon.

Remarques

ExamineDesktops() doit être appelée avant cette commande pour mettre à jour les informations concernant les bureaux.

Exemple

  ExamineDesktops()
  MessageRequester("Information bureau", "Nom du bureau principal = "+DesktopName(0))

Voir aussi

ExamineDesktops(),
DesktopDepth(), DesktopFrequency(),
DesktopHeight(), DesktopWidth()


DesktopWidth()

Syntaxe

Largeur = DesktopWidth(#Bureau)
Description
Renvoie la largeur d'un bureau.

Arguments

#Bureau Le numéro du bureau à tester.

Le bureau principal a toujours la valeur 0.

Valeur de retour

Renvoie la largeur en pixel du bureau.

Remarques

ExamineDesktops() doit être appelée avant cette commande pour mettre à jour les informations concernant les bureaux.

Exemple

  ExamineDesktops()
  MessageRequester("Information d'affichage", "Résolution = "+Str(DesktopWidth(0))+"x"+Str(DesktopHeight(0))+"x"+Str(DesktopDepth(0)))

Voir aussi

ExamineDesktops(),
DesktopDepth(), DesktopX(), DesktopY(),
DesktopHeight()


DesktopX()

Syntaxe

Resultat = DesktopX(#Bureau)
Description
Renvoie la position 'x' d'un bureau.

Arguments

#Bureau Le numéro du bureau à tester.

Le bureau principal a toujours la valeur 0.

Valeur de retour

Renvoie la position 'x' en pixels, à partir du coin supérieur gauche du bureau.

La coordonnée est relative au coin supérieur gauche de l'écran principal.
Elle est négative si le bureau est indiqué à gauche de l'écran principal.

Remarques

ExamineDesktops() doit être appelée avant cette commande pour mettre à jour les informations concernant les bureaux.

Voir aussi

ExamineDesktops(),
DesktopDepth(), DesktopY(),
DesktopHeight(), DesktopWidth()


DesktopY()

Syntaxe

Resultat = DesktopY(#Bureau)
Description
Renvoie la position 'y' d'un bureau.

Arguments

#Bureau Le numéro du bureau à tester.

Le bureau principal a toujours la valeur 0.

Valeur de retour

Renvoie la position 'y' en pixels, à partir du coin supérieur gauche du bureau.

La coordonnée est relative au coin supérieur gauche de l'écran principal.
Elle est négative si le bureau est indiqué en dessous de l'écran principal.

Remarques

ExamineDesktops() doit être appelée avant cette commande pour mettre à jour les informations concernant les bureaux.

Voir aussi

ExamineDesktops(),
DesktopDepth(), DesktopX(),
DesktopHeight(), DesktopWidth()


ExamineDesktops()

Syntaxe

Resultat = ExamineDesktops()
Description
Examine les caractéristiques des bureaux que l'utilisateur a à sa disposition.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Si la commande s'exécute avec succès, elle renvoie le nombre de bureaux détectés, sinon elle renvoie 0.

Remarques

Cette commande doit être appelée avant d'utiliser les fonctions suivantes: DesktopDepth(), DesktopFrequency(), DesktopHeight(), DesktopName() et DesktopWidth().

En règle générale, un utilisateur en utilise qu'un seul, mais il est possible d'en avoir plusieurs en cas de double-écrans par exemple.

Exemple

  MessageRequester("Information bureau", "Vous avez "+Str(ExamineDesktops())+" bureau(x)")

Voir aussi

DesktopDepth(), DesktopFrequency(), DesktopHeight(), DesktopName(), DesktopWidth()


DragDrop

PureBasic - DragDrop

Généralités

Le 'Drag & Drop' (glisser-déposer) est aujourd'hui une technologie très largement utilisée et permet d'échanger de manière intuitive des données entre applications. Cette bibliothèque ajoute ces fonctionnalités aux gadgets et aux fenêtres juste en rajoutant quelques lignes de code.

De plus, pour les programmeurs expérimentés, elle donne accès aux fonctions bas-niveau de l'API pour exploiter au maximum les capacités d'un système d'exploitation particulier.

Sommaire des commandes

DragFiles
DragImage
DragOSFormats
DragPrivate
DragText
EnableGadgetDrop
EnableWindowDrop
EventDropAction
EventDropBuffer
EventDropFiles
EventDropImage
EventDropPrivate
EventDropSize
EventDropText
EventDropType
EventDropX
EventDropY
SetDragCallback
SetDropCallback

Exemple

DragDrop.pb

OS Supportés

Tous

Guide de référence - Index


DragFiles()

Syntaxe

Resultat = DragFiles(Fichiers$ [, Actions])
Description
Lance une opération de 'Drag & Drop' en utilisant une liste de fichiers.

Arguments

Fichiers$ La liste des noms de fichiers ou de répertoires à transférer.

Les noms doivent être séparés par le caractère Chr(10) (fin de ligne).

Chaque nom de fichier doit contenir son chemin absolu, car l'application qui recevra ces données ne sera pas capable de résoudre les chemins relatifs.

Ces noms de fichiers doivent se référer à des fichiers existants, accessibles par l'application cible.
Actions (optionnel) Si ce paramètre est omis, #PB_Drag_Copy sera utilisé comme valeur par défaut.

Peut être une combinaison de:
  #PB_Drag_Copy: Les fichiers peuvent être copiés
  #PB_Drag_Move: Les fichiers peuvent être déplacés
  #PB_Drag_Link: Les fichiers peuvent être liés
L'utilisateur peut décider de l'action à prendre en utilisant les touches Ctrl ou Shift. Les actions disponibles dépendent aussi du composant sur lequel le texte va être déposé. (Sous MacOSX, les actions ne sont traités que comme une suggestion. La cible de dépôt peut encore choisir une autre action.)

Valeur de retour

Renvoie une des valeurs 'Actions' pour indiquer laquelle a été choisie par l'utilisateur, ou #PB_Drag_None si le 'Drag & Drop' a été annulé.

Note: contrairement aux autres fonctions de 'Drag & Drop', aucune action n'est à prendre lorsque #PB_Drag_Move est renvoyé. Comme les données déposées ne sont que le nom du fichier et pas le fichier lui-même, toutes actions entreprises sur le fichier seront faites par l'application cible.

Remarques

Un 'Drag & Drop' peut être démarré n'importe quand, mais il faut que le bouton gauche de la souris soit appuyé sinon l'opération se terminera immédiatement. Le moment le plus approprié pour lancer un 'Drag & Drop' est en réponse à un évènement sur un Gadget avec un EventType() valant #PB_EventType_DragStart.

Exemple

  ; Sélectionnez quelques fichiers ou dossiers et glissez-les dans une autre application
  ;
  If OpenWindow(1, 200, 200, 400, 400, "Drag & Drop", #PB_Window_SystemMenu)
    ExplorerListGadget(1, 10, 10, 380, 380, "*", #PB_Explorer_MultiSelect)

    Repeat
      Event = WaitWindowEvent()

      If Event = #PB_Event_Gadget And EventGadget() = 1 And EventType() = #PB_EventType_DragStart
        Files$ = ""
        For i = 0 To CountGadgetItems(1)-1
          If GetGadgetItemState(1, i) & #PB_Explorer_Selected
            Files$ + GetGadgetText(1) + GetGadgetItemText(1, i) + Chr(10)
          EndIf
        Next i

        DragFiles(Files$)
      EndIf

    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

DragText(), DragImage(), DragPrivate(), DragOSFormats(), SetDragCallback()


DragImage()

Syntaxe

Resultat = DragImage(ImageID [, Actions])
Description
Lance une opération de 'Drag & Drop' en utilisant une donnée de type 'image'.

Arguments

ImageID L'image à transférer.

ImageID() peut être utilisé pour obtenir cet identifiant.
Actions (optionnel) Si ce paramètre est omis, #PB_Drag_Copy sera utilisé comme valeur par défaut.

Peut être une combinaison de:
  #PB_Drag_Copy: L'image peut être copiée
  #PB_Drag_Move: L'image peut être déplacée
  #PB_Drag_Link: L'image peut être liée
L'utilisateur peut décider de l'action à prendre en utilisant les touches Ctrl ou Shift. Les actions disponibles dépendent aussi du composant sur lequel le texte va être déposé. (Sous MacOSX, les actions ne sont traités que comme une suggestion. La cible de dépôt peut encore choisir une autre action.)

Valeur de retour

Renvoie une des valeurs 'Actions' pour indiquer laquelle a été choisie par l'utilisateur, ou #PB_Drag_None si le 'Drag & Drop' a été annulé.

Note: si #PB_Drag_Move est renvoyé, l'image déposée ne sera pas automatiquement effacée de l'application PureBasic. Il faudra le faire en réponse à ce message.

Remarques

Un 'Drag & Drop' peut être démarré n'importe quand, mais il faut que le bouton gauche de la souris soit appuyé sinon l'opération se terminera immédiatement. Le moment le plus approprié pour lancer un 'Drag & Drop' est en réponse à un évènement sur un Gadget avec un EventType() valant #PB_EventType_DragStart.

Exemple

  ; Glissez une image vers une application qui les accepte comme une application de bureau ou un programme graphique.
  ;
  If LoadImage(1, #PB_Compiler_Home + "examples/sources/data/PureBasicLogo.bmp")
    If OpenWindow(1, 200, 200, 400, 90, "Drag & Drop", #PB_Window_SystemMenu)
      ImageGadget(1, 10, 10, 380, 70, ImageID(1))

      Repeat
        Event = WaitWindowEvent()
        If Event = #PB_Event_Gadget And EventGadget() = 1 And EventType() = #PB_EventType_DragStart
          DragImage(ImageID(1))
        EndIf
      Until Event = #PB_Event_CloseWindow
    EndIf
  EndIf

Voir aussi

DragFiles(), DragText(), DragPrivate(), DragOSFormats(), SetDragCallback()


DragOSFormats()

Syntaxe

Resultat = DragOSFormats(Formats(), NbFormats [, Actions])
Description
Lance une opération de 'Drag & Drop' avec une liste de formats propre au système d'exploitation. Ceci permet de supporter des formats de données qui ne sont pas nativement gérés par PureBasic tout en gardant la simplicité d'utilisation fournie par cette bibliothèque.

Arguments

Formats() Est un tableau de structures 'DragDataFormat' contenant un ou plusieurs formats à gérer.
  Structure DragDataFormat
    Format.l    ; L'identifant de l'OS concernant le format (voir ci-dessous)
   *Buffer      ; La zone mémoire contenant la donnée dans ce format
    Size.l      ; La taille de la zone mémoire
  EndStructure
Windows:
Sous Windows, le champ 'Format' est une valeur de type 'CLIPBOARDFORMAT'. Ce peut être n'importe quel format standard (voir le SDK Windows), ou un format enregistré avec l'API RegisterClipboardFormat_().
Linux:
Sous Linux, le champ 'Format' est une valeur de type 'GdkAtom'. Il peut être créé avec la fonction gdk_atom_intern_(). Les "atomes" sont généralement assimilés à des types mime usuels (i.e "text/html" pour des données HTML). L'atome peut aussi être créé avec n'importe quelle chaîne capable d'être correctement interprétée par l'application cible.
MacOSX:
Sur MacOSX, le champ 'Format' précise un type pour le contenu du presse-papier via le "scrap manager" ( le gestionnaire du presse-papier). Il possède quatre caractères alphanumériques constants, 'TEXT' par exemple. Il y a un certain nombre de types prédéfinis, mais on peut également utiliser des valeurs personnalisées à condition que le programme cible puisse les interpréter correctement.
NbFormats Le nombre de formats dans le tableau.
Si plusieurs formats sont transférés, l'application cible acceptera le premier qu'elle reconnaîtra. Le format qui fournit le plus d'informations (donc qui représente le plus fidèlement la donnée) doit être le premier dans le tableau, suivi par les autres qui sont de moins en moins précis. De cette façon, chaque application recevra la meilleure réprésentation de la donnée, en fonction de ce qu'elle sait interpréter.
Actions (optionnel) Si ce paramètre est omis, #PB_Drag_Copy sera utilisé comme valeur par défaut. Peut être une combinaison de:
  #PB_Drag_Copy: La donnée peut être copiée
  #PB_Drag_Move: La donnée peut être déplacée
  #PB_Drag_Link: La donnée peut être liée
L'utilisateur peut décider de l'action à prendre en utilisant les touches Ctrl ou Shift. Les actions disponibles dépendent aussi du composant sur lequel le texte va être déposé. (Sous MacOSX, les actions ne sont traités que comme une suggestion. La cible de dépôt peut encore choisir une autre action.)

Valeur de retour

Renvoie une des valeurs 'Actions' pour indiquer laquelle a été choisie par l'utilisateur, ou #PB_Drag_None si le 'Drag & Drop' a été annulé.

Note: si #PB_Drag_Move est renvoyé, la donnée déposée ne sera pas automatiquement effacée de l'application PureBasic. Il faudra le faire en réponse à ce message.

Remarques

Un 'Drag & Drop' peut être démarré n'importe quand, mais il faut que le bouton gauche de la souris soit appuyé sinon l'opération se terminera immédiatement. Le moment le plus approprié pour lancer un 'Drag & Drop' est en réponse à un évènement sur un Gadget avec un EventType() valant #PB_EventType_DragStart.

Voir aussi

DragText(), DragImage(), DragFiles(), DragPrivate(), SetDragCallback()


DragPrivate()

Syntaxe

Resultat = DragPrivate(Type [, Actions])
Description
Lance une opération de 'Drag & Drop' limitée à l'appicaton elle-même.

Arguments

Type La valeur qui identifiera la donnée à déposer dans l'application.

N'importe quelle valeur de type Long (.l) est utilisable.

La même valeur devra être spécifiée à EnableGadgetDrop() ou EnableWindowDrop() pour les Gadgets/Fenêtres qui accepteront cette donnée.

Cela permet de définir avec exactitude quel Gadget/Fenêtre acceptera tel type de données, et ainsi de réaliser des schémas 'Drag & Drop' complexes.
Actions (optionnel) Si ce paramètre est omis, #PB_Drag_Copy sera utilisé comme valeur par défaut.

Peut être une combinaison de:
  #PB_Drag_Copy: Le texte peut être copié
  #PB_Drag_Move: Le texte peut être déplacé
  #PB_Drag_Link: Le texte peut être lié
L'utilisateur peut décider de l'action à prendre en utilisant les touches Ctrl ou Shift. Les actions disponibles dépendent aussi du composant sur lequel le texte va être déposé.

Valeur de retour

Renvoie une des valeurs 'Actions' pour indiquer laquelle a été choisie par l'utilisateur, ou #PB_Drag_None si le 'Drag & Drop' a été annulé.

Si l'opération n'a pas été annulée, la boucle d'évènement recevra #PB_Event_WindowDrop ou #PB_Event_GadgetDrop de type #PB_Drop_Private.

Remarques

Contrairement aux autres commandes qui démarrent un 'Drag & Drop', la donnée ne pourra être déposée qu'au sein de l'application (les données transférées avec les commandes telles que DragText() ou DragImage() peuvent aussi être acceptés par les autres applications). Cette commande permet d'ajouter des fonctionnalités de 'Drag & Drop' entre les Gadgets ou les Fenêtres en utilisant des données qui ne seraient pas interprétables par d'autres applications.

Un 'Drag & Drop' peut être démarré n'importe quand, mais il faut que le bouton gauche de la souris soit appuyé sinon l'opération se terminera immédiatement. Le moment le plus approprié pour lancer un 'Drag & Drop' est en réponse à un évènement sur un Gadget avec un EventType() valant #PB_EventType_DragStart.

Si l'opération n'a pas été interrompu, la boucle d'événements recevra un événement #PB_Event_WindowDrop ou #PB_Event_GadgetDrop de type #PB_Drop_Private.

Voir aussi

DragText(), DragImage(), DragFiles(), DragOSFormats(), SetDragCallback()


DragText()

Syntaxe

Resultat = DragText(Texte$ [, Actions])
Description
Lance une opération de 'Drag & Drop' en utilisant une donnée de type 'texte'.

Arguments

Texte$ Le texte à transférer.
Actions (optionnel) Si ce paramètre est omis, #PB_Drag_Copy sera utilisé comme valeur par défaut.

Peut être une combinaison de:
  #PB_Drag_Copy: Le texte peut être copié
  #PB_Drag_Move: Le texte peut être déplacé
  #PB_Drag_Link: Le texte peut être lié
L'utilisateur peut décider de l'action à prendre en utilisant les touches Ctrl ou Shift. Les actions disponibles dépendent aussi du composant sur lequel le texte va être déposé. (Sous MacOSX, les actions ne sont traités que comme une suggestion. La cible de dépôt peut encore choisir une autre action.)

Valeur de retour

Renvoie une des valeurs 'Actions' pour indiquer laquelle a été choisie par l'utilisateur, ou #PB_Drag_None si le 'Drag & Drop' a été annulé.

Note: si #PB_Drag_Move est renvoyé, le texte déposé ne sera pas automatiquement effacé de l'application PureBasic. Il faudra le faire en réponse à ce message.

Remarques

Un 'Drag & Drop' peut être démarré n'importe quand, mais il faut que le bouton gauche de la souris soit appuyé sinon l'opération se terminera immédiatement. Le moment le plus approprié pour lancer un 'Drag & Drop' est en réponse à un évènement sur un Gadget avec un EventType() valant #PB_EventType_DragStart.

Voir aussi

DragFiles(), DragImage(), DragPrivate(), DragOSFormats(), SetDragCallback()


EnableGadgetDrop()

Syntaxe

EnableGadgetDrop(#Gadget, Format, Actions [, TypeInterne])
Description
Permet à un gadget d'être la cible d'un 'Drag & Drop' d'un format spécifique. Quand l'utilisateur voudra déposer une donnée de ce format sur le gadget, le curseur sera modifié en conséquence, indiquant que l'action est possible.

Arguments

#Gadget Le numéro du gadget qui supportera le 'Drag & Drop'.
Format Indique quel type de donnée pourra être déposé sur le gadget.

Il peut prendre une des valeurs suivantes, ou un identifiant de format système (voir DragOSFormats() pour plus d'informations).
  #PB_Drop_Text   : Accepte du texte sur ce gadget
  #PB_Drop_Image  : Accepte des images sur ce gadget
  #PB_Drop_Files  : Accepte des noms de fichiers sur ce gadget
  #PB_Drop_Private: Accepte un 'Drag & Drop' interne
Actions L'utilisateur peut décider de l'action à prendre en utilisant les touches Ctrl ou Shift. Les actions disponibles dépendent aussi du composant sur lequel le texte va être déposé.

Peut être une combinaison de:
  #PB_Drag_None: Le format de données ne sera pas accepté par ce gadget
  #PB_Drag_Copy: La donnée peut être copiée
  #PB_Drag_Move: La donnée peut être déplacée
  #PB_Drag_Link: La donnée peut être liée
TypeInterne (optionnel) Uniquement nécessaire quand #PB_Drop_Private est utilisé comme format.
Il indique le type du 'Drag & Drop' interne à accepter.
Voir DragPrivate() pour plus d'informations.
Ce paramètre est ignoré pour les autres formats.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Plusieurs types de formats peuvent être acceptés par un même gadget. Si la source des données transférées a spécifié plusieurs formats qui sont pris en compte par le gadget, celui qui aura été activé en dernier sera accepté. Donc le format le plus approprié devra être activé en dernier.

Quand une donnée sera déposée sur le gadget, le programme recevra un évènement #PB_Event_GadgetDrop. EventGadget() indiquera le gadget concerné et les commandes 'Event' de cette bibliothèque permettront de récupérer la donnée déposée.

Voir aussi

EnableWindowDrop(), EventDropType(), EventDropAction(), SetDropCallback()


EnableWindowDrop()

Syntaxe

EnableWindowDrop(#Fenetre, Format, Actions [, TypeInterne])
Description
Permet à une fenêtre d'être la cible d'un 'Drag & Drop' d'un format spécifique. Quand l'utilisateur voudra déposer une donnée de ce format sur la fenêtre, le curseur sera modifié en conséquence, indiquant que l'action est possible.

Arguments

#Fenetre Le numéro de la fenêtre qui supportera le 'Drag & Drop'.
Format Indique quel type de donnée pourra être déposé sur la fenêtre.

Il peut prendre une des valeurs suivantes, ou un identifiant de format système (voir DragOSFormats() pour plus d'informations).
  #PB_Drop_Text   : Accepte du texte sur cette fenêtre
  #PB_Drop_Image  : Accepte des images sur cette fenêtre
  #PB_Drop_Files  : Accepte des noms de fichiers sur cette fenêtre
  #PB_Drop_Private: Accepte un 'Drag & Drop' interne
Actions L'utilisateur peut décider de l'action à prendre en utilisant les touches Ctrl ou Shift. Les actions disponibles dépendent aussi du composant sur lequel le texte va être déposé.

Peut être une combinaison de:
  #PB_Drag_None: Le format de données ne sera pas accepté par cette fenêtre
  #PB_Drag_Copy: La donnée peut être copiée
  #PB_Drag_Move: La donnée peut être déplacée
  #PB_Drag_Link: La donnée peut être liée
TypeInterne (optionnel) Uniquement nécessaire quand #PB_Drop_Private est utilisé comme format.
Il indique le type du 'Drag & Drop' interne à accepter.
Voir DragPrivate() pour plus d'informations.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Plusieurs types de formats peuvent être acceptés par une même fenêtre. Si la source des données transférées a spécifié plusieurs formats qui sont pris en compte par la fenêtre, celui qui aura été activé en dernier sera accepté. Donc le format le plus approprié devra être activé en dernier.

Quand une donnée sera déposée sur la fenêtre, le programme recevra un évènement #PB_Event_WindowDrop. EventWindow() indiquera la fenêtre concernée et les commandes 'Event' de cette bibliothèque permettront de récupérer la donnée déposée.

Voir aussi

EnableGadgetDrop(), EventDropType(), EventDropAction(), SetDropCallback()


EventDropAction()

Syntaxe

Resultat = EventDropAction()
Description
Après avoir reçu #PB_Event_GadgetDrop ou #PB_Event_WindowDrop avec WaitWindowEvent() ou WindowEvent(), cette fonction renvoie l'action qui devra être gérée pour la donnée transférée.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

  #PB_Drag_Copy: La donnée devra être copiée
  #PB_Drag_Move: La donnée devra être déplacée
                 (La source du transfert est responsable
                 d'effacer la donnée originale)
  #PB_Drag_Link: La donnée devra être liée

Voir aussi

EnableGadgetDrop(), EnableWindowDrop(), EventDropType(), EventDropX(), EventDropY()


EventDropBuffer()

Syntaxe

*Resultat = EventDropBuffer()
Description
Après avoir reçu #PB_Event_GadgetDrop ou #PB_Event_WindowDrop avec WaitWindowEvent() ou WindowEvent() et un format système, cette fonction permet d'accéder à la donnée déposée.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie l'adresse mémoire de la donnée déposée.

Remarques

Cette zone de mémoire est gérée par la bibliothèque et ne doit en aucun cas être détruite. Elle reste valide jusqu'au prochain appel à la commande WaitWindowEvent() ou WindowEvent(), donc son contenu devra être copié si il est nécessaire de le conserver plus longtemps.

EventDropSize() renvoie la taille de cette zone mémoire (buffer).

Voir aussi

EventDropSize(),
EnableGadgetDrop(), EnableWindowDrop(),
EventDropType(),  EventDropAction(),
EventDropX(), EventDropY()


EventDropFiles()

Syntaxe

Resultat$ = EventDropFiles()
Description
Après avoir reçu #PB_Event_GadgetDrop ou #PB_Event_WindowDrop avec WaitWindowEvent() ou WindowEvent() et un format (récupérable avec EventDropType()) de type #PB_Drop_Files, cette fonction permet de récupérer les noms de fichiers déposés.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie une liste de fichiers et de répertoires, avec leurs chemins absolus. Les noms de fichiers sont séparés par le caractère Chr(10) (fin de ligne).

Voir aussi

EnableGadgetDrop(), EnableWindowDrop(),
EventDropType(),  EventDropAction(),
EventDropX(), EventDropY()


EventDropImage()

Syntaxe

Resultat = EventDropImage(#Image [, Profondeur])
Description
Après avoir reçu #PB_Event_GadgetDrop ou #PB_Event_WindowDrop avec WaitWindowEvent() ou WindowEvent() et un format (récupérable avec EventDropType()) de type #PB_Drop_Image, cette fonction permet de récupérer l'image déposée.

Arguments

#Image Le numéro de la nouvelle image à créer.

Si #PB_Any est utilisé, le nouveau numéro de l'image sera renvoyé dans 'Resultat'.
Profondeur (optionnel) Profondeur de couleur de la nouvelle image.

Les valeurs possibles sont:
  24 : 24 Bits (par défaut)
  32 : 32 Bits

Valeur de retour

Renvoie une valeur non nulle si l'image a été créée avec succès et zéro sinon.

Si #PB_Any a été utilisée pour le paramètre #Image alors le nombre généré est retourné en cas de succès.

Voir aussi

EnableGadgetDrop(), EnableWindowDrop(),
EventDropType(),  EventDropAction(),
EventDropX(), EventDropY()


EventDropPrivate()

Syntaxe

Resultat = EventDropPrivate()
Description
Après avoir reçu #PB_Event_GadgetDrop ou #PB_Event_WindowDrop avec WaitWindowEvent() ou WindowEvent() et un format (récupérable avec EventDropType()) de type #PB_Drop_Private, cette fonction renvoie le 'TypeInterne' qui a été déposé (voir DragPrivate() pour plus d'informations).

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la valeur de type privé utilisé lors du démarrage de l'opération de Drag & Drop. (Voir DragPrivate() pour plus d'informations.)

Voir aussi

EnableGadgetDrop(), EnableWindowDrop(),
EventDropType(),  EventDropAction(),
EventDropX(), EventDropY()


EventDropSize()

Syntaxe

Resultat = EventDropSize()
Description
Après avoir reçu #PB_Event_GadgetDrop ou #PB_Event_WindowDrop avec WaitWindowEvent() ou WindowEvent() et un format système, cette fonction renvoie la taille de la donnée déposée.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la taille en octets de la zone de mémoire renvoyée par EventDropBuffer().

Voir aussi

EventDropBuffer(),
EnableGadgetDrop(), EnableWindowDrop(),
EventDropType(),  EventDropAction(),
EventDropX(), EventDropY()


EventDropText()

Syntaxe

Resultat$ = EventDropText()
Description
Renvoie le texte déposé.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le texte déposé après avoir reçu #PB_Event_GadgetDrop ou #PB_Event_WindowDrop avec WaitWindowEvent() ou WindowEvent() et un format (récupérable avec EventDropType()) de type #PB_Drop_Text, .

Voir aussi

EnableGadgetDrop(), EnableWindowDrop(),
EventDropType(),  EventDropAction(),
EventDropX(), EventDropY()


EventDropType()

Syntaxe

Resultat = EventDropType()
Description
Après avoir reçu #PB_Event_GadgetDrop ou #PB_Event_WindowDrop avec WaitWindowEvent() ou WindowEvent(), cette fonction renvoie le format de la donnée transférée.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie une des valeurs suivantes, ou un identifiant de format système (voir DragOSFormats() pour plus d'informations).
  #PB_Drop_Text   : Un texte a été déposé.     (EventDropText()  pour le récupérer)
  #PB_Drop_Image  : Une image a été déposée.   (EventDropImage() pour la récupérer)
  #PB_Drop_Files  : Des noms de fichiers ont été déposés.  (EventDropFiles() pour les récupérer)
  #PB_Drop_Private: Une opération interne a été effectuée. (EventDropPrivate() pour connaître le type)

Remarques

Pour gérer les formats systèmes, EventDropBuffer() et EventDropSize() peuvent être utilisés.

Voir aussi

EnableGadgetDrop(), EnableWindowDrop(), EventDropAction(),
EventDropText(),  EventDropImage(),  EventDropFiles(),  EventDropPrivate(),
EventDropBuffer(),  EventDropSize(),
EventDropX(), EventDropY()


EventDropX()

Syntaxe

Resultat = EventDropX()
Description
Après avoir reçu #PB_Event_GadgetDrop ou #PB_Event_WindowDrop avec WaitWindowEvent() ou WindowEvent(), cette fonction renvoie la position en X dans la fenêtre ou le gadget sur lequel la donnée a été déposée.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la coordonnée x de la zone de dépôt par rapport à la fenêtre ou au gadget dans lequel les données ont été déposées.

Voir aussi

EnableGadgetDrop(), EnableWindowDrop(),
EventDropType(),  EventDropAction(),
EventDropX(), EventDropY()


EventDropY()

Syntaxe

Resultat = EventDropY()
Description
Après avoir reçu #PB_Event_GadgetDrop ou #PB_Event_WindowDrop avec WaitWindowEvent() ou WindowEvent(), cette fonction renvoie la position en Y dans la fenêtre ou le gadget sur lequel la donnée a été déposée.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la coordonnée y de la zone de dépôt par rapport à la fenêtre ou au gadget dans lequel les données ont été déposées.

Voir aussi

EnableGadgetDrop(), EnableWindowDrop(),
EventDropType(),  EventDropAction(),
EventDropX(), EventDropY()


SetDragCallback()

Syntaxe

SetDragCallback(@DragCallback())
Description
Installe une fonction callback qui sera appelée automatiquement quand une opération de 'Drag & Drop' sera démarrée depuis cette application. La callback permet de modifier le comportement par défaut fourni par PureBasic, par exemple pour changer le curseur via l'API du système d'exploitation. La fonction callback est dépendante de l'OS.

Arguments

@DragCallback() L'adresse d'une fonction à appeler lors du début d'une opération de drag & drop.
La forme et l'objet du rappel dépend de l'OS.
Elle doit prendre la forme suivante:

Windows:
  Procedure DragCallback(Action)

    ProcedureReturn #True
  EndProcedure
La callback est appelée durant toute l'opération de 'Drag & Drop'. Le paramètre 'Action' indique quelle action serait prise en compte si l'utilisateur relachait le bouton de la souris à cet instant. Il peut prendre une des valeurs suivantes:
  #PB_Drag_None: La donnée ne sera pas acceptée
  #PB_Drag_Copy: La donnée sera copiée
  #PB_Drag_Move: La donnée sera déplacée
  #PB_Drag_Link: La donnée sera liée
La callback permet de fournir un curseur ou une image différente. Si c'est le cas, il faudra renvoyer #False, sinon le curseur par défaut sera utilisé.
Linux:
  Procedure DragCallback(*Context.GdkDragContext, isStart)

  EndProcedure
La callback est appelée seulement au début et à la fin d'une opération de 'Drag & Drop'. Le paramètre '*Context' indique le contexte gdk de cette opération, 'isStart' indique si c'est le début ou la fin de l'opération. La valeur renvoyée par la callback est ignorée.

Des fonctions Gtk comme gtk_drag_set_icon_pixbuf_() peuvent être utilisées dans la callback pour définir une image différente durant l'opération.
MacOSX:
  Procedure DragCallback(DragReference, isStart)

  EndProcedure
La callback n'est appelée seulement qu'au début ou à la fin de l'opération "Drag & Drop" (="glisser/déposer"). Le paramètre 'DragReference' précise le contexte 'Drag' de Carbon pour cette opération, contexte qui prend la forme d'une valeur 'DragRef'. 'isStart' précise s'il s'agit du début ou de la fin de l'opération 'Drag & Drop'. La valeur de retour de cette fonction callback est ignorée.

Toutes les fonctions du "Drag Manager" de Carbon peuvent être utilisées pour modifier l'opération 'Drag' avant qu'elle ne commence (ajouter plusieurs choix par exemple) et pour obtenir plus d'informations une fois qu'elle est terminée.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

SetDropCallback()


SetDropCallback()

Syntaxe

SetDropCallback(@DropCallback())
Description
Installe une fonction callback qui sera appelée automatiquement quand une donnée en cours de transfert se trouve au dessus d'une fenêtre ou d'un gadget pouvant l'accepter (voir EnableGadgetDrop() / EnableWindowDrop()). La callback permet de modifier le comportement par défaut de PureBasic, en fournissant par exemple des effets visuels supplémentaires en fonction de la position de la donnée.

Arguments

@DropCallback() L'adresse de la fonction callback.

La callback est appelée quand la souris entre, se déplace et quitte une zone propice au 'Drag & Drop', pour permettre de réagir contextuellement. De plus la callback peut interdire le transfert si nécessaire. Le curseur ne doit pas être modifié dans cette fonction, car seule la source du transfert en est responsable.

Les paramètres de la callback sont décrits ci-dessous:

  Procedure DropCallback(Handle, Etat, Format, Action, x, y)

    ProcedureReturn #True
  EndProcedure
Le premier paramètre indique l' identifiant (Handle) spécifique de l'OS pour le gadget ou la fenêtre cible. Sous Windows, il s'agit de la valeur HWND, sous Linux d'un pointeur GtkWidget et sous MacOSX de la valeur ControlRef ou WindowRef. Pour obtenir ces valeurs, vous pouvez utiliser GadgetID() ou WindowID() pour le gadget ou la fenêtre cible.

'Etat' représente l'état actuel du 'Drag & Drop' en cours. Peut prendre l'une des valeurs suivantes:
  #PB_Drag_Enter : La souris est entrée dans la zone du gadget ou de la fenêtre
  #PB_Drag_Update: La souris se déplace dans le gadget ou la fenêtre, ou l'action a changé
  #PB_Drag_Leave : La souris est sortie de la zone du gadget ou de la fenêtre (Format, Action, x, y sont à 0)
  #PB_Drag_Finish: Le 'Drag & Drop' est terminé
'Format' représente le format de la donnée. Peut prendre l'une des valeurs suivantes, ou un identifiant de format système (voir DragOSFormats() pour plus d'informations):
  #PB_Drop_Text   : Le texte est accepté sur ce gadget ou cette fenêtre
  #PB_Drop_Image  : Les images sont acceptés sur ce gadget ou cette fenêtre
  #PB_Drop_Files  : Les fichiers sont acceptés sur ce gadget ou cette fenêtre
  #PB_Drop_Private: Le type interne est accepté sur ce gadget ou cette fenêtre
Le paramètre 'Action' indique quelle action serait prise en compte si l'utilisateur relachait le bouton de la souris à cet instant. Il peut prendre une des valeurs suivantes:
  #PB_Drag_None: La donnée ne sera pas acceptée
  #PB_Drag_Copy: La donnée sera copiée
  #PB_Drag_Move: La donnée sera déplacée
  #PB_Drag_Link: La donnée sera liée
En retournant #True, la callback permet que l'action se déroule normalement. En retournant #False, la callback interdit l'action (le curseur sera changé en "panneau d'interdiction" par la source du transfert). Si l'Etat' est #PB_Drag_Finish, retourner #False annulera le 'Drag & Drop'.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

SetDragCallback()


Engine3D

PureBasic - Engine3D

Généralités

PureBasic dispose d'un accès simplifié à OGRE, un moteur 3D OpenSource très performant.

Ce choix a été fait car il aurait été dommage de réinventer la roue plutôt que de supporter et de pousser le développement d'un excellent produit déjà disponible.

OGRE est toujours en phase de finition et de nombreuses nouvelles fonctionnalités devraient lui être ajoutées au fur et à mesure.

Plus d'informations à propos de ce moteur 3D sont disponible sur: http://www.ogre3d.org. La licence relative à l'usage de OGRE est consultable ici et les sources d'OGRE modifiées pour PureBasic sont téléchargeables ici.

Note: Si vous utilisez le moteur 3D de PureBasic dans vos projets avec l'intention de distribuer votre exécutable, vous devrez copier la Engine3D.dll du dossier PureBasic/Compilers dans le répertoire de votre projet.

Repère dans l'espace

OGRE utilise les conventions spatiales suivantes:
Le repère spatial de Ogre est direct et la règle des 3 doigts nous permet de retrouver facilement la position des axes X, Y et Z dans l'espace.

Attention, l'axe Z est face à vous.

Définition de : Roulis, Tangage et Lacet:

Le tangage (pitch) est une rotation autour de l'axe X.
Le lacet (yaw) est une rotation autour de l'axe Y.
Le roulis (roll) est une rotation autour de l'axe Z.

Le sens positif (direct) d'une rotation autour d'un axe peut être retrouvé grâce à ce shéma.
Le pouce dans le sens de l'axe comme indiqué, la direction des doigts donne le sens positif de la rotation.
(Utilisez votre main droite).

Sommaire des commandes

Add3DArchive
AmbientColor
AntialiasingMode
ConvertLocalToWorldPosition
ConvertWorldToLocalPosition
CountRenderedTriangles
CreateWater
EnableWorldCollisions
EnableWorldPhysics
Engine3DFrameRate
FetchOrientation
Fog
GetW
GetX
GetY
GetZ
InitEngine3D
InputEvent3D
LoadWorld
MousePick
MouseRayCast
NormalX
NormalY
NormalZ
Parse3DScripts
PickX
PickY
PickZ
PointPick
RayCast
RayCollide
RayPick
RenderWorld
SetGUITheme3D
SetOrientation
ShowGUI
SkyBox
SkyDome
Sun
WaterColor
WorldDebug
WorldGravity
WorldShadows

Exemple

ConvertLocalToWorldPosition.pb
ConvertWorldToLocalPosition.pb
FetchOrientation.pb
MousePick.pb
MouseRayCast.pb
PointPick.pb
PointPick_2D3D.pb
RayPick.pb
RayPick_LightDirection.pb
Screen3DRequester.pb
SetOrientation.pb
SkyBox.pb
SkyDome.pb
Water.pb
WorldDebug.pb
WorldShadows.pb

Bridge.pb
Pendulum.pb

OS Supportés

Tous

Guide de référence - Index


Add3DArchive()

Syntaxe

Resultat = Add3DArchive(Chemin$, Type)
Description
Ajoute un nouveau chemin absolu ou relatif dans la liste actuelle des répertoires disponibles pour les fonctions 3D telles que texture, mesh, sky, etc... world)

Arguments

Chemin$ Le chemin d'accès à ajouter à la liste des chemins vers les ressources 3D.
Cela peut être un chemin sur le système réel, ou une archive ZIP.
Type
  #PB_3DArchive_FileSystem  : Répertoire classique, situé sur une unité disque
  #PB_3DArchive_Zip         : Fichier .zip (archive compressée)

Valeur de retour

Renvoie une valeur non nulle si le chemin a été ajouté avec succès à la liste des ressources 3D, zéro sinon.

Remarques

Ce mode spécial de gestion des accès aux données est dû au fait que ces données peuvent se trouver indifféremment sur le disque (répertoire classique) ou dans une archive (fichier .zip). C'est un moyen très flexible d'abstraire cet accès aux données et permet une flexibilité importante. Par exemple il est possible de créer un .zip de tout le répertoire 'Data' où sont stockées les données relatives à l'application 3D et d'y accéder comme si c'était un répertoire classique.

Exemple

  Add3DArchive("MyData.zip", #PB_3DArchive_Zip) ; Ajoute le .zip comme un répertoire possible
  LoadTexture(0, "MyTexture.jpg")               ; Charge MyTexture.jpg à partir du zip
  LoadTexture(1, "World/Grass.jpg")             ; Charge Grass.jpg à partir du zip, situé dans le sous répertoire World/

Voir aussi

InitEngine3D()


AmbientColor()

Syntaxe

AmbientColor(Couleur)
Description
Change la couleur ambiante du monde 3D.

Arguments

Couleur Nouvelle couleur ambiante.

RGB() peut être utilisée pour obtenir facilement la couleur désirée.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

Fog()


AntialiasingMode()

Syntaxe

AntialiasingMode(Mode)
Description
Change l'antialiasing (anti crénelage) en mode plein écran.

Arguments

Mode
  #PB_AntialiasingMode_None: Pas d'antialiasing (valeur par défaut).
  #PB_AntialiasingMode_x2  : antialiasing  x2 (FSAA).
  #PB_AntialiasingMode_x4  : antialiasing  x4 (FSAA).
  #PB_AntialiasingMode_x6  : antialiasing  x6 (FSAA).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette fonction doit être appelée avant OpenScreen().

En fonction de la carte graphique, cette commande peut avoir un impact important sur les performances de rendu.

Voir aussi

InitEngine3D(), CountRenderedTriangles()


ConvertLocalToWorldPosition()

Syntaxe

ConvertLocalToWorldPosition(ObjetID, x, y, z)
Description
Convertit les coordonnées locales x, y, z en coordonnées dans le monde 3D.

Arguments

ObjetID L'ID (Identifiant) de l'objet concerné. Il peut être un des types suivants:
:   - Camera         : Utilisez CameraID() pour obtenir un ID valide.
  - Entité         : Utilisez EntityID() pour obtenir un ID valide.
  - Luière         : Utilisez LightID() pour obtenir un ID valide.
  - Mesh           : Utilisez MeshID() pour obtenir un ID valide.
  - Noeud          : Utilisez NodeID() pour obtenir un ID valide.
  - Texte3D        : Utilisez Text3DID() pour obtenir un ID valide.
  - Emetteur de Particle : Utilisez ParticleEmitterID() pour obtenir un ID valide.
  - Groupe de billboards : Utilisez BillboardGroupID() pour obtenir un ID valide.
x, y, z Les coordonnées locales à convertir.

Remarques

GetX(), GetY() et GetZ() seront utilisés pour obtenir les coordonnées converties.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

ConvertWorldToLocalPosition()


ConvertWorldToLocalPosition()

Syntaxe

ConvertWorldToLocalPosition(ObjetID, x, y, z)
Description
Convertit les coordonnées dans le monde 3D x, y, z en coordonnées locales.

Arguments

ObjetID L'ID (Identifiant) de l'objet concerné. Il peut être un des types suivants:
:   - Camera         : Utilisez CameraID() pour obtenir un ID valide.
  - Entité         : Utilisez EntityID() pour obtenir un ID valide.
  - Luière         : Utilisez LightID() pour obtenir un ID valide.
  - Mesh           : Utilisez MeshID() pour obtenir un ID valide.
  - Noeud          : Utilisez NodeID() pour obtenir un ID valide.
  - Texte3D        : Utilisez Text3DID() pour obtenir un ID valide.
  - Emetteur de Particle : Utilisez ParticleEmitterID() pour obtenir un ID valide.
  - Groupe de billboards : Utilisez BillboardGroupID() pour obtenir un ID valide.
x, y, z Les coordonnées locales à convertir.

Remarques

GetX(), GetY() et GetZ() seront utilisés pour obtenir les coordonnées converties.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

ConvertLocalToWorldPosition()


CountRenderedTriangles()

Syntaxe

Resultat = CountRenderedTriangles()
Description
Renvoie le nombre de triangles utilisés pour créer la dernière image.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le nombre de triangles de la dernière image.

Voir aussi

AntialiasingMode()


CreateWater()

Syntaxe

CreateWater(#Camera, x, y, z, Transparence, Options)
Description
Crée un plan d'eau.

Arguments

x, y, z | Position du plan d'eau.
Transparence | Transparence du plan d'eau qui peut varier de 0 (complètement opaque) à 255 (transparent).
Options Peut être une combinaison des constantes suivantes:
  #PB_World_WaterMediumQuality: Qualité moyenne (valeur par défaut).
  #PB_World_WaterLowQuality   : Basse qualité, ce qui implique moins de polygones (et donc un rendu plus rapide).
  #PB_World_WaterHighQuality  : Haute qualité, ce qui implique plus de polygones (et donc un rendu plus lent).
  #PB_World_WaterCaustics     : Active les effets caustiques sur l'eau, qui sont des formes créées par la lumière à la surface de l'eau.
  #PB_World_WaterSmooth       : Active la transition douce entre les vagues.
  #PB_World_WaterFoam         : Active l'effet d'écume, qui affecte les objets sous-marins lorsqu'ils sont vus de l'extérieur du plan d'eau.
  #PB_World_WaterSun          : Active la réflexion du soleil sur l'eau. Utilisez Sun() pour modifier la position et la couleur du soleil.
  #PB_World_UnderWater        : Active un effet sous-marin opaque.
  #PB_World_WaterGodRays      : Active un effet rayons de soleil divin lorsqu'on est sous l'eau.  #PB_World_WaterSun doit être spécifié.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

WaterColor()


EnableWorldCollisions()

Syntaxe

EnableWorldCollisions(Mode)
Description
Active ou désactive les collisions dans l'environnement 3D.

Arguments

Mode Avec une valeur non nulle, la gestion des collisions est activée (mode par défaut).

Les collisions fonctionnent avec toutes les entités qui ont un corps (body) créé avec EntityPhysicBody().

Les collisions ne fonctionnent que si le moteur physique est activé avec EnableWorldPhysics().

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

EnableWorldPhysics()


EnableWorldPhysics()

Syntaxe

EnableWorldPhysics(Mode)
Description
Active ou désactive le moteur physique de l'environnement 3D.

Arguments

Mode Avec une valeur non nulle, le moteur physique est activé (mode par défaut).

Toutes les entités qui ont un corps (body) attribué par la commande EntityPhysicBody() seront affectées par le moteur physique.

Les collisions peuvent être activées avec EnableWorldCollisions().

Les collisions ne fonctionnent que si le moteur physique est activé.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

EnableWorldCollisions()


Engine3DFrameRate()

Syntaxe

Resultat = Engine3DFrameRate(Type)
Description
Renvoie le nombre d'images par seconde du moteur 3D.

Arguments

Type
  #PB_Engine3D_Current : Nombre d'images par seconde actuel
  #PB_Engine3D_Average : Nombre d'images par seconde moyen depuis que le moteur 3D est lancé
  #PB_Engine3D_Maximum : Nombre d'images par seconde maximum depuis que le moteur 3D est lancé
  #PB_Engine3D_Minimum : Nombre d'images par seconde minimum depuis que le moteur 3D est lancé
  #PB_Engine3D_Reset   : Réinitialise les statistiques (valeurs 'Minimum', 'Maximum' et 'Moyen')

Valeur de retour

Renvoie le nombre d'images par seconde (fps = frame per second) du moteur 3D.

Voir aussi

CountRenderedTriangles()


FetchOrientation()

Syntaxe

FetchOrientation(ObjetID)
Description
Renvoie le quaternion représentant l'orientation d'un objet. Les valeurs du quaternion peuvent être obtenues avec GetX(), GetY(), GetZ() et GetW().

Arguments

ObjectID L'ID (Identifiant) de l'objet concerné. Il peut être un des types suivants:
  - Camera         : Utilisez CameraID() pour obtenir un ID valide.
  - Entité         : Utilisez EntityID() pour obtenir un ID valide.
  - Luière         : Utilisez LightID() pour obtenir un ID valide.
  - Mesh           : Utilisez MeshID() pour obtenir un ID valide.
  - Noeud          : Utilisez NodeID() pour obtenir un ID valide.
  - Texte3D        : Utilisez Text3DID() pour obtenir un ID valide.
  - Emetteur de Particle : Utilisez ParticleEmitterID() pour obtenir un ID valide.
  - Groupe de billboards : Utilisez BillboardGroupID() pour obtenir un ID valide.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Plutôt que de réaliser une série de rotation autour de l'axe X puis Y puis Z, on définit un axe de rotation unique et un angle de rotation unique lui aussi qui est la résultante de ces trois rotations. Les coordonnées de cet axe unique est le triplet (x, y, z) et l'angle unique de rotation est 'w'.

GetX(), GetY(), GetZ() et GetW() seront utilisées pour obtenir les valeurs du quaternion représentant l'orientation de l'objet.

Voir aussi

GetX(), GetY(), GetZ(), GetW(), SetOrientation()


Fog()

Syntaxe

Fog(Couleur, Intensite, DistanceDebut, DistanceFin)
Description
Affiche un effet de brouillard.

Arguments

Couleur Couleur du brouillard.

RGB() peut être utilisée pour obtenir facilement la couleur désirée.
Intensite Epaisseur du brouillard.

Avec une valeur de 0, l'effet de brouillard est supprimé.
DistanceDebut | Distance à laquelle le brouillard commence à apparaître par rapport à la caméra.
DistanceFin | Distance à laquelle le brouillard devient complètement opaque par rapport à la caméra.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

AmbientColor()


GetW()

Syntaxe

Result = GetW()
Description
Renvoie la valeur w de la dernière commande appelée. La seule fonction prise en charge est FetchOrientation().

Valeur de retour

Renvoie la valeur w de la dernière commande appelée.

Voir aussi

GetX(), GetY(), GetZ(), FetchOrientation()


GetX()

Syntaxe

Resultat = GetX()
Description
Renvoie la valeur x de la dernière commande appelée. Les fonctions prises en charge sont FetchOrientation(), ConvertLocalToWorldPosition() et ConvertWorldToLocalPosition().

Valeur de retour

Renvoie la valeur x de la dernière commande appelée.

Voir aussi

GetY(), GetZ(), GetW(), FetchOrientation(), ConvertLocalToWorldPosition(), ConvertWorldToLocalPosition()


GetY()

Syntaxe

Result = GetY()
Description
Renvoie la valeur y de la dernière commande appelée. Les fonctions prises en charge sont FetchOrientation(), ConvertLocalToWorldPosition() et ConvertWorldToLocalPosition().

Valeur de retour

Renvoie la valeur y de la dernière commande appelée.

Voir aussi

GetX(), GetZ(), GetW(), FetchOrientation(), ConvertLocalToWorldPosition(), ConvertWorldToLocalPosition()


GetZ()

Syntaxe

Result = GetZ()
Description
Renvoie la valeur z de la dernière commande appelée. Les fonctions prises en charge sont FetchOrientation(), ConvertLocalToWorldPosition() et ConvertWorldToLocalPosition().

Valeur de retour

Renvoie la valeur z de la dernière commande appelée.

Voir aussi

GetX(), GetY(), GetW(), FetchOrientation(), ConvertLocalToWorldPosition(), ConvertWorldToLocalPosition()


InitEngine3D()

Syntaxe

Resultat = InitEngine3D([Options [, Bibliotheque$])
Description
Initialise l'environnement nécessaire au fonctionnement du moteur 3D.

Vous devez placer cette fonction au début de votre code source si vous souhaitez utiliser les fonctions 3D.

Arguments

Options (optionnel) Peut être une combinaison des constantes suivantes:
  #PB_Engine3D_NoLog      : Pas de log sauvegardé sur disque ni affiché dans une console (par défaut).
  #PB_Engine3D_DebugLog   : Un fichier journal de débogage nommé 'Ogre.log' sera créé dans le répertoire courant.
                            pour aider au déboguage. Un grand nombre d'actions sont consignées dans ce fichier,
                            mais il ne devrait pas affecter les performances de sorte qu'il peut même être activé
                            dans un éxecutable distribuable...
  #PB_Engine3D_DebugOutput: Les actions sont affichées sur la console.
  #PB_Engine3D_EnableCG   : Utilise le 'Cg ToolKit' de NVIDIA (fonctionne avec DirectX et OpenGL).
                            Doit  être installé au préalable, voir nvidia website.
Bibliotheque$ (optionnel) Le nom d'un fichier Engine3D à charger.

S'il se trouve dans autre endroit que le dossier courant, il pourra être spécifié ici.

Valeur de retour

Renvoie une valeur non nulle si la bibliothèque a été chargée avec succès, zéro autrement.
Si l'initialisation a échoué, le programme devrait cesser de fonctionner ou tous les appels de fonctions 3D devraient être désactivée.

Remarques

Cette fonction tente de charger la bibliothèque de moteur 3d (nommé 'Engine3D.dll' sous Windows, 'engine3d.so' sur Linux et 'engine3d.dylib' sur Mac OS X, depuis le dossier PureBasic/compilateurs/). Si elle échoue, c'est probablement parce que la bibliothèque est introuvable. Sous Windows, une version récente de DirectX 9 doit être installé (voir ici: DirectX 9 runtime installer).

Voir aussi

OpenScreen(), OpenWindowedScreen(), Add3DArchive()


InputEvent3D()

Syntaxe

InputEvent3D(SourisX, SourisY, BoutonGaucheSouris, [, Texte$, ToucheSpeciale])
Description
Injecte des événements dans l'interface graphique 3D (GUI).

Arguments

SourisX, SourisY | La position de la souris sur l'interface 3D, en pixels.
BoutonGaucheSouris L'état du bouton gauche de la souris
  0 : Bouton relâché.
  1 : Bouton pressé.
Texte$ (optionnel) | Le texte injecté dans l'interface graphique, par exemple pour alimenter un StringGadget3D().
ToucheSpeciale (optionnel) Touche muette du clavier injectée dans le système de l'interface graphique, par exemple pour gérer le Retour Arrière (Backspace), Entrée ou Retour Chariot (Enter) et autres.
Les touches spéciales disponibles sont:
  #PB_Key_Back  : Retour arrière
  #PB_Key_Delete: Supprimer
  #PB_Key_Return: Entrée
  #PB_Key_Up    : Flèche haut
  #PB_Key_Down  : Flèche bas
  #PB_Key_Left  : Flèche gauche
  #PB_Key_Right : Flèche droite

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Pour plus de souplesse, les événements ne sont pas obtenus automatiquement à partir de la souris et du clavier, mais injectés à la demande.

Exemple

  ; Voici une utilisation classique pour renseigner les événements de la souris et du clavier
  ;
  InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))

Voir aussi

Add3DArchive(), MousePick()


LoadWorld()

Syntaxe

Résultat = LoadWorld(NomFichier$)
Description
Charge un monde complet.

Arguments

NomFichier$ Le nom du fichier contenant le monde complet doit être accessible dans le chemin géré par Add3DArchive().

Valeur de retour

Si le 'Résultat' est zéro alors le chargement du monde a échoué.

Remarques

Actuellement, seulement le format BSP de Quake3 est supporté mais d'autres vont suivre.

De tels mondes peuvent être facilement créés grâce à des outils comme 'Quark'. Un monde contient un ciel, des batiments, des lumières etc... Les mondes de Quake3 peuvent être chargés immediatement, sans aucune conversion.

Important: Le format BSP est la propriété intellectuelle d'iD Software et ne peut être utilisé librement que dans des logiciels gratuits. Les logiciels à but commerciaux doivent acquérir une licence d'exploitation auprès d'iD Software. Ce système de licence n'est pas lié à PureBasic et Fantaisie Software ne peut en aucun cas être tenu pour responsable d'un usage incorrect de cette commande.

Voir aussi

Add3DArchive()


MousePick()

Syntaxe

Resultat = MousePick(#Camera, x, y [, MasqueSelection])
Description
Simule un clic de la souris et renvoie l'objet se trouvant au point 2D.

Arguments

#Camera | La caméra à utiliser.
x, y | Le point 2D, en pixels, dans le monde.
MasqueSelection (optionnel) Est un masque de sélection d'entités utilisé pendant une sélection d'objets.

Seules les entités avec un masque correspondant à la valeur 'MasqueSelection' seront sélectionnées mais si ce paramètre est omis alors toutes les entités seront sélectionnées.

Il est possible de sélectionner plus d'un groupe d'entités.

Pour plus d'information sur 'MasqueSelection', voir CreateEntity().

Valeur de retour

La valeur renvoyée peut être :
  -1       : Aucun objet détecté.
  0 et plus: Le clic s'est fait sur une entité.
             La sélection de l'entité est basée sur sa boîte englobante.
  et non sur son mesh.
  #PB_World_WaterPick  : Le clic s'est fait sur l'eau.
  #PB_World_TerrainPick: Le clic s'est fait sur un terrain.

Pour obtenir les coordonnées du point 3D sur l'objet sélectionné, utilisez PickX(), PickY() et PickZ().

Exemple

MousePick.pb

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

PickX(), PickY(), PickZ()


MouseRayCast()

Syntaxe

Resultat = MouseRayCast(#Camera, x, y, MasqueSelection)
Description
Jette un rayon depuis un point 2D à travers la scène, et vérifie si un objet traverse le rayon.

Arguments

#Camera | La caméra à utiliser.
x, y | Coordonnées 2D, en pixels, du point de départ.
MasqueSelection Le masque entité à utiliser.

Seules les entités avec un masque correspondant à la valeur 'MasqueSelection' seront signalées. Si ce paramètre est omis, toutes les entités sont des valeurs admissibles pour la détection des rayons. Le masque peut être une combinaison, pour sélectionner plus d'un groupe d'entités.
Pour avoir plus d'informations sur le masque de sélection, voir CreateEntity().

Valeur de retour

Renvoie une valeur non nulle si le rayon est entré en collision avec un objet.

Voir aussi

NormalX(), NormalY(), NormalZ()


NormalX()

Syntaxe

Resultat.f = NormalX()
Description
Renvoie la valeur 'X' de la normale au point de rencontre, après RayCast() ou MouseRayCast().

Valeur de retour

Renvoie la valeur 'X' de la normale au point de rencontre.

Voir aussi

RayCast(), MouseRayCast(), NormalY(), NormalZ()


NormalY()

Syntaxe

Resultat.f = NormalY()
Description
Renvoie la valeur 'Y' de la normale au point de rencontre, après RayCast() ou MouseRayCast().

Valeur de retour

Renvoie la valeur 'Y' de la normale au point de rencontre.

Voir aussi

RayCast(), MouseRayCast(), NormalX(), NormalZ()


NormalZ()

Syntaxe

Resultat.f = NormalZ()
Description
Renvoie la valeur 'Z' de la normale au point de rencontre, après RayCast() ou MouseRayCast().

Valeur de retour

Renvoie la valeur 'Z' de la normale au point de rencontre.

Voir aussi

RayCast(), MouseRayCast(), NormalX(), NormalY()


Parse3DScripts()

Syntaxe

Parse3DScripts()
Description
Lit tous les fichiers scripts '.materials' d'OGRE trouvés dans les chemins définis avec Add3DArchive().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cela permet d'utiliser les meshs qui ont des scripts de matières complexes directement en PureBasic.

Quand une entité utilisant ce type de mesh sera créée, la constante #PB_Material_None devra être spécifiée pour indiquer que les informations concernant les matières doivent être lues à partir du script (si il a été correctement chargé).

Vous trouverez plus d'informations au sujet des scripts dans le manuel en ligne d'OGRE.

Voir aussi

SetGUITheme3D()


PickX()

Syntaxe

Resultat.f = PickX()
Description
Renvoie une position ou une direction, suivant l'axe X.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Après MousePick(), cette commande renvoie la position en 'X' de l'objet sélectionné, dans le monde 3D.
Après PointPick(), cette commande renvoie la direction en 'X' du point sous le clic de la souris. Sa valeur se situe entre -1 et 1.

Voir aussi

PickY(), PickZ()


PickY()

Syntaxe

Resultat.f = PickY()
Description
Renvoie une position ou une direction, suivant l'axe Y.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Après MousePick(), cette commande renvoie la position en 'Y' de l'objet sélectionné, dans le monde 3D.
Après PointPick(), cette commande renvoie la direction en 'Y' du point sous le clic de la souris. Sa valeur se situe entre -1 et 1.

Voir aussi

PickX(), PickZ()


PickZ()

Syntaxe

Resultat.f = PickZ()
Description
Renvoie une position ou une direction, suivant l'axe Z.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Après MousePick(), cette commande renvoie la position en 'Z' de l'objet sélectionné, dans le monde 3D.
Après PointPick(), cette commande renvoie la direction en 'Z' du point sous le clic de la souris. Sa valeur se situe entre -1 et 1.

Voir aussi

PickX(), PickY()


PointPick()

Syntaxe

Resultat = PointPick(#Camera, x, y)
Description
Permet d'obtenir la direction d'un point 2D.

Arguments

#Camera | La caméra à utiliser.
x, y | Le point 2D, en pixels, dans le monde.

Valeur de retour

En cas d'erreur 'Resultat' sera égal à zéro.

Remarques

Pour obtenir la direction du point, voir PickX(), PickY() et PickZ().

Cette fonction est très utile pour réaliser une projection d'un point 2D dans le monde 3D.

Pour réaliser une projection d'un point 3D sur l'écran, utilisez les commandes CameraProjectionX() et CameraProjectionY()

Exemple

PointPick.pb

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

PickX(), PickY(), PickZ()


RayCast()

Syntaxe

Resultat = RayCast(x, y, z, DestinationX, DestinationY, DestinationZ, MasqueSelection)
Description
Projette un rayon entre le premier point et le second point, et vérifie si un objet traverse le rayon.

Arguments

x, y, z | Coordonnées, dans l'unité de monde, du premier point.
DestinationX, DestinationY, DestinationZ | Coordonnées, dans l'unité de monde, du second point.
MasqueSelection Le masque entité à utiliser.

Seules les entités avec un masque correspondant à la valeur 'MasqueSelection' seront signalées. Si ce paramètre est omis, toutes les entités sont des valeurs admissibles pour la détection des rayons. Le masque peut être une combinaison, pour sélectionner plus d'un groupe d'entités.
Pour avoir plus d'informations sur le masque de sélection, voir CreateEntity().

Valeur de retour

Renvoie une valeur non nulle si le rayon est entré en collision avec un objet.

Remarques

Cette fonction ne repose pas sur le moteur physique.

Les valeur des normales au point d'impact sont disponibles avec NormalX(), NormalY() et NormalZ().

Voir aussi

NormalX(), NormalY(), NormalZ()


RayCollide()

Syntaxe

Resultat = RayCollide(x, y, z, DestinationX, DestinationY, DestinationZ)
Description
Lance un rayon entre deux points et vérifie si le rayon rencontre un objet.

Arguments

x, y, z | Coordonnée du point de départ du rayon, dans l'unité de monde.
DestinationX, DestinationY, DestinationZ | Coordonnée du point d'arrivé du rayon, dans l'unité de monde.

Valeur de retour

Renvoie une valeur non nulle si le rayon a heurté un objet.

Remarques

Pour avoir un quelconque effet, le moteur physique doit être activé avec la fonction EnableWorldPhysics().

Voir aussi

RayPick()


RayPick()

Syntaxe

Resultat = RayPick(x, y, z, DestinationX, DestinationY, DestinationZ [, MasqueSelection])
Description
Lance un rayon entre deux points et vérifie si un objet traverse la trajectoire du rayon.

Arguments

x, y, z | Coordonnée du point de départ du rayon, dans l'unité de monde.
DestinationX, DestinationY, DestinationZ | Coordonnée du point d'arrivé du rayon, dans l'unité de monde.
MasqueSelection (optionnel) Est un masque de sélection d'entités utilisé pendant une sélection d'objets.

Seules les entités avec un masque correspondant à la valeur 'MasqueSelection' seront sélectionnées mais si ce paramètre est omis alors toutes les entités seront sélectionnées.

Il est possible de sélectionner plus d'un groupe d'entités.

Pour plus d'information sur 'MasqueSelection', voir CreateEntity().

Valeur de retour

La valeur retournée peut être:
  -1              : Rien n'a été franchi.
  0 et au-dessus  : Le rayon traverse une entité.
                  La détection d'entité est basée sur sa boîte englobante et pas sur son mesh.
  #PB_World_WaterPick  : Le rayon traverse l'eau.
  #PB_World_TerrainPick: Le rayon traverse un terrain.
Pour obtenir plus d'informations sur la position de l'objet sélectionné, voir PickX(), PickY() and PickZ().

Voir aussi

RayCollide()


RenderWorld()

Syntaxe

Resultat = RenderWorld([TempsPhysiqueEcoulé])
Description
Affiche le rendu de la scène 3D sur l'écran courant.

Arguments

TempsPhysiqueEcoulé (optionnel) Force le moteur physique à utiliser cette valeur, en millisecondes, qui est le temps écoulé depuis le dernier appel de RenderWorld.

Utile pour simuler un ralenti ou une accélération du temps réel.

Valeur de retour

Renvoie le temps écoulé depuis la dernière image en millisecondes.

Il peut être utile d'avoir une simulation basée sur un temps précis, si le temps de rendu d'image n'est pas stable.

Remarques

Cette commande doit être appelée quand toutes les opérations relatives à la 3D sont terminées et une seule fois par image (frame).

Il est parfaitement possible d'utiliser les fonctions 2D habituelles telles que DisplaySprite() après cette commande, pour afficher des informations en sur-impression.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

InitEngine3D(), InputEvent3D()


SetGUITheme3D()

Syntaxe

SetGUITheme3D(NomTheme$, NomPolice$)
Description
Cette commande permet de sélectionner le thème et la police utilisés pour l'interface graphique (GUI). Le paramètre 'NomTheme$' et le paramètre 'NomPolice$'

Arguments

NomTheme$ | Le nom du thème à appliquer, sans l'extension '.scheme'
NomPolice$ | Le nom de la police à appliquer, sans l'extension '.font'.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette commande doit être appelée avant n'importe quelle commande de la 'GUI' pour avoir un effet.

Ce 'skining' est possible grâce à CEGUI.

Pour plus d'informations sur les 'skins', visitez le web site CEGUI.

Voir aussi

ShowGUI()


SetOrientation()

Syntaxe

SetOrientation(ObjectID, x, y, z, w)
Description
Change le quaternion représentant l'orientation d'un objet.

Arguments

ObjectID L'ID (Identifiant) de l'objet concerné. Il peut être un des types suivants:
:   - Camera         : Utilisez CameraID() pour obtenir un ID valide.
  - Entité         : Utilisez EntityID() pour obtenir un ID valide.
  - Luière         : Utilisez LightID() pour obtenir un ID valide.
  - Mesh           : Utilisez MeshID() pour obtenir un ID valide.
  - Noeud          : Utilisez NodeID() pour obtenir un ID valide.
  - Texte3D        : Utilisez Text3DID() pour obtenir un ID valide.
  - Emetteur de Particle : Utilisez ParticleEmitterID() pour obtenir un ID valide.
  - Groupe de billboards : Utilisez BillboardGroupID() pour obtenir un ID valide.
x, y, z, w Les nouvelles valeurs du quaternion représentant l'orientation de l'objet.

'x, y, z' sont les coordonnées de l'axe de rotation et 'w' l'angle de rotation à appliquer.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Plutôt que de réaliser une série de rotation autour de l'axe X puis Y puis Z, on définit un axe de rotation unique et un angle de rotation unique lui aussi qui est la résultante de ces trois rotations. Les coordonnées de cet axe unique est le triplet (x, y, z) et l'angle unique de rotation est 'w'.

Voir aussi

GetX(), GetY(), GetZ(), GetW(), FetchOrientation()


ShowGUI()

Syntaxe

ShowGUI(Transparence, AfficherCurseur [, #Camera, Activer])
Description
Affiche ou cache l'ensemble des éléments de l'interface graphique (GUI), qui est composée de fenêtres 3d et de gadgets 3d.

Arguments

Transparence Transparence des éléments de l'interface graphique (GUI).

Peut prendre une valeur allant de 0 (invisible) à 255 (Opaque).
Les valeurs intermédiaires donneront un effet de fondu.
AfficherCurseur
  0: Curseur de la souris masqué.
  1: Curseur de la souris affiché.
#Camera (optionnel) Indique si la GUI doit être affichée ou non sur cette caméra.
Fonctionne conjointement avec le paramètre 'Activer'.
Activer (optionnel) Active ou désactive l'affichage de la GUI sur la caméra indiquée.
Fonctionne conjointement avec le paramètre '#Camera'.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

SetGUITheme3D()


SkyBox()

Syntaxe

Resultat = SkyBox(NomTexture$)
Description
Crée une boîte (cube) artificielle située très loin de la caméra pour fermer complètement le monde.

Arguments

NomTexture$ Est la racine du nom des 6 fichiers de texture qui doivent suivre la règle de nommage suivante:
  NomTexture_BK : Face arrière (BacK)
  NomTexture_FR : Face avant (FRont)
  NomTexture_DN : Face du bas (DowN)
  NomTexture_UP : Face du haut (UP)
  NomTexture_LF : Face de gauche (LeFt)
  NomTexture_RT : Face de droite (RighT)

Valeur de retour

Si 'Resultat' est égal à zéro alors la commande a échouée.

Remarques

Les textures doivent être accessibles dans le chemin géré par Add3DArchive().

Voir aussi

SkyDome()


SkyDome()

Syntaxe

Resultat = SkyDome(NomTexture$, Courbure)
Description
Crée un ciel artificiel animé en forme de dôme, situé très loin de la caméra.

Arguments

NomTexture$ La texture à utiliser pour décorer le dôme.

La texture doit être accessible dans le chemin géré par Add3DArchive().
Courbure Cette valeur indique de quelle manière le ciel doit être courbé.
(valeur positive ou négative).

Valeur de retour

Si 'Resultat' est égal à zéro alors la commande a échouée.

Voir aussi

SkyBox()


Sun()

Syntaxe

Sun(x, y, z, Couleur)
Description
Change la position et la couleur du soleil.

Arguments

x, y, z La nouvelle position du soleil.
Couleur La nouvelle couleur du soleil.

RGB() peut être utilisé pour obtenir une couleur valide.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Attention: Ceci affecte l' eau créée avec l'option #PB_World_WaterSun.

Voir aussi

SkyBox(), SkyDome()


WaterColor()

Syntaxe

WaterColor(#Camera, Couleur)
Description
Change la couleur de l'eau.

Arguments

#Camera La caméra à utiliser.
Couleur La nouvelle couleur de l'eau.

Une valeur de couleur valide peut être obtenue avec RGB().

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

CreateWater() doit être appelée avant d'appeler cette fonction.

Voir aussi

CreateWater()


WorldDebug()

Syntaxe

Resultat = WorldDebug(Mode)
Description
Change le mode débogage du monde 3D.

Arguments

Mode
  #PB_World_DebugNone  : Pas d'information de débogage (Valeur par défaut).
  #PB_World_DebugEntity: Montre les boîtes englobantes des entités.
  #PB_World_DebugBody  : Montre les boîtes des corps physique, à la fois statiques et dynamiques.

Remarques

Cette fonction est utile pour par exemple, aider à résoudre un problème de collision ou de picking lié à une mauvaise définition des boîtes.

Valeur de retour

Renvoie zéro en cas d'échec.

Voir aussi

Add3DArchive()


WorldGravity()

Syntaxe

Resultat = WorldGravity(Gravitation)
Description
Change la gravité du monde 3D.

Arguments

Gravitation Valeur de la pesanteur normale.

La valeur par défaut est -9.806, ce qui correspond à la gravité terrestre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le moteur physique doit être activé avec EnableWorldPhysics().

Quelques exemples de pesanteur:
  Attraction de la pesanteur en % de celle de la terre
  LUNE   : 16%
  MERCURE: 38%
  VENUS  : 90%
  MARS   : 38%
  JUPITER: 2,53 fois
  SATURNE: 107%
  URANUS : 92%
  NEPTUNE: 112%
  PLUTON : 10% (approximatif)
Par exemple, le champs de pesanteur de Mercure vaut 38% de 9.806 soit 3.72 en valeur absolue.

Voir aussi

AmbientColor()


WorldShadows()

Syntaxe

WorldShadows(Type [, Distance [, Couleur [, TailleTexture]]])
Description
Change le type d'ombre qui sera appliqué dans le monde 3D.

Arguments

Type Peut prendre l'une des valeurs suivantes:
  #PB_Shadow_None      : Aucune ombre ne sera affichée dans le le monde 3D. Cela peut permettre d'économiser beaucoup
                         de temps processeur si les ombres ne sont pas nécessaires (mode par defaut).
  #PB_Shadow_Modulative: Des ombres dites 'modulative' seront affichées pour les entity qui ont le
                         mode 'ombre' activé avec EntityRenderMode() et #PB_Entity_CastShadow.
                         Ce mode est le plus rapide pour afficher des ombres, mais il n'est pas très réaliste car les ombres ainsi projetées
                         ne sont pas translucides.
  #PB_Shadow_Additive  : Des ombres dites 'additives' seront affichées pour les entity qui ont le
                         mode 'ombre' activé avec EntityRenderMode() et #PB_Entity_CastShadow.
                         Ce mode est le plus lent mais aussi le plus réaliste, étant donné que les ombres sont transparentes et s'ajoutent si
                         plusieurs ombres se chevauchent.
  #PB_Shadow_TextureAdditive: Les ombres dites 'texture additive' seront affichées pour les entity qui ont le
                         mode 'ombre' activé avec EntityRenderMode() et #PB_Entity_CastShadow. Ce mode
                         est moyen en terme de rapidité et de qualité, mais fonctionnera meme avec un plan d'eau.
Distance (optionnel) Distance maximale de la camera au delà de laquelle les ombres ne seront plus calculées ni affichées.
Couleur (optionnel) Couleur de l'ombre.

RGB() peut être utilisé pour obtenir une valeur de couleur valide.
TailleTexture (optionnel) Taille en pixel de la texture utilisée pour rendre l'ombre.

Plus elle est grande et plus l'ombre sera réaliste, mais plus ce sera lent.

La valeur par défaut est 512 et cette valeur ne doit pas être supérieur à 4096.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

EnableWorldPhysics()


Entity

PureBasic - Entity

Généralités

Les 'Entities', ou entités en français, sont des objets composés d'un mesh (un maillage 3D) et d'une matière (ou matériau) pouvant être déplacés et transformés en temps réel.

Il est possible de partager le même mesh entre plusieurs Entities tout en utilisant une matière différente pour chaque Entity, réduisant ainsi la consommation mémoire et l'utilisation du processeur.

InitEngine3D() doit être appelé avec succès avant de pouvoir utiliser les commandes relatives aux Entitys.

Sommaire des commandes

ApplyEntityForce
ApplyEntityImpulse
AttachEntityObject
CopyEntity
CreateEntity
DetachEntityObject
DisableEntityBody
EnableManualEntityBoneControl
EntityAngularFactor
EntityBonePitch
EntityBoneRoll
EntityBoneX
EntityBoneY
EntityBoneYaw
EntityBoneZ
EntityBoundingBox
EntityCollide
EntityCustomParameter
EntityFixedYawAxis
EntityID
EntityLinearFactor
EntityLookAt
EntityParentNode
EntityPhysicBody
EntityPitch
EntityRenderMode
EntityRoll
EntityVelocity
EntityX
EntityY
EntityYaw
EntityZ
FreeEntity
FreeEntityJoints
GetEntityAttribute
GetEntityMaterial
HideEntity
IsEntity
MoveEntity
MoveEntityBone
RotateEntity
RotateEntityBone
ScaleEntity
SetEntityAttribute
SetEntityMaterial

Exemple

Entity.pb
CopyAngle.pb

AttachEntityObject.pb
AttachEntityObject2.pb
AttachEntityObject3.pb

EntityBonePosition.pb
EntityBonePosition2.pb
EnableManualEntityBoneControl.pb

EntityBoundingBox.pb
EntityCollide.pb
GetEntityMaterial.pb
VisibilityMask.pb

OS Supportés

Tous

Guide de référence - Index


ApplyEntityForce()

Syntaxe

ApplyEntityForce(#Entity, x, y, z [, PositionX, PositionY, PositionZ])
Description
Applique une force sur une entité.

Arguments

#Entity | L'entité à utiliser.
x, y, z | Valeur de la force en x, y et z.
PositionX, PositionY, PositionZ (optionnel) | La position relative par rapport au centre de l'entité, où la force doit être appliquée.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

La valeur de la nouvelle force remplace l'ancienne.

Voir aussi

ApplyEntityImpulse()


ApplyEntityImpulse()

Syntaxe

ApplyEntityImpulse(#Entity, x, y, z [, PositionX, PositionY, PositionZ])
Description
Applique une impulsion à une entité.

Arguments

#Entity | L'entité à utiliser.
x, y, z | Valeur de la force d'impulsion en x, y et z.
PositionX, PositionY, PositionZ (optionnel) | La position relative par rapport au centre de l'entité, où l'impulsion doit être appliquée.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

La nouvelle impulsion est ajoutée à l'ancienne.

Voir aussi

ApplyEntityForce()


AttachEntityObject()

Syntaxe

AttachEntityObject(#Entity, Os$, ObjetID [, x, y, z, Tangage, Roulis, Lacet])
Description
Attache un objet existant à un os d'une entité.

Arguments

#Entity | L'entité à utiliser.
Os$ Le nom de l'os dans le mesh OGRE.

Si le nom de l'os est vide, l'objet n'est pas attaché à un os, mais directement à l'entité.
ObjetID Peut être un des objets suivants:
  - Entity : Utilisation de EntityID() en tant que 'ObjetID'.
  - Camera : Utilisation de CameraID() en tant que 'ObjetID'.
  - Light  : Utilisation de LightID() en tant que 'ObjetID'.
  - BillboardGroup : Utilisation de BillboardGroupID() en tant que 'ObjetID'.
  - ParticleEmitter: Utilisation de ParticleEmitterID() en tant que 'ObjetID'.
x, y, z (optionnel) | Déplacement relatif par rapport à la position de l'objet.
Tangage, Roulis, Lacet (optionnel) | Correspondent à la rotation de l'objet par rapport aux 3 axes.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Un objet peut être détaché de l'os d'une entité avec DetachEntityObject().

Voir aussi

DetachEntityObject()


CopyEntity()

Syntaxe

Resultat = CopyEntity(#Entity, #NouvelleEntity)
Description
Crée une copie d'une entité.

Arguments

#Entity L'entité à copier.
#NouvelleEntity La copie.

Si #PB_Any est utilisé pour le paramètre '#NouvelleEntity' alors le numéro de la nouvelle entité sera renvoyé dans 'Resultat'.

Tous ses attributs sont dupliqués.

Valeur de retour

Si le 'Resultat' est nulle alors la copie a échouée.

Si la '#NouvelleEntity' était déjà créée, elle est automatiquement supprimée et remplacée par la nouvelle.

Voir aussi

CreateEntity(), FreeEntity()


CreateEntity()

Syntaxe

Resultat = CreateEntity(#Entity, MeshID, MatiereID, [x, y, z[, MasqueSelection[, MasqueVisibilite]])
Description
Crée une nouvelle entité utilisant un mesh et une matière.

Arguments

#Entity Numéro de l'entité.

Si #PB_Any est utilisé pour le paramètre '#Entity', le numéro de la nouvelle entity sera renvoyé dans 'Resultat'.

MeshID Le mesh à utiliser.

Pour obtenir un identifiant valide, utilisez MeshID().

MatiereID La matière à utiliser.

Pour obtenir un identifiant valide, utilisez MaterialID().

Si la commande Parse3DScripts() a été utilisée, la constante #PB_Material_None peut être utilisée comme valeur pour le paramètre 'MatiereID', afin de prendre en compte les matières du script '.material' associé au mesh.

x, y, z (optionnel) La position de la nouvelle entité dans le monde.

MasqueSelection (optionnel) Utilisé par RayPick() et MousePick() pour sélectionner le groupe d'entités qui sera traité.

Comme il s'agit d'un masque, chaque valeur doit être une puissance de deux et 31 masques différents sont disponibles.

Pour créer une valeur de masque facilement, l'opérateur '<<' peut être utilisé:
  - 1 << 1  : Première valeur de masque valide
  - 1 << 2  : Deuxième valeur de masque valide
  - 1 << 3  : Troisième valeur de masque valide
  - ...
  - 1 << 31 : Dernières valeur de masque valide
Pour faciliter l'utilisation, les constantes doivent être utilisées pour stocker la valeur du masque.

Lorsque vous appelez les fonctions de sélections, les masques peuvent être combinés avec l'opérateur '|' pour sélectionner plus d'un type d'entité.

MasqueVisibilite (optionnel) Un masque à choisir sur la caméra qui affiche l'entité.

Si ce masque correspond au masque spécifié par CreateCamera() alors l'entité sera affichée par la caméra.
Voir l'option 'MasqueSelection' ci-dessus pour construire des masques appropriés.

Si ce paramètre est omis alors l'entité sera visible par toutes les caméras.

Valeur de retour

Si 'Resultat' est nulle, l'entité n'a pas pu être créée.

Si l'entité était déjà créée, elle est automatiquement supprimée et remplacée par la nouvelle.

Voir aussi

FreeEntity(), HideEntity(), IsEntity()


DetachEntityObject()

Syntaxe

DetachEntityObject(#Noeud, ObjetID)
Description
Détache un objet précédemment attaché à un os d'une entité.

Arguments

#Noeud Le noeud à utiliser.
ObjetID Les objets pris en charge sont:
  - Entity : Utilisation de EntityID() en tant que 'ObjetID'.
  - Camera : Utilisation de CameraID() en tant que 'ObjetID'.
  - Light  : Utilisation de LightID() en tant que 'ObjetID'.
  - BillboardGroup : Utilisation de BillboardGroupID() en tant que 'ObjetID'.
  - ParticleEmitter: Utilisation de ParticleEmitterID() en tant que 'ObjetID'.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Un objet peut être attaché à un os avec AttachEntityObject().

Voir aussi

AttachEntityObject()


DisableEntityBody()

Syntaxe

DisableEntityBody(#Entity, Desactiver)
Description
Désactive le corps d'une entité.

Arguments

#Entity L'entité à désactiver.
Desactiver
   #True : Le corps de l'entité est désactivé.
   #False: Le corps de l'entité est activé.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le moteur physique n'affecte plus l'entité quand son corps est désactivé.

Voir aussi

EntityPhysicBody(), CreateEntity()


EnableManualEntityBoneControl()

Syntaxe

EnableManualEntityBoneControl(#Entity, Os$, Etat, HeritageOrientation)
Description
Activer la commande manuelle d'un os.

Arguments

#Entity | L'entité à utiliser.
Os$ | Le nom de l'os dans le mesh OGRE.
Etat Peut être une des valeurs suivantes:
  #True : La commande manuelle de l'os est activée.
  #False: La commande manuelle de l'os est désactivée.
HeritageOrientation (optionnel) Indique si l'orientation de l'os doit hériter de l'orientation de l'entité. Peut être une des valeurs suivantes:
  #True : L'orientation manuelle de l'os est héritée de l'entité.
  #False: L'orientation manuelle de l'os ne prend pas en compte l'orientation de l'entité.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Il peut être déplacé manuellement avec MoveEntityBone() et tourné avec RotateEntityBone().


EntityAngularFactor()

Syntaxe

EntityAngularFactor(#Entity, x, y, z)
Description
Modifie le facteur angulaire d'une entité.

Arguments

#Entity | L'entité à utiliser.
x, y, z | Les facteurs angulaires du vecteur.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

EntityVelocity(), EntityCustomParameter(), EntityLinearFactor(), MoveEntity()


EntityBonePitch()

Syntaxe

Resultat = EntityBonePitch(#Entity, Os$)
Description
Renvoie le "tangage" (torsion de haut en bas) d'un os d'une entité.

Arguments

#Entity | L'entité à utiliser.
Os$ | Le nom de l'os dans le mesh OGRE.

Valeur de retour

La valeur du tangage de l'os.

Valeur toujours comprise entre -180.0 et 180.0 degrés.

Voir aussi

EntityBoneYaw(), EntityBoneRoll()


EntityBoneRoll()

Syntaxe

Resultat = EntityBoneRoll(#Entity, Os$)
Description
Renvoie le roulis (torsion verticale de gauche à droite) d'un os d'une entité.

Arguments

#Entity | L'entité à utiliser.
Os$ | Le nom de l'os dans le mesh OGRE.

Valeur de retour

La valeur du roulis de l'os.

Valeur toujours comprise entre -180.0 et 180.0 degrés.

Voir aussi

EntityBoneRoll(), EntityBoneYaw()


EntityBoneX()

Syntaxe

Resultat = EntityBoneX(#Entity, Os$ [, DeplacementX, DeplacementY, DeplacementZ])
Description
Renvoie la position en 'x' d'un os d'une entité.

Arguments

#Entity | L'entité à utiliser.
Os$ | Le nom de l'os dans le mesh OGRE .
DeplacementX, DeplacementY, DeplacementZ (optionnel) | Le décalage par rapport à l'os.

Valeur de retour

Renvoie la position en 'x' de l'os dans le monde.

Voir aussi

EntityBoneY(), EntityBoneZ()


EntityBoneY()

Syntaxe

Resultat = EntityBoneY(#Entity, Os$ [, DeplacementX, DeplacementY, DeplacementZ])
Description
Renvoie la position en 'y' d'un os d'une entité.

Arguments

#Entity | L'entité à utiliser.
Os$ | Le nom de l'os dans le mesh OGRE .
DeplacementX, DeplacementY, DeplacementZ (optionnel) | Le décalage par rapport à l'os.

Valeur de retour

Renvoie la position en 'y' de l'os dans le monde.

Voir aussi

EntityBoneX(), EntityBoneZ()


EntityBoneYaw()

Syntaxe

Resultat = EntityBoneYaw(#Entity, Os$)
Description
Renvoie le lacet (torsion horizontale de gauche à droite) d'un os d'une entité.

Arguments

#Entity | L'entité à utiliser.
Os$ | Le nom de l'os dans le mesh OGRE.

Valeur de retour

La valeur du lacet de l'os.

Valeur toujours comprise entre -180.0 et 180.0 degrés.

Voir aussi

EntityBonePitch(), EntityBoneRoll()


EntityBoneZ()

Syntaxe

Resultat = EntityBoneZ(#Entity, Os$ [, DeplacementX, DeplacementY, DeplacementZ])
Description
Renvoie la position en 'z' d'un os d'une entité.

Arguments

#Entity | L'entité à utiliser.
Os$ | Le nom de l'os dans le mesh OGRE .
DeplacementX, DeplacementY, DeplacementZ (optionnel) | Le décalage par rapport à l'os.

Valeur de retour

Renvoie la position en 'z' de l'os dans le monde.

Voir aussi

EntityBoneX(), EntityBoneY()


EntityBoundingBox()

Syntaxe

Resultat = EntityBoundingBox(#Entity, Options)
Description
Renvoie la position de la boîte englobante d'une entité en coordonnées locales ou mondiales.

Arguments

#Entity L'entité à utiliser.
Options
  #PB_Entity_MinBoundingBoxX: Min 'x' de la boîte englobante
  #PB_Entity_MaxBoundingBoxX: Max 'x' de la boîte englobante
  #PB_Entity_MinBoundingBoxY: Min 'y' de la boîte englobante
  #PB_Entity_MaxBoundingBoxY: Max 'y' de la boîte englobante
  #PB_Entity_MinBoundingBoxZ: Min 'z' de la boîte englobante
  #PB_Entity_MaxBoundingBoxZ: Max 'z' de la boîte englobante
Il est possible de la combiner avec l'une des valeurs suivantes:
  #PB_Entity_WorldBoundingBox: Coordonnées mondiales (par défaut)
  #PB_Entity_LocalBoundingBox: Coordonnées locales

Valeur de retour

Renvoie la position de la boîte englobante en coordonnées locales ou mondiales.


EntityCollide()

Syntaxe

Resultat = EntityCollide(#Entity, #Entity2)
Description
Vérifie si deux entités entrent en collision.

Arguments

#Entity | La première entité à tester.
#Entity2 | La seconde entité à tester.

Valeur de retour

Renvoie une valeur non nulle si les deux entités entrent en collision.

Remarques

Pour que les collisions soient gérées par le moteur physique, une entité a besoin d'un corps (body) créé avec EntityPhysicBody().

De plus, le moteur physique doit être activé avec EnableWorldPhysics().

Voir aussi

DetachEntityObject(), CreateEntity(), DisableEntityBody()


EntityCustomParameter()

Syntaxe

EntityCustomParameter(#Entity, IndexSousEntity, IndexParametre, Valeur1, Valeur2, Valeur3, Valeur4)
Description
Définit des paramètres personnalisés pour le 'script shader' matériaux d'une entité.
Pour avoir un effet, le matériaux associé à l'entité doit avoir un 'script shader', soit GLSL soit HLSL.

Arguments

#Entity L'entité à utiliser.
IndexSousEntity L'indice de la sous-entité à utiliser.

Le premier indice commence à 0 (reprensentant l'entité principale).

IndexParametre L'indice de paramètre dans le shader script.

Valeur1, Valeur2, Valeur3, Valeur4 Les valeurs du paramètre.

Si le paramètre ne peut accepter une valeur, cette valeur sera ignorée.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

EntityVelocity(), EntityLinearFactor(), EntityAngularFactor(), MoveEntity()


EntityFixedYawAxis()

Syntaxe

EntityFixedYawAxis(#Entity, Actif [, VecteurX, VecteurY, VecteurZ])
Description
Change l'axe fixe de lacet d'une entité.

Arguments

#Entity L'entité à utiliser.
Actif Active ou désactive l'utilisation d'un axe de lacet personnalisé.
  #True : Un nouvel axe vecteur doit être spécifié.
  #False: L'entité fera un lacet autour de son axe propre Y.
VecteurX, VecteurY, VecteurZ (optionnel) Direction du vecteur du nouvel axe de lacet.

Valeur comprise entre -1.0 et 1.0.

Le paramètre "Actif" doit être posé à #True pour avoir un effet.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le comportement par défaut d'une entité est un lacet autour de son propre axe Y.

Voir aussi

EntityYaw()


EntityID()

Syntaxe

EntityID = EntityID(#Entity)
Description
Renvoie l'identifiant unique d'une entité.

Arguments

#Entity L'entité à utiliser.

Valeur de retour

Renvoie le numéro de l'entité.

Remarques

Cette fonction est très utile quand une fonction d'une autre bibliothèque nécessite l'identifiant d'une entité.

Voir aussi

CreateEntity(), FreeEntity()


EntityLinearFactor()

Syntaxe

EntityLinearFactor(#Entity, x, y, z)
Description
Modifie le facteur linéaire d'une entité.

Arguments

#Entity L'entité à utiliser.
x, y, z Les valeurs du facteur linéaire.

0 indique que l'entité ne sera plus en mesure de se déplacer sur l'axe spécifié 'x, y ou z'.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

En cas de déplacement, la vitesse linéaire est multipliée par le facteur linéaire pour obtenir la vitesse finale.

Ceci est très utile pour contraindre le mouvement d'une entité sur un ou plusieurs axes.

Par défaut, le facteur linéaire est de 1 pour tous les axes ce qui signifie aucun impact sur la vitesse.

L'entité a besoin d'un corps physique pour utiliser cette contrainte.

Voir aussi

EntityVelocity(), EntityCustomParameter(), EntityAngularFactor(), MoveEntity()


EntityLookAt()

Syntaxe

EntityLookAt(#Entity, x, y, z [, DirectionX, DirectionY, DirectionZ])
Description
Spécifie le point (dans l'unité du monde) auquel une entité fait face.

Arguments

#Entity | L'entité à utiliser.
x, y, z | L'entité pointe vers la position 'x, y, z' (dans l'unité du monde).
DirectionX, DirectionY, DirectionZ (optionnel) La direction de l'entité.

Valeur comprise entre -1,0 et 1,0.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

La position de l'entité n'est pas modifiée.


EntityParentNode()

Syntaxe

Resultat = EntityParentNode(#Entity)
Description
Renvoie le numéro du noeud parent d'une entité.

Arguments

#Entity L'entité à utiliser.

Valeur de retour

Renvoie le NodeID() parent, s'il existe ou zéro sinon.

Remarques

Il peut s'agir d'un noeud réel ou d'un os si l'entité est fixée à un os.

Voir aussi

FreeEntityJoints()


EntityPhysicBody()

Syntaxe

EntityPhysicBody(#Entity, Type [, Masse [, Restitution, Friction]])
Description
Crée ou change le type de corps (body) associé à une entité.

Arguments

#Entity L'entité à utiliser.
Type Le 'Type' définit comment le moteur physique gère l'entité:
  #PB_Entity_None       : Aucun body associé à l'entity (mode par défaut).
  #PB_Entity_StaticBody : Le body est statique, c'est à dire que le mesh ne peut pas être animé.
                          Ce mode permet des collisions très précises, car elles sont faites par rapport aux triangles
                          qui compose le mesh (connu comme la tri-mesh collision). Les collisions entre body static et les autres types de body
                          (sphere, box etc.) sont très rapides, mais entre deux body static, cela devient très lent.
                          C'est le type de body parfait pour utiliser une mesh comme un sol ou pour un monde statique.
  #PB_Entity_BoxBody    : Une boîte 'virtuelle' englobant totalement l'entity (avec les mêmes dimensions)
                          est utilisée pour gérer les collisions entre les autres entités.
  #PB_Entity_SphereBody : Une sphère 'virtuelle' englobant totalement l'entity
                          est utilisée pour gérer les collisions entre les autres entités.
  #PB_Entity_CylinderBody : Un cylindre 'virtuel' englobant totalement l'entity
                          est utilisée pour gérer les collisions entre les autres entités.
  #PB_Entity_CapsuleBody : Une capsule 'virtuelle' englobant totalement l'entity
                          est utilisée pour gérer les collisions entre les autres entités.
  #PB_Entity_ConvexHullBody : Une forme complexe 'virtuelle' déduite du mesh réel gère les collisions contre les autres
                          entités. Ce mode est plus lent que le mode basic de collision.
Masse (optionnel) Masse de l'objet.

Ne pas utiliser une valeur trop grande car il pourrait se produire des incohérences physiques (Préférer la valeur 1).

Restitution (optionnel) Coefficient de Restitution de la vitesse de l'objet suite à une collision (Rebond).

En théorie, ce coefficient est égal à la vitesse restituée, divisée par la vitesse initiale. Il est aussi égal à la racine carrée de la hauteur du rebond, divisée par la hauteur du lâché.

Il est généralement compris entre 0 et 1 mais s'il est supérieur à 1 ou inférieur à 0, la collision produit de l'énergie cinétique et donc de la vitesse (vitesse restituée > vitesse initiale).

Cette valeur peut également être obtenue ou définie via GetEntityAttribute() et SetEntityAttribute()

Friction (optionnel) Force de friction ou de frottement de l'objet.

Attention ce paramètre est proportionnel à la Masse.

Cette valeur peut également être obtenue ou définie via GetEntityAttribute() et SetEntityAttribute()

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Pour que les collisions soient gérées par le moteur physique, une entité doit avoir un corps.

De plus, le moteur physique doit être activé à l'aide de la commande EnableWorldPhysics().

En fait, seul le corps est connu du moteur physique lequel fera tous les calculs concernant l'entité, vérifiera sa masse, les forces de frottements (friction) et s'il entre en collision, cela entraînera un mouvement de recul de l'entité (Restitution).

Exemple

 ;- initialisation
InitEngine3D()
InitSprite()
InitKeyboard()

 ;- Fenêtre
OpenWindow(0, 0, 0, 800, 500, "Billard. (Touche Echap pour quitter)", #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800,500, 0, 0, 0,#PB_Screen_SmartSynchronization)

 ;- Textures
txTable = CreateTexture(#PB_Any,256, 256)
StartDrawing(TextureOutput(txTable))
Box(0, 0, 256, 256, $008000)
StopDrawing()

txBordure= CreateTexture(#PB_Any,256, 256)
StartDrawing(TextureOutput(txBordure))
Box(0, 0, 256, 256, $000080)
StopDrawing()

txBalle =CreateTexture(#PB_Any,256, 256)
StartDrawing(TextureOutput(txBalle))
Box(0, 0, 256, 256, $0000FF)
StopDrawing()

 ;- Matériaux
mtTable = CreateMaterial(#PB_Any,TextureID(txTable))
mtBordure = CreateMaterial(#PB_Any,TextureID(txBordure))
mtBalle = CreateMaterial(#PB_Any,TextureID(txBalle))

 ;- Entities

 ; Table
dimX = 50:dimY = 25
bordureHeight.f = 2:bordureWidth.f = 1
planeMesh = CreatePlane(#PB_Any,dimX,dimY,1,1,1,1)
sol  = CreateEntity(#PB_Any, MeshID(planeMesh), MaterialID(mtTable),0,0.2,0)
EntityPhysicBody(sol, #PB_Entity_StaticBody,999,0,0.2)

 ; Bordures
cubeMesh = CreateCube(#PB_Any,1)
 ;Nord
bordure1 = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtBordure))
ScaleEntity(bordure1,dimX,bordureHeight,bordureWidth)
EntityLocate(bordure1,0,bordureHeight / 2,-(dimY / 2 + bordureWidth / 2))
EntityPhysicBody(bordure1, #PB_Entity_StaticBody,999,1,0)
 ;Sud
bordure2 = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtBordure))
ScaleEntity(bordure2,dimX,bordureHeight,bordureWidth)
EntityLocate(bordure2,0,bordureHeight / 2,(dimY / 2 + bordureWidth / 2))
EntityPhysicBody(bordure2, #PB_Entity_StaticBody,999,1,0)
 ;Ouest
bordure3 = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtBordure))
ScaleEntity(bordure3,bordureWidth,bordureHeight,dimY)
EntityLocate(bordure3,-(dimX / 2 + bordureWidth / 2),bordureHeight / 2,0)
EntityPhysicBody(bordure3, #PB_Entity_StaticBody,999,1,0)
 ;Est
bordure4 = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtBordure))
ScaleEntity(bordure4,bordureWidth,bordureHeight,dimY)
EntityLocate(bordure4,(dimX / 2 + bordureWidth / 2),bordureHeight / 2,0)
EntityPhysicBody(bordure4, #PB_Entity_StaticBody,999,1,0)

 ; Bille
billeMesh =CreateSphere(#PB_Any, 1); Sphère
 ;billeMesh = CreateCylinder(#PB_Any,1,0.3) ; Un Palet à la place d'une bille

bille = CreateEntity(#PB_Any,MeshID(billeMesh),MaterialID(mtBalle))
EntityLocate(bille,-dimx/2 + 3,2,0)
 ; Masse de 0.5 : Coefficient de restitution de 0.2 : Force de friction de 0
EntityPhysicBody(bille,#PB_Entity_CylinderBody,0.5,0.2,0)
 ;.==========================================.
 ;| Essayez différentes valeurs de la Masse, |
 ;| du coefficient de restitution            |
 ;| et de la force de friction               |
 ;'=========================================='

 ;- Caméra
CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0,0,15,dimY)
CameraBackColor(0,$808000) ; Couleur de fond

 ;-Lumière & Ombre
AmbientColor($333333)
CreateLight(0,$FFFFFF,200,400,200)
WorldShadows(#PB_Shadow_Additive)

 ;- Go !
wireframe.b = #False
impulse.f = 10
timer = ElapsedMilliseconds() - 3000

KeyboardMode(#PB_Keyboard_International)
Repeat
  Delay(1)
  While WindowEvent() : Wend

  ExamineKeyboard()

  ; Suivre la bille du regard
  CameraLookAt(0,EntityX(bille),EntityY(bille),EntityZ(bille))

  ; Applique une impulsion à la bille toutes les 5 secondes pour la mettre en mouvement
  If ElapsedMilliseconds() - timer >= 5000
    ApplyEntityImpulse(bille,impulse,0,0)
    impulse = -impulse
    timer = ElapsedMilliseconds()
  EndIf

  ; Rendu
  RenderWorld()
  FlipBuffers()

Until KeyboardPushed(#PB_Key_Escape)

End

Voir aussi

EntityAngularFactor(), EntityCollide(), EntityCustomParameter(), EntityLinearFactor(), GetEntityAttribute(), GetEntityMaterial(), SetEntityAttribute(), SetEntityMaterial()


EntityPitch()

Syntaxe

Resultat = EntityPitch(#Entity [, Mode])
Description
Renvoie le tangage d'une entité. (Mouvement vertical de haut en bas)

Arguments

#Entity L'entité à utiliser.
Mode (optionnel) Peut être une des valeurs suivantes:
  #True : La valeur brute, mais elle ne peut pas être utilisée avec RotateEntity() pour récupérer la même orientation (par défaut).
  #False: Le tangage est ajusté, de sorte qu'il peut être réutiliser avec RotateEntity() pour récupérer la même orientation.

Valeur de retour

La valeur du tangage actuel de l'entité.

Valeur toujours comprise entre -180.0 et 180.0 degrés.

Voir aussi

EntityYaw(), EntityRoll()


EntityRenderMode()

Syntaxe

EntityRenderMode(#Entity, Mode)
Description
Change le mode de rendu d'une entité.

Arguments

#Entity L'entité à utiliser.
Mode Peut être une combinaison de:
  #PB_Entity_CastShadow      : L'entité projette des ombres si WorldShadows() est activé (mode par défaut).
  #PB_Entity_DisplaySkeleton : Affiche le squelette de l'entité

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateEntity()


EntityRoll()

Syntaxe

Resultat = EntityRoll(#Entity [, Mode])
Description
Renvoie le roulis d'une entité. (Mouvement vertical de gauche à droite)

Arguments

#Entity L'entité à utiliser.
Mode (optionnel) Peut être une des valeurs suivantes:
  #True : La valeur brute, mais elle ne peut pas être utilisée avec RotateEntity() pour récupérer la même orientation (par défaut).
  #False: Le roulis est ajusté, de sorte qu'il peut être réutiliser avec RotateEntity() pour récupérer la même orientation.

Valeur de retour

La valeur du roulis actuel de l'entité.

Valeur toujours comprise entre -180.0 et 180.0 degrés.

Voir aussi

EntityYaw(), EntityPitch()


EntityVelocity()

Syntaxe

EntityVelocity(#Entity, x, y, z)
Description
Modifie la vitesse linéaire d'une entité.

Arguments

#Entity | L'entité à utiliser.
x, y, z | Le vecteur vitesse.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le facteur linéaire est appliquée à l'entité.
Consultez EntityLinearFactor() pour plus d'informations.

L'entité a besoin d'un corps physique pour avoir une vitesse linéaire.

Pour obtenir la vitesse courante de l'entité, utilisez GetEntityAttribute().

Voir aussi

EntityAngularFactor(), EntityCustomParameter(), EntityLinearFactor(), MoveEntity()


EntityX()

Syntaxe

Resultat = EntityX(#Entity)
Description
Renvoie la position en 'x' d'une entité.

Arguments

#Entity L'entité à utiliser.

Valeur de retour

Renvoie la position en 'x' de l'entité dans le monde 3D.

Voir aussi

EntityY(), EntityZ()


EntityY()

Syntaxe

Resultat = EntityY(#Entity)
Description
Renvoie la position en 'y' d'une entité.

Arguments

#Entity L'entité à utiliser.

Valeur de retour

Renvoie la position en 'y' de l'entité dans le monde 3D.

Voir aussi

EntityX(), EntityZ()


EntityYaw()

Syntaxe

Resultat = EntityYaw(#Entity [, Mode])
Description
Renvoie le lacet d'une entité. (Mouvement horizontal de gauche à droite)

Arguments

#Entity L'entité à utiliser.
Mode (optionnel) Peut être une des valeurs suivantes:
  #True : La valeur brute, mais elle ne peut pas être utilisée avec RotateEntity() pour récupérer la même orientation (par défaut).
  #False: Le lacet est ajusté, de sorte qu'il peut être réutiliser avec RotateEntity() pour récupérer la même orientation.

Valeur de retour

La valeur du lacet actuel de l'entité.

Valeur toujours comprise entre -180.0 et 180.0 degrés.

Voir aussi

EntityPitch(), EntityRoll()


EntityZ()

Syntaxe

Resultat = EntityZ(#Entity)
Description
Renvoie la position en 'z' d'une entité.

Arguments

#Entity L'entité à utiliser.

Valeur de retour

Renvoie la position en 'z' de l'entité dans le monde 3D.

Voir aussi

EntityX(), EntityY()


FreeEntity()

Syntaxe

FreeEntity(#Entity)
Description
Supprime une entité.

Arguments

#Entity L'entité à supprimer.

Si #PB_All est spécifié, toutes les entités restantes sont libérées.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Toutes les entities restantes sont automatiquement supprimées quand le programme se termine.

Voir aussi

CreateEntity()


FreeEntityJoints()

Syntaxe

FreeEntityJoints(#Entity)
Description
Libère toutes les articulations associées à une entité.

Arguments

#Entity L'entité à utiliser.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

EntityParentNode()


GetEntityAttribute()

Syntaxe

Resultat = GetEntityAttribute(#Entity, Attribut)
Description
Renvoie la valeur d'un attribut d'une entité.

Arguments

#Entity L'entité à utiliser.
Attribut
  #PB_Entity_Friction      : Renvoie la valeur de la force de friction ou de frottement.
  #PB_Entity_Restitution   : Renvoie la valeur du coefficient de restitution de la vitesse.
  #PB_Entity_Velocity      : Renvoie la vitesse linéaire courante (tous les axes).
  #PB_Entity_VelocityX     : Renvoie la vitesse linéaire courante sur l'axe des 'x'.
  #PB_Entity_VelocityY     : Renvoie la vitesse linéaire courante sur l'axe des 'y'.
  #PB_Entity_VelocityZ     : Renvoie la vitesse linéaire courante sur l'axe des 'z'.
  #PB_Entity_MassCenterX   : Renvoie la position du centre de masse en 'x'.
  #PB_Entity_MassCenterY   : Renvoie la position du centre de masse en 'y'.
  #PB_Entity_MassCenterZ   : Renvoie la position du centre de masse en 'z'.

Valeur de retour

Renvoie la valeur de l'attribut spécifié ou zéro si l'entité ne supporte pas l'attribut.

Voir aussi

SetEntityAttribute(), SetEntityMaterial(), GetEntityMaterial()


GetEntityMaterial()

Syntaxe

MaterialID = GetEntityMaterial(#Entity)
Description
Renvoie le matériau associé à une entité.

Arguments

#Entity L'entité à utiliser.

Valeur de retour

Renvoie le matériau associé à l'entité avec SetEntityMaterial().

Voir aussi

SetEntityMaterial(), GetEntityAttribute(), SetEntityAttribute()


HideEntity()

Syntaxe

HideEntity(#Entity, Etat)
Description
Affiche ou cache une entité.

Arguments

#Entity L'entité à utiliser.
Etat
  0: L'entité est affichée
  1: L'entité est cachée

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateEntity(), FreeEntity()


IsEntity()

Syntaxe

Resultat = IsEntity(#Entity)
Description
Teste si une entité est correctement initialisée.

Arguments

#Entity L'entité à utiliser.

Valeur de retour

Si le 'Résultat' est différent de zéro alors cet objet est valide.

Remarques

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.

C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

CreateEntity(), FreeEntity()


MoveEntity()

Syntaxe

MoveEntity(#Entity, x, y, z [, Mode])
Description
Déplace une entité.

Arguments

#Entity | L'entité à utiliser.
x, y, z | Nouvelle position de l'entité.
Mode (optionnel) Peut être une des valeurs suivantes:
  #PB_Relative: Déplacement relatif, à partir de la position actuelle de l'entité (par défaut).
  #PB_Absolute: Déplacement absolu à la position spécifiée.
combinée avec l'une des valeurs suivantes:
  #PB_Local : Déplacement local.
  #PB_Parent: Déplacement par rapport à la position du parent.
  #PB_World : Déplacement par rapport au monde.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le déplacement dans le monde 3D est relatif à la position actuelle de l'entité.

Voir aussi

RotateEntity(), ScaleEntity()


MoveEntityBone()

Syntaxe

MoveEntityBone(#Entity, Os$, x, y, z, Mode)
Description
Déplace l'os d'une entité.

Arguments

#Entity | L'entité à utiliser.
Os$ | Le nom de l'os dans le mesh OGRE.
x, y, z | Nouvelle position de l'os.
Mode Peut être une des valeurs suivantes:
  #PB_Relative: Déplacement relatif, à partir de la position actuelle de l'os (par défaut).
  #PB_Absolute: Déplacement absolu à la position spécifiée.
combinée avec l'une des valeurs suivantes:
  #PB_Local : Déplacement local.
  #PB_Parent: Déplacement par rapport à la position du parent.
  #PB_World : Déplacement par rapport au monde.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

L'os doit être en mode manuel en utilisant EnableManualEntityBoneControl().

Voir aussi

RotateEntityBone()


RotateEntity()

Syntaxe

RotateEntity(#Entity, x, y, z [, Mode])
Description
Effectue une rotation d'une entité.

Arguments

#Entity L'entité à utiliser.
x, y, z Angles de rotation.

Tous les angles sont en degrés, de 0 à 359.
Mode (optionnel)
  @pb_absolute: Rotation absolue (par défaut).
  @pb_relative: Rotation relative basée sur la rotation précédente de l'entité.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

MoveEntity(), ScaleEntity()


RotateEntityBone()

Syntaxe

RotateEntityBone(#Entity, Os$, x, y, z, Mode)
Description
Fait pivoter un os d'une entité.

Arguments

#Entity | L'entité à utiliser.
Os$ | Le nom de l'os dans le mesh OGRE.
x, y, z | La valeur de rotation en 'x', 'y' et 'z', entre 0 à 359.
Mode (optionnel)
  @pb_absolute: Rotation absolue (par défaut).
  @pb_relative: Rotation relative basée sur la rotation précédente de l'os.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

MoveEntityBone()


ScaleEntity()

Syntaxe

ScaleEntity(#Entity, x, y, z [, Mode])
Description
Change les dimensions d'une entité.

Arguments

#Entity L'entité à utiliser.
x, y, z Les facteurs d'échelle sur les trois axes.

Les dimensions de l'entité vont être multipliées par les valeurs x,y,z.
Mode (optionnel) Peut être une des valeurs suivantes:
  #PB_Relative: Facteur d'échelle relatif, sur la base de la taille initiale (par défaut).
                L'utilisation de la valeur 1.0 permettra de garder la taille inchangée.
  #PB_Absolute: Facteur déchelle absolue, dans l'unité du monde.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Lorsque vous utilisez le mode #PB_Relative, alors la taille de l'entité sera multipliée par la valeur donnée pour obtenir la nouvelle taille.

Exemple

  ScaleEntity(0, 2, 2, 2) ; Double la taille courante de l'entité.
  ScaleEntity(0, 1, 1, 1) ; Ne change pas la taille de l'entité (Multiplication par '1').
  ScaleEntity(0, 3, 1, 1) ; Change la taille en 'x': 3 fois plus grande.
  ScaleEntity(0, 1, 1, 1, #PB_Absolute) ; Réinitialise la taille de l'entité à 1,1,1.

Voir aussi

MoveEntity(), RotateEntity()


SetEntityAttribute()

Syntaxe

SetEntityAttribute(#Entity, Attribut, Valeur)
Description
Assigne la valeur d'un attribut de l'articulation associée à une entité.

Arguments

#Entity | L'entité à utiliser.
Attribut | L'attribut à définir.
Valeur
  #PB_Entity_Friction      : Change la valeur de la force de friction ou de frottement.
  #PB_Entity_Restitution   : Change la valeur du coefficient de restitution de la vitesse.
  #PB_Entity_MaxVelocity   : Définit la vitesse linéaire maximale de l'entité. Comme il ne stocke pas la valeur,
                             il doit être appelé à chaque fois que l'entité est déplacée.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

GetEntityAttribute(), SetEntityMaterial(), GetEntityMaterial()


SetEntityMaterial()

Syntaxe

SetEntityMaterial(#Entity, MatiereID)
Description
Assigne une matière à l'entité.

Arguments

#Entity L'entité à utiliser.
MatiereID La matière.

Si une matière était déjà assignée à l'entité alors elle est remplacée.

Peut être facilement obtenu avec la commande MaterialID().

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

GetEntityMaterial(), GetEntityAttribute(), SetEntityAttribute()


EntityAnimation

PureBasic - EntityAnimation

Généralités

Les Entities, ou "Entités" en français, sont des objets composés d'un mesh (maillage en 3D) et d'un material (matière ou matériaux) qui peuvent être librement déplacés et transformés en temps réel.

Cette bibliothèque permet le contrôle de l'animation d'une entité.
Attention, le mesh associé à l'entité doit avoir un squelette avec des animations prédéfinies.

InitEngine3D() doit être appelé avec succès avant d'utiliser les fonctions d'animations d'entités.

Sommaire des commandes

AddEntityAnimationTime
EntityAnimationBlendMode
EntityAnimationStatus
GetEntityAnimationLength
GetEntityAnimationTime
GetEntityAnimationWeight
SetEntityAnimationLength
SetEntityAnimationTime
SetEntityAnimationWeight
StartEntityAnimation
StopEntityAnimation
UpdateEntityAnimation

Exemple

EntityAnimation.pb
EntityAnimation2.pb
EntityAnimation3.pb

OS Supportés

Tous

Guide de référence - Index


AddEntityAnimationTime()

Syntaxe

AddEntityAnimationTime(#Entity, Animation$, Temps)
Description
Ajoute du temps à l'animation d'une entité.

Arguments

#Entity | L'entité à utiliser.
Animation$ Le nom de l'animation.

Les animations sont stockées dans l'objet mesh et de manière sensible à la casse ( ex: "Marche" sera une animation différente de "marche").

Si l'animation n'est pas trouvée ou le mesh n'a pas de squelette alors cette fonction n'aura aucun effet.
Temps | Le temps à ajouter (en millisecondes) à l'animation.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

StartEntityAnimation()


EntityAnimationBlendMode()

Syntaxe

EntityAnimationBlendMode(#Entity, Mode)
Description
Change le blendmode (mélange des couleurs) de l'animation d'une entité.

Arguments

#Entity L'entité à utiliser.
Mode
  #PB_EntityAnimation_Average   : Le mélange est le résultat de la moyenne des deux animations (par défaut). Par exemple, si
                                  la première animation tourne un bras à 40 degrés et la deuxième animation fait tourner le bras à 90 degrés,
                                  le bras va tourner de (40+90)/2 = 65 degrés (si les deux animations tournent en même temps en mode full weight).
  #PB_EntityAnimation_Cumulative: Le mélange est la somme des deux animations. Par exemple, si la première animation tourne un bras à 40 degrés
                                  et la deuxième animation fait tourner le bras à 90 degrés, alors le bras tourne à 40+90 = 130 degrés
                                  (si les deux animations tournent en même temps en mode full weight).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Lors du passage d'une animation à l'autre avec SetEntityAnimationWeight(), un mélange est appliqué pour une transition en douceur entre les animations.

Voir aussi

StartEntityAnimation(), SetEntityAnimationWeight()


EntityAnimationStatus()

Syntaxe

Resultat = EntityAnimationStatus(#Entity, Animation$)
Description
Renvoie l'état de l'animation d'une entité.

Arguments

#Entity L'entité à utiliser.
Animation$ Le nom de l'animation.

Les animations sont stockées dans l'objet mesh de manière sensible à la casse (ex: "Marche" sera une animation différente de "marche").

Si l'animation n'est pas trouvée ou le mesh n'a pas de squelette alors cette fonction n'aura aucun effet.

Valeur de retour

  #PB_EntityAnimation_Stopped: L'animation est à l'arrêt (ou terminée).
  #PB_EntityAnimation_Started: L'animation est en cours d'exécution.
  #PB_EntityAnimation_Unknown: L'animation n'existe pas dans le mesh.

Voir aussi

StartEntityAnimation(), StopEntityAnimation()


GetEntityAnimationLength()

Syntaxe

Resultat = GetEntityAnimationLength(#Entity, Animation$)
Description
Renvoie la longueur de l'animation d'une entité.

Arguments

#Entity L'entité à utiliser.
Animation$ Le nom de l'animation.

Les animations sont stockées dans l'objet mesh de manière sensible à la casse (ex: "Marche" sera une animation différente de "marche").

Si l'animation n'est pas trouvée ou le mesh n'a pas de squelette alors cette fonction n'aura aucun effet.

Valeur de retour

La durée de l'animation de l'entité (en millisecondes).

Voir aussi

StartEntityAnimation(), SetEntityAnimationLength()


GetEntityAnimationTime()

Syntaxe

Resultat = GetEntityAnimationTime(#Entity, Animation$)
Description
Renvoie le temps de l'animation d'une entité.

Arguments

#Entity L'entité à utiliser.
Animation$ Le nom de l'animation.

Les animations sont stockées dans l'objet mesh de manière sensible à la casse (ex: "Marche" sera une animation différente de "marche").

Si l'animation n'est pas trouvée ou le mesh n'a pas de squelette alors cette fonction n'aura aucun effet.

Valeur de retour

Le temps courant de l'animation (en millisecondes) ou zéro si l'animation ne fonctionne pas.

Voir aussi

StartEntityAnimation(), AddEntityAnimationTime(), SetEntityAnimationTime()


GetEntityAnimationWeight()

Syntaxe

Resultat = GetEntityAnimationWeight(#Entity, Animation$)
Description
Renvoie le poids de l'animation d'une entité.

Arguments

#Entity L'entité à utiliser.
Animation$ Le nom de l'animation.

Les animations sont stockées dans l'objet mesh de manière sensible à la casse (ex: "Marche" sera une animation différente de "marche").

Si l'animation n'est pas trouvée ou le mesh n'a pas de squelette alors cette fonction n'aura aucun effet.

Valeur de retour

Le poids actuel de l'animation (valeur comprise entre 0.0 et 1.0). Si le poids est égal à 0, alors l'animation est sans effet. Si le poids est égal à 1 alors l'animation joue pleinement.

Remarques

Le poids est utile lorsque vous jouez plusieurs animations à la fois.
Par exemple, pour faire une transition en douceur d'une animation à une autre, il est possible de réduire progressivement le poids de la première animation et d'augmenter le poids de la deuxième animation.
L'EntityAnimationBlendMode() affecte également la façon dont les animations sont mélangées.

Voir aussi

StartEntityAnimation(), EntityAnimationBlendMode()


SetEntityAnimationLength()

Syntaxe

SetEntityAnimationLength(#Entity, Animation$, Duree)
Description
Change la longueur de l'animation d'une entité.

Arguments

#Entity | L'entité à utiliser.
Animation$ Le nom de l'animation.

Les animations sont stockées dans l'objet mesh de manière sensible à la casse (ex: "Marche" sera une animation différente de "marche").

Si l'animation n'est pas trouvée ou le mesh n'a pas de squelette alors cette fonction n'aura aucun effet.
Duree | La nouvelle durée de l'animation de l'entité (en millisecondes).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

StartEntityAnimation(), GetEntityAnimationLength()


SetEntityAnimationTime()

Syntaxe

SetEntityAnimationTime(#Entity, Animation$, Temps)
Description
Modifie le temps courant de l'animation d'une entité.

Arguments

#Entity | L'entité à utiliser.
Animation$ Le nom de l'animation.

Les animations sont stockées dans l'objet mesh de manière sensible à la casse (ex: "Marche" sera une animation différente de "marche").

Si l'animation n'est pas trouvée ou le mesh n'a pas de squelette alors cette fonction n'aura aucun effet.
Temps | Le temps absolu à définir (en millisecondes).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Il s'agit d'un temps absolu.
Pour changer le temps par rapport au temps actuel, utilisez AddEntityAnimationTime().

Voir aussi

StartEntityAnimation(), AddEntityAnimationTime(), GetEntityAnimationTime()


SetEntityAnimationWeight()

Syntaxe

SetEntityAnimationWeight(#Entity, Animation$, Poids)
Description
Modifie le poids de l'animation d'une entité.

Arguments

#Entity | L'entité à utiliser.
Animation$ Le nom de l'animation.

Les animations sont stockées dans l'objet mesh de manière sensible à la casse (ex: "Marche" sera une animation différente de "marche").

Si l'animation n'est pas trouvée ou le mesh n'a pas de squelette alors cette fonction n'aura aucun effet.
Poids | Le nouveau poids de l'animation (valeur comprise entre 0.0 et 1.0). Si le poids est égal à 0 alors l'animation est sans effet. Si le poids est égal à 1 alors l'animation joue pleinement.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le poids est utile lorsque vous jouez plusieurs animations à la fois.
Par exemple, pour faire une transition en douceur d'une animation à une autre, il est possible de réduire progressivement le poids de la première et d'augmenter le poids de la deuxième animation.
L'EntityAnimationBlendMode() affecte également la façon dont les animations sont mélangées.

Voir aussi

StartEntityAnimation(), EntityAnimationBlendMode()


StartEntityAnimation()

Syntaxe

StartEntityAnimation(#Entity, Animation$ [, Options])
Description
Lance l'animation d'une entité.
L'animation est toujours recommencée depuis le début.

Arguments

#Entity L'entité à utiliser.
Animation$ Le nom de l'animation.

Les animations sont stockées dans l'objet mesh de manière sensible à la casse ex: "Marche" sera une animation différente de "marche").

Si l'animation n'est pas trouvée ou le mesh n'a pas de squelette alors cette fonction n'aura aucun effet.
Options Combinaison des valeurs suivantes:
  #PB_EntityAnimation_Once  : Joue l'animation une seule fois. Par défaut, l'animation boucle automatiquement lorsque son extrémité est atteinte.
                              EntityAnimationStatus() peut être utilisé pour détecter la fin de l'animation.
  #PB_EntityAnimation_Manual: Lance l'animation en mode manuel, le temps ne sera pas automatiquement ajouté après chaque RenderWorld().
                              AddEntityAnimationTime() doit être appelé manuellement pour mettre à jour le temps de l'animation.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

StopEntityAnimation(), EntityAnimationStatus(), AddEntityAnimationTime()


StopEntityAnimation()

Syntaxe

StopEntityAnimation(#Entity, Animation$)
Description
Arrête l'animation d'une entité.

Arguments

#Entity L'entité à utiliser.
Animation$ Le nom de l'animation.

Les animations sont stockées dans l'objet mesh de manière sensible à la casse (ex: "Marche" sera une animation différente de "marche").

Si l'animation n'est pas trouvée ou le mesh n'a pas de squelette alors cette fonction n'aura aucun effet.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

StartEntityAnimation()


UpdateEntityAnimation()

Syntaxe

UpdateEntityAnimation(#Entity, Animation$)
Description
Mise à jour de l'animation d'une entité.

Arguments

#Entity L'entité à utiliser.
Animation$ Le nom de l'animation.

Les animations sont stockées dans l'objet mesh de manière sensible à la casse (ex: "Marche" sera une animation différente de "marche").

Si l'animation n'est pas trouvée ou le mesh n'a pas de squelette alors cette fonction n'aura aucun effet.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Par exemple, si les sommets du mesh ont été modifiés alors le cache d'animation doit être recalculé.

Voir aussi

StartEntityAnimation()


File

PureBasic - File

Généralités

Les fichiers sont les principaux modes de stockage d'informations des ordinateurs actuels. PureBasic vous permet de les gérer de manière simple et efficace. Un nombre quelconque de fichiers peuvent être ouverts simultanément. Cette bibliothèque utilise des fonctions optimisées pour accélérer la vitesse de lecture/écriture des informations. Toutes les fonctions permettent la gestion des très gros fichiers, jusqu'à 2^64 octets si le système de fichiers les supporte.

Pour de grandes quantités de données, il peut être utile de charger les données dans un tableau, une liste chaînée ou une map (carte) et l'utilisation de blocs de mémoire peut aussi être une bonne idée.

Pour obtenir les chemins de fichiers valides pour la lecture et l'enregistrement des données, jetez un oeil à la bibliothèque système de fichiers et à la bibliothèque requester.

Sommaire des commandes

CloseFile
CreateFile
Eof
FileBuffersSize
FileID
FileSeek
FlushFileBuffers
IsFile
Loc
Lof
OpenFile
ReadAsciiCharacter
ReadByte
ReadCharacter
ReadData
ReadDouble
ReadFile
ReadFloat
ReadInteger
ReadLong
ReadQuad
ReadString
ReadStringFormat
ReadUnicodeCharacter
ReadWord
TruncateFile
WriteAsciiCharacter
WriteByte
WriteCharacter
WriteData
WriteDouble
WriteFloat
WriteInteger
WriteLong
WriteQuad
WriteString
WriteStringFormat
WriteStringN
WriteUnicodeCharacter
WriteWord

Exemple

File.pb

OS Supportés

Tous

Guide de référence - Index


CloseFile()

Syntaxe

CloseFile(#Fichier)
Description
Ferme un fichier.

Arguments

#Fichier Le fichier à fermer.

Si #PB_All est spécifié, tous les fichiers restants sont fermés.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Une fois que le fichier est fermé, il ne peut plus être utilisé.

Fermer un fichier permet de s'assurer que toutes ses informations sont effectivement écrites sur le disque.

Tous les fichiers restant ouverts sont automatiquement fermés quand le programme se termine.

Voir un exemple dans ReadFile() ou CreateFile().

Voir aussi

CreateFile(), OpenFile(), ReadFile()


CreateFile()

Syntaxe

Resultat = CreateFile(#Fichier, NomFichier$ [, Options])
Description
Crée un fichier vide.

Arguments

#Fichier Le numéro du nouveau fichier.

Si #PB_Any est utilisé pour le paramètre '#Fichier', le numéro du nouveau fichier sera renvoyé dans 'Resultat'.
NomFichier$ Le nom et le chemin vers le nouveau fichier.
Si le nom de fichier ne contient pas de chemin complet alors le chemin courant sera utilisé.
Options (optionnel) Peut être une combinaison de:
  #PB_File_SharedRead : Le fichier ouvert peut être lu par un autre processus (Windows uniquement).
  #PB_File_SharedWrite: le fichier ouvert peut être écrit par un autre processus (Windows uniquement).
  #PB_File_NoBuffering: Le système interne de mise en mémoire tampon de PureBasic sera désactivé pour ce fichier.
                        FileBuffersSize() ne peut pas être utilisé sur ce fichier.

Valeur de retour

Renvoie une valeur nonnulle si le fichier a été créé avec succès et zéro en cas d'erreur.
Si #PB_Any a été utilisé comme paramètre #Fichier alors le nouveau numéro généré est retourné en cas de succès.

Remarques

Si le fichier existe déjà, il sera remplacé par un fichier vide!

La fonction FileSize() peut être utilisée pour déterminer si un fichier existe avant de l'écraser.

Pour ouvrir un fichier existant en lecture et en écriture, utilisez la fonction OpenFile().
Pour ouvrir un fichier en lecture seule, utilisez ReadFile().

Exemple

  If CreateFile(0, "Text.txt")         ; création d'un nouveau fichier texte...
    For a=1 To 10
      WriteStringN(0, "Ligne "+Str(a))  ; écriture de 10 lignes (suivies du code 'Fin de Ligne')
    Next
    For a=1 To 10
      WriteString(0, "Chaîne"+Str(a))  ; ajoute 10 chaînes sur la même ligne (le code 'Fin de Ligne' n'est pas ajouté)
    Next
    CloseFile(0)                       ; ferme le fichier précédemment ouvert et enregistre les données
  Else
    MessageRequester("Information","Impossible de créer le fichier!")
  EndIf

Voir aussi

OpenFile(), ReadFile(), CloseFile()


Eof()

Syntaxe

Resultat = Eof(#Fichier)
Description
Teste si la fin d'un fichier (Eof : End Of File) a été atteinte.

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

Si 'Resultat' est différent de 0, la fin du fichier est atteinte, sinon, Resultat = 0.

Remarques

Vous trouverez un exemple d'utilisation avec la commande ReadFile().

Voir aussi

Lof(), Loc(), CreateFile(), OpenFile(), ReadFile()


FileBuffersSize()

Syntaxe

FileBuffersSize(#Fichier, Taille)
Description
Change la taille des caches de lecture/écriture.

Arguments

#Fichier Le fichier à utiliser.

Si #PB_Default est utilisé alors la valeur par défaut de la taille des caches sera changée, et tous les futurs appels à OpenFile(), CreateFile() et ReadFile() utiliseront cette nouvelle valeur.
Taille La nouvelle taille du cache (en octet).

La taille par défaut du cache est de 4096 octets.

Si la 'Taille' est mise à 0, alors le cache est complètement désactivé et les informations sont immédiatement écrites dans le fichier.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette méthode, disponible pour les programmeurs chevronnés, permet d'avoir un contrôle plus fin sur le système de cache, pour pouvoir améliorer les performances d'accès aux fichiers dans certains cas particuliers.

Note: Pour des raisons de performances, le cache devrait être d'au moins 1024 octets. Quand le cache est actif, les informations ne sont réellement écrite dans le fichier que lorsque le cache est plein, ou que le fichier est fermé. La commande FlushFileBuffers() permet de forcer cette écriture à tout moment.

Voir aussi

FlushFileBuffers()


FileID()

Syntaxe

Resultat = FileID(#Fichier)
Description
Renvoie l'identifiant unique d'un fichier dans le système d'exploitation.

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

Renvoie le handle du fichier.

Voir aussi

CreateFile(), OpenFile(), ReadFile()


FileSeek()

Syntaxe

FileSeek(#Fichier, Position.q [, Mode])
Description
Change la position du pointeur de lecture/écriture.

Arguments

#Fichier | Le fichier à utiliser.
Position.q | La nouvelle position en octet par rapport au début du fichier.
Mode (optionnel) Le mode de recherche. Peut être l'une des valeurs suivantes:
  #PB_Absolute: Position absolue (par défaut).
  #PB_Relative: Position relative, un décalage (offset) positif ou négatif
                par rapport à la position courante du pointeur dans le fichier.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  file$ = OpenFileRequester("Sélectionner un fichier","","Texte (.txt)|*.txt|Tous (*.*)|*.*",0)
  If file$
    If ReadFile(0, file$)
      length = Lof(0)                       ; Lit la taille en octets du fichier
      FileSeek(0, length - 10)              ; place le pointeur 10 caractères avant la fin du fichier
      Debug "Position: " + Str(Loc(0))      ; Affiche la position du pointeur
      *MemoryID = AllocateMemory(10)        ; alloue un bloc mémoire pour 10 octets
      If *MemoryID
        bytes = ReadData(0, *MemoryID, 10)  ; Lit les 10 derniers caractères du fichier
        Debug PeekS(*MemoryID)
      EndIf
      CloseFile(0)
    EndIf
  EndIf

Voir aussi

Loc(), Lof()


FlushFileBuffers()

Syntaxe

Resultat = FlushFileBuffers(#Fichier)
Description
Ecrit immédiatement le contenu du cache dans un fichier.

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

Renvoie une valeur non nulle si le tampon a été écrit correctement sur le disque. Si une erreur survient (Ex: Erreur de disque, disque plein...), il renverra zéro.

Remarques

Pour plus d'informations sur la gestion du cache des fichiers, consulter FileBuffersSize().

Voir aussi

FileBuffersSize()


IsFile()

Syntaxe

Resultat = IsFile(#Fichier)
Description
Teste si un fichier est correctement initialisé.

Arguments

#Fichier Le fichier à tester.

Valeur de retour

Si le 'Résultat' est différent de zéro alors cet objet est valide.

Remarques

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.

C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

CreateFile(), OpenFile(), ReadFile()


Loc()

Syntaxe

Position.q = Loc(#Fichier)
Description
Renvoie la position du pointeur de lecture/écriture dans un fichier.

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

Renvoie la position du pointeur en octet par rapport au début du fichier.

Remarques

Voir un exemple avec la fonction FileSeek().

Voir aussi

FileSeek(), Lof()


Lof()

Syntaxe

Longueur.q = Lof(#Fichier)
Description
Lof (Length of File) renvoie la taille d'un fichier.

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

renvoie la longueur en octets.

Exemple

  file$ = OpenFileRequester("Sélectionnez un fichier","","Texte (.txt)|*.txt|Tous (*.*)|*.*",0)
  If file$
    If ReadFile(0, file$)
      length = Lof(0)                            ; Lit la taille en octets du fichier
      *MemoryID = AllocateMemory(length)         ; alloue un bloc mémoire de la taille du fichier
      If *MemoryID
        bytes = ReadData(0, *MemoryID, length)   ; Lit les données du fichier et les place dans le bloc mémoire
        Debug "Nombre d'octets lus: " + Str(bytes)
      EndIf
      CloseFile(0)
    EndIf
  EndIf

Voir aussi

Loc(), FileSeek(), FileSize()


OpenFile()

Syntaxe

Resultat = OpenFile(#Fichier, NomFichier$ [, Options])
Description
Ouvre un fichier en lecture et en écriture ou le crée s'il n'existe pas.

Arguments

#Fichier Le fichier à utiliser.

Si #PB_Any est utilisé pour le paramètre '#Fichier', le numéro du nouveau fichier sera renvoyé dans 'Resultat'.
NomFichier$ Le nom du fichier à ouvrir.
Options (optionnel) Peut être une combinaison de:
  #PB_File_SharedRead : Le fichier ouvert peut être lu par un autre processus (Windows uniquement).
  #PB_File_SharedWrite: Le fichier ouvert peut être écrit par un autre processus (Windows uniquement).
  #PB_File_Append     : La position du pointeur de fichier sera fixée à la fin du fichier.
  #PB_File_NoBuffering: Le système interne de mise en mémoire tampon de PureBasic sera désactivé pour ce fichier.
                        FileBuffersSize() ne peut pas être utilisé sur ce fichier.

Valeur de retour

Si Resultat est différent de 0, l'ouverture du fichier a réussi, sinon le fichier n'a pu être ouvert.

Si #PB_Any est utilisé pour le paramètre '#Fichier', le numéro du nouveau fichier sera renvoyé dans 'Resultat'.

'Resultat' doit toujours être testé car la manipulation d'un fichier non créé peut occasionner un plantage sérieux.

Remarques

Pour que l'ouverture du fichier avec OpenFile() soit un succès, le fichier doit avoir les droits en lecture et écriture. Ceci peut devenir un problème si il faut manipuler des fichiers sur un CD-Rom par exemple. Dans ce cas, il convient d'utiliser ReadFile() quand seule la lecture du fichier est nécessaire.

Pour ajouter des données à la fin d'un fichier existant il faut au préalable positionner le pointeur de lecture/écriture. Dans l'exemple qui suit les commandes FileSeek() et Lof() sont utilisées après OpenFile():

Exemple

  If OpenFile(0, "Test.txt")    ; Ouvre un fichier existant ou en crée un nouveau s'il n'existait pas
    FileSeek(0, Lof(0))         ; Place le pointeur à la fin du fichier en utilisant le résultat de Lof()
    WriteStringN(0, "... une autre ligne à la fin du fichier.")
    CloseFile(0)
  EndIf

Voir aussi

CreateFile(), ReadFile(), CloseFile()


ReadAsciiCharacter()

Syntaxe

Valeur.a = ReadAsciiCharacter(#Fichier)
Description
Lit un caractère ascii (1 octet).

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

Renvoie le caractère ascii ou zéro si une erreur s'est produite.

Remarques

Vous trouverez un exemple d'utilisation avec la commande ReadFile() en remplaçant ReadString() par ReadAsciiCharacter() pour lire un caractère.

Voir aussi

WriteAsciiCharacter(), ReadUnicodeCharacter(), ReadCharacter(), OpenFile(), ReadFile()


ReadByte()

Syntaxe

Valeur.b = ReadByte(#Fichier)
Description
Lit un 'byte' (1 octet).

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

Renvoie l'octet lu ou zéro si une erreur s'est produite.

Remarques

Vous trouverez un exemple d'utilisation avec la commande ReadFile() en remplaçant ReadString() par ReadByte().

Voir aussi

WriteByte(), OpenFile(), ReadFile()


ReadCharacter()

Syntaxe

Valeur.c = ReadCharacter(#Fichier)
Description
Lit un caractère (1 octet en mode ascii, 2 octets en mode unicode).

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

Renvoie le caractère lu ou zéro si une erreur s'est produite.

Remarques

Vous trouverez un exemple d'utilisation avec la commande ReadFile() en remplaçant ReadString() par ReadCharacter().

Voir aussi

WriteCharacter(), ReadAsciiCharacter(), ReadUnicodeCharacter(), OpenFile(), ReadFile()


ReadData()

Syntaxe

Resultat = ReadData(#Fichier, *Memoire, Longueur)
Description
Lit le contenu d'un fichier et place les informations en mémoire

Arguments

#Fichier | Le fichier à utiliser.
*Memoire | L'adresse mémoire où sera stocké les données du fichier.
Longueur | Le nombre d'octets à lire.

Valeur de retour

Renvoie le nombre d'octets effectivement lus dans le fichier.
S'il y a une erreur, le valeur renvoyée est zéro.

Remarques

Pour un exemple de code voir la fonction Lof().

Voir aussi

WriteData(), OpenFile(), ReadFile()


ReadDouble()

Syntaxe

Valeur.d = ReadDouble(#Fichier)
Description
Lit un nombre entier 'double' (8 octets).

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

Renvoie l'entier lu ou zéro si une erreur s'est produite.

Remarques

Vous trouverez un exemple d'utilisation avec la commande ReadFile() en remplaçant ReadString() par ReadDouble().

Voir aussi

WriteDouble(), OpenFile(), ReadFile()

OS Supportés

Windows, Linux, MacOS X (x86)


ReadFile()

Syntaxe

Resultat = ReadFile(#Fichier, NomFichier$ [, Options])
Description
Ouvre un fichier pour des opérations de lecture seule.

Arguments

#Fichier Le fichier à utiliser.

Si #PB_Any est utilisé pour le paramètre '#Fichier', le numéro du nouveau fichier sera renvoyé dans 'Resultat'.
NomFichier$ Le nom et le chemin d'accès du fichier.
Si le nom de fichier ne contient pas de chemin complet, il est interprété par rapport au répertoire courant.
Options (optionnel) Peut être une combinaison de:
  #PB_File_SharedRead : Le fichier ouvert peut être lu par un autre processus (Windows uniquement).
  #PB_File_NoBuffering: Le système interne de mise en mémoire tampon de PureBasic sera désactivé pour ce fichier.
                        FileBuffersSize() ne peut pas être utilisé sur ce fichier.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé comme paramètre #Fichier alors le nouveau numéro généré est retourné en cas de succès.

'Resultat' doit toujours être testé car la manipulation d'un fichier non créé peut occasionner un plantage sérieux.

Remarques

Pour ouvrir un fichier en lecture et en écriture, utilisez la fonction OpenFile().
Pour créer un nouveau fichier vide, utilisez la fonction CreateFile().

Exemple

  If ReadFile(0, "Texte.txt")  ; Si le fichier peut être lu , on continue...
    While Eof(0) = 0           ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File')
      Debug ReadString(0)      ; Affiche ligne par ligne le contenu du fichier
    Wend
    CloseFile(0)               ; Ferme le fichier précédemment ouvert
  Else
    MessageRequester("Information","Impossible d'ouvrir le fichier!")
  EndIf

Voir aussi

OpenFile(), CreateFile(), CloseFile()


ReadFloat()

Syntaxe

Valeur.f = ReadFloat(#Fichier)
Description
Lit un nombre à virgule 'float' (4 octets).

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

Renvoie le nombre à virgule flottante en simple précision ou zéro si une erreur s'est produite.

Remarques

Vous trouverez un exemple d'utilisation avec la commande ReadFile() en remplaçant ReadString() par ReadFloat().

Voir aussi

WriteFloat(), ReadDouble(), OpenFile(), ReadFile()


ReadInteger()

Syntaxe

Valeur.i = ReadInteger(#Fichier)
Description
Lit un nombre entier 'integer' (4 octets sur les éxecutables 32-bit, ou 8 octets sur les éxecutables 64-bit).

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

Renvoie le nombre entier ou zéro si une erreur s'est produite.

Remarques

Vous trouverez un exemple d'utilisation avec la commande ReadFile() en remplaçant ReadString() par ReadInteger().

Voir aussi

WriteInteger(), OpenFile(), ReadFile()


ReadLong()

Syntaxe

Valeur.l = ReadLong(#Fichier)
Description
Lit un nombre entier 'long' (4 octets).

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

Renvoie le nombre entier ou zéro si une erreur s'est produite.

Remarques

Vous trouverez un exemple d'utilisation avec la commande ReadFile() en remplaçant ReadString() par ReadLong().

Voir aussi

WriteLong(), OpenFile(), ReadFile()


ReadQuad()

Syntaxe

Valeur.q = ReadQuad(#Fichier)
Description
Lit un nombre entier 'quad' (8 octets).

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

Renvoie le nombre entier ou zéro si une erreur s'est produite.

Remarques

Vous trouverez un exemple d'utilisation avec la commande ReadFile() en remplaçant ReadString() par ReadQuad().

Voir aussi

WriteQuad(), OpenFile(), ReadFile()

OS Supportés

Windows, Linux, MacOS X (x86)


ReadString()

Syntaxe

Texte$ = ReadString(#Fichier [, Options [, Longueur]])
Description
Lit une chaîne de caractères jusqu'au prochain caractère 'Fin de Ligne' (EOL: End Of Line) (Les formats des fichiers texte DOS, Unix et MacOS sont supportés).

Arguments

#Fichier Le fichier à utiliser.
Options (optionnel)
  #PB_Ascii  : Lit le texte en ASCII, même si le programme est compilé en mode unicode.
  #PB_UTF8   : Lit le texte en UTF-8, même si le programme est compilé en mode ASCII.
  #PB_Unicode: Lit le texte en UTF-16 (le programme peut être soit en mode unicode, soit en mode ASCII).
A combiner avec:
  #PB_File_IgnoreEOL: Ignore le caractère de fin de ligne et la lecture se poursuit
                      jusqu'à ce que la longueur spécifiée soit atteinte ou jusqu'à
                      la fin du fichier.
Si le paramètre 'Option' n'est pas spécifié, la chaîne de caractères est lue au format UTF-8 si le programme est compilé en mode unicode, sinon la lecture s'effectue en ASCII.
Longueur (optionnel) Le nombre de caractères à lire.
Si un caractère de fin de ligne est rencontré avant que la longueur soit atteinte, la lecture s'arrête (à moins que l'option #PB_File_IgnoreEOL ait été définie).

Valeur de retour

Renvoie la chaîne lue ou une chaîne vide en cas d'erreur.

Remarques

Pour détecter le format d'encodage de chaîne (byte order mark) utilisé dans un fichier, il y a la fonction ReadStringFormat() de disponible.

Vous trouverez un exemple d'utilisation avec la commande ReadFile().

Voir aussi

WriteString(), ReadStringFormat(), OpenFile(), ReadFile()


ReadStringFormat()

Syntaxe

Resultat = ReadStringFormat(#Fichier)
Description
Détermine si la position actuelle du fichier contient un BOM (Byte Order Mark) pour essayer d'identifier l'encodage des caractères utilisé par le fichier. Si un BOM est détecté, le curseur du fichier sera placé juste après le BOM.

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

  #PB_Ascii  : Aucun BOM détecté. C'est probablement un fichier texte standard
  #PB_UTF8   : BOM UTF-8 détecté.
  #PB_Unicode: BOM UTF-16 (little endian) détecté.
  #PB_UTF16BE: BOM UTF-16 (big endian) détecté.
  #PB_UTF32  : BOM UTF-32 (little endian) détecté.
  #PB_UTF32BE: BOM UTF-32 (big endian) détecté.
Les resultats #PB_Ascii, #PB_UTF8 et #PB_Unicode peuvent être utilisés directement avec ReadString() pour lire le texte à partir du fichier. Les autres constantes sont incluses pour faciliter la détection du type de fichier, mais ne sont pas prises en compte nativement par PureBasic.

Remarques

Si le BOM est détecté, le pointeur de fichier sera placé à la fin du BOM.
Si aucun BOM n'est détecté, le pointeur de fichier reste inchangé.

Le BOM (Byte Order Mark) est un moyen couramment utilisé pour indiquer le type d'encodage d'un fichier texte. Il est habituellement placé au début du fichier. Néanmoins, ce n'est pas un standard ni une norme, mais une pratique courante. Ainsi, si aucun BOM n'est détecté au début du fichier, cela ne veut pas forcément dire qu'il s'agit d'un fichier ASCII. WriteStringFormat() peut être utilisé pour écrire un BOM dans un fichier.

Pour plus d'informations, consulter cet article Wikipedia.
Vous trouverez plus d'informations sur le mode unicode avec PureBasic ici.

Voir aussi

WriteStringFormat(), ReadString(), OpenFile(), ReadFile()


ReadUnicodeCharacter()

Syntaxe

Valeur.u = ReadUnicodeCharacter(#Fichier)
Description
Lit un caractère unicode (2 octets).

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

Renvoie le caractère lu ou zéro en cas d'erreur.

Remarques

Vous trouverez un exemple d'utilisation avec la commande ReadFile() en remplaçant ReadString() par ReadUnicodeCharacter().

Voir aussi

WriteUnicodeCharacter(), ReadAsciiCharacter(), ReadCharacter(), OpenFile(), ReadFile()


ReadWord()

Syntaxe

Valeur.w = ReadWord(#Fichier)
Description
Lit une donnée de type 'word' (2 octets).

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

Renvoie le nombre lu ou zéro en cas d'erreur.

Remarques

Vous trouverez un exemple d'utilisation avec la commande ReadFile() en remplaçant ReadString() par ReadWord().

Voir aussi

WriteWord(), OpenFile(), ReadFile()


TruncateFile()

Syntaxe

TruncateFile(#Fichier)
Description
Coupe le fichier à la position courante et supprime toutes les données qui suivent.

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette fonction peut être employée pour rendre un fichier plus court sans le recréer entièrement. Pour faire un fichier plus long, ajoutez simplement plus de données avec les commandes d'écriture ('write') de cette bibliothèque.

Voir aussi

FileSeek(), Loc()


WriteAsciiCharacter()

Syntaxe

Resultat = WriteAsciiCharacter(#Fichier, Valeur.a)
Description
Ecrit une valeur de type caractère ascii (1 octet).

Arguments

#Fichier | Le fichier à utiliser.
Valeur | La valeur du caractère ASCII à écrire.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Remarques

En raison de la mise en mémoire tampon, cette fonction peut retourner une valeur avec succès même s'il n'y a pas assez d'espace disponible sur le périphérique de sortie pour l'opération d'écriture.

Le fichier doit être ouvert en utilisant une fonction d'écriture compatible (c'est à dire pas avec ReadFile()).

Vous trouverez un exemple d'utilisation avec la commande CreateFile() en remplaçant WriteString() par WriteAsciiCharacter() pour écrire un caractère ascii.

Voir aussi

ReadAsciiCharacter(), WriteUnicodeCharacter(), WriteCharacter(), CreateFile(), OpenFile()


WriteByte()

Syntaxe

Resultat = WriteByte(#Fichier, Valeur.b)
Description
Ecrit une valeur de type 'byte' (1 octet).

Arguments

#Fichier | Le fichier à utiliser.
Valeur | La valeur de l'octet à écrire.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Remarques

En raison de la mise en mémoire tampon, cette fonction peut retourner une valeur avec succès même s'il n'y a pas assez d'espace disponible sur le périphérique de sortie pour l'opération d'écriture.

Le fichier doit être ouvert en utilisant une fonction d'écriture compatible (c'est à dire pas avec ReadFile()).

Vous trouverez un exemple d'utilisation avec la commande CreateFile() en remplaçant WriteString() par WriteByte() pour écrire un byte.

Voir aussi

ReadByte(), CreateFile(), OpenFile()


WriteCharacter()

Syntaxe

Resultat = WriteCharacter(#Fichier, Valeur.c)
Description
Ecrit un caractère (1 octet en mode ascii, 2 octets en mode unicode).

Arguments

#Fichier | Le fichier à utiliser.
Valeur | La valeur du caractère à écrire.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Remarques

En raison de la mise en mémoire tampon, cette fonction peut retourner une valeur avec succès même s'il n'y a pas assez d'espace disponible sur le périphérique de sortie pour l'opération d'écriture.

Le fichier doit être ouvert en utilisant une fonction d'écriture compatible (c'est à dire pas avec ReadFile()).

Vous trouverez un exemple d'utilisation avec la commande CreateFile() en remplaçant WriteString() par WriteCharacter() pour écrire un character.

Voir aussi

ReadCharacter(), WriteAsciiCharacter(), WriteUnicodeCharacter(), CreateFile(), OpenFile()


WriteData()

Syntaxe

Resultat = WriteData(#Fichier, *Memoire, Longueur)
Description
Ecrit le contenu d'une zone mémoire dans un fichier.

Arguments

#Fichier | Le fichier à utiliser.
*Memoire | L'adresse mémoire des données à écrire dans le fichier.
Longueur | Le nombre d'octets à écrire dans le fichier.

Valeur de retour

Renvoie le nombre d'octets qui ont été réellement écrit dans le fichier. ou zéro en cas d'erreur.

Remarques

En raison de la mise en mémoire tampon, cette fonction peut retourner une valeur avec succès même s'il n'y a pas assez d'espace disponible sur le périphérique de sortie pour l'opération d'écriture.

Le fichier doit être ouvert en utilisant une fonction d'écriture compatible (c'est à dire pas avec ReadFile()).

Exemple

  *MemoryID = AllocateMemory(1000) ; Alloue un bloc mémoire de 1000 octets
  If *MemoryID
    PokeS(*MemoryID, "Enregistre ce texte dans le bloc mémoire") ; Ecriture d'une chaîne de caractères dans le bloc mémoire
  EndIf
  If CreateFile(0, "Texte.txt")   ; Création d'un nouveau fichier...
    WriteData(0, *MemoryID, SizeOf(Character)*10)   ; On écrit les 10 premiers caractères du bloc mémoire dans le fichier
    CloseFile(0)                  ; Ferme le fichier précédemment ouvert et enregistre les données
  Else
    Debug "Impossible de créer le fichier!"
  EndIf

Voir aussi

ReadData(), CreateFile(), OpenFile()


WriteDouble()

Syntaxe

Resultat = WriteDouble(#Fichier, Valeur.d)
Description
Ecrit une valeur de type 'double' (8 octets).

Arguments

#Fichier | Le fichier à utiliser.
Valeur | La valeur à écrire.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Remarques

En raison de la mise en mémoire tampon, cette fonction peut retourner une valeur avec succès même s'il n'y a pas assez d'espace disponible sur le périphérique de sortie pour l'opération d'écriture.

Le fichier doit être ouvert en utilisant une fonction d'écriture compatible (c'est à dire pas avec ReadFile()).

Vous trouverez un exemple d'utilisation avec la commande CreateFile() en remplaçant WriteString() par WriteDouble() pour écrire un double.

Voir aussi

ReadDouble(), WriteFloat(), CreateFile(), OpenFile()

OS Supportés

Windows, Linux, MacOS X (x86)


WriteFloat()

Syntaxe

Resultat = WriteFloat(#Fichier, Valeur.f)
Description
Ecrit une valeur de type 'float' (4 octets).

Arguments

#Fichier | Le fichier à utiliser.
Valeur | La valeur à écrire.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Remarques

En raison de la mise en mémoire tampon, cette fonction peut retourner une valeur avec succès même s'il n'y a pas assez d'espace disponible sur le périphérique de sortie pour l'opération d'écriture.

Le fichier doit être ouvert en utilisant une fonction d'écriture compatible (c'est à dire pas avec ReadFile()).

Vous trouverez un exemple d'utilisation avec la commande CreateFile() en remplaçant WriteString() par WriteFloat() pour écrire un float.

Voir aussi

ReadFloat(), WriteDouble(), CreateFile(), OpenFile()


WriteInteger()

Syntaxe

Resultat = WriteInteger(#Fichier, Valeur)
Description
Ecrit une valeur de type 'integer' (4 octets sur un éxecutable 32-bit, ou 8 octets sur un éxecutable 64-bit).

Arguments

#Fichier | Le fichier à utiliser.
Valeur | La valeur à écrire.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Remarques

En raison de la mise en mémoire tampon, cette fonction peut retourner une valeur avec succès même s'il n'y a pas assez d'espace disponible sur le périphérique de sortie pour l'opération d'écriture.

Le fichier doit être ouvert en utilisant une fonction d'écriture compatible (c'est à dire pas avec ReadFile()).

Vous trouverez un exemple d'utilisation avec la commande CreateFile() en remplaçant WriteString() par WriteInteger() pour écrire un integer.

Voir aussi

ReadInteger(), CreateFile(), OpenFile()


WriteLong()

Syntaxe

Resultat = WriteLong(#Fichier, Valeur.l)
Description
Ecrit une valeur de type 'long' (4 octets).

Arguments

#Fichier | Le fichier à utiliser.
Valeur | La valeur à écrire.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Remarques

En raison de la mise en mémoire tampon, cette fonction peut retourner une valeur avec succès même s'il n'y a pas assez d'espace disponible sur le périphérique de sortie pour l'opération d'écriture.

Le fichier doit être ouvert en utilisant une fonction d'écriture compatible (c'est à dire pas avec ReadFile()).

Vous trouverez un exemple d'utilisation avec la commande CreateFile() en remplaçant WriteString() par WriteLong() pour écrire un long.

Voir aussi

ReadLong(), CreateFile(), OpenFile()


WriteQuad()

Syntaxe

Resultat = WriteQuad(#Fichier, Valeur.q)
Description
Ecrit une valeur de type 'quad' (8 octets).

Arguments

#Fichier Le fichier à utiliser.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Remarques

En raison de la mise en mémoire tampon, cette fonction peut retourner une valeur avec succès même s'il n'y a pas assez d'espace disponible sur le périphérique de sortie pour l'opération d'écriture.

Le fichier doit être ouvert en utilisant une fonction d'écriture compatible (c'est à dire pas avec ReadFile()).

Vous trouverez un exemple d'utilisation avec la commande CreateFile() en remplaçant WriteString() par WriteQuad() pour écrire un quad.

Voir aussi

ReadQuad(), CreateFile(), OpenFile()

OS Supportés

Windows, Linux, MacOS X (x86)


WriteString()

Syntaxe

Resultat = WriteString(#Fichier, Texte$ [, Format])
Description
Ecrit une chaîne de caractères dans un fichier.

Arguments

#Fichier | Le fichier à utiliser.
Texte$ | Le texte à écrire dans le fichier.
Format (optionnel)
  #PB_Ascii  : Ecrit le texte en ASCII.
  #PB_UTF8   : Ecrit le texte en UTF-8.
  #PB_Unicode: Ecrit le texte en UTF-16.
Si ce paramètre n'est pas spécifié, la chaîne de caractères est écrite au format UTF-8 si le programme est compilé en mode unicode, ou en ASCII sinon.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Remarques

En raison de la mise en mémoire tampon, cette fonction peut retourner une valeur avec succès même s'il n'y a pas assez d'espace disponible sur le périphérique de sortie pour l'opération d'écriture.

Le fichier doit être ouvert en utilisant une fonction d'écriture compatible (c'est à dire pas avec ReadFile()).

Le caractère 'NUL' de fin de chaîne n'est pas écrit dans le fichier.

Vous trouverez un exemple d'utilisation avec la commande CreateFile().

Afin d'identifier plus facilement le type d'encodage d'un fichier, utilisez la commande WriteStringFormat() pour écrire un BOM (Byte Order Mark).

Voir aussi

ReadString(), WriteStringN(), WriteStringFormat(), CreateFile(), OpenFile()


WriteStringFormat()

Syntaxe

Resultat = WriteStringFormat(#Fichier, Format)
Description
Ecrit un BOM (Byte Order Mark) à la position courante.

Arguments

#Fichier Le fichier à utiliser.
Format
  #PB_Ascii  : N'écrit aucun BOM (fichier texte standard).
  #PB_UTF8   : Ecrit le BOM UTF-8.
  #PB_Unicode: Ecrit le BOM UTF-16 (little endian).
  #PB_UTF16BE: Ecrit le BOM UTF-16 (big endian).
  #PB_UTF32  : Ecrit le BOM UTF-32 (little endian).
  #PB_UTF32BE: Ecrit le BOM UTF-32 (big endian).
Les constantes #PB_Ascii, #PB_UTF8 et #PB_Unicode correspondent aux options supportés par WriteString() et WriteStringN(). Après avoir placé un BOM, toutes les opérations d'écriture devraient utiliser ce format.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Remarques

En raison de la mise en mémoire tampon, cette fonction peut retourner une valeur avec succès même s'il n'y a pas assez d'espace disponible sur le périphérique de sortie pour l'opération d'écriture.

Le fichier doit être ouvert en utilisant une fonction d'écriture compatible (c'est à dire pas avec ReadFile()).

Le BOM (Byte Order Mark) est un moyen couramment utilisé pour indiquer le type d'encodage d'un fichier texte. Il est habituellement placé au début du fichier. Néanmoins, ce n'est pas un standard ni une norme, mais une pratique courante. Ainsi, si aucun BOM n'est détecté au début du fichier, cela ne veut pas forcément dire qu'il s'agit d'un fichier ASCII. ReadStringFormat() peut être utilisé pour detecter le BOM d'un fichier.

Pour plus d'informations, consulter cet article Wikipedia.
Vous trouverez plus d'informations sur le mode unicode avec PureBasic ici.

Voir aussi

ReadStringFormat(), WriteString(), WriteStringN(), CreateFile(), OpenFile()


WriteStringN()

Syntaxe

Resultat = WriteStringN(#Fichier, Texte$ [, Format])
Description
Ecrit une chaîne de caractères dans un fichier suivie du code 'Fin de Ligne'.

Arguments

#Fichier | Le fichier à utiliser.
Texte$ | Le texte à écrire dans le fichier.
Format (optionnel)
  #PB_Ascii  : Ecrit le texte en ASCII.
  #PB_UTF8   : Ecrit le texte en UTF-8.
  #PB_Unicode: Ecrit le texte en UTF-16.
Si ce paramètre n'est pas spécifié, la chaîne de caractères est écrite au format UTF-8 si le programme est compilé en mode unicode, ou en ASCII sinon.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Remarques

En raison de la mise en mémoire tampon, cette fonction peut retourner une valeur avec succès même s'il n'y a pas assez d'espace disponible sur le périphérique de sortie pour l'opération d'écriture.

Le fichier doit être ouvert en utilisant une fonction d'écriture compatible (c'est à dire pas avec ReadFile()).

Vous trouverez un exemple d'utilisation avec la commande CreateFile().

Afin d'identifier plus facilement le type d'encodage d'un fichier, utilisez la commande WriteStringFormat() pour écrire un BOM (Byte Order Mark).

Voir aussi

ReadString(), WriteString(), WriteStringFormat(), CreateFile(), OpenFile()


WriteUnicodeCharacter()

Syntaxe

Resultat = WriteUnicodeCharacter(#Fichier, Valeur.c)
Description
Ecrit une valeur de type caractère unicode (2 octets).

Arguments

#Fichier | Le fichier à utiliser.
Valeur | La valeur du caractère unicode à écrire.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Remarques

En raison de la mise en mémoire tampon, cette fonction peut retourner une valeur avec succès même s'il n'y a pas assez d'espace disponible sur le périphérique de sortie pour l'opération d'écriture.

Le fichier doit être ouvert en utilisant une fonction d'écriture compatible (c'est à dire pas avec ReadFile()).

Vous trouverez un exemple d'utilisation avec la commande CreateFile() en remplaçant WriteString() par WriteUnicodeCharacter() pour écrire un caractère unicode.

Voir aussi

ReadUnicodeCharacter(), WriteAsciiCharacter(), WriteCharacter(), CreateFile(), OpenFile()


WriteWord()

Syntaxe

Resultat = WriteWord(#Fichier, Valeur)
Description
Ecrit une valeur de type 'word' (2 octets).

Arguments

#Fichier | Le fichier à utiliser.
Valeur | La valeur à écrire.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Remarques

En raison de la mise en mémoire tampon, cette fonction peut retourner une valeur avec succès même s'il n'y a pas assez d'espace disponible sur le périphérique de sortie pour l'opération d'écriture.

Le fichier doit être ouvert en utilisant une fonction d'écriture compatible (c'est à dire pas avec ReadFile()).

Vous trouverez un exemple d'utilisation avec la commande CreateFile() en remplaçant WriteString() par WriteWord() pour écrire un word.

Voir aussi

ReadWord(), CreateFile(), OpenFile()


FileSystem

PureBasic - FileSystem

Généralités

La bibliothèque FileSystem vous permet de manipuler les fichiers et répertoires de vos périphériques de sauvegarde (Lecteurs de disquettes, disques durs, etc...). Vous pourrez par exemple examiner le contenu d'un répertoire, en créer un nouveau, etc...

Si vous voulez examiner le contenu d'un répertoire commencez par la commande ExamineDirectory().

Les chemins des fichiers et des répertoires peuvent être complet ou relatifs. Les chemins relatifs sont interprétés par rapport au répertoire courant du programme. Les fonctions GetCurrentDirectory() et SetCurrentDirectory() peuvent être utilisé pour modifier le répertoire courant.

En complément de cette bibliothèque, vous pourrez manipuler des fichiers avec les commandes de la bibliothèque File.
Pour obtenir le nom du programme en cours, utilisez la commande ProgramFilename() de la bibliothèque Process.

Sommaire des commandes

CheckFilename
CopyDirectory
CopyFile
CreateDirectory
DeleteDirectory
DeleteFile
DirectoryEntryAttributes
DirectoryEntryDate
DirectoryEntryName
DirectoryEntrySize
DirectoryEntryType
ExamineDirectory
FileSize
FinishDirectory
GetCurrentDirectory
GetExtensionPart
GetFileAttributes
GetFileDate
GetFilePart
GetHomeDirectory
GetPathPart
GetTemporaryDirectory
IsDirectory
NextDirectoryEntry
RenameFile
SetCurrentDirectory
SetFileAttributes
SetFileDate

Exemple

FileSystem.pb

OS Supportés

Tous

Guide de référence - Index


CheckFilename()

Syntaxe

Resultat = CheckFilename(NomFichier$)
Description
Vérifie si un nom de fichier ne contient aucun caractère interdit par le système de fichiers.
Par exemple, les caractères '/' et '\' sont interdits sous Windows.

Arguments

NomFichier$ Le nom du fichier à tester sans son chemin.

Valeur de retour

Renvoie une valeur non nulle si le fichier ne contient pas de caractères non valides et zéro si c'est le cas.


CopyDirectory()

Syntaxe

Resultat = CopyDirectory(RepertoireSource$, RepertoireDestination$, Masque$ [, Mode])
Description
Copie le contenu du répertoire source dans le répertoire destination.

Arguments

RepertoireSource$ | Le dossier à copier.
RepertoireDestination$ | Le dossier de destination de la copie.
Masque$ Le masque de copie.
Par exemple: "*.*" copie tous les fichiers situés dans le répertoire.
"*.exe" copie seulement les fichiers .exe.
Par défaut, une chaîne Masque$ vide permet la copie de tous les fichiers.
Mode (optionnel) Peut être une combinaison des valeurs suivantes:
  #PB_FileSystem_Recursive: Copie le répertoire et de tous les sous-répertoires.
  #PB_FileSystem_Force    : Remplace également les fichiers protégés (Lecture seule).

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Remarques

Si le répertoire existe déjà son contenu sera automatiquement écrasé.

La fonction FileSize() peut être utilisée pour déterminer si la cible existe ou non.

Exemple

  Debug CopyDirectory("D:\Games\MyGame\", "D:\Games\Backup\", "", #PB_FileSystem_Recursive)

Voir aussi

CreateDirectory(), ExamineDirectory(), DeleteDirectory()


CopyFile()

Syntaxe

Resultat = CopyFile(NomFichierSource$, NomFichierDestination$)
Description
Copie le fichier source dans le fichier destination.

Arguments

NomFichierSource$ | Le fichier à copier.
NomFichierDestination$ | Le fichier copié.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Remarques

Si le répertoire existe déjà son contenu sera automatiquement écrasé.

La fonction FileSize() peut être utilisée pour déterminer si la cible existe ou non.

Voir aussi

RenameFile(), DeleteFile(), FileSize(), CreateFile(), OpenFile()


CreateDirectory()

Syntaxe

Resultat = CreateDirectory(NomRepertoire$)
Description
Crée un nouveau répertoire.

Arguments

NomRepertoire$ Le nom du nouveau répertoire.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Remarques

Cette fonction échoue si le répertoire parent du nouveau dossier n'existe pas.
Pour créer plusieurs niveaux de répertoires, il suffit d'appeler cette fonction pour chacun d'entre-eux.

Voir aussi

CopyDirectory(), ExamineDirectory(), DeleteDirectory()


DeleteDirectory()

Syntaxe

Resultat = DeleteDirectory(Repertoire$, Masque$ [, Mode])
Description
Efface un répertoire.

Arguments

Repertoire$ Le dossier à détruire. Parameter "Masque$" Le masque de copie.
Par exemple: "*.*" copie tous les fichiers situés dans le répertoire.
"*.exe" copie seulement les fichiers .exe.
Par défaut, une chaîne Masque$ vide permet la copie de tous les fichiers.
Mode (optionnel) Peut être une combinaison des valeurs suivantes:
  #PB_FileSystem_Recursive: Efface le répertoire et tous les sous-répertoires.
  #PB_FileSystem_Force    : Efface également les fichiers protégés (Lecture seule).

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Voir aussi

CreateDirectory(), ExamineDirectory(), CopyDirectory()


DeleteFile()

Syntaxe

Resultat = DeleteFile(NomFichier$)
Description
Supprime un fichier.

Arguments

NomFichier$ Le fichier à supprimer.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Voir aussi

CopyFile(), RenameFile(), FileSize(), CreateFile(), OpenFile()


DirectoryEntryAttributes()

Syntaxe

Attributs = DirectoryEntryAttributes(#Repertoire)
Description
Renvoie les attributs du fichier courant dans le #Repertoire examiné par les fonctions ExamineDirectory() et NextDirectoryEntry().

Arguments

#Directory Le répertoire examiné avec ExamineDirectory().

Valeur de retour

Avec Windows, les attributs sont une combinaison des valeurs suivantes:
  #PB_FileSystem_Hidden    : Fichier caché
  #PB_FileSystem_Archive   : Fichier inchangé et archivé
                             depuis le dernier examen
  #PB_FileSystem_Compressed: Fichier compressé
  #PB_FileSystem_Normal    : Fichier normal
  #PB_FileSystem_ReadOnly  : Fichier en lecture seule
  #PB_FileSystem_System    : Fichier système.
Avec Linux ou MacOSX, les attributs sont une combinaison des valeurs suivantes:
  #PB_FileSystem_Link      : Le fichier est un lien symbolique
  #PB_FileSystem_ReadUser  : Permission d'accès en lecture pour le propriétaire
  #PB_FileSystem_WriteUser : Permission d'accès en écriture pour le propriétaire
  #PB_FileSystem_ExecUser  : Permission d'accès en exécution pour le propriétaire
  #PB_FileSystem_ReadGroup : Permission d'accès en lecture pour les membres du groupe propriétaire
  #PB_FileSystem_WriteGroup: Permission d'accès en écriture pour les membres du groupe propriétaire
  #PB_FileSystem_ExecGroup : Permission d'accès en exécution pour les membres du groupe propriétaire
  #PB_FileSystem_ReadAll   : Permission d'accès en lecture pour les autres utilisateurs
  #PB_FileSystem_WriteAll  : Permission d'accès en écriture pour les autres utilisateurs
  #PB_FileSystem_ExecAll   : Permission d'accès en exécution pour les autres utilisateurs

Remarques

Pour vérifier si un attribut est présent, il suffit d'utiliser l'operateur '&' (And):
  [...]

  Attributs = DirectoryEntryAttributes(#Repertoire)
  If Attributs & #PB_FileSystem_Hidden
    Debug "Fichier caché !"
  EndIf

Voir aussi

ExamineDirectory(),
NextDirectoryEntry(),
DirectoryEntryType(),
DirectoryEntryName(),
DirectoryEntrySize(),
DirectoryEntryDate()


DirectoryEntryDate()

Syntaxe

Resultat = DirectoryEntryDate(#Repertoire, TypeDate)
Description
Renvoie la date du fichier courant dans le #Repertoire examiné par les fonctions ExamineDirectory() et NextDirectoryEntry().

Arguments

#Repertoire Le répertoire examiné avec ExamineDirectory().
TypeDate Peut être une des valeurs suivantes:
  #PB_Date_Created : Renvoie la date de création du fichier.
  #PB_Date_Accessed: Renvoie la date du dernier accès au fichier.
  #PB_Date_Modified: Renvoie la date de la dernière modification du fichier.

Valeur de retour

La date renvoyée est dans le même format que celui utilisé dans la bibliothèque Date, donc toutes les commandes telle que FormatDate() peuvent être utilisées.

Remarques

Sous Linux et Mac OSX, la date de retour pour #PB_Date_Created est la même que la date de #PB_Date_Modified, parce que la plupart des systèmes de fichiers ne stockent pas une date de création du fichier.

Voir aussi

ExamineDirectory(),
NextDirectoryEntry(),
DirectoryEntryType(),
DirectoryEntryName(),
DirectoryEntrySize(),
DirectoryEntryAttributes()


DirectoryEntryName()

Syntaxe

NomFichier$ = DirectoryEntryName(#Repertoire)
Description
Renvoie le nom du fichier courant dans le #Repertoire examiné par les fonctions ExamineDirectory() et NextDirectoryEntry().

Arguments

#Repertoire Le répertoire examiné avec ExamineDirectory().

Valeur de retour

Renvoie le nom du répertoire courant.

Remarques

Les pseudo-répertoires "." et ".." peuvent être retournés dans une énumération de répertoire, de sorte qu'ils doivent être filtrés s'ils ne doivent pas être inclus.

Voir aussi

ExamineDirectory(),
NextDirectoryEntry(),
DirectoryEntryType(),
DirectoryEntrySize(),
DirectoryEntryAttributes(),
DirectoryEntryDate()


DirectoryEntrySize()

Syntaxe

Resultat.q = DirectoryEntrySize(#Repertoire)
Description
Renvoie la taille en octets du fichier courant dans le #Repertoire examiné par les fonctions ExamineDirectory() et NextDirectoryEntry().

Arguments

#Repertoire Le répertoire examiné avec ExamineDirectory().

Valeur de retour

Renvoie la taille de l'entrée du répertoire courant en octets.

Remarques

DirectoryEntrySize() renvoie un quad (8 octets) supportant les tailles de fichier supérieures à 4Go.

Voir aussi

ExamineDirectory(),
NextDirectoryEntry(),
DirectoryEntryType(),
DirectoryEntryName(),
DirectoryEntryAttributes(),
DirectoryEntryDate()


DirectoryEntryType()

Syntaxe

Resultat = DirectoryEntryType(#Repertoire)
Description
Renvoie le type du fichier courant dans le #Repertoire examiné par les fonctions ExamineDirectory() et NextDirectoryEntry().

Arguments

#Repertoire Le répertoire examiné avec ExamineDirectory().

Valeur de retour

  #PB_DirectoryEntry_File     : C'est un fichier.
  #PB_DirectoryEntry_Directory: C'est un répertoire.

Voir aussi

ExamineDirectory(),
NextDirectoryEntry(),
DirectoryEntryName(),
DirectoryEntrySize(),
DirectoryEntryAttributes(),
DirectoryEntryDate()


ExamineDirectory()

Syntaxe

Resultat = ExamineDirectory(#Repertoire, NomRepertoire$, Filtre$)
Description
Examine un répertoire et crée une liste qui peut être ensuite parcourue avec les fonctions NextDirectoryEntry() et DirectoryEntryName().

Arguments

#Repertoire Le numéro qui identifie le listing de fichier.

Si #PB_Any est utilisé pour le paramètre '#Repertoire', le numéro du nouveau répertoire sera renvoyé dans 'Resultat'.
NomRepertoire$ Le dossier à examiner.
Filtre$ Permet de sélectionner quels types de fichiers doivent être retenus.
Par exemple, un 'Filtre$' "*.*" ou "" retiendra tous les fichiers (et sous-dossiers) du répertoire , "*.exe" ne retient que les fichiers dont l'extension est .exe (ou les sous-dossiers se terminant par .exe).

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Si #PB_Any est utilisé pour le paramètre '#Repertoire', le numéro du nouveau répertoire sera renvoyé dans 'Resultat'.

Remarques

Une fois que l'examen du répertoire est terminé, la commande FinishDirectory() doit être appelée pour libérer toutes les ressources associées à ce listing.

Exemple

  Directory$ = "C:\"   ; Énumère le contenu du répertoire C (Les sous-répertoires ne sont pas examinés)
  If ExamineDirectory(0, Directory$, "*.*")
    While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        Type$ = " [Fichier] "
      Else
        Type$ = " [Sous-répertoire] "
      EndIf

      Debug DirectoryEntryName(0) + Type$ + "- Taille en octet : " + Str(DirectoryEntrySize(0))
    Wend
    FinishDirectory(0)
  EndIf

Voir aussi

FinishDirectory(),
NextDirectoryEntry(),
DirectoryEntryType(),
DirectoryEntryName(),
DirectoryEntrySize(),
DirectoryEntryAttributes(),
DirectoryEntryDate()


FileSize()

Syntaxe

Resultat.q = FileSize(NomFichier$)
Description
Renvoie la taille d'un fichier.

Arguments

NomFichier$ Le nom du fichier.

Valeur de retour

Renvoie la taille du fichier en octets ou l'une des valeurs suivantes:
  -1: Fichier inexistant.
  -2: Le fichier est en fait un répertoire.

Voir aussi

DirectoryEntrySize()


FinishDirectory()

Syntaxe

FinishDirectory(#Repertoire)
Description
Termine l'examen du répertoire commencé par ExamineDirectory(). Ceci permet de libérer les ressources associées au listing du #Répertoire.

Arguments

#Repertoire Le répertoire examiné avec ExamineDirectory().

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

ExamineDirectory()


GetCurrentDirectory()

Syntaxe

Resultat$ = GetCurrentDirectory()
Description
Renvoie le chemin du répertoire courant de l'application.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le chemin complet du répertoire courant.
Il se termine par un séparateur de répertoire ('\' sous Windows ou '/' pour les autres OS).

Cette fonction renvoie une chaîne vide dans le cas très improbable d'un échec.

Remarques

Tous les accès aux fichiers sont relatifs à ce répertoire quand un chemin absolu n'est pas spécifié. SetCurrentDirectory() peut être utilisé pour changer le répertoire courant.

Voir aussi

SetCurrentDirectory(),
GetHomeDirectory(),
GetTemporaryDirectory()


GetExtensionPart()

Syntaxe

Extension$ = GetExtensionPart(CheminComplet$)
Description
Extrait l'extension d'un fichier d'après son chemin complet.

Arguments

CheminComplet$ Le chemin d'accès complet au fichier.

Valeur de retour

Renvoie l'extension du fichier.
Par exemple, si le chemin d'accès complet est "C:\PureBasic\PB.exe", le résultat sera "exe".

Remarques

Pour récupérer le nom du fichier ou son chemin, voir les fonctions GetFilePart() et GetPathPart().

Voir aussi

GetFilePart(), GetPathPart()


GetFileAttributes()

Syntaxe

Attributs = GetFileAttributes(NomFichier$)
Description
Renvoie les attributs d'un fichier.

Arguments

NomFichier$ Le fichier à tester.
Cela peut également être le nom d'un répertoire.

Valeur de retour

Renvoie les attributs du fichier.
Si le fichier n'existe pas ou si les attributs du fichier ne peuvent être lus, la commande renvoie -1.

Sur Windows, les attributs sont une combinaison des valeurs suivantes:
  #PB_FileSystem_Hidden    : Fichier caché.
  #PB_FileSystem_Archive   : Fichier inchangé et archivé
                             depuis le dernier test.
  #PB_FileSystem_Compressed: Fichier compressé.
  #PB_FileSystem_Normal    : Fichier normal.
  #PB_FileSystem_ReadOnly  : Fichier en lecture seule.
  #PB_FileSystem_System    : Fichier système.
Sur Linux ou MacOSX, les attributs sont une combinaison des valeurs suivantes:
  #PB_FileSystem_Link      : Le fichier est un lien symbolique
  #PB_FileSystem_ReadUser  : Permission d'accès en lecture pour le propriétaire
  #PB_FileSystem_WriteUser : Permission d'accès en écriture pour le propriétaire
  #PB_FileSystem_ExecUser  : Permission d'accès en exécution pour le propriétaire
  #PB_FileSystem_ReadGroup : Permission d'accès en lecture pour les membres du groupe propriétaire
  #PB_FileSystem_WriteGroup: Permission d'accès en écriture pour les membres du groupe propriétaire
  #PB_FileSystem_ExecGroup : Permission d'accès en exécution pour les membres du groupe propriétaire
  #PB_FileSystem_ReadAll   : Permission d'accès en lecture pour les autres utilisateurs
  #PB_FileSystem_WriteAll  : Permission d'accès en écriture pour les autres utilisateurs
  #PB_FileSystem_ExecAll   : Permission d'accès en exécution pour les autres utilisateurs

Remarques

Pour vérifier si un attribut est présent, il suffit d'utiliser l'operateur '&' (And):
  Attributs = GetFileAttributes("C:\Text.txt")
  If Attributs & #PB_FileSystem_Hidden
    Debug "Fichier caché !"
  EndIf

Exemple

  Attributs.l = GetFileAttributes("c:\autoexec.bat")

  If Attributs = -1
    Debug "Erreur à la lecture des attributs du fichier!"
  Else
    If Attributs & #PB_FileSystem_Hidden     : texte$ + "H" : Else : texte$+"-" : EndIf
    If Attributs & #PB_FileSystem_Archive    : texte$ + "A" : Else : texte$+"-" : EndIf
    If Attributs & #PB_FileSystem_Compressed : texte$ + "C" : Else : texte$+"-" : EndIf
    If Attributs & #PB_FileSystem_Normal     : texte$ + "N" : Else : texte$+"-" : EndIf
    If Attributs & #PB_FileSystem_ReadOnly   : texte$ + "R" : Else : texte$+"-" : EndIf
    If Attributs & #PB_FileSystem_System     : texte$ + "S" : Else : texte$+"-" : EndIf
    Debug texte$
  EndIf

Voir aussi

SetFileAttributes(), DirectoryEntryAttributes()


GetFileDate()

Syntaxe

Resultat = GetFileDate(NomFichier$, TypeDate)
Description
Renvoie la date d'un fichier.

Arguments

NomFichier$ Le fichier à tester.
TypeDate Le type de date:
  #PB_Date_Created : Renvoie la date de création du fichier.
  #PB_Date_Accessed: Renvoie la date du dernier accès au fichier.
  #PB_Date_Modified: Renvoie la date de la dernière modification du fichier.

Valeur de retour

La date renvoyée est dans le même format que celui utilisé dans la bibliothèque Date, donc toutes les commandes telle que FormatDate() peuvent être utilisées.

Remarques

Sous Linux et Mac OSX, la date de retour pour #PB_Date_Created est la même que la date de #PB_Date_Modified, parce que la plupart des systèmes de fichiers ne stockent pas une date de création de fichier.

Voir aussi

SetFileDate(), DirectoryEntryDate()


GetFilePart()

Syntaxe

Fichier$ = GetFilePart(CheminComplet$)
Description
Extrait le nom d'un fichier d'un chemin complet.

Arguments

CheminComplet$ Le chemin d'accès complet au fichier.

Valeur de retour

Renvoie le nom du fichier.
Si, par exemple, la chaîne CheminComplet$ est "C:\PureBasic\PB.exe", la chaîne retournée dans Fichier$ sera "PB.exe".

Remarques

Pour récupérer l'extension ou le chemin, voirz les fonctions GetExtensionPart() et GetPathPart().

Voir aussi

GetExtensionPart(), GetPathPart()


GetHomeDirectory()

Syntaxe

Resultat$ = GetHomeDirectory()
Description
Renvoie le chemin du répertoire racine de l'utilisateur qui est actuellement logué.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le chemin complet du répertoire courant.
Il se termine par un séparateur de répertoire ('\' sous Windows ou '/' pour les autres OS).

Cette fonction renvoie une chaîne vide dans le cas très improbable d'un échec.

Remarques

Ce répertoire a les droits de l'utilisateur, donc il est possible d'y lire et ecrire des fichiers. Il est spécifique à chaque utilisateur et peut donc être utile pour stocker des informations concernant uniquement cet utilisateur (fichiers de préférences, plugins etc.).

Voir aussi

GetCurrentDirectory(), GetTemporaryDirectory()


GetPathPart()

Syntaxe

Chemin$ = GetPathPart(FullPathName$)
Description
Extrait le chemin d'un fichier d'un chemin complet.

Arguments

CheminComplet$ Le chemin d'accès complet au fichier.

Valeur de retour

Renvoie le chemin.
Si, par exemple, la chaîne CheminComplet$ est "C:\PureBasic\PB.exe", la chaîne retournée dans Chemin$ sera "C:\PureBasic\".

Remarques

Pour récupérer l'extension ou le nom du fichier, voir les fonctions GetExtensionPart() et GetFilePart().

Voir aussi

GetExtensionPart(), GetFilePart()


GetTemporaryDirectory()

Syntaxe

Resultat$ = GetTemporaryDirectory()
Description
Renvoie le chemin du répertoire temporaire.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le chemin complet et le nom du répertoire temporaire.
Il se termine par un séparateur de répertoire ('\' sous Windows ou '/' pour les autres OS).

Cette fonction renvoie une chaîne vide dans le cas très improbable d'un échec.

Remarques

Ce répertoire a les droits de l'utilisateur, donc il est possible d'y lire et ecrire des fichiers. Il est spécifique à chaque utilisateur et peut donc être utile pour stocker des informations concernant uniquement cet utilisateur (fichiers de préférences, plugins etc.).

Voir aussi

GetCurrentDirectory(), GetHomeDirectory()


IsDirectory()

Syntaxe

Resultat = IsDirectory(#Repertoire)
Description
Teste si un listing est correctement initialisé.

Arguments

#Repertoire Le dossier à tester.

Valeur de retour

Si le 'Résultat' est différent de zéro alors cet objet est valide.

Remarques

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.

C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

ExamineDirectory()


NextDirectoryEntry()

Syntaxe

Resultat = NextDirectoryEntry(#Repertoire)
Description
Cette fonction doit être appelée à la suite de ExamineDirectory(). Elle examine à la suite chaque entrée de la liste du répertoire.

Arguments

#Repertoire Le dossier à examiner avec ExamineDirectory()

Valeur de retour

Renvoie une valeur non nulle si une nouvelle entrée a été lue ou zéro s'il n'y a pas d'entrée supplémentaire.

Remarques

Le type, le nom, la taille, la date et les attributs du fichier ou sous-répertoire correspondant à l'entrée peuvent être obtenus grâce aux fonctions DirectoryEntryType(), DirectoryEntryName(), DirectoryEntrySize(), DirectoryEntryDate() et DirectoryEntryAttributes().

Voir aussi

ExamineDirectory(),
DirectoryEntryType(),
DirectoryEntryName(),
DirectoryEntrySize(),
DirectoryEntryAttributes(),
DirectoryEntryDate()


RenameFile()

Syntaxe

Resultat = RenameFile(AncienNom$, NouveauNom$)
Description
Renomme un fichier

Arguments

AncienNom$ | L'ancien nom du fichier.
NouveauNom$ | Le nouveau nom du fichier.

Valeur de retour

Renvoie une valeur non nulle en cas de succès ou zéro sinon.

Remarques

L'ancien et le nouveau nom de fichier ne doivent pas être dans le même répertoire, cette fonction peut être utilisée pour déplacer un fichier vers un autre répertoire. Cette fonction peut également être utilisée pour renommer / déplacer des répertoires.

Exemple

  RenameFile("C:\Temp\Test.txt", "C:\Temp\TestNew.txt")    ; Renomme le fichier Test.txt du répertoire Temp
  RenameFile("C:\Temp\", "C:\TempNew\")                    ; Renomme le répertoire Temp en TempNew
Il est également possible de déplacer un fichier et de le renommer en utilisant deux répertoires différents (ou disques) comme paramètres.

Exemple

  If RenameFile("C:\test.txt", "D:\temp\test_backup.txt")
    Debug "Fichier déplacé et renommé avec succès."
  Else
    Debug "Echec, le fichier ne peut pas être renommé et déplacé." ; Echec si par exemple le fichier (ou le disque) n'existe pas.
  EndIf

Voir aussi

CopyFile(), DeleteFile(), CreateFile(), CopyDirectory()


SetCurrentDirectory()

Syntaxe

Resultat = SetCurrentDirectory(Repertoire$)
Description
Change le répertoire courant de l'application.

Arguments

Repertoire$ Le chemin complet vers le nouveau répertoire courant, ou un chemin relatif au répertoire courant.

Valeur de retour

Renvoie une valeur non nulle si le répertoire courant a été changé avec succès, ou zéro sinon.

Remarques

Tous les accès aux fichiers sont relatifs à ce répertoire quand un chemin absolu n'est pas spécifié. GetCurrentDirectory() peut être utilisé pour récupérer le répertoire courant.

Voir aussi

GetCurrentDirectory()


SetFileAttributes()

Syntaxe

Resultat = SetFileAttributes(NomFichier$, Attributs)
Description
Change les attributs d'un fichier.

Arguments

NomFichier$ Le nom du fichier à utiliser.
Cela peut-être un répertoire.
Attributs Les nouveaux attributs.

Sur Windows, les attributs sont une combinaison de:
  #PB_FileSystem_Hidden    : Fichier caché.
  #PB_FileSystem_Archive   : Fichier inchangé et archivé
                             depuis le dernier test.
  #PB_FileSystem_Compressed: Fichier compressé.
  #PB_FileSystem_Normal    : Fichier normal.
  #PB_FileSystem_ReadOnly  : Fichier en lecture seule.
  #PB_FileSystem_System    : Fichier système.
Sur Linux ou MacOSX, les attributs sont une combinaison de:
  #PB_FileSystem_ReadUser  : Permission d'accès en lecture pour le propriétaire
  #PB_FileSystem_WriteUser : Permission d'accès en écriture pour le propriétaire
  #PB_FileSystem_ExecUser  : Permission d'accès en exécution pour le propriétaire
  #PB_FileSystem_ReadGroup : Permission d'accès en lecture pour les membres du groupe propriétaire
  #PB_FileSystem_WriteGroup: Permission d'accès en écriture pour les membres du groupe propriétaire
  #PB_FileSystem_ExecGroup : Permission d'accès en exécution pour les membres du groupe propriétaire
  #PB_FileSystem_ReadAll   : Permission d'accès en lecture pour les autres utilisateurs
  #PB_FileSystem_WriteAll  : Permission d'accès en écriture pour les autres utilisateurs
  #PB_FileSystem_ExecAll   : Permission d'accès en exécution pour les autres utilisateurs

Remarques

Pour combiner plusieurs attributs, il suffit d'utiliser l'operateur '|' (Ou):
  SetFileAttributes("C:\Text.txt", #PB_FileSystem_Hidden | #PB_FileSystem_ReadOnly)

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro autrement.

Voir aussi

GetFileAttributes()


SetFileDate()

Syntaxe

Resultat = SetFileDate(NomFichier$, TypeDate, Date)
Description
Change la date d'un fichier.

Arguments

NomFichier$ | Le fichier à utiliser.
TypeDate Le type de date à modifier:
  #PB_Date_Created : Change la date de création du fichier.
  #PB_Date_Accessed: Change la date du dernier accès au fichier.
  #PB_Date_Modified: Change la date de la dernière modification du fichier.
Date | La nouvelle date. Ce doit être une valeur de la bibliothèque Date.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro autrement.

Remarques

La date est dans le même format que celui utilisé dans la bibliothèque Date, donc toutes les commandes telle que FormatDate() peuvent être utilisées.

Voir aussi

GetFileDate()


Font

PureBasic - Font

Généralités

Les polices de caractères sont largement utilisées sur les systèmes d'exploitation graphiques. Elles permettent d'agrémenter les textes avec différentes tailles et formes de polices.

Note: En PureBasic, les polices de caractères colorées ne sont pas encore supportées. Il est néanmoins possible de contourner cette limitation en utilisant les commandes StartDrawing() et dessiner directement sur la surface souhaitée.

Sommaire des commandes

FontID
FreeFont
IsFont
LoadFont

Exemple

Font.pb

OS Supportés

Tous

Guide de référence - Index


FontID()

Syntaxe

PoliceID = FontID(#Police)
Description
Renvoie l'identifiant unique d'une police dans le système d'exploitation.

Arguments

#Police Le numéro de la police à tester.

Valeur de retour

Renvoie le numéro de la police

Exemple

  If OpenWindow(0, 0, 0, 222, 130, "FontID()", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0, 10, 10, 200, 30, "Cliquez pour changer la police...")
    Font1 = LoadFont(#PB_Any, "Arial"  ,  8, #PB_Font_Bold)
    Font2 = LoadFont(#PB_Any, "Verdana", 12, #PB_Font_StrikeOut)
    UsedFont = 1
  EndIf

  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_Gadget
      If EventGadget() = 0
        If UsedFont = 1
          SetGadgetFont(0, FontID(Font2))
          UsedFont = 2
        Else
          SetGadgetFont(0, FontID(Font1))
          UsedFont = 1
        EndIf
      EndIf
    EndIf
  Until Event = #PB_Event_CloseWindow

Voir aussi

IsFont(),
LoadFont(),
SetGadgetFont(),
DrawingFont()


FreeFont()

Syntaxe

FreeFont(#Police)
Description
Libère une police.

Arguments

#Police Le numéro de la police à libérer.

Si #PB_All est spécifié, toutes les polices restantes seront libérées.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Toutes les polices restantes sont automatiquement libérées quand le programme se termine.

Voir aussi

LoadFont()


IsFont()

Syntaxe

Resultat = IsFont(#Police)
Description
Teste si une police est correctement initialisée.

Arguments

#Police Le numéro de la police à tester.

Valeur de retour

Si le 'Résultat' est différent de zéro alors la police est utilisable.

Remarques

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.

C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

FontID(), LoadFont()


LoadFont()

Syntaxe

Resultat = LoadFont(#Police, NomPolice$, Taille [, Options])
Description
Charge une police de caractère.

Arguments

#Police Le numéro de la police.

Si #PB_Any est utilisé pour le paramètre '#Police', le numéro de la nouvelle police sera renvoyé dans 'Resultat'.
NomPolice$ | Le nom de la police.
Taille | Taille de la police.
Options (optionnel) Peut être une combinaison de:
  #PB_Font_Bold       : La police de caractère sera en gras
  #PB_Font_Italic     : La police de caractère sera en italique
  #PB_Font_Underline  : La police de caractère sera soulignée
  #PB_Font_StrikeOut  : La police de caractère sera barrée
  #PB_Font_HighQuality: La police de caractère sera en qualité supérieure (plus lent)
Note: Seuls #PB_Font_Bold et #PB_Font_Italic sont supportées sur tous les OS. Les autres constantes sont spécifiques à Windows.

Valeur de retour

Si 'Resultat' est égal à zéro alors la création de la police a échoué. #Police est le numéro d'identification de la police.

Remarques

Si une autre police de caractère était déjà chargé avec le même numéro de #Police, elle sera automatiquement fermée lors du chargement de la nouvelle.

Sous Microsoft Windows, le gestionnaire de police de caractères essaiera toujours de trouver une police équivalente à celle demandée, si cette dernière n'est pas disponible. Par exemple, si vous essayez de charger la police "Tim Now Ronin" et qu'elle n'existe pas, une autre police sera chargée automatiquement, en fonction de sa taille, du style etc. Il est donc peu probable que cette commande échoue.

Exemple

   If OpenWindow(0, 0, 0, 270, 160, "Chargement police...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If LoadFont(1, "Arial", 24)
      SetGadgetFont(#PB_Default, FontID(1))
      TextGadget(0, 10, 10, 250, 40, "Arial 24")
    EndIf
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

FreeFont(), FontID()


Ftp

PureBasic - Ftp

Généralités

Le Ftp (File Transfer Protocol) est un moyen de partage de fichiers basé sur le modèle client-serveur en réseau. Cette bibliothèque implémente la partie client du Ftp, qui permet de se connecter à un serveur distant et de manipuler les fichiers disponibles (téléchargement, envoi, renommage, etc.).

Toutes les commandes Ftp sont basées sur la bibliothèque network, donc InitNetwork() doit être appelé avant de pouvoir les utiliser.

Sommaire des commandes

AbortFTPFile
CheckFTPConnection
CloseFTP
CreateFTPDirectory
DeleteFTPDirectory
DeleteFTPFile
ExamineFTPDirectory
FTPDirectoryEntryAttributes
FTPDirectoryEntryDate
FTPDirectoryEntryName
FTPDirectoryEntryRaw
FTPDirectoryEntrySize
FTPDirectoryEntryType
FTPProgress
FinishFTPDirectory
GetFTPDirectory
IsFtp
NextFTPDirectoryEntry
OpenFTP
ReceiveFTPFile
RenameFTPFile
SendFTPFile
SetFTPDirectory

Exemple

Ftp.pb

OS Supportés

Tous

Guide de référence - Index


AbortFTPFile()

Syntaxe

AbortFTPFile(#Ftp)
Description
Annule le transfert en cours, préalablement initié avec SendFTPFile() ou ReceiveFTPFile().

Arguments

#Ftp La connexion FTP à utiliser.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Si aucun transfert n'est en cours, cette fonction n'a aucun effet.

Voir aussi

SendFTPFile(), ReceiveFTPFile(), FTPProgress()


CheckFTPConnection()

Syntaxe

Resultat = CheckFTPConnection(#Ftp)
Description
Vérifie qu'une connexion Ftp est toujours connectée au serveur distant.

Arguments

#Ftp La connexion FTP à utiliser.

Valeur de retour

Renvoie une valeur non nulle si la connexion est toujours ouverte et zéro si le serveur a fermé la connexion.

Voir aussi

OpenFTP()


CloseFTP()

Syntaxe

CloseFTP(#Ftp)
Description
Ferme une connexion Ftp préalablement ouverte avec OpenFTP() et libère les ressources associées.

Arguments

#Ftp La connexion FTP à utiliser.

Si #PB_All est spécifié, toutes les connexions FTP restantes seront fermées.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Toutes les connexions FTP restantes sont automatiquement fermées quand le programme se termine.

Voir aussi

OpenFTP(), IsFtp()


CreateFTPDirectory()

Syntaxe

Resultat = CreateFTPDirectory(#Ftp, Repertoire$)
Description
Crée un nouveau répertoire sur le serveur Ftp.

Arguments

#Ftp La connexion FTP à utiliser.
Repertoire$ Le nom du dossier à créer.

Le nouveau répertoire sera créé dans le répertoire courant (voir GetFTPDirectory() et SetFTPDirectory()).
Il n'est pas possible de spécifier un chemin dans le nom du 'Repertoire$'.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi ou zéro si elle a échoué.

Voir aussi

DeleteFTPDirectory(), SetFTPDirectory(), GetFTPDirectory()


DeleteFTPDirectory()

Syntaxe

Resultat = DeleteFTPDirectory(#Ftp, Repertoire$)
Description
Efface un répertoire d'un serveur Ftp.

Arguments

#Ftp La connexion FTP à utiliser.
Repertoire$ Le nom du dossier à supprimer.

Le répertoire doit se trouver dans le répertoire courant (voir GetFTPDirectory() et SetFTPDirectory()). Il n'est pas possible de spécifier un chemin dans le nom du 'Repertoire$'.

Le répertoire doit être vide ou la suppression échouera.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi ou zéro si elle a échoué.

Voir aussi

CreateFTPDirectory(), SetFTPDirectory(), GetFTPDirectory()


DeleteFTPFile()

Syntaxe

Resultat = DeleteFTPFile(#Ftp, Fichier$)
Description
Efface un fichier du serveur Ftp.

Arguments

#Ftp La connexion FTP à utiliser.
Fichier$ Le fichier à détruire.

Le fichier doit se trouver dans le répertoire courant (voir GetFTPDirectory() et SetFTPDirectory()).
Il n'est pas possible de spécifier un chemin dans le nom du 'Fichier$'.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi ou zéro si elle a échoué.

Voir aussi

SendFTPFile(), SetFTPDirectory(), GetFTPDirectory()


ExamineFTPDirectory()

Syntaxe

Resultat = ExamineFTPDirectory(#Ftp)
Description
Examine le contenu du répertoire Ftp courant.

Arguments

#Ftp La connexion FTP à utiliser.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi ou zéro si elle a échoué.

Remarques

Pour le moment, seuls les serveurs de type unix sont supportés. Le protocole FTP ne spécifie pas formellement comment la liste des fichiers doit être retournée, donc chaque serveur peut potentiellement la renvoyer sous une forme spécifique. Heureusement, la plupart des serveurs Ftp dans le monde fonctionnent sous unix/linux, et utilisent la même convention pour lister un répertoire. Ceci dit, il n'est pas garanti que cette commande fonctionne avec tous les serveurs. Elle sera mise à jour au fur et à mesure des besoins pour supporter un plus grand nombre de serveurs. Si le serveur n'est pas correctement supporté, il est possible d'utiliser FTPDirectoryEntryRaw() pour récupérer l'information brute de chaque élément.

La liste crée peut être ensuite parcourue avec les fonctions NextFTPDirectoryEntry(), FTPDirectoryEntryName(), FTPDirectoryEntryType(), FTPDirectoryEntryAttributes(), FTPDirectoryEntryDate() et FTPDirectoryEntrySize().

Pour changer le répertoire courant, utilisez SetFTPDirectory().

Une fois que l'examen du répertoire est terminé, il faut appeler FinishFTPDirectory() pour libérer les ressources associées.

Exemple

  InitNetwork()

  If OpenFTP(0, "ftp.free.fr", "anonymous", "")
    If ExamineFTPDirectory(0)
      While NextFTPDirectoryEntry(0)
        Debug FTPDirectoryEntryName(0)
      Wend
    EndIf
  Else
    Debug "Connexion avec ftp.free.fr impossible"
  EndIf

Voir aussi

NextFTPDirectoryEntry(), FinishFTPDirectory()


FTPDirectoryEntryAttributes()

Syntaxe

Attributs = FTPDirectoryEntryAttributes(#Ftp)
Description
Renvoie l'attribut du fichier courant sur le Ftp, pendant un examen avec ExamineFTPDirectory() et NextFTPDirectoryEntry().

Arguments

#Ftp La connexion FTP à utiliser.

Valeur de retour

Renvoie une combinaison de:
  #PB_FTP_ReadUser  : Droits d'accès pour l'utilisateur
  #PB_FTP_WriteUser
  #PB_FTP_ExecuteUser
  #PB_FTP_ReadGroup : Droits d'accès pour le groupe
  #PB_FTP_WriteGroup
  #PB_FTP_ExecuteGroup
  #PB_FTP_ReadAll   : Droits d'accès pour le reste des utilisateurs
  #PB_FTP_WriteAll
  #PB_FTP_ExecuteAll

Remarques

Pour tester si un attribut est présent, il convient d'utiliser '&' (ET binaire) et la constante de l'attribut.

Exemple

  [...]

  FileAttributes = FTPDirectoryEntryAttributes(#Ftp)
  If FileAttributes & #PB_FTP_ReadUser
    Debug "Ce fichier à le droit de lecture pour l'utilisateur"
  EndIf

Voir aussi

ExamineFTPDirectory(),
NextFTPDirectoryEntry(),
FTPDirectoryEntryType(),
FTPDirectoryEntryName(),
FTPDirectoryEntryDate(),
FTPDirectoryEntrySize(),
FTPDirectoryEntryRaw()


FTPDirectoryEntryDate()

Syntaxe

Resultat = FTPDirectoryEntryDate(#Ftp)
Description
Renvoie la date du fichier courant sur le Ftp en cours d'examen avec ExamineFTPDirectory() et NextFTPDirectoryEntry().

Arguments

#Ftp La connexion FTP à utiliser.

Valeur de retour

Renvoie la date du fichier.
La date est dans le même format que celui utilisé dans la bibliothèque Date, donc toutes les commandes s'y rapportant comme FormatDate() sont utilisables.

Voir aussi

ExamineFTPDirectory(),
NextFTPDirectoryEntry(),
FTPDirectoryEntryType(),
FTPDirectoryEntryName(),
FTPDirectoryEntrySize(),
FTPDirectoryEntryRaw(),
FTPDirectoryEntryAttributes()


FTPDirectoryEntryName()

Syntaxe

NomFichier$ = FTPDirectoryEntryName(#Ftp)
Description
Renvoie le nom du fichier courant sur le Ftp en cours d'examen avec ExamineFTPDirectory() et NextFTPDirectoryEntry().

Arguments

#Ftp La connexion FTP à utiliser.

Valeur de retour

Renvoie le nom du fichier.

Voir aussi

ExamineFTPDirectory(),
NextFTPDirectoryEntry(),
FTPDirectoryEntryType(),
FTPDirectoryEntryDate(),
FTPDirectoryEntrySize(),
FTPDirectoryEntryRaw(),
FTPDirectoryEntryAttributes()


FTPDirectoryEntryRaw()

Syntaxe

Element$ = FTPDirectoryEntryRaw(#Ftp)
Description
Renvoie la ligne brute de l'élément courant sur le Ftp en cours d'examen avec ExamineFTPDirectory() et NextFTPDirectoryEntry(), comme il a été envoyé par le serveur FTP. Cela peut être utile quand le serveur n'est pas correctement supporté par ExamineFTPDirectory(): les informations concernant le contenu du répertoire pourront quand même être reçues et analysées manuellement.

Arguments

#Ftp La connexion FTP à utiliser.

Valeur de retour

Renvoie la ligne d'entrée comme envoyée par le serveur FTP.

Exemple

  InitNetwork()

  If OpenFTP(0, "ftp.free.fr", "anonymous", "")
    If ExamineFTPDirectory(0)
      While NextFTPDirectoryEntry(0)
        Debug FTPDirectoryEntryRaw(0)
      Wend
    EndIf
  Else
    Debug "Connexion avec ftp.free.fr impossible"
  EndIf

Voir aussi

ExamineFTPDirectory(),
NextFTPDirectoryEntry(),
FTPDirectoryEntryType(),
FTPDirectoryEntryName(),
FTPDirectoryEntryDate(),
FTPDirectoryEntrySize(),
FTPDirectoryEntryAttributes()


FTPDirectoryEntrySize()

Syntaxe

Taille = FTPDirectoryEntrySize(#Ftp)
Description
Renvoie la taille du fichier courant sur le Ftp en cours d'examen avec ExamineFTPDirectory() et NextFTPDirectoryEntry().

Arguments

#Ftp La connexion FTP à utiliser.

Valeur de retour

Renvoie la taille en octets.

Voir aussi

ExamineFTPDirectory(),
NextFTPDirectoryEntry(),
FTPDirectoryEntryType(),
FTPDirectoryEntryName(),
FTPDirectoryEntryDate(),
FTPDirectoryEntryRaw(),
FTPDirectoryEntryAttributes()


FTPDirectoryEntryType()

Syntaxe

Resultat = FTPDirectoryEntryType(#Ftp)
Description
Renvoie le type de l'élément courant sur le #Ftp en cours d'examen avec ExamineFTPDirectory() et NextFTPDirectoryEntry().

Arguments

#Ftp La connexion FTP à utiliser.

Valeur de retour

Peut être une des valeurs suivantes:
  #PB_FTP_File     : L'élément est un fichier.
  #PB_FTP_Directory: L'élément est un répertoire.

Voir aussi

ExamineFTPDirectory(),
NextFTPDirectoryEntry(),
FTPDirectoryEntryName(),
FTPDirectoryEntryDate(),
FTPDirectoryEntrySize(),
FTPDirectoryEntryRaw(),
FTPDirectoryEntryAttributes()


FTPProgress()

Syntaxe

Resultat = FTPProgress(#Ftp)
Description
Renvoie la progression du fichier en cours de transfert Ftp, démarré avec ReceiveFTPFile() ou SendFTPFile().

Arguments

#Ftp La connexion FTP à utiliser.

Valeur de retour

Renvoie le nombre d'octets qui ont été reçus ou émis, ou l'une des valeurs suivantes:
  #PB_FTP_Started : Le transfert de fichier est dans la phase d'initialisation.
  #PB_FTP_Finished: Le transfert de fichier s'est terminé correctement.
  #PB_FTP_Error   : Le transfert de fichier a été interrompu car une erreur est survenue.

Voir aussi

SendFTPFile(), ReceiveFTPFile(), AbortFTPFile()


FinishFTPDirectory()

Syntaxe

FinishFTPDirectory(#Ftp)
Description
Termine l'énumération préalablement commencé avec ExamineFTPDirectory().

Arguments

#Ftp La connexion FTP à utiliser.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Permet de libérer les ressources allouées lors de l'examen du répertoire.

Voir aussi

ExamineFTPDirectory()


GetFTPDirectory()

Syntaxe

Resultat$ = GetFTPDirectory(#Ftp)
Description
Renvoie le répertoire Ftp courant.

Arguments

#Ftp La connexion FTP à utiliser.

Valeur de retour

Renvoie le répertoire Ftp courant relatif à la racine du compte Ftp.

Remarques

Pour modifier le répertoire courant, voir SetFTPDirectory().

Voir aussi

SetFTPDirectory(), ExamineFTPDirectory(), SendFTPFile(), ReceiveFTPFile()


IsFtp()

Syntaxe

Resultat = IsFtp(#Ftp)
Description
Teste si une connexion Ftp est correctement initialisé.

Arguments

#Ftp La connexion FTP à utiliser.

Valeur de retour

Renvoie une valeur non nulle si le nombre donné est une connexion client valide et correctement initialisée.

Remarques

Cette fonction a été conçue pour accepter n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.
C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

OpenFTP(), CloseFTP(), CheckFTPConnection()


NextFTPDirectoryEntry()

Syntaxe

Resultat = NextFTPDirectoryEntry(#Ftp)
Description
Permet de passer au fichier suivant lors de l'examen d'un répertoire Ftp avec ExamineFTPDirectory().

Arguments

#Ftp La connexion FTP à utiliser.

Valeur de retour

Renvoie une valeur non nulle si l'entrée suivante est disponible ou zéro s'il n'y a pas d'entrée supplémentaire à examiner.

Remarques

Le nom du fichier est disponible avec la commande FTPDirectoryEntryName().
Pour savoir si l'élément est un fichier ou un répertoire, utiliser FTPDirectoryEntryType().

Voir aussi

ExamineFTPDirectory(),
FTPDirectoryEntryType(),
FTPDirectoryEntryName(),
FTPDirectoryEntryDate(),
FTPDirectoryEntrySize(),
FTPDirectoryEntryRaw(),
FTPDirectoryEntryAttributes()


OpenFTP()

Syntaxe

Resultat = OpenFTP(#Ftp, NomServeur$, Utilisateur$, MotDePasse$ [, Passif [, Port]])
Description
Ouvre une connexion sur un serveur Ftp.

Arguments

#Ftp La connexion FTP à utiliser.

Si #PB_Any est utilisé pour le paramètre '#Ftp', le numéro de la nouvelle connexion ftp sera renvoyé dans 'Resultat'.
NomServeur$ | L'URL ou l'adresse du server Ftp.
Utilisateur$ | Le nom d'utilisateur pour l'authentification sur le serveur.
MotDePasse$ | Le mot de passe pour l'authentification sur le serveur.
Passif (optionnel) Active ou désactive le mode passif pour la connexion (les valeurs valides sont #True ou #False).

Si ce paramètre n'est pas spécifié, le mode passif sera utilisé.
Port (optionnel) Le port à utiliser pour la connexion.

La valeur par défaut est le port 21.

Valeur de retour

Renvoie une valeur non nulle si la connexion a été établie correctement ou zéro sinon.

Si #PB_Any est utilisé pour le paramètre '#Ftp', le numéro de la nouvelle connexion ftp sera renvoyé dans 'Resultat'.

Remarques

Les commandes Ftp sont basées sur la bibliothèque network, donc InitNetwork() doit être appelé avant de pouvoir les utiliser.

Par défaut, la connexion sera ouverte en mode passif, car c'est la façon la plus compatible (la plupart des ordinateurs ont un firewall qui n'acceptera pas les connexions actives). Le port par défaut est 21, mais il peut être modifié à l'aide du pamètre 'Port'.

Pour les serveurs ftp publics, 'Utilisateur$' sera "anonymous" et le 'MotDePasse$' sera vide.

Exemple

  InitNetwork()

  If OpenFTP(0, "ftp.free.fr", "anonymous", "")
    Debug "Connecté avec succès"
  Else
    Debug "Impossible de se connecter à ftp.free.fr"
  EndIf

Voir aussi

CloseFTP(), SetFTPDirectory(), ReceiveFTPFile(), SendFTPFile(), ExamineFTPDirectory()


ReceiveFTPFile()

Syntaxe

Resultat = ReceiveFTPFile(#Ftp, FichierDistant$, Fichier$ [, Asynchrone])
Description
Télécharge un fichier depuis un serveur Ftp.

Arguments

#Ftp La connexion FTP à utiliser.
FichierDistant$ Le nom du fichier à télécharger.

Le 'FichierDistant$' doit être dans le répertoire courant (voir GetFTPDirectory() et SetFTPDirectory()).
Fichier$ Le nom que prend le fichier une fois enregistré en local.

Si le nom de fichier ne comporte pas de chemin d'accès complet, il est interprété par rapport au répertoire courant.

Si le fichier existe, il sera écrasé.
Asynchrone (optionnel)
  #True : Le téléchargement sera effectué en arrière-plan.
  #False: Valeur par défaut, le téléchargement est synchrone
Par défaut le téléchargement est synchrone et bloque l'exécution du programme jusqu'à ce que le fichier soit complètement arrivé. Le mode 'Asynchrone' permet de lancer le téléchargement en tâche de fond, et FTPProgress() permet de suivre sa progression. Un transfert asynchrone peut être arrêté avec AbortFTPFile(). Un seul fichier peut être reçu ou envoyé (voir SendFTPFile()) à la fois.

Valeur de retour

Renvoie une valeur non nulle si le fichier a été téléchargé correctement ou le transfert asynchrone a été initialisé correctement.
En cas d'échec, le valeur de retour est zéro.

Remarques

Un seul fichier peut être téléchargé ou uploadé (voir SendFTPFile()) à la fois et en arrière-plan .

Voir aussi

SendFTPFile(), SetFTPDirectory(), GetFTPDirectory(), FTPProgress(), AbortFTPFile()


RenameFTPFile()

Syntaxe

Resultat = RenameFTPFile(#Ftp, Fichier$, NouveauNomFichier$)
Description
Renomme un fichier sur le serveur Ftp.

Arguments

#Ftp La connexion FTP à utiliser.
Fichier$ Le fichier à renommer.

Il doit être dans le répertoire courant (voir GetFTPDirectory() et SetFTPDirectory()).

Il n'est pas possible de spécifier un chemin dans le nom du 'Fichier$'
NouveauNomFichier$ Le fichier renommé.

Il doit être dans le répertoire courant (voir GetFTPDirectory() et SetFTPDirectory()).

Il n'est pas possible de spécifier un chemin dans le nom du 'NouveauNomFichier$'

Valeur de retour

Renvoie une valeur non nulle si le fichier a été renommé avec succès ou zéro sinon.

Voir aussi

SendFTPFile(), SetFTPDirectory(), GetFTPDirectory(),


SendFTPFile()

Syntaxe

Resultat = SendFTPFile(#Ftp, Fichier$, FichierDistant$ [, Asynchrone])
Description
Envoie un fichier sur un serveur Ftp.

Arguments

#Ftp La connexion FTP à utiliser.
Fichier$ Le nom du fichier à envoyer.

Si le nom de fichier ne comporte pas de chemin d'accès complet, il est interprété par rapport au répertoire courant.
FichierDistant$ Le nom de fichier distant.

Il doit être dans le répertoire courant (voir GetFTPDirectory() et SetFTPDirectory()).
Asynchrone (optionnel)
  #True : Le téléchargement sera effectué en arrière-plan.
  #False: Valeur par défaut, le téléchargement est synchrone
Par défaut le téléchargement est synchrone et bloque l'exécution du programme jusqu'à ce que le fichier soit complètement arrivé. Le mode 'Asynchrone' permet de lancer le téléchargement en tâche de fond, et FTPProgress() permet de suivre sa progression. Un transfert asynchrone peut être arrêté avec AbortFTPFile(). Un seul fichier peut être reçu ou envoyé (voir SendFTPFile()) à la fois.

Valeur de retour

Renvoie une valeur non nulle si le fichier a été téléchargé correctement ou le transfert asynchrone a été initialisé correctement.
En cas d'échec, le valeur de retour est zéro.

Remarques

Un seul fichier peut être téléchargé ou uploadé (voir ReceiveFTPFile()) à la fois et en arrière-plan .

Voir aussi

ReceiveFTPFile(), SetFTPDirectory(), GetFTPDirectory(), FTPProgress(), AbortFTPFile()


SetFTPDirectory()

Syntaxe

Resultat = SetFTPDirectory(#Ftp, Repertoire$)
Description
Change le répertoire courant du Ftp, relativement au répertoire courant.

Arguments

#Ftp La connexion FTP à utiliser.
Repertoire$ Le nouveau répertoire.
Ce paramètre doit correspondre à un répertoire dans le répertoire courant du FTP.
Le chemins imbriqués ne sont pas autorisés donc pour changer de plusieurs niveaux de répertoire, il faut appeler cette commande plusieurs fois de suite.
Utilisez la valeur ".." pour revenir vers le répertoire parent du répertoire courant.

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi ou zéro si elle a échoué.

Remarques

Pour obtenir le répertoire courant FTP, voir GetFTPDirectory().

Exemple

  InitNetwork()

  If OpenFTP(0, "ftp.free.fr", "anonymous", "")

    Debug "Connecté au serveur"

    If SetFTPDirectory(0, "pub")
      If SetFTPDirectory(0, "linux")
        Debug "Changement de repertoire: '/pub/linux'"
        Debug GetFTPDirectory(0)
      Else
        Debug "Changement de repertoire impossible: '/pub/linux'"
      EndIf
    Else
      Debug "Changement de repertoire impossible: 'pub'"
    EndIf

  Else
    Debug "Impossible de se connecter à ftp.free.fr"
  EndIf

Voir aussi

GetFTPDirectory(), ExamineFTPDirectory(), SendFTPFile(), ReceiveFTPFile()


Gadget

PureBasic - Gadget

Généralités

En PureBasic, un Gadget est un nom générique donné pour tous les composants de l'interface graphique d'un programme : boutons, listes d'éléments, cases à cocher, boîtes à onglets, etc...

Cette bibliothèque est indépendante du système d'exploitation utilisé (OS). Elle utilise les composants de l'Interface Graphique Utilisateur (GUI) de chaque système.

Avant d'utiliser les gadgets, normalement vous aurez au préalable ouvert une fenêtre, d'autre part pour la création d'une interface utilisateurs vous pouvez aussi utiliser un menu, une barre d'outils et une barre d'états.

Si #PB_Any est utilisé pour créer un gadget, alors la commande renvoie le numéro du gadget créé (appelé #Gadget dans cette bibliothèque).
Si une autre valeur que #PB_Any est utilisée pour identifier le gadget, alors la commande renvoie l'identifiant OS du gadget créé.

Les identifiants (aussi appelés handles) peuvent être utilisés pour les autres commandes de PureBasic, aussi bien que pour les commandes de l'API Windows comme SendMessage_() etc.
Pour plus d'informations référez vous au chapitre Numéros et identifiants.

Sommaire des commandes

AddGadgetColumn
AddGadgetItem
ButtonGadget
ButtonImageGadget
CalendarGadget
CanvasGadget
CanvasOutput
CheckBoxGadget
ClearGadgetItems
CloseGadgetList
ComboBoxGadget
ContainerGadget
CountGadgetItems
DateGadget
DisableGadget
EditorGadget
ExplorerComboGadget
ExplorerListGadget
ExplorerTreeGadget
Frame3DGadget
FreeGadget
GadgetHeight
GadgetID
GadgetItemID
GadgetToolTip
GadgetType
GadgetWidth
GadgetX
GadgetY
GetActiveGadget
GetGadgetAttribute
GetGadgetColor
GetGadgetData
GetGadgetFont
GetGadgetItemAttribute
GetGadgetItemColor
GetGadgetItemData
GetGadgetItemState
GetGadgetItemText
GetGadgetState
GetGadgetText
HideGadget
HyperLinkGadget
IPAddressGadget
ImageGadget
IsGadget
ListIconGadget
ListViewGadget
MDIGadget
OpenGadgetList
OptionGadget
PanelGadget
ProgressBarGadget
RemoveGadgetColumn
RemoveGadgetItem
ResizeGadget
ScrollAreaGadget
ScrollBarGadget
SetActiveGadget
SetGadgetAttribute
SetGadgetColor
SetGadgetData
SetGadgetFont
SetGadgetItemAttribute
SetGadgetItemColor
SetGadgetItemData
SetGadgetItemImage
SetGadgetItemState
SetGadgetItemText
SetGadgetState
SetGadgetText
ShortcutGadget
SpinGadget
SplitterGadget
StringGadget
TextGadget
TrackBarGadget
TreeGadget
UseGadgetList
WebGadget
WebGadgetPath (Dépréciée)

Exemple

Gadget.pb
GadgetAdvanced.pb
GadgetSplitter.pb
GadgetSplitterAdvanced.pb
MDI_ImageViewer.pb
WebBrowser.pb

OS Supportés

Tous

Guide de référence - Index


AddGadgetColumn()

Syntaxe

AddGadgetColumn(#Gadget, Position, Titre$, Largeur)
Description
Ajoute une colonne à un gadget.

Arguments

#Gadget | Le gadget à utiliser.
Position Le numéro de colonne où sera inséré la nouvelle colonne.

La première colonne commence à la position 0 (la colonne la plus à gauche), puis on augmente de 1 pour chaque colonne à droite.

Lorsque vous insérez une colonne, toutes les anciennes colonnes qui se trouvent à droite de la nouvelle auront une position augmentée de 1 (mise à jour automatique de leur position).
Titre$ | Texte de l'en-tête de la colonne.
Largeur | La largeur initiale de la colonne.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Les gadgets supportant cette commande sont:
- ListIconGadget()
- ExplorerListGadget()

Cette commande permet de paramétrer complètement l'affichage d'un ExplorerListGadget(), soit en retirant les colonnes standards à l'aide de RemoveGadgetColumn() et en ajoutant celles de votre choix.
A noter que la colonne 'Nom des fichiers' (#PB_Explorer_Name) n'a pas à être obligatoirement en première position.

Les constantes suivantes sont disponibles à la place du Titre$ pour créer une colonne prédéfinie (qui sera rafraîchie automatiquement par le gadget):
  #PB_Explorer_Name      : Affiche le nom du fichier (ou répertoire)
  #PB_Explorer_Size      : Affiche la taille du fichier (en Ko)
  #PB_Explorer_Type      : Affiche le type du fichier
  #PB_Explorer_Attributes: Affiche les attributs du fichier (ou répertoire)
  #PB_Explorer_Created   : Affiche la date de création du fichier (ou répertoire)
  #PB_Explorer_Modified  : Affiche la date de dernière modification du fichier (ou répertoire)
  #PB_Explorer_Accessed  : Affiche la date du dernier accès au fichier (ou répertoire)

Note 1
Pour remettre à jour le contenu du gadget (pour rafraîchir l'affichage), il convient d'utiliser SetGadgetText().

Note 2
Pour remplir une colonne personnalisée (qui n'est pas parmi les colonnes supportées nativement par le gadget), utilisez SetGadgetItemText() pour chaque élément, dès qu'un évènement du type #PB_EventType_Change est détecté.

Exemple

  ;Liste avec icônes - Ajoute des colonnes
  If OpenWindow(0, 0, 0, 400, 150, "AddGadgetColumn", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ListIconGadget(0, 10, 10, 380, 100, "Colonne standard", 150, #PB_ListIcon_GridLines)
    ButtonGadget(1, 10, 120, 150, 20, "Ajouter une nouvelle colonne")
    index = 1     ; La "colonne standard" a déjà l'index 0
    Repeat
      Evenement = WaitWindowEvent()
      If Evenement = #PB_Event_Gadget
        If EventGadget() = 1
          AddGadgetColumn(0, index, "Colonne "+Str(index), 80)
          index + 1
        EndIf
      EndIf
    Until Evenement = #PB_Event_CloseWindow
  EndIf


AddGadgetItem()

Syntaxe

Resultat = AddGadgetItem(#Gadget, Position, Texte$ [, ImageID [, Options]])
Description
Ajoute un élément à un gadget.

Arguments

#Gadget Le gadget à utiliser.
Position La position ou l'index du nouvel élément.

Pour ajouter un élément au début, utilisez la valeur 0.
Pour ajouter un élément à la fin de la liste des éléments en cours, utilisez la valeur -1.
N'oubliez pas que lorsque vous insérez un nouvel élément entre deux éléments existant, la position de chaque élément de droite est augmentée de 1.

Pour le MDIGadget() ce paramètre spécifie le numéro de la nouvelle fenêtre fille. PB_Any # peut être utilisé, dans ce cas, la valeur de retour sera le nouveau numéro attribué par PB.
Texte$ Le texte du nouvel élément.
Lorsque vous ajoutez un élément à un ListIconGadget(), ce paramètre peut contenir le texte pour plusieurs colonnes séparées par un caractère Chr (10).
ImageID (optionnel) Le numéro d'une image (icône) à afficher à côté de l'élément inséré.
La taille conseillée de l'image est de 16x16 pixels.

'ImageID' peut être récupéré facilement grâce à la commande ImageID().
Options (optionnel) Ce paramètre n'est utilisable qu'avec les gadgets suivants:

TreeGadget()
Ce paramètre spécifie le sous-niveau du nouvel item.
Si le sous-niveau est supérieur à celui de l'item précédent, le nouvel item devient l'enfant de celui-ci.
S'il est inférieur, il sera ajouté après le parent de l'élément précédent.
MDIGadget()
Ce paramètre peut être utilisé pour spécifier les options de la nouvelle fenêtre (voir OpenWindow()).
Les options #PB_Window_Borderless, #PB_Window_Screencentered et #PB_Window_WindowCentered ne sont pas prises en charge pour les fenêtres MDI. Autrement dit, pour le MDIGadget() la syntaxe peut se présenter ainsi :
AddGadgetItem(#MDI, #Fenetre, Titre$ [, ImageID [, Options]])

Valeur de retour

La valeur de retour est uniquement valable qu'avec le MDIGadget(). Si #PB_Any a été utilisé à la place de 'Position' lors de l'ajout d'un élément à la MDIGadget(), la valeur de retour est le numéro d'identification de la nouvelle fenêtre MDI.

Remarques

Les gadgets supportant cette commande sont:
  - ComboBoxGadget(): Support de l'ImageID si l'option #PB_ComboBox_Image
                      est spécifiée.
  - EditorGadget()
  - ListViewGadget()
  - ListIconGadget(): Support de l'ImageID.
  - MDIGadget()     : Si l'ImageID est une icône, elle sera affichée dans la barre
                      de titre de la fenêtre fille.
  - PanelGadget()   : Support de l'ImageID.
  - TreeGadget()    : Support de l'ImageID. Le paramètre 'Position' est ignoré.

Voir aussi

RemoveGadgetItem(), ClearGadgetItems(), CountGadgetItems(), ComboBoxGadget(), ListIconGadget(), ListViewGadget(), MDIGadget(), PanelGadget(), TreeGadget()


ButtonGadget()

Syntaxe

Resultat = ButtonGadget(#Gadget, x, y, Largeur, Hauteur, Texte$ [, Options])
Description
Crée un bouton dans la GadgetList en cours.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur Les coordonnées et la position du bouton dans la fenêtre.
Note: Sur OS X, utiliser une hauteur de 25 activera un bouton avec une hauteur fixe, ce qui est couramment utilisé dans les applications OS X. Il activera également l'option #PB_Button_Default.
Texte$ Le texte qui sera affiché dans le bouton.
Options (optionnel) Peut être une combinaison des constantes suivantes:
  #PB_Button_Right    : Aligne le texte du bouton à droite (non supporté sous Mac OSX).
  #PB_Button_Left     : Aligne le texte du bouton à gauche (non supporté sous Mac OSX).
  #PB_Button_Default  : Définit le bouton comme bouton par défaut (sur OS X, la hauteur du bouton doit être 25).
  #PB_Button_MultiLine: Affiche le texte sur plusieurs lignes s'il est trop long (non supporté sous Mac OSX).
  #PB_Button_Toggle   : Crée un bouton de type 'Toogle' (bascule). Ce bouton alterne l'état 'appuyé' et 'normal'.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  Les commandes suivantes peuvent être utilisées pour agir sur le gadget:
  - SetGadgetText(): Change le texte affiché par le bouton.
  - GetGadgetText(): Renvoie le texte affiché par le bouton.

  Utile avec les boutons bascules (#PB_Button_Toggle)
  - SetGadgetState():  Changer d'état (1 = pressé, 0 = normal).
  - GetGadgetState():  Renvoie l'état (1 = pressé, 0 = normal).
Pour Window uniquement:
Vous pouvez utiliser le caractère '&' pour souligner une lettre particulière dans le 'Texte$'du bouton : "&Bouton" affichera : Bouton
(Note: Sous Windows XP, le support des thèmes d'affichages peut empêcher le caractère souligné de s'afficher.)

Vous pouvez associer un raccourci clavier au bouton avec la commande AddKeyboardShortcut().

Exemple

  ; Démonstration des options possibles pour le gadget bouton
  ;
  If OpenWindow(0, 0, 0, 222, 200, "ButtonGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0, 10,  10, 200, 20, "Bouton standard")
    ButtonGadget(1, 10,  40, 200, 20, "Texte aligné à gauche", #PB_Button_Left)
    ButtonGadget(2, 10,  70, 200, 20, "Texte aligné à droite", #PB_Button_Right)
    ButtonGadget(3, 10, 100, 200, 60, "Texte sur plusieurs lignes (les textes longs retournent automatiquement à la ligne)", #PB_Button_MultiLine)
    ButtonGadget(4, 10, 170, 200, 20, "Bouton à bascule", #PB_Button_Toggle)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

SetGadgetText(), GetGadgetText(), SetGadgetState(), GetGadgetState(), ButtonImageGadget()


ButtonImageGadget()

Syntaxe

Resultat = ButtonImageGadget(#Gadget, x, y, Largeur, Hauteur, ImageID [, Options])
Description
Crée un bouton avec image dans la GadgetList en cours.

Arguments

#Gadget Le numéro du nouveau gadget.

PB_Any # peut être utilisé pour générer automatiquement ce numéro.
x, y, Largeur, Hauteur | La position et les dimensions du nouveau gadget.
ImageID Le numéro d'identification de l'image du gadget.

Utilisez la fonction ImageID() pour obtenir ce numéro.

Ce paramètre peut être égal à zéro pour créer un bouton sans image.

La fonction SetGadgetAttribute() peut être utilisée pour modifier l'image plus tard.
Options (optionnel) | #PB_Button_Toggle crée un bouton à bascule (garde son état ON/OFF) qui alterne l'état 'appuyé' et 'normal'.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé à la place de #Gadget, alors la valeur de retour est le numéro du gadget, généré automatiquement.

Remarques

   - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  Les fonctions suivantes peuvent être utilisées pour contrôler le gadget:
  - GetGadgetAttribute() avec une des valeurs suivantes:
    #PB_Button_Image       : Renvoie l'identifiant de l'image du bouton.
    #PB_Button_PressedImage: Renvoie l'identifiant de l'image du bouton lorsqu'il est enfoncé.

  - SetGadgetAttribute() avec une des valeurs suivantes:
    #PB_Button_Image       : Change l'image du bouton.
    #PB_Button_PressedImage: Change l'image du bouton lorsqu'il est enfoncé.

Bouton à bascule: Option #PB_Button_Toggle
  - SetGadgetState():  Changer d'état (1 = pressé, 0 = normal).
  - GetGadgetState():  Renvoie l'état (1 = pressé, 0 = normal).

Exemple

  If OpenWindow(0, 0, 0, 160, 100, "ButtonImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If LoadImage(0, "map.bmp")    ; changez le 2ème paramètre en indiquant le chemin/fichier contenant votre image
      ButtonImageGadget(0, 10, 10, 100, 83, ImageID(0))
    EndIf
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetState(), SetGadgetState(), GetGadgetAttribute(), SetGadgetAttribute(), ButtonGadget(), ImageID(), EventGadget()


CalendarGadget()

Syntaxe

Resultat = CalendarGadget(#Gadget, x, y, Largeur, Hauteur [, Date [, Option]])
Description
Crée un gadget de type calendrier dans la GadgetLits en cours.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur | La position et les dimensions du nouveau gadget.
Date (optionnel) La date initiale à définir.
La valeur par défaut est la date du jour.
Option (optionnel) | #PB_Calendar_Borderless : Créer un gadget sans bordure.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

La date utilisée par ce gadget est identique à celle utilisée dans la bibliothèque Date.
  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  Les commandes suivantes peuvent être utilisées pour agir sur le gadget :
  - SetGadgetState(): Change la date actuellement affichée.
  - GetGadgetState(): Renvoie la date actuellement affichée.

  - SetGadgetItemState(): Fait apparaître une date donnée en gras (Windows seulement).
  - GetGadgetItemState(): Détermine si une date donnée est en gras (Windows seulement).

  - SetGadgetAttribute() avec les attributs suivants:
    #PB_Calendar_Minimum: Change la date minimale que l'utilisateur peut choisir
    #PB_Calendar_Maximum: Change la date maximale que l'utilisateur peut choisir avec ce gadget

  - GetGadgetAttribute() avec les attributs suivants:
    #PB_Calendar_Minimum: Renvoie la date minimale que l'utilisateur peut choisir
    #PB_Calendar_Maximum: Renvoie la date maximale que l'utilisateur peut choisir avec ce gadget

  - SetGadgetColor() et GetGadgetColor() avec les constantes suivantes comme 'TypeCouleur':
    #PB_Gadget_BackColor      : Couleur de fond
    #PB_Gadget_FrontColor     : Couleur du texte pour les jours affichés
    #PB_Gadget_TitleBackColor : Couleur du fond du titre du mois
    #PB_Gadget_TitleFrontColor: Couleur du texte du titre du mois
    #PB_Gadget_GrayTextColor  : Couleur du texte pour les jours n'appartenant pas au mois courant.

Exemple

  If OpenWindow(0, 0, 0, 220, 200, "CalendarGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CalendarGadget(0, 10, 10, 200, 180)
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

SetGadgetState(), GetGadgetState(), SetGadgetItemState(), GetGadgetItemState(), SetGadgetAttribute(), GetGadgetAttribute(),
SetGadgetColor(), GetGadgetColor(),
DateGadget(), Date(), FormatDate()


CanvasGadget()

Syntaxe

Resultat = CanvasGadget(#Gadget, x, y, Largeur, Hauteur [, Options])
Description
Crée un canvas dans la GadgetList en cours.

Ce gadget offre une surface de dessin et d'événements pour la souris et le clavier dans le but de créer facilement des affichages personnalisées.

Arguments

#Gadget Numéro d'identification du canvas.

#PB_Any peut être utilisé pour générer ce numéro.

x, y, Largeur, Hauteur Position et dimensions du canvas.
Options (optionnel) Combinaison des constantes suivantes:
  #PB_Canvas_Border   : Trace une bordure autour du gadget.

  #PB_Canvas_ClipMouse: Capture automatiquement la souris dans la zone
                        du gadget tant qu'un bouton de la souris est appuyé.
                        (Non supporté par OSX).

  #PB_Canvas_DrawFocus: Dessine un rectangle de focus sur le gadget s'il a le focus clavier.

  #PB_Canvas_Keyboard : Reçoit le focus du clavier ainsi que les événements clavier.
                        Avec cette option, utilisez les événements #PB_EventType_Focus
                        et #PB_EventType_LostFocus pour identifier le gadget qui a le focus.
                        Une autre façon de savoir si le canvas a le focus, est l'utilisation de #PB_Canvas_DrawFocus
                        qui dessine un rectangle de focus chaque fois qu'il a le focus.

Valeur de retour

Renvoie une valeur non nulle en cas de succès ou une valeur nulle en cas d'échec.

Si #PB_Any a été utilisé alors la valeur retournée est son numéro d'dentification en cas de succès.

Remarques

- Le gadget apparaît comme un simple fond blanc.

- Utilisez la commande CanvasOutput() pour dessiner sur le canvas.

- Le contenu reste persistant jusqu'à ce qu'il soit effacé par une opération de dessin.

- Il n'est pas nécessaire de redessiner le contenu à chaque fois qu'un événement #PB_Event_Repaint est reçu.

.:Evènements:.

Le canvas renvoie les types d'événements EventType() suivant:
Connaitre l'état du canvas: GetGadgetAttribute() avec les options suivantes:

  #PB_EventType_MouseEnter      : Le curseur de la souris est entré dans le gadget
  #PB_EventType_MouseLeave      : Le curseur de la souris est sorti du gadget
  #PB_EventType_MouseMove       : Le curseur de la souris a bougé
  #PB_EventType_MouseWheel(*)   : La molette de la souris a bougé

  #PB_EventType_LeftButtonDown  : Le bouton gauche de la souris a été pressé
  #PB_EventType_LeftButtonUp    : Le bouton gauche de la souris a été relâché
  #PB_EventType_LeftClick       : Un clic avec le bouton gauche de la souris
  #PB_EventType_LeftDoubleClick : Un double-clic avec le bouton gauche de la souris
  #PB_EventType_RightButtonDown : Le bouton droit de la souris a été pressé
  #PB_EventType_RightButtonUp   : Le bouton droit de la souris a été relâché
  #PB_EventType_RightClick      : Un clic avec le bouton droit de la souris
  #PB_EventType_RightDoubleClick: Un double-clic avec le bouton droit de la souris
  #PB_EventType_MiddleButtonDown: Le bouton central de la souris a été pressé
  #PB_EventType_MiddleButtonUp  : Le bouton central de la souris a été relâché

  #PB_EventType_Focus           : Le gadget a obtenu le focus clavier
  #PB_EventType_LostFocus       : Le gadget a perdu le focus clavier
  #PB_EventType_KeyDown(*)      : Une touche clavier a été pressée
  #PB_EventType_KeyUp(*)        : Une touche clavier a été relâchée
  #PB_EventType_Input(*)        : Du texte a été entré dans le gadget

  (*)    Les événements #PB_EventType_KeyDown, #PB_EventType_KeyUp
         et #PB_EventType_Input sont renvoyés seulement si le gadget
         a le focus clavier (Voir l'option #PB_Canvas_Keyboard).

         Avec Windows, l'événement #PB_EventType_MouseWheel est renvoyé seulement
         si le gadget a le focus clavier. Avec les autres OS, cet événement est renvoyé au gadget
         sous le curseur, qu'il ait le focus clavier ou non.

.:Attributs:. Les connaître.

  - GetGadgetAttribute() permet de connaître les attributs du canvas avec les options suivantes:
Souris:
  - #PB_Canvas_MouseX    : Renvoie les coordonnées de la souris dans la zone de dessin du canvas
  - #PB_Canvas_MouseY    : au moment où l'événement a été généré.
                           Note: Le résultat peut être différent des coordonnées envoyées par WindowMouseX() et par
                                 WindowMouseY() qui elles, renvoient l'emplacement actuel de la souris indépendamment des
                                 événements.

  - #PB_Canvas_Buttons   : Renvoie l'état des boutons de la souris.
                           Peut être une combinaison de:
                             #PB_Canvas_LeftButton  : Le bouton de gauche est actuellement enfoncé.
                             #PB_Canvas_RightButton : Le bouton de droite est actuellement enfoncé.
                             #PB_Canvas_MiddleButton: Le bouton du milieu est actuellement enfoncé.

  - #PB_Canvas_WheelDelta: Renvoie le mouvement de la molette de la souris par multiple de 1 ou -1.
                           Une valeur positive indique que la roue a été tournée vers le haut (en l'éloignant de
                           l'utilisateur) et une valeur négative indique que la roue a été déplacée vers le bas
                           (vers l'utilisateur).
                           Cet attribut est à 0 si l'événement en cours n'est pas un événement #PB_EventType_MouseWheel.

  - #PB_Canvas_Clip      : Renvoie une valeur non nulle si la souris est confinée dans le canvas, zéro sinon.

  - #PB_Canvas_Cursor    : Renvoie le curseur qui est actuellement utilisé dans le gadget.
                           Voir ci-dessous pour obtenir une liste des valeurs possibles.
                           Si le gadget utilise un handle de curseur personnalisé, la valeur retournée est -1.

  - #PB_Canvas_CustomCursor: Renvoie le handle personnalisé du curseur qui a été défini à l'aide de SetGadgetAttribute().
                             Si le gadget utilise un curseur standard, la valeur retournée est zéro.
Clavier:
   - #PB_Canvas_Modifiers: Renvoie l'état des touches de contrôle du clavier.
                           Peut être une combinaison de:
                             #PB_Canvas_Shift  : La touche 'Shift' est actuellement pressée.
                             #PB_Canvas_Alt    : La touche 'alt' est actuellement pressée.
                             #PB_Canvas_Control: La touche 'Control' est actuellement pressée.
                             #PB_Canvas_Command: La touche 'command' (ou "pomme") est actuellement pressée. (Mac OSX seulement)

  - #PB_Canvas_Key  : Renvoie la touche du clavier qui a été enfoncée ou relâchée après un
                      événement #PB_EventType_KeyDown ou un événement #PB_EventType_KeyUp et
                      la valeur retournée est l'une des constantes #PB_Shortcut_ ... qui
                      sont utilisées par la fonction AddKeyboardShortcut().
                      Note: Cet attribut renvoie la première touche préssée.
                      Note: Pour obtenir un texte saisie au clavier dans le Canvasgadget,
                            il est préférable d'utiliser l'événement #PB_EventType_Input
                            avec l'attribut #PB_Canvas_Input, car il permet la saisie de
                            texte à partir d'une combinaison de plusieurs touches telles
                            que la touche 'Shift' et autres touches muettes.

  - #PB_Canvas_Input: Renvoie le caractère qui a été généré par une ou plusieurs touches.
                      Cet attribut n'est présent qu'après un événement #PB_EventType_Input.
                      La valeur du caractère retournée peut être convertie en une chaîne
                      de caractère en utilisant la fonction Chr().
Image:
  - #PB_Canvas_Image: Renvoie un ImageID, valeur qui représente le numéro d'une image avec
                      le contenu actuel du CanvasGadget.
                      Cette valeur peut être utilisée pour dessiner le contenu du gadget
                      vers une autre surface de dessin en utilisant la fonction DrawImage().
                      Note: La valeur retournée est valable uniquement jusqu'à
                            l'apparition d'une modification apportée au gadget comme le
                            redimensionnement ou un changement dans le dessin, donc elle
                            ne devrait être utilisée directement que dans une commande de
                            type DrawImage() et ne pas être stockée pour une utilisation future.
Attention: Ces informations ne sont disponibles que si l'événement courant reçu par WaitWindowEvent() ou WindowEvent() provient d'un canvas.

.:Attributs:. Les modifier.

  - SetGadgetAttribute() permet de changer les attributs du canvas avec les options suivantes:
Souris:
  - #PB_Canvas_Clip: Une valeur non nulle et le mouvement du curseur de la souris sera confiné à la zone du canvas gadget.
                     Avec une valeur nulle, cela supprime le confinement.
                     Note: Le confinement de la souris doit être uniquement le résultat direct de
                           l'action de l'utilisateur sur le canvas, comme un clic de souris par exemple,
                           et il faut prendre soin de bien enlever le confinement à nouveau, sinon
                           l'utilisateur sera emprisonné à l'intérieur du gadget.
                     L'option #PB_Canvas_ClipMouse peut être utilisée pour automatiquement
                     capturer/relâcher la souris lorsque l'utilisateur appuie ou relâche le bouton
                     de la souris dans le canvas.

  - #PB_Canvas_Cursor: Change le curseur lorsque la souris survole le gadget.
                       Les valeurs suivantes sont possibles:
                         #PB_Cursor_Default   : Flèche du curseur par défaut
                         #PB_Cursor_Cross     : Curseur en forme de croix
                         #PB_Cursor_IBeam     : Barre d'insertion 'I' utilisée pour la sélection de texte
                         #PB_Cursor_Hand      : Curseur main
                         #PB_Cursor_Busy      : Curseur sablier ou une montre
                         #PB_Cursor_Denied    : Curseur cercle barré ou curseur X
                         #PB_Cursor_Arrows    : Flèches dans toutes les directions (non disponible sur Mac OSX)
                         #PB_Cursor_LeftRight : Flèches gauche et droite
                         #PB_Cursor_UpDown    : Flèches haut et bas
                         #PB_Cursor_LeftUpRightDown: Flèches diagonales (Windows uniquement)
                         #PB_Cursor_LeftDownRightUp: Flèches diagonales (Windowsuniquement)
                         #PB_Cursor_Invisible      : Cache le curseur

  - #PB_Canvas_CustomCursor: Change le curseur lorsque la souris survole le gadget en un curseur
                             personnalisé créé en utilisant l'API de l'OS correspondant.

                             Le type attendu est:
                               Avec Windows: Un handle HCURSOR
                               Avec Linux  : Un pointeur GtkCursor
                               Avec Mac OSX: Un pointer vers une structure Curseur
Image:
  - #PB_Canvas_Image: Applique l'ImageID au CanvasGadget.
                      Le gadget fait une copie de l'image d'entrée afin qu'elle puisse être
                      libérée ou réutilisée après cet appel.
                      Utiliser cet attribut revient à utiliser StartDrawing(),
                      CanvasOutput() et DrawImage() pour dessiner l'image sur le CanvasGadget.

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

Exemple

  If OpenWindow(0, 0, 0, 220, 220, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CanvasGadget(0, 10, 10, 200, 200)

    Repeat
      Event = WaitWindowEvent()

      If Event = #PB_Event_Gadget And EventGadget() = 0
        If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
          If StartDrawing(CanvasOutput(0))
            x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
            y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
            Circle(x, y, 10, RGB(Random(255), Random(255), Random(255)))
            StopDrawing()
          EndIf
        EndIf
      EndIf

    Until Event = #PB_Event_CloseWindow
  EndIf

Exemple

CanvasGadget.pb

Voir aussi

CanvasOutput(), GetGadgetAttribute(), SetGadgetAttribute(), EventType(), StartDrawing()


CanvasOutput()

Syntaxe

OutputID = CanvasOutput(#Gadget)
Description
Renvoie le numéro d'identification OutputID d'un CanvasGadget pour effectuer l'opération de rendu 2D.

Arguments

#Gadget Spécifie le gadget. Ce doit être un CanvasGadget().

Valeur de retour

Renvoie l'identifiant ouputID ou zéro si le dessin n'est pas possible.

Cette valeur doit être transmise directement à la fonction StartDrawing() pour lancer l'opération de dessin.

La valeur de retour n'est valable que pour une seule opération de dessin et ne peut pas être réutilisée.

Exemple

  ...
  StartDrawing(CanvasOutput(#Gadget))
    ; faire des trucs de dessin ici ...
  StopDrawing()

Remarques

Le dessin sur un CanvasGadget() utilise un double tampon. Cela signifie que les opérations de dessin ne deviennent visibles qu'après la commande StopDrawing() pour éviter un effet de scintillement pendant le rendu.

Voir aussi

StartDrawing(), CanvasGadget()


CheckBoxGadget()

Syntaxe

Resultat = CheckBoxGadget(#Gadget, x, y, Largeur, Hauteur, Texte$ [, Options])
Description
Crée un gadget case à cocher dans la GadgetList en cours.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur | La position et les dimensions du nouveau gadget.
Texte$ | Le texte à afficher à côté de la case, il est placé à sa droite.
Options (optionnel) Peut être une combinaison de:
  #PB_CheckBox_Right     : Aligne le texte de la case à cocher à droite.
  #PB_CheckBox_Center    : Centre le texte de la case à cocher.
  #PB_CheckBox_ThreeState: Crée une case à cocher qui peut avoir trois états (dont un état intermédiaire).
L'option #PB_CheckBox_ThreeState permet à une case à cocher de représenter l'état de plusieurs élements. L'état indéterminé (ni coché, ni décoché) indique alors que certains éléments sont dans un état différent des autres. En cliquant sur la case à cocher, l'utilisateur peut alors les remettre tous dans le même état, soit coché, soit décoché. L'état indéterminé peut donc uniquement être activé à l'aide de SetGadgetState().

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  - GetGadgetState() est utilisé pour récupérer l'état du gadget.
  - SetGadgetState() est utilisé pour changer l'état du gadget.

Exemple

  If OpenWindow(0, 0, 0, 270, 160, "CheckBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CheckBoxGadget(0, 10,  10, 250, 20, "Case à cocher standard")
    CheckBoxGadget(1, 10,  40, 250, 20, "Case à cocher (cochée)") : SetGadgetState(1, #PB_Checkbox_Checked)
    CheckBoxGadget(2, 10,  70, 250, 20, "Case à cocher à trois états", #PB_CheckBox_ThreeState) : SetGadgetState(2, #PB_Checkbox_Inbetween)
    CheckBoxGadget(3, 10, 100, 250, 20, "Case à cocher (texte aligné à droite)", #PB_CheckBox_Right)
    CheckBoxGadget(4, 10, 130, 250, 20, "Case à cocher (texte centré)", #PB_CheckBox_Center)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetState(), SetGadgetState(), OptionGadget()


ClearGadgetItems()

Syntaxe

ClearGadgetItems(#Gadget)
Description
Supprime tous les éléments d'un gadget.

Arguments

#Gadget Le gadget à nettoyer.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le gadget doit être de l'un des types suivants :
  - ComboBoxGadget()
  - EditorGadget()
  - ListViewGadget()
  - MDIGadget()
  - PanelGadget()
  - ListIconGadget()
  - TreeGadget()

Exemple

  If OpenWindow(0, 0, 0, 260, 150, "ClearGadgetItems", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ListViewGadget(0,10,10,240,100)
    For a = 1 To 10 : AddGadgetItem (0, -1, "Elément "+Str(a)) : Next    ; ajoute 10 éléments
    ButtonGadget(1, 10, 120, 200, 20, "Supprimer le contenu de la boîte de liste")
    Repeat
      Evenement = WaitWindowEvent()
      If Evenement = #PB_Event_Gadget
        If EventGadget() = 1
          ClearGadgetItems(0)
        EndIf
      EndIf
    Until Evenement = #PB_Event_CloseWindow
  EndIf

Voir aussi

AddGadgetItem(), RemoveGadgetItem(), CountGadgetItems()


CloseGadgetList()

Syntaxe

CloseGadgetList()
Description
Ferme la liste de gadgets courante et revient à la précédente.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

  C'est particulièrement utile pour les gadgets suivants:
    - ContainerGadget()
    - PanelGadget()
    - ScrollAreaGadget()

Voir aussi

OpenGadgetList(), ContainerGadget(), PanelGadget(), ScrollAreaGadget()


ComboBoxGadget()

Syntaxe

Resultat = ComboBoxGadget(#Gadget, x, y, Largeur, Hauteur [, Options])
Description
Crée un gadget Liste déroulante dans la GadgetList en cours.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur La position et les dimensions du nouveau gadget.
Options (optionnel) Peut être une combinaison de:
  #PB_ComboBox_Editable : Rend la liste déroulante éditable
  #PB_ComboBox_LowerCase: Tous les textes entrés dans la combobox sont convertis en minuscules
  #PB_ComboBox_UpperCase: Tous les textes entrés dans la combobox sont convertis en majuscules
  #PB_ComboBox_Image    : Active le support des images dans les éléments (sauf ComboBox éditables sous MacOS X)

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  - AddGadgetItem()     : Ajoute un élément
  - CountGadgetItems()  : Renvoie le nombre d'éléments que contient le ComboBox.
  - ClearGadgetItems()  : Supprime tous les éléments
  - RemoveGadgetItem()  : Supprime un élément

  - SetGadgetItemText() : Change le texte de l'élément spécifié
  - GetGadgetItemText() : Renvoie le texte de l'élément spécifié

  - SetGadgetItemImage(): Change l'image associée au gadget (doit être créé avec l'option #PB_ComboBox_Image).

  - SetGadgetState()    : Change l'élément sélectionné.
  - GetGadgetState()    : Récupère l'index de l'élément sélectionné.

  - SetGadgetText()     : Change le texte affiché. Si le ComboBoxGadget n'est pas éditable, le texte doit être dans la liste déroulante.
  - GetGadgetText()     : Renvoie le contenu texte de la zone visible de la ComboBox.

  - SetGadgetItemData() : Associe une valeur personnalisée à cet élément.
  - GetGadgetItemData() : Renvoie la valeur personnalisée associée à cet élément.
ComboBoxGadget prend en charge les événements suivants, voir EventType():
  #PB_EventType_Change   : La sélection du texte dans le champ d'édition a changé.
  #PB_EventType_Focus    : Le champ d'édition a reçu le focus clavier (ComboBox modifiable uniquement).
  #PB_EventType_LostFocus: Le champ d'édition a perdu le focus du clavier (ComboBox modifiable uniquement).

Exemple

  UsePNGImageDecoder()
  LoadImage(0, #PB_Compiler_Home + "examples/sources/Data/world.png")

  If OpenWindow(0, 0, 0, 270, 180, "ComboBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ComboBoxGadget(0, 10, 10, 250, 21, #PB_ComboBox_Editable)
      AddGadgetItem(0, -1, "Liste déroulante éditable...")

    ComboBoxGadget(1, 10, 40, 250, 21, #PB_ComboBox_Image)
      AddGadgetItem(1, -1, "Liste déroulante avec une image", ImageID(0))

    ComboBoxGadget(2, 10, 70, 250, 21)
      For a = 1 To 5
        AddGadgetItem(2, -1,"Elément de liste déroulante " + Str(a))
      Next

    SetGadgetState(0, 0)
    SetGadgetState(1, 0)
    SetGadgetState(2, 2) ; Sélectionne le troisième élément (la numérotation commence à 0)

    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

AddGadgetItem(), RemoveGadgetItem(), CountGadgetItems(), ClearGadgetItems(),
GetGadgetState(), SetGadgetState(), GetGadgetText(), SetGadgetText(), SetGadgetItemImage(),
GetGadgetItemText(), SetGadgetItemText(),
GetGadgetItemData(), SetGadgetItemData(), ExplorerComboGadget()


ContainerGadget()

Syntaxe

Resultat = ContainerGadget(#Gadget, x, y, Largeur, Hauteur [, Options])
Description
Crée un nouveau gadget-container qui est un simple panneau destiné à contenir d'autres gadgets.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur La position et les dimensions du nouveau gadget.
Options (optionnel) Peut être une combinaison de:
  #PB_Container_BorderLess: Sans bordure (Defaut)
  #PB_Container_Flat      : Cadre simple
  #PB_Container_Raised    : Cadre élevé
  #PB_Container_Single    : Cadre enfoncé
  #PB_Container_Double    : Cadre doublement enfoncé

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

Une fois le gadget créé, les gadgets créés utérieurement feront partis du container.
Pour ne plus ajouter de gadgets au container, utilisez la fonction CloseGadgetList() pour fermer la 'GadgetList' du container et retourner à la 'GadgetList' précédente.
OpenGadgetList() pourra être utiliser pour ajouter des gadgets dynamiquement dans ce #Gadget.
  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  - SetGadgetColor() et GetGadgetColor() avec la constante
    #PB_Gadget_BackColor comme 'TypeCouleur' pour changer la couleur de fond du gadget.

Exemple

  If OpenWindow(0, 0, 0, 322, 150, "ContainerGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ContainerGadget(0, 8, 8, 306, 133, #PB_Container_Raised)
      ButtonGadget(1, 10, 15, 80, 24, "Bouton 1")
      ButtonGadget(2, 95, 15, 80, 24, "Bouton 2")
    CloseGadgetList()
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

OpenGadgetList(), CloseGadgetList(), SetGadgetColor(), GetGadgetColor()


CountGadgetItems()

Syntaxe

Resultat = CountGadgetItems(#Gadget)
Description
Renvoie le nombre d'éléments que contient un gadget.

Arguments

#Gadget Le gadget à utiliser.

Valeur de retour

Renvoie le nombre d'éléments du gadget.

Remarques

C'est une fonction universelle qui fonctionne avec tous les gadgets qui gèrent plusieurs éléments:
  - ComboBoxGadget()
  - EditorGadget()
  - ExplorerListGadget()
  - ListIconGadget()
  - ListViewGadget()
  - MDIGadget()
  - PanelGadget()
  - TreeGadget()

Voir aussi

AddGadgetItem(), RemoveGadgetItem(), ClearGadgetItems()


DateGadget()

Syntaxe

Resultat = DateGadget(#Gadget, x, y, Largeur, Hauteur [, Masque$ [, Date [, Options]]])
Description
Crée un champ de saisie (identique à un StringGadget()) dans la GadgetList en cours, dans lequel il sera possible d'entrer une date et/ou une heure.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur La position et les dimensions du nouveau gadget.
Masque$ (optionnel) Le format de la date. Voir FormatDate() pour le format de ce masque.
Note importante: Le gadget ne supporte pas l'affichage des secondes, donc si vous spécifiez "%ss" dans le paramètre 'Masque$, il sera tout simplement ignoré ! Si vous ne spécifiez pas de masque ou si vous spécifiez une chaîne vide, un masque par défaut sera utilisé. Le masque peut être modifié avec la fonction SetGadgetText().
Date (optionnel) La date initialement prévue pour le gadget.
Ne pas spécifier ce paramètre ou utiliser une valeur 0 permet d'afficher la date et l'heure du jour.
Options (optionnel) Peut être une combinaison de:

#PB_Date_UpDown
Par défaut le gadget a un bouton pour afficher un calendrier à partir duquel l'utilisateur peut choisir une date facilement (voir l'image ci-dessous). Avec cette option, deux boutons (un pour monter, un pour descendre) seront présent pour permettre de modifier la date directement, sans passer par un calendrier.
Cette option est seulement disponible sous Windows.

#PB_Date_CheckBox, le gadget aura une case à cocher à partir de laquelle l'utilisateur pourra mettre le gadget sur 'Aucune date' (si la case à cocher est décochée).
Tant que la case à cocher est décochée, GetGadgetState() renverra 0.
Pour changer l'état de la case à cocher, utiliser SetGadgetState() avec soit 0 (aucune date), soit avec une date valide.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

Ce gadget utilise le même format de date que celui utilisé par les fonctions de la bibliothèque Date. Ainsi, vous pouvez, par exemple, utiliser FormatDate() pour afficher le résultat renvoyé par GetGadgetState(), avec un format personnalisé.
  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  Les commandes suivantes peuvent être utilisées pour agir sur ce gadget :
  - SetGadgetState(): Change la date du gadget.
  - GetGadgetState(): Renvoie la valeur numérique de la date actuellement affichée.

  - SetGadgetText() : Change le masque du gadget.
  - GetGadgetText() : Renvoie la date actuellement affichée sous forme de texte (exactement comme elle est affichée).

  - GetGadgetAttribute() avec les attributs suivants:
    #PB_Date_Minimum: Renvoie la date minimale que l'utilisateur peut choisir
    #PB_Date_Maximum: Renvoie la date maximale que l'utilisateur peut choisir avec ce gadget

  - SetGadgetAttribute(): avec les attributs suivants:
    #PB_Date_Minimum: Change la date minimale que l'utilisateur peut choisir
    #PB_Date_Maximum: Change la date maximale que l'utilisateur peut choisir avec ce gadget

  - SetGadgetColor() et GetGadgetColor() avec les constantes suivantes comme 'TypeCouleur':
    #PB_Gadget_BackColor      : Couleur de fond
    #PB_Gadget_FrontColor     : Couleur du texte pour les jours affichés
    #PB_Gadget_TitleBackColor : Couleur du fond du titre du mois
    #PB_Gadget_TitleFrontColor: Couleur du texte du titre du mois
    #PB_Gadget_GrayTextColor  : Couleur du texte pour les jours n'appartenant pas au mois courant.

Note: SetGadgetColor() n'est pas pris en charge sur la plate-forme MacOS X.

Exemple

  If OpenWindow(0, 0, 0, 250, 250,"DateGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    DateGadget(0, 10, 10, 190, 25, "Date : %dd/%mm/%yyyy Heure : %hh:%ii")
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetState(), SetGadgetState(), GetGadgetText(), SetGadgetText(), GetGadgetAttribute(), SetGadgetAttribute(), GetGadgetColor(), SetGadgetColor(), CalendarGadget(), Date(), FormatDate()


DisableGadget()

Syntaxe

DisableGadget(#Gadget, Etat)
Description
Active ou désactive un gadget.

Arguments

#Gadget Le gadget à activer ou à désactiver.
Etat
  Etat = 0: Le gadget est activé.
  Etat = 1: Le gadget est désactivé.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  If OpenWindow(0, 0, 0, 250, 105, "Activer/Désactiver un Gadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0, 10, 15, 230, 30, "Bouton désactivé") : DisableGadget(0, 1)
    ButtonGadget(1, 10, 60, 230, 30, "Bouton activé") : DisableGadget(1, 0)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

HideGadget()


EditorGadget()

Syntaxe

Resultat = EditorGadget(#Gadget, x, y, Largeur, Hauteur [, Options])
Description
Crée un gadget de type 'éditeur' permettant de saisie une grande quantité de texte dans la GadgetList courante.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur La position et les dimensions du nouveau gadget.
Options (optionnel) Peut être une combinaison de:
  #PB_Editor_ReadOnly: L'état 'lecture seule' du gadget (0 = éditable, 1 = non éditable).
  #PB_Editor_WordWrap: Les lignes trop longues pour être affichées entièrement seront renvoyées à la ligne.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  - L'événement suivant est pris en charge par EventType():
    #PB_EventType_Change: Le texte a été modifié par l'utilisateur.

  Les commandes suivantes peuvent être utilisées pour agir sur le contenu du gadget:
  - AddGadgetItem()    : Ajoute une ligne de texte
  - CountGadgetItems() : Renvoie le nombre de lignes contenues dans le gadget.
  - GetGadgetItemText(): Renvoie la ligne de texte spécifié
  - GetGadgetText()    : Renvoie tout le texte contenu dans le gadget
  - RemoveGadgetItem() : Efface la ligne spécifiée
  - ClearGadgetItems() : Efface tout le texte
  - SetGadgetItemText(): Change le contenu de la ligne spécifiée
  - SetGadgetText()    : Remplace tout le texte contenu par le gadget par un autre

  - SetGadgetAttribute() avec l'attribut suivant:
    #PB_Editor_ReadOnly: Change l'état 'lecture seule' du gadget (0 = éditable, 1 = non éditable).
    #PB_Editor_WordWrap: Retour à la ligne automatique.

  - GetGadgetAttribute() avec l'attribut suivant:
    #PB_Editor_ReadOnly: Renvoie l'état 'lecture seule' du gadget (0 = éditable, 1 = non éditable).
    #PB_Editor_WordWrap: Renvoie l'état du retour à la ligne automatique.

  - SetGadgetColor() et GetGadgetColor() avec les valeurs 'TypeCouleur' suivantes:
    #PB_Gadget_BackColor : Couleur de fond
    #PB_Gadget_FrontColor: Couleur du texte

Exemple

  If OpenWindow(0, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    EditorGadget(0, 8, 8, 306, 133)
    For a = 0 To 5
      AddGadgetItem(0, a, "Ligne "+Str(a))
    Next
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

AddGadgetItem(), RemoveGadgetItem(), CountGadgetItems(), ClearGadgetItems(), GetGadgetText(), SetGadgetText(),
GetGadgetItemText(), SetGadgetItemText(), GetGadgetAttribute(), SetGadgetAttribute(),
GetGadgetColor(), SetGadgetColor(), StringGadget()


ExplorerComboGadget()

Syntaxe

Resultat = ExplorerComboGadget(#Gadget, x, y, Largeur, Hauteur, Repertoire$, [, Options])
Description
Crée une combobox qui affiche un répertoire ainsi que tous ses répertoires pères permettant à l'utilisateur d'en choisir un.

Par exemple, une telle ComboBox est utilisée dans la commande OpenFileRequester().
C'est un bon complément de ExplorerListGadget().
C'est un gadget très haut niveau qui fonctionne automatiquement facilitant grandement la programmation.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur La position et les dimensions du nouveau gadget.
Repertoire$ Le répertoire initial affiché (doit être défini comme un chemin d'accès complet), une chaîne vide spécifie le dossier racine.

Si l'option #PB_Explorer_DrivesOnly est posée alors Repertoire$ ne peut être qu'une lettre de lecteur ("A:", "C:" etc.). Tout caractère qui suit la lettre du lecteur sera ignoré.
Options (optionnel) Peut être une combinaison de:
  #PB_Explorer_DrivesOnly   : Le Gadget n'affichera que les disques pour en sélectionner un.
  #PB_Explorer_Editable     : Le Gadget sera éditable, avec un mode d'auto-complétion automatique.
  #PB_Explorer_NoMyDocuments: Le répertoire 'MesDocuments' ne sera pas affiché séparément.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec. Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

Les commandes suivantes peuvent être utilisées pour agir sur le gadget:
  - GetGadgetText(): Renvoie le répertoire actuellement affiché.
  - SetGadgetText(): Change le répertoire actuellement affiché.

Exemple

  If OpenWindow(0, 0, 0, 400, 45, "ExplorerComboGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ExplorerComboGadget(0, 10, 10, 380, 25, GetHomeDirectory(), #PB_Explorer_Editable)
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetText(), SetGadgetText(), ExplorerListGadget(), ExplorerTreeGadget(), ComboBoxGadget()


ExplorerListGadget()

Syntaxe

Resultat = ExplorerListGadget(#Gadget, x, y, Largeur, Hauteur, Repertoire$, [, Options])
Description
Créé un nouveau gadget de type ListIconGadget() qui gère automatiquement l'affichage d'un répertoire et la navigation sur le disque (à la manière de l'Explorateur Windows). Il permet à l'utilisateur de choisir un fichier ou un dossier situé à n'importe quel endroit sur le disque (ou les disques).

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur La position et les dimensions du nouveau gadget.
Repertoire$ Le répertoire initial affiché.
'Repertoire$' est l'emplacement de départ lorsque le gadget est créé. Il peut être composé de motifs ('patterns'), tels que: "C:\*.pb;*.pbi". Si aucun 'pattern' n'est spécifié, le répertoire doit se terminer par un '\'. Si 'Repertoire$' est nul (chaîne vide) alors la liste des disques disponibles sera affichée.
Options (optionnel) Peut être une combinaison de:
  #PB_Explorer_BorderLess         : Crée un #Gadget sans bordure.
  #PB_Explorer_AlwaysShowSelection: Affiche la sélection même quand le gadget n'est plus actif.
  #PB_Explorer_MultiSelect        : Active le mode 'sélection multiple'.
  #PB_Explorer_GridLines          : Affiche des lignes de séparation.
  #PB_Explorer_HeaderDragDrop     : L'ordre des colonnes peut être changé avec un glisser/déposer (drag'n'drop).
  #PB_Explorer_FullRowSelect      : La sélection s'étend à toute la ligne au lieu de la première colonne.

  #PB_Explorer_NoFiles            : Aucun fichier ne sera affiché.
  #PB_Explorer_NoFolders          : Aucun répertoire ne sera affiché.
  #PB_Explorer_NoParentFolder     : Le 'pseudo' répertoire père [..] ne sera pas affiché.
  #PB_Explorer_NoDirectoryChange  : Le répertoire ne pourra pas être changé par l'utilisateur.
  #PB_Explorer_NoDriveRequester   : Aucun message du type 'Insérer un disque dans le lecteur A:' ne sera affiché.
  #PB_Explorer_NoSort             : L'utilisateur ne pourra pas trier les colonnes en cliquant sur les titres des colonnes.
  #PB_Explorer_NoMyDocuments      : Le répertoire spécial 'Mes documents' ne sera pas affiché séparément.
  #PB_Explorer_AutoSort           : Le contenu sera automatiquement trié par nom.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  Les commandes suivantes sont disponibles pour contrôler le gadget:
  - AddGadgetColumn()   : Ajoute une colonne (prédéfinie ou additionnelle). Voir AddGadgetColumn() pour plus d'informations.
  - RemoveGadgetColumn(): Supprime une colonne (ainsi que ses données).
  - GetGadgetText()     : Renvoie le répertoire affiché.
  - SetGadgetText()     : Change le répertoire affiché, ou les 'patterns' actuellement utilisés.
  - GetGadgetState()    : Renvoie l'index du premier élément selectionné (-1: aucune selection).
  - GetGadgetItemText() : Renvoie le texte de l'élément, ou du titre de la colonne si 'Position' = -1.
  - SetGadgetItemText() : Modifie le texte de l'élément, ou du titre de la colonne si 'Position' = -1.
  - GetGadgetItemState(): Vérifie si un élément est un répertoire ou un fichier et si il est sélectionné.
  - SetGadgetItemState(): Modifier l'état sélectionné de l'élément spécifié.
  - CountGadgetItems()  : Compte le nombre d'éléments dans le répertoire.

  - GetGadgetAttribute() / SetGadgetAttribute(): avec l'attribut suivant:
    #PB_Explorer_DisplayMode : Change le mode d'affichage du gadget. Le mode peut être l'une des constantes suivantes:
    #PB_Explorer_LargeIcon   : Mode grandes icônes
    #PB_Explorer_SmallIcon   : Mode petites icônes
    #PB_Explorer_List        : Mode Liste
    #PB_Explorer_Report      : Mode Détails (colonnes, mode par défaut)

  - GetGadgetItemAttribute() / SetGadgetItemAttribute(): Avec l'attribut suivant:

    #PB_Explorer_ColumnWidth : Renvoie / Change la largeur de la 'Colonne' spécifiée. Le paramètre 'Element' est ignoré.

  - SetGadgetColor() et GetGadgetColor() avec les valeurs suivantes comme 'TypeCouleur':
    #PB_Gadget_FrontColor: Couleur du texte
    #PB_Gadget_BackColor : Couleur du fond
    #PB_Gadget_LineColor : Couleur de la grille si l'option #PB_Explorer_GridLines est utilisée.

  Note: SetGadgetColor() n'est pas pris en charge sur la plate-forme MacOS X.
Les évènements suivants sont disponibles par l'intermédiaire d' EventType():
  #PB_EventType_Change          : La sélection de l'élément courant vient de changer.
  #PB_EventType_LeftClick       : L'utilisateur a cliqué sur un élément avec le bouton gauche de la souris.
  #PB_EventType_RightClick      : L'utilisateur a cliqué sur un élément avec le bouton droit de la souris.
  #PB_EventType_LeftDoubleClick : L'utilisateur a double-cliqué sur un élément avec le bouton gauche de la souris.
  #PB_EventType_RightDoubleClick: L'utilisateur a double-cliqué sur un élément avec le bouton droit de la souris.
  #PB_EventType_DragStart       : L'utilisateur a essayé de lancer Une opération 'Glisser & Déposer'.
Après un évènement #PB_EventType_DragStart , la bibliothèque Drag & Drop peut être utilisée pour commencer une opération 'Glisser & Déposer'.

Exemple

  If OpenWindow(0, 0, 0, 400, 200, "ExplorerListGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ExplorerListGadget(0, 10, 10, 380, 180, "*.*", #PB_Explorer_MultiSelect)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

AddGadgetColumn(), RemoveGadgetColumn(), GetGadgetText(), SetGadgetText(), GetGadgetState(), GetGadgetItemState(), SetGadgetItemState(),
GetGadgetItemText(), SetGadgetItemText(), CountGadgetItems(), GetGadgetAttribute(), SetGadgetAttribute(),
GetGadgetItemAttribute(), SetGadgetItemAttribute(),SetGadgetColor(), GetGadgetColor(),
ExplorerComboGadget(), ExplorerTreeGadget(), ListIconGadget()


ExplorerTreeGadget()

Syntaxe

Resultat = ExplorerTreeGadget(#Gadget, x, y, Largeur, Hauteur, Repertoire$, [, Options])
Description
Créé un nouveau gGadget de type TreeGadget() qui gère automatiquement l'affichage d'un répertoire et la navigation sur le disque (à la manière de l'Explorateur Windows). Il permet à l'utilisateur de choisir un fichier ou un dossier situé à n'importe quel endroit sur le disque (ou les disques).

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur La position et les dimensions du nouveau gadget.
Repertoire$ Le répertoire initial affiché.
'Repertoire$' est l'emplacement de départ lorsque le gadget sera créé. Il peut être composé de motifs ('patterns'), tels que: "C:\*.pb;*.pbi". Si aucun 'pattern' n'est spécifié, le répertoire doit se terminer par un '\'. Si 'Repertoire$' est nul (chaîne vide), alors la liste des disques disponibles sera affichée.
Options (optionnel) Peut être une combinaison de:
  #PB_Explorer_BorderLess         : Crée un #Gadget sans bordure.
  #PB_Explorer_AlwaysShowSelection: Affiche la sélection même quand le gadget n'est plus actif.
  #PB_Explorer_NoLines            : Cache les lignes de liaisons entre les noeuds '+'.
  #PB_Explorer_NoButtons          : Cache les noeuds '+'.

  #PB_Explorer_NoFiles            : Aucun fichier ne sera affiché.
  #PB_Explorer_NoDriveRequester   : Aucun message du type 'Insérer un disque dans le lecteur A:' ne sera affiché.
  #PB_Explorer_NoMyDocuments      : Le répertoire spécial 'Mes documents' ne sera pas affiché séparément.
  #PB_Explorer_AutoSort           : Le contenu sera automatiquement trié par nom.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec. Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

 Les commandes suivantes sont disponibles pour contrôler le gadget:
  - GetGadgetText() : Renvoie le chemin complet du répertoire ou fichier sélectionné.
  - SetGadgetText() : Change l'élément actuellement sélectionné.
  - GetGadgetState(): Permet de savoir si l'élément sélectionné est un répertoire ou un fichier.

  - SetGadgetColor() et GetGadgetColor() avec les valeurs suivantes comme 'TypeCouleur':
    #PB_Gadget_FrontColor: Couleur du texte
    #PB_Gadget_BackColor : Couleur du fond
    #PB_Gadget_LineColor : Couleur de la grille et des marqueurs si l'option #PB_Explorer_GridLines est utilisée.

  Note: SetGadgetColor() n'est pas pris en charge sur la plate-forme MacOS X.
ExplorerTreeGadget() génère les évènements suivants, renvoyés par EventType():
  #PB_EventType_Change          : La sélection de l'élément courant vient de changer.
  #PB_EventType_LeftClick       : L'utilisateur a cliqué sur un élément avec le bouton gauche de la souris.
  #PB_EventType_RightClick      : L'utilisateur a cliqué sur un élément avec le bouton droit de la souris.
  #PB_EventType_LeftDoubleClick : L'utilisateur a double-cliqué sur un élément avec le bouton gauche de la souris.
  #PB_EventType_RightDoubleClick: L'utilisateur a double-cliqué sur un élément avec le bouton droit de la souris.
  #PB_EventType_DragStart       : L'utilisateur a essayé de lancer Une opération 'Glisser & Déposer'.
Après un évènement #PB_EventType_DragStart , la bibliothèque Drag & Drop peut être utilisée pour commencer une opération 'Glisser & Déposer'.

Exemple

  If OpenWindow(0, 0, 0, 300, 300, "ExplorerTreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ExplorerTreeGadget(0, 10, 10, 280, 280, "*.pb;*.pbi")
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetText(), SetGadgetText(), GetGadgetState(), GetGadgetColor(), SetGadgetColor(), ExplorerComboGadget(), ExplorerListGadget(), TreeGadget()


Frame3DGadget()

Syntaxe

Resultat = Frame3DGadget(#Gadget, x, y, Largeur, Hauteur, Texte$ [, Options])
Description
Crée dans la GadgetList un cadre en relief qui permet de regrouper un ensemble de gadgets.

Ce gadget ne peut être activé, il ne sert qu'à rendre plus compréhensible la présentation d'une fenêtre.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur | La position et les dimensions du nouveau gadget.
Texte$ | Titre qui s'affiche près du bord supérieur gauche du cadre (ce texte est ignoré si le gadget a l'option #PB_Frame3D_Single, #PB_Frame3D_Double ou #PB_Frame3D_Flat).
Options (optionnel) Peut être une combinaison de:
  #PB_Frame3D_Single: Cadre enfoncé
  #PB_Frame3D_Double: Cadre doublement enfoncé
  #PB_Frame3D_Flat  : Cadre simple

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

Comme ce gadget est seulement décoratif, GadgetToolTip() ne peut pas être utilisé (ce gadget ne reçoit aucun évènement).

Exemple

  If OpenWindow(0, 0, 0, 320, 250, "Frame3DGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    Frame3DGadget(0, 10,  10, 300, 50, "Cadre en relief standard")
    Frame3DGadget(1, 10,  70, 300, 50, "", #PB_Frame3D_Single)
    Frame3DGadget(2, 10, 130, 300, 50, "", #PB_Frame3D_Double)
    Frame3DGadget(3, 10, 190, 300, 50, "", #PB_Frame3D_Flat)

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetText(), SetGadgetText(), ContainerGadget()


FreeGadget()

Syntaxe

FreeGadget(#Gadget)
Description
Enlève un gadget de la fenêtre à laquelle il était attaché et le détruit.
Pour un gadget container, sa 'gadgetlist' est détruite aussi.

Arguments

#Gadget Le gadget à détruire.

Si #PB_All est spécifié, tous les gadgets restants sont libérés.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Un gadget est libérée automatiquement si l'un des événements suivants se produit:

- La fenêtre qui contient le gadget est fermée.
- Le gadget parent (ContainerGadget(), PanelGadget(), etc) est libéré.
- Le programme se termine.

Voir aussi

IsGadget(), CloseWindow()


GadgetHeight()

Syntaxe

Resultat = GadgetHeight(#Gadget)
Description
Renvoie la hauteur (en pixels) d'un gadget.

Arguments

#Gadget Le gadget à utiliser

Valeur de retour

Renvoie la hauteur du gadget en pixels.

Voir aussi

GadgetWidth(), GadgetX(), GadgetY(), ResizeGadget()


GadgetID()

Syntaxe

GadgetID = GadgetID(#Gadget)
Description
Renvoie l'identifiant propre à l'OS d'un gadget.

Arguments

#Gadget Le gadget à utiliser.

Valeur de retour

Renvoie le numéro d'identification du gadget.

Ce résultat est parfois aussi appelé 'Handle'.
Voir le chapitre Numéros et Identifiants (Handles) pour plus d'informations.

Remarques

Utile pour utiliser les commandes de l'OS (API) directement avec le gadget.


GadgetItemID()

Syntaxe

Resultat = GadgetItemID(#Gadget, Element)
Description
Renvoie l'identifiant propre à l'OS de l'élément d'un gadget.

Arguments

#Gadget Le gadget à utiliser.
Element L'élément dont le handle doit être retourné.

Le premier élément dans le gadget commence à 0.

Valeur de retour

Renvoie le Handle de l'élément ou 0 en cas d'échec.

Remarques

Cette fonction est pour l'instant seulement supportée par le TreeGadget() sous Windows.
Elle renvoie 0 dans les autres cas.

C'est utile pour pouvoir utiliser l'API avec les éléments des gadgets PureBasic.

Voir aussi

TreeGadget()

OS Supportés

Windows


GadgetToolTip()

Syntaxe

GadgetToolTip(#Gadget, Texte$)
Description
Associe ou remplace une bulle d'aide à un gadget.

Un 'Tooltip' est un texte flottant qui apparaît au bout d'un certain temps lorsque le curseur de la souris est immobile au dessus d'un gadget.

Arguments

#Gadget | Le gadget à utiliser
Texte$ | Le texte flottant ou bulle d'aide.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Les gadgets suivants sont supportés:

- ButtonGadget()
- ButtonImageGadget()
- CalendarGadget()
- CanvasGadget()
- CheckBoxGadget()
- ComboBoxGadget()
- ContainerGadget()
- DateGadget()
- EditorGadget()
- ExplorerListGadget()
- ExplorerTreeGadget()
- HyperLinkGadget()
- ImageGadget()
- IPAddressGadget()
- ListIconGadget()
- ListViewGadget()
- MDIGadget()
- OptionGadget()
- PanelGadget()
- ProgressBarGadget()
- ScrollBarGadget()
- SpinGadget()
- SplitterGadget()
- StringGadget()
- TrackBarGadget()
- TreeGadget()

Exemple

  If OpenWindow(0, 0, 0, 270, 100, "GadgetToolTip", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0, 10, 30, 250, 30, "Bouton avec texte flottant")
    GadgetToolTip(0, "Texte flottant pour bouton")
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


GadgetType()

Syntaxe

Resultat = GadgetType(#Gadget)
Description
Renvoie le type d'un gadget.

Arguments

#Gadget Le gadget à utiliser

Valeur de retour

Renvoie une des valeurs suivantes:
  #PB_GadgetType_Button        : ButtonGadget()
  #PB_GadgetType_ButtonImage   : ButtonImageGadget()
  #PB_GadgetType_Calendar      : CalendarGadget()
  #PB_GadgetType_Canvas        : CanvasGadget()
  #PB_GadgetType_CheckBox      : CheckBoxGadget()
  #PB_GadgetType_ComboBox      : ComboBoxGadget()
  #PB_GadgetType_Container     : ContainerGadget()
  #PB_GadgetType_Date          : DateGadget()
  #PB_GadgetType_Editor        : EditorGadget()
  #PB_GadgetType_ExplorerCombo : ExplorerComboGadget()
  #PB_GadgetType_ExplorerList  : ExplorerListGadget()
  #PB_GadgetType_ExplorerTree  : ExplorerTreeGadget()
  #PB_GadgetType_Frame3D       : Frame3DGadget()
  #PB_GadgetType_HyperLink     : HyperLinkGadget()
  #PB_GadgetType_Image         : ImageGadget()
  #PB_GadgetType_IPAddress     : IPAddressGadget()
  #PB_GadgetType_ListIcon      : ListIconGadget()
  #PB_GadgetType_ListView      : ListViewGadget()
  #PB_GadgetType_MDI           : MDIGadget()
  #PB_GadgetType_Option        : OptionGadget()
  #PB_GadgetType_Panel         : PanelGadget()
  #PB_GadgetType_ProgressBar   : ProgressBarGadget()
  #PB_GadgetType_Scintilla     : ScintillaGadget()
  #PB_GadgetType_ScrollArea    : ScrollAreaGadget()
  #PB_GadgetType_ScrollBar     : ScrollBarGadget()
  #PB_GadgetType_Shortcut      : ShortcutGadget()
  #PB_GadgetType_Spin          : SpinGadget()
  #PB_GadgetType_Splitter      : SplitterGadget()
  #PB_GadgetType_String        : StringGadget()
  #PB_GadgetType_Text          : TextGadget()
  #PB_GadgetType_TrackBar      : TrackBarGadget()
  #PB_GadgetType_Tree          : TreeGadget()
  #PB_GadgetType_Web           : WebGadget()
  #PB_GadgetType_Unknown       : Type inconnu, problablement pas un gadget PureBasic.

Remarques

Cette commande peut être utile pour écrire des fonctions génériques qui fonctionnent avec plusieurs types de gadgets.


GadgetWidth()

Syntaxe

Resultat = GadgetWidth(#Gadget)
Description
Renvoie la largeur (en pixels) d'un gadget.

Arguments

#Gadget Le gadget à utiliser

Valeur de retour

Renvoie la largeur du gadget en pixels.

Voir aussi

GadgetHeight(), GadgetX(), GadgetY(), ResizeGadget()


GadgetX()

Syntaxe

Resultat = GadgetX(#Gadget [, Mode])
Description
Renvoie la position en X d'un gadget.

Arguments

#Gadget Le gadget à utiliser
Mode (optionnel)
  #PB_Gadget_ContainerCoordinate: La position en X du gadget (en pixels) dans son conteneur, ou dans une fenêtre (par défaut).
  #PB_Gadget_WindowCoordinate   : La position absolue en X du gadget (en pixels) dans la fenêtre.
  #PB_Gadget_ScreenCoordinate   : La position absolue en X du gadget (en pixels) dans l'écran.
                                  Il peut être utile d'afficher quelque chose sur le gadget comme une fenêtre flottante ou un menu contextuel.

Valeur de retour

Renvoie la position en X par rapport au gadget parent ou à la fenêtre, en pixels.

Voir aussi

GadgetY(), GadgetWidth(), GadgetHeight(), ResizeGadget()


GadgetY()

Syntaxe

Resultat = GadgetY(#Gadget [, Mode])
Description
Renvoie la position en Y d'un gadget.

Arguments

#Gadget Le gadget à utiliser
Mode (optionnel)
  #PB_Gadget_ContainerCoordinate: La position en Y du gadget (en pixels) dans son conteneur, ou dans une fenêtre (par défaut).
  #PB_Gadget_WindowCoordinate   : La position absolue en Y du gadget (en pixels) dans la fenêtre.
  #PB_Gadget_ScreenCoordinate   : La position absolue en Y du gadget (en pixels) dans l'écran.
                                  Il peut être utile d'afficher quelque chose sur le gadget comme une fenêtre flottante ou un menu contextuel.

Valeur de retour

Renvoie la position en Y par rapport au gadget parent ou à la fenêtre, en pixels.

Voir aussi

GadgetX(), GadgetWidth(), GadgetHeight(), ResizeGadget()


GetActiveGadget()

Syntaxe

Resultat = GetActiveGadget()
Description
Renvoie le numéro d'un gadget qui a actuellement le 'focus' clavier.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le numéro #Gadget du gadget qui a le focus.
Si aucun gadget a le focus, -1 est retourné.

Exemple

  If OpenWindow(0, 0, 0, 270, 70, "GetActiveGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    StringGadget  (0, 10, 10, 250, 20, "Appuyez sur la touche [Echap]...")
    StringGadget  (1, 10, 40, 250, 20, "Appuyez sur la touche [Echap]...")
    AddKeyboardShortcut(0, #PB_Shortcut_Escape, 1)
    SetActiveGadget(0)
    Repeat
      Evenement = WaitWindowEvent()
      If Evenement = #PB_Event_Menu And EventMenu() = 1
        MessageRequester("Test", "La touche [Echap] a été appuyée dans le gadget " + Str(GetActiveGadget()))
      EndIf
    Until Evenement = #PB_Event_CloseWindow
  EndIf


GetGadgetAttribute()

Syntaxe

Valeur = GetGadgetAttribute(#Gadget, Attribut)
Description
Renvoie la valeur de l'attribut d'un gadget.

Arguments

#Gadget | Le gadget à utiliser
Attribut | L'attribut à tester.

Valeur de retour

Renvoie la valeur de l'attribut spécifié ou 0 si le gadget ne supporte pas l'attribut.

Remarques

Cette fonction est disponible avec les gadgets suivants:

- ButtonImageGadget()
- CalendarGadget()
- CanvasGadget()
- DateGadget()
- EditorGadget()
- ExplorerListGadget()
- ListIconGadget()
- PanelGadget()
- ProgressBarGadget()
- ScrollAreaGadget()
- ScrollBarGadget()
- SpinGadget()
- SplitterGadget()
- TrackBarGadget()
- WebGadget()

Voir aussi

SetGadgetAttribute(), GetGadgetItemAttribute(), SetGadgetItemAttribute()


GetGadgetColor()

Syntaxe

Couleur = GetGadgetColor(#Gadget, TypeCouleur)
Description
Renvoie la couleur du 'TypeCouleur' d'un gadget.

Arguments

#Gadget Le gadget à utiliser
TypeCouleur Peut prendre l'une des valeurs suivantes (tous les gadgets ne supportent pas toutes ces valeurs):
  #PB_Gadget_FrontColor     : Texte du gadget
  #PB_Gadget_BackColor      : Fond du gadget
  #PB_Gadget_LineColor      : Couleur de la grille
  #PB_Gadget_TitleFrontColor: Couleur du texte dans le titre (pour CalendarGadget())
  #PB_Gadget_TitleBackColor : Couleur du fond dans le titre (pour CalendarGadget())
  #PB_Gadget_GrayTextColor  : Couleur du texte inactif (pour CalendarGadget())

Valeur de retour

Renvoie la couleur courante.

Cette fonction retourne la couleur qui a été précédemment définie par SetGadgetColor().

Si aucune couleur personnalisée est définie pour le #Gadget et TypeCouleur alors la fonction retourne -1.

Remarques

Cette commande est supportée par les gadgets suivants:

- CalendarGadget()
- ContainerGadget()
- DateGadget()
- EditorGadget()
- ExplorerListGadget()
- ExplorerTreeGadget()
- HyperLinkGadget()
- ListViewGadget()
- ListIconGadget()
- MDIGadget()
- ProgressBarGadget()
- ScrollAreaGadget()
- SpinGadget()
- StringGadget()
- TextGadget()
- TreeGadget()

Voir aussi

SetGadgetColor(), GetGadgetItemColor(), SetGadgetItemColor()


GetGadgetData()

Syntaxe

Resultat = GetGadgetData(#Gadget)
Description
Renvoie la valeur qui a été stockée dans un gadget.

Arguments

#Gadget Le gadget à utiliser

Valeur de retour

Renvoie la valeur courante de la donnée stockée avec la commande SetGadgetData().
Sans donnée définie pour ce gadget, la valeur de retour est 0.

Remarques

Cela permet d'associer une valeur personnalisée pour chaque gadget.

Cette commande fonctionne avec tous les types de gadget du PureBasic.

Pour un exemple d'utilisation, consulter la définition de la commande SetGadgetData().

Voir aussi

SetGadgetData(), GetGadgetItemData(), SetGadgetItemData()


GetGadgetFont()

Syntaxe

PoliceID = GetGadgetFont(#Gadget)
Description
Renvoie le numéro d'identification (FontID) de la police associée au #Gadget.

Arguments

#Gadget Le gadget à utiliser.

Si la constante #PB_Default est utilisée à la place du numéro de #Gadget, Le 'PoliceID' de la police utilisé lors de la création de nouveaux gadgets est renvoyé.

Valeur de retour

Renvoie le numéro d'identification 'PoliceID' pour le gadget spécifié ou celui utilisé pour les gadgets nouvellement créés.

Note: Sur Mac OS X, cette fonction retourne 0 si le gadget ne dispose pas d'une police spécifique qui lui est associée.

Remarques

Le 'PoliceID' peut être utilisé avec les fonctions du type DrawingFont().

SetGadgetFont() permet de changer la police des gadgets par défaut, ou d'affecter une police à un gadget spécifique.


GetGadgetItemAttribute()

Syntaxe

Valeur = GetGadgetItemAttribute(#Gadget, Element, Attribut [, Colonne])
Description
Renvoie la valeur de l'attribut de l'élément d'un gadget.

Arguments

#Gadget | Le gadget à utiliser.
Element L'élément spécifié.

Le premier élément dans le gadget commence à 0.
Attribut | L'attribut à tester.
Colonne (optionnel) La colonne spécifiée.

La première colonne commence à 0.

La valeur par défaut est 0 colonne.

Valeur de retour

Renvoie la valeur de l'attribut ou zéro si l'élément ou l'attribut n'existe pas.

Remarques

Cette fonction est disponible pour tous les gadgets et éléments suivants:
  - ExplorerListGadget()
    #PB_Explorer_ColumnWidth: Renvoie la largeur de la 'Colonne' spécifiée. Le paramètre 'Element' est ignoré.

  - ListIconGadget()
    #PB_ListIcon_ColumnWidth: Renvoie la largeur de la 'Colonne' spécifiée. Le paramètre 'Element' est ignoré.

  - TreeGadget()
    #PB_Tree_SubLevel: Renvoie le niveau de l'élément indiqué
    Le niveau des éléments du TreeGadget() peut être utilisé pour déterminer la relation
    entre deux éléments de l'arbre. Par exemple, le premier élément avec un niveau inférieur à l'élément courant
    (si la liste est examinée en remontant) est l'élément 'parent'.

Voir aussi

SetGadgetItemAttribute(), GetGadgetAttribute(), SetGadgetAttribute()


GetGadgetItemColor()

Syntaxe

Couleur = GetGadgetItemColor(#Gadget, Element, TypeCouleur [, Colonne])
Description
Renvoie la couleur de l'élément d'un gadget.

Arguments

#Gadget Le gadget à utiliser.
Element L'élément à tester.

Le premier élément dans le gadget commence à 0.
TypeCouleur Le paramètre 'TypeCouleur' peut prendre l'une des valeurs suivantes:
  #PB_Gadget_FrontColor: Texte de l'élément.
  #PB_Gadget_BackColor : Fond de l'élément.
Colonne (optionnel) La colonne spécifiée.

La première colonne commence à 0.

La valeur par défaut est 0 colonne.

Valeur de retour

Renvoie la couleur courante.

Cette fonction retourne la couleur qui a été précédemment définie par SetGadgetItemColor(). Si aucune couleur personnalisée est définie pour le #Gadget et TypeCouleur alors la fonction renvoie -1.

Remarques

Cette commande est supportée par les gadgets suivants:

- ListIconGadget()
- TreeGadget()

Voir aussi

SetGadgetItemColor(), GetGadgetColor(), SetGadgetColor()


GetGadgetItemData()

Syntaxe

Resultat = GetGadgetItemData(#Gadget, Element)
Description
Renvoie la valeur qui a été stockée dans 'Element' d'un gadget .

Arguments

#Gadget Le gadget à utiliser
Element L'élément à partir duquel les données doivent être lues.

Le premier élément dans le gadget commence à 0.

Valeur de retour

Renvoie la donnée stockée avec la commande SetGadgetItemData().

Si aucune valeur n'a été stockée avec l'élément alors la valeur de retour est 0.

Remarques

Cela permet d'associer une valeur personnalisée pour chaque élément d'un gadget.

Cette commande est supportée par les gadgets suivants:
- ComboBoxGadget()
- ListIconGadget()
- ListViewGadget()
- PanelGadget()
- TreeGadget()

Pour un exemple d'utilisation, consulter la définition de la commande SetGadgetItemData().

Voir aussi

SetGadgetItemData(), GetGadgetData(), SetGadgetData()


GetGadgetItemState()

Syntaxe

Resultat = GetGadgetItemState(#Gadget, Element)
Description
Renvoie l'état de l'élément d'un gadget.

Arguments

#Gadget Le gadget à utiliser
Element L'élément à tester.

Le premier élément dans le gadget commence à 0.

Valeur de retour

Renvoie l'état de l'élément du gadget ou 0 si il y a une erreur.
Voir ci-dessous pour connaître la signification de cette valeur en fonction du type du gadget.

Remarques

Il s'agit d'une fonction universelle qui fonctionne avec presque tous les gadgets:
  - CalendarGadget()    : Renvoie #PB_Calendar_Bold quand la date spécifiée
                          est affichée en gras, sinon #PB_Calendar_Normal
                          est renvoyé. 'Element' doit être une date
                          au format PureBasic.

  - ExplorerListGadget(): Renvoie une combinaison des valeurs suivantes:
    #PB_Explorer_File     : L'élément est un fichier.
    #PB_Explorer_Directory: L'élément est un répertoire (ou un disque).
    #PB_Explorer_Selected : L'élément est sélectionné.

  - ListViewGadget()   : Renvoie 1 si l'élément est sélectionné, 0 sinon.

  - ListIconGadget()   : Renvoie une combinaison des valeurs suivantes:
    #PB_ListIcon_Selected : L'élément est sélectionné
    #PB_ListIcon_Checked  : L'élément a sa case à cocher associée cochée
                            (crée avec l'option #PB_ListIcon_CheckBoxes)
    #PB_ListIcon_Inbetween: L'élément a sa case à cocher associée "indéterminée"
                            (#PB_ListIcon_ThreeState option).

  - TreeGadget()       : Renvoie une combinaison des valeurs suivantes:
    #PB_Tree_Selected : L'élément est sélectionné.
    #PB_Tree_Expanded : L'élément est déployé (la branche de l'arbre est ouverte).
    #PB_Tree_Collapsed: L'élément est fermé.
    #PB_Tree_Checked  : La case à cocher de l'élément est cochée. (Si l'option #PB_Tree_CheckBoxes est utilisée)
    #PB_Tree_Inbetween: L'élément a sa case à cocher associée "indéterminée" (#PB_ListIcon_ThreeState option)
Pour vérifier si un état est actif, utilisez l'opérateur '&':
  If Resultat & #PB_Tree_Checked
    ; La 'case à cocher' de l'élément est cochée
  EndIf

Exemple

L'exemple ci-dessous montre comment tester différentes combinaisons pour le gadget ListIconGadget() :
  ; ... Ce code est à placer dans une boucle avec WaitWindowEvent() :
  If GetGadgetItemState(#Listicon, n) & #PB_ListIcon_Checked
    ; L'élément n est coché (indépendamment qu'il soit sélectionné ou non)
  EndIf

  If GetGadgetItemState(#Listicon, n) & #PB_ListIcon_Selected
    ; L'élément n est sélectionné (indépendamment qu'il soit coché ou non)
  EndIf

  If GetGadgetItemState(#Listicon, n) = #PB_ListIcon_Checked | #PB_ListIcon_Selected
    ; L'élément n est coché et sélectionné
  EndIf

  If GetGadgetItemState(#Listicon, n) & #PB_ListIcon_Checked | #PB_ListIcon_Selected
    ; L'élément n est coché ou sélectionné ou les deux
  EndIf

Voir aussi

SetGadgetItemState(), GetGadgetState(), SetGadgetState()


GetGadgetItemText()

Syntaxe

Resultat$ = GetGadgetItemText(#Gadget, Element [, Colonne])
Description
Renvoie le texte de l'élément d'un gadget.

Arguments

#Gadget Le gadget à utiliser
Element L'élément à tester.

Le premier élément dans le gadget commence à 0.
Colonne (optionnel) La colonne à utiliser pour les gadgets qui prennent en charge plusieurs colonnes.

La première colonne commence à 0.

La valeur par défaut est 0 colonne.

Valeur de retour

Renvoie le texte de l'élément du gadget ou une chaîne vide si il y a une erreur.

Remarques

Il s'agit d'une fonction universelle qui fonctionne avec presque tous les gadgets:
  - ComboBoxGadget()    : Renvoie le texte de l'élément de la liste déroulante ('Colonne' est ignorée).
  - EditorGadget()      : Renvoie le texte de l'élément (la ligne) de l'editor ('Colonne' est ignorée).
  - ExplorerListGadget(): Renvoie le nom du l'élément, sans son chemin complet.
                          Si 'Element' = -1, alors le titre de la colonne est renvoyé.
  - ListIconGadget()    : Renvoie le texte de l'élément de la liste.
                          'Colonne' est l'index de la colonne (commence à partir de 0).
                          Si 'Element' = -1, alors le titre de la colonne est renvoyé.
  - ListViewGadget()    : Renvoie le texte de l'élément de la liste ('Colonne' est ignorée).
  - MDIGadget()         : Renvoie le titre de la fenêtre fille (élement) spécifiée ('Colonne' est ignorée).
  - PanelGadget()       : Renvoie le texte de l'élément spécifié ('Colonne' est ignorée).
  - TreeGadget()        : Renvoie le texte de l'élément d'arbre ('Colonne' est ignorée).
  - WebGadget()         : Renvoie le code html, le titre de la page, message statut ou la sélection actuelle.
Note: La numérotation des éléments commence à partir de 0.

Voir aussi

SetGadgetItemText(), GetGadgetText(), SetGadgetText()


GetGadgetState()

Syntaxe

Resultat = GetGadgetState(#Gadget)
Description
Renvoie l'état actuel d'un gadget.

Arguments

#Gadget Le gadget à utiliser.

Valeur de retour

Renvoie l'état du gadget.
Voir ci-dessous pour son sens en fonction du type gadget.

Remarques

Il s'agit d'une fonction universelle qui fonctionne avec presque tous les gadgets:
  - ButtonImageGadget(): renvoie l'état d'un bouton à bascule (#PB_Button_Toggle): 1 = pressé, 0 = normal.
  - ButtonGadget()     : renvoie l'état d'un bouton à bascule (#PB_Button_Toggle): 1 = pressé, 0 = normal.
  - CalendarGadget()   : renvoie la date actuellement sélectionnée.
  - CheckBoxGadget()   : renvoie une des valeurs suivantes:
    #PB_CheckBox_Checked  : La case est cochée.
    #PB_CheckBox_Unchecked: La case est décochée.
    #PB_CheckBox_Inbetween: L'état de la case à cocher est indéterminé (Seulement pour les cases à cocher de type #PB_CheckBox_ThreeState).

  - ComboBoxGadget()    : Renvoie le numéro de l'élément sélectionné ou -1 si pas de sélection.
  - DateGadget()        : Renvoie la date ou l'heure actuellement sélectionnée. Si #PB_Date_CheckBox
                          est utilisé et que la case à cocher est décochée, 0 sera renvoyé.
  - ExplorerListGadget(): Renvoie le numéro de l'élément sélectionné ou -1 si pas de sélection.
  - ExplorerTreeGadget(): Renvoie le type de l'élément sélectionné (#PB_Explorer_File ou #PB_Explorer_Directory).
  - ImageGadget()       : Renvoie l'ImageID de l'image actuellement affichée.
  - IPAddressGadget()   : Renvoie l'adresse IP courante.
  - ListIconGadget()    : Renvoie le numéro de l'élément sélectionné ou -1 si il n'y a pas d'élément sélectionné.
  - ListViewGadget()    : Renvoie le numéro de l'élément sélectionné ou -1 si il n'y a pas d'élément sélectionné.
  - MDIGadget()         : Renvoie le numéro de la fenêtre fille active, ou -1 si aucune n'est active.
  - OptionGadget()      : Renvoie 1 s'il est activé, 0 sinon.
  - PanelGadget()       : Renvoie le numéro d'onglet sélectionné ou -1 si pas de sélection.
  - ProgressBarGadget() : Renvoie la valeur actuelle de la barre de progression.
  - ScrollBarGadget()   : Renvoie la position actuelle de l'ascenseur.
  - ShortcutGadget()    : Renvoie le raccourci clavier sélectionné.
  - SpinGadget()        : Renvoie la valeur actuelle du SpinGadget.
  - SplitterGadget()    : Renvoie la position actuelle de la barre de séparation, en pixels.
  - TrackBarGadget()    : Renvoie la position actuelle de la TrackBar (valeur comprise entre la valeur minimale et maximale).
  - TreeGadget()        : Renvoie le numéro de l'élément sélectionné ou  -1 si pas de sélection.

Voir aussi

SetGadgetState(), GetGadgetItemState(), SetGadgetItemState()


GetGadgetText()

Syntaxe

Texte$ = GetGadgetText(#Gadget)
Description
Renvoie le texte contenu dans un gadget.

Arguments

#Gadget Le gadget à utiliser

Valeur de retour

Renvoie le texte du gadget, ou une chaîne vide si le gadget ne supporte la présence de texte.

Remarques

Cette commande est particulièrement utile pour :
  - ButtonGadget()       : Renvoie le texte affiché par le BoutonGadget.
  - ComboBoxGadget()     : Renvoie le texte de l'élément sélectionné.
  - EditorGadget()       : Renvoie le texte contenu dans l'éditeur.
                           Les différentes lignes seront séparées par
                           la combinaison "Chr(13) + Chr(10)".
  - ExplorerComboGadget(): Renvoie le répertoire affiché et sélectionné.
  - ExplorerListGadget() : Renvoie le répertoire actuellement affiché.
  - ExplorerTreeGadget() : Renvoie le chemin complet du fichier ou répertoire sélectionné.
  - HyperLinkGadget()    : Renvoie le contenu de l'HyperLinkGadget.
  - ListIconGadget()     : Renvoie le texte de la première colonne de l'élément sélectionné.
  - ListViewGadget()     : Renvoie le texte de l'élément sélectionné.
  - StringGadget()       : Renvoie le contenu du StringGadget.
  - TextGadget()         : Renvoie le contenu du TextGadget.
  - TreeGadget()         : Renvoie le texte de l'élément sélectionné.
  - WebGadget()          : Renvoie l'URL du website affiché.

Voir aussi

SetGadgetText(), GetGadgetItemText(), SetGadgetItemText()


HideGadget()

Syntaxe

HideGadget(#Gadget, Etat)
Description
Cache ou affiche un gadget.

Arguments

#Gadget Le gadget à utiliser
Etat
  'Etat' = 1: Le gadget sera caché.
  'Etat' = 0: Le gadget sera affiché.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  If OpenWindow(0,0,0,180,120,"Cacher un Gadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0,10,10,160,50,"Bouton 1") : bouton = #True   ; le bouton est affiché
    ButtonGadget(1,10,80,160,30,"Cacher le bouton 1")
    Repeat
      Evenement = WaitWindowEvent()
      If Evenement = #PB_Event_Gadget
        If EventGadget()=1
          If bouton = #True     ; si le bouton est affiché
            HideGadget(0,1)     ; cache le bouton
            bouton = #False
            SetGadgetText(1,"Afficher le bouton 1")
          Else                  ; si le bouton est caché
            HideGadget(0,0)     ; affiche le bouton
            bouton = #True
            SetGadgetText(1,"Cacher le bouton 1")
          EndIf
        EndIf
      EndIf
    Until Evenement = #PB_Event_CloseWindow
  EndIf

Voir aussi

DisableGadget()


HyperLinkGadget()

Syntaxe

Resultat = HyperLinkGadget(#Gadget, x, y, Largeur, Hauteur, Texte$, Couleur [, Options])
Description
Crée un lien cliquable, similaire à ceux que l'on trouve sur les pages web dans la GadgetList courante.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur | La position et les dimensions du nouveau gadget.
Texte$ | Le texte à afficher.
Couleur La couleur du texte lorsque la souris survole le gadget.

La couleur du texte pour l'état non survolé peut être modifié avec SetGadgetColor().
Options (optionnel)
  #PB_Hyperlink_Underline: Affiche une ligne en dessous du texte sans avoir à utiliser une police soulignée.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

La couleur du texte ainsi que le pointeur de la souris changent automatiquement au passage de la souris sur ce gadget. Pour avoir un lien souligné, il suffit d'utiliser une police soulignée avec SetGadgetFont() une fois que le gadget a été créé.
  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  - Le texte peut être manipulé à l'aide des commandes SetGadgetText() et GetGadgetText().
  - SetGadgetColor() et GetGadgetColor() avec la constante #PB_Gadget_FrontColor pour changer la couleur du texte.
    La couleur de fond est toujours la couleur de la fenêtre.

  Note: SetGadgetColor() n'est pas pris en charge sur la plate-forme MacOS X.

Exemple

  If OpenWindow(0,0,0,270,160,"HyperLinkGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    HyperLinkGadget(0, 10, 10,250,20,"Lien rouge", RGB(255,0,0))
    HyperLinkGadget(1, 10, 30,250,20,"Lien vert souligné (Police Arial)", RGB(0,255,0), #PB_Font_Underline)
    SetGadgetFont(1, LoadFont(0, "Arial", 12))
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetText(), SetGadgetText(), GetGadgetColor(), SetGadgetColor()


IPAddressGadget()

Syntaxe

Resultat = IPAddressGadget(#Gadget, x, y, Largeur, Hauteur)
Description
Crée un gadget de saisie d'adresses IP dans la GadgetList courante.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur La position et les dimensions du nouveau gadget.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  Les commandes suivantes peuvent être utilisées pour contrôler le gadget:
  - GetGadgetState(): Renvoie l'adresse IP courante (IPAddressField() est utile pour récupérer la valeur d'un champ).
  - SetGadgetState(): Change l'adresse IP courante (MakeIPAddress() pour construire une IP valide).
  - GetGadgetText() : Renvoie l'adresse IP en format texte: par exemple "127.0.0.1".
  - SetGadgetText() : Efface complètement le gadget quand une chaîne vide est spécifiée. C'est la seule action valide pour l'instant.

Exemple

  If OpenWindow(0, 0, 0, 210, 50, "IPAddressGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    IPAddressGadget(0, 10, 15, 160, 20)
    SetGadgetState(0, MakeIPAddress(127, 0, 0, 1))   ; affiche une adresse IP valide
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetState(), SetGadgetState(), GetGadgetText(), SetGadgetText(), IPAddressField(), IPString(), MakeIPAddress()


ImageGadget()

Syntaxe

Resultat = ImageGadget(#Gadget, x, y, Largeur, Hauteur, ImageID [, Options])
Description
Crée un gadget Image dans la GadgetList en cours.

Un gadget Image permet de positionner une image dans une fenêtre.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur La position et les dimensions du nouveau gadget.

Le gadget ajuste sa largeur et sa hauteur pour s'adapter à l'image affichée.

La largeur et la hauteur spécifiées ne sont utilisés que si aucune image ne s'affiche.
ImageID L'image à afficher. Utilisez la fonction ImageID() pour obtenir l'ID d'une image.

Si ce paramètre est 0, aucune image ne sera affichée.
Options (optionnel)
  #PB_Image_Border : Affiche un cadre autour de l'image.
  #PB_Image_Raised : Affiche une bordure surélevée autour de l'image.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  - SetGadgetState(): Permet de changer dynamiquement l'image contenue dans le gadget.
    Un ImageID valide peut être obtenu via ImageID(). Si 'ImageID' est 0, alors l'image est retirée du gadget.

  Les évènements suivants sont supportés par EventType():
    #PB_EventType_LeftClick
    #PB_EventType_RightClick
    #PB_EventType_LeftDoubleClick
    #PB_EventType_RightDoubleClick
    #PB_EventType_DragStart : L'utilisateur a essayé de lancer une opération de 'Glisser & Déposer'.

  Après un évènement #PB_EventType_DragStart , la bibliothèque Drag & Drop peut être
  utilisée pour commencer une opération 'Glisser & Déposer'.

  Si vous avez besoin de plus de types d'événements plus ou de l'affichage avec double-tampon pour une mise à jour
  régulière de l'image alors jetez un oeil au canvas gadget CanvasGadget().

Exemple

  If OpenWindow(0, 0, 0, 245, 105, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If LoadImage(0, "map.bmp")    ; changez le 2ème paramètre en indiquant le chemin/fichier contenant votre image
      ImageGadget(0,  10, 10, 100, 83, ImageID(0))                      ; imagegadget standard
      ImageGadget(1, 130, 10, 100, 83, ImageID(0), #PB_Image_Border)     ; imagegadget avec cadre
    EndIf
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetState(), SetGadgetState(), ButtonImageGadget(), ImageID(), CanvasGadget()


IsGadget()

Syntaxe

Resultat = IsGadget(#Gadget)
Description
Teste si un gadget est correctement initialisé.

Arguments

#Gadget Le gadget à utiliser

Valeur de retour

Renvoie une valeur non nulle si l'entrée est un gadget valide et zéro autrement.

Remarques

Cette fonction a été créée pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.

C'est une bonne façon de s'assurer qu'un gadget est prêt à l'emploi.

Voir aussi

FreeGadget()


ListIconGadget()

Syntaxe

Resultat = ListIconGadget(#Gadget, x, y, Largeur, Hauteur, Titre$, LargeurTitre [, Options])
Description
Crée un gadget de listes avec icônes dans la GadgetList en cours.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur | La position et les dimensions du nouveau gadget.
Titre$ Le titre de la première colonne dans le gadget.

Le gadget est créé avec une colonne initiale.
LargeurTitre | La largeur de la première colonne dans le gadget.
Options (optionnel) Peut être une combinaison de:
  #PB_ListIcon_CheckBoxes         : Affiche une case à cocher dans la première colonne.
  #PB_ListIcon_ThreeState         : La case à cocher peut avoir un état 'indéterminé'.
  #PB_ListIcon_MultiSelect        : Active le mode 'sélection multiple'.
  #PB_ListIcon_GridLines          : Affiche des lignes de séparation (non supporté sous Mac OS X).
  #PB_ListIcon_FullRowSelect      : La sélection s'étend à toute la ligne au lieu de la première colonne (Windows seulement).
  #PB_ListIcon_HeaderDragDrop     : L'ordre des colonnes peut être changé avec un glisser/déposer (drag'n'drop).
  #PB_ListIcon_AlwaysShowSelection: Affiche la selection même quand le gadget n'est plus actif (Windows seulement).
L'option #PB_ListIcon_ThreeState peut être utilisée en combinaison avec l'option #PB_ListIcon_CheckBoxes pour obtenir une case à cocher qui peut avoir un état "on", "off" et "indéterminée". L'utilisateur ne peut sélectionner que l'état "on" ou "off". L'état "indéterminée" peut être définie en utilisant la fonction SetGadgetItemState().

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  Les fonctions suivantes peuvent être utilisées pour agir sur le contenu de cette liste :
  - AddGadgetColumn()   : Ajoute une colonne au gadget.
  - RemoveGadgetColumn(): Supprime une colonne (ainsi que ses données).
  - AddGadgetItem()     : Ajoute un élément et éventuellement une image.
  - RemoveGadgetItem()  : Supprime un élément.
  - ClearGadgetItems()  : Supprime tous les éléments.
  - CountGadgetItems()  : Renvoie le nombre d'éléments actuellement contenus dans le gadget.
  - GetGadgetItemColor(): Renvoie la couleur du texte ou du fond de l'élément.
  - SetGadgetItemColor(): Change la couleur du texte ou du fond de l'élément.
  - GetGadgetItemData() : Renvoie la valeur personnalisée associée à cet élément.
  - SetGadgetItemData() : Associe une valeur personnalisée à cet élément.
  - GetGadgetItemState(): Renvoie l'état de l'élément spécifié.
                          Ce peut être une combinaison de #PB_ListIcon_Selected
                          et #PB_ListIcon_Checked si les 'cases à cocher' sont affichées
  - SetGadgetItemState(): Change l'état de l'élément spécifié.
                          Ce peut être une combinaison de #PB_ListIcon_Selected
                          et #PB_ListIcon_Checked si les 'cases à cocher' sont affichées
  - GetGadgetItemText() : Renvoie le texte de l'élément spécifié. Si 'Element' = -1, alors le titre de la colonne est renvoyé.
  - SetGadgetItemText() : Change le texte de l'élément spécifié. Si 'Element' = -1, alors le titre de la colonne est modifié.
                          Comme avec AddGadgetItem(), il est possible de définir le texte de plusieurs colonnes à la fois,
                          avec le séparateur Chr(10).
  - SetGadgetItemImage(): Modifie l'image actuelle de l'élément spécifié.
  - GetGadgetState()    : Renvoie le premier élément selectionné ou -1 s'il n'y a pas d'élément sélectionné.
  - SetGadgetState()    : Change l'élément sélectionné (tous les autres éléments sont alors désélectionnés). Si -1 est utilisé, tous les éléments seront désélectionnés.
  - GetGadgetAttribute() / SetGadgetAttribute(): avec l'attribut suivant (seulement sous Windows):
      #PB_ListIcon_DisplayMode : Change le mode d'affichage du gadget.
           Le mode peut être l'une des constantes suivantes:
           #PB_ListIcon_LargeIcon   : Mode grandes icônes
           #PB_ListIcon_SmallIcon   : Mode petites icônes
           #PB_ListIcon_List        : Mode Liste
           #PB_ListIcon_Report      : Mode Détails (colonnes, mode par défaut)

  - GetGadgetItemAttribute() / SetGadgetItemAttribute(): Avec l'attribut suivant:
    #PB_ListIcon_ColumnWidth : Renvoie / Change la largeur de la 'Colonne' spécifiée. Le paramètre 'Element' est ignoré.

  Si vous voulez ajouter du contenu à un gadget ListIcon contenant plusieurs colonnes en utilisant
  AddGadgetItem(), utilisez le format "première colonne"+chr(10)+"deuxième colonne" comme paramètre Texte$.

  - SetGadgetColor() et GetGadgetColor() avec les valeurs 'TypeCouleur' suivantes:
    #PB_Gadget_FrontColor: Couleur du texte
    #PB_Gadget_BackColor : Couleur du fond
    #PB_Gadget_LineColor : Couleur de la grille si l'option #PB_ListIcon_GridLines est utilisée.

  -  SetGadgetItemColor() et GetGadgetItemColor() avec les  valeurs 'TypeCouleur' suivantes:
    #PB_Gadget_FrontColor: Texte de l'élément.
    #PB_Gadget_BackColor : Fond de l'élément.

  Note: SetGadgetColor() n'est pas pris en charge sur la plate-forme MacOS X.
Les évènements suivants sont supportés par EventType():
  #PB_EventType_LeftClick        : Clic avec le bouton gauche de la souris, ou une case à cocher a été utilisée.
  #PB_EventType_LeftDoubleClick  : Double-clic avec le bouton gauche de la souris
  #PB_EventType_RightClick       : Clic avec le bouton droit de la souris
  #PB_EventType_RightDoubleClick : Double-clic avec le bouton droit de la souris
  #PB_EventType_Change           : L'élément sélectionné a été changé
  #PB_EventType_DragStart        : L'utilisateur a essayé de lancer une opération de 'Glisser & Déposer'.
Après un évènement #PB_EventType_DragStart , la bibliothèque Drag & Drop peut être utilisée pour commencer une opération 'Glisser & Déposer'.

Exemple

 If OpenWindow(0, 100, 100, 300, 100, "ListIconGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   ListIconGadget(0, 5, 5, 290, 90, "Nom", 100, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
   AddGadgetColumn(0, 1, "Adresse", 250)
   AddGadgetItem(0, -1, "Harry Rannit"+Chr(10)+"12 Parliament Way, Battle Street, By the Bay")
   AddGadgetItem(0, -1, "Ginger Brokeit"+Chr(10)+"130 PureBasic Road, BigTown, CodeCity")

   Repeat
     Evenement = WaitWindowEvent()
   Until Evenement = #PB_Event_CloseWindow
 EndIf

Exemple

  ; Démonstration des options possibles pour le gadget liste avec icônes...
  If OpenWindow(0, 0, 0, 690, 300, "ListIconGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ; colonne de gauche
    TextGadget    (6,  10,  10, 300, 20, "Liste avec icônes standard", #PB_Text_Center)
    ListIconGadget(0,  10,  25, 300, 70, "Colonne 1", 100)
    TextGadget    (7,  10, 105, 300, 20, "Liste avec icônes + cases à cocher", #PB_Text_Center)
    ListIconGadget(1,  10, 120, 300, 75, "Colonne 1", 100, #PB_ListIcon_CheckBoxes)  ; Liste avec icônes et cases à cocher
    TextGadget    (8,  10, 205, 300, 20, "Liste avec icônes + sélection multiple", #PB_Text_Center)
    ListIconGadget(2,  10, 220, 300, 70, "Colonne 1", 100, #PB_ListIcon_MultiSelect) ; Liste avec icônes et sélection multiple
    ; colonne de droite
    TextGadget    (9, 330,  10, 350, 20, "Liste avec icônes + lignes de séparation",#PB_Text_Center)
    ListIconGadget(3, 330,  25, 350, 70, "Colonne 1", 100, #PB_ListIcon_GridLines)
    TextGadget   (10, 330, 105, 350, 20, "Liste avec icônes + sélection de ligne entière + sélection toujours affichée",#PB_Text_Center)
    ListIconGadget(4, 330, 120, 350, 75, "Colonne 1", 100, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
    TextGadget   (11, 330, 205, 350, 20, "Liste avec icônes standard + mode grandes icônes",#PB_Text_Center)
    ListIconGadget(5, 330, 225, 350, 65, "", 200,#PB_ListIcon_GridLines)
    For a = 0 To 4            ; pour chacune des 5 premières listes avec icônes
      For b = 2 To 4          ; ajouter 3 colonnes supplémentaires
        AddGadgetColumn(a, b, "Colonne " + Str(b), 65)
      Next
      For b = 0 To 2          ; ajouter 4 éléments à chaque ligne des listes avec icônes
        AddGadgetItem(a, b, "Elément 1"+Chr(10)+"Elément 2"+Chr(10)+"Elément 3"+Chr(10)+"Elément 4")
      Next
    Next
    ; Ici nous changeons l'affichage de la liste avec icônes en mode grandes icônes et nous affichons une image
    If LoadImage(0, "map2.bmp")     ; changez le chemin/fichier contenant votre image 32x32 pixel
      SetGadgetAttribute(5, #PB_ListIcon_DisplayMode, #PB_ListIcon_LargeIcon)
      AddGadgetItem(5, 1, "Image 1", ImageID(0))
      AddGadgetItem(5, 2, "Image 2", ImageID(0))
    EndIf
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

AddGadgetColumn(), RemoveGadgetColumn(), AddGadgetItem(), RemoveGadgetItem(), ClearGadgetItems(), CountGadgetItems(),
GetGadgetState(), SetGadgetState(), GetGadgetAttribute(), SetGadgetAttribute(), GetGadgetItemText(), SetGadgetItemText(),
GetGadgetItemState(), SetGadgetItemState(), SetGadgetItemImage(),
GetGadgetItemData(), SetGadgetItemData(), GetGadgetItemAttribute(), SetGadgetItemAttribute(), GetGadgetColor(), SetGadgetColor(),
GetGadgetItemColor(), SetGadgetItemColor(), ExplorerListGadget(), ListViewGadget()


ListViewGadget()

Syntaxe

Resultat = ListViewGadget(#Gadget, x, y, Largeur, Hauteur [, Options])
Description
Crée une boîte à listes (ListView) dans la GadgetList en cours.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur La position et les dimensions du nouveau gadget.
Options (optionnel) Peut être une combinaison de:
  #PB_ListView_Multiselect: Permet la sélection de plusieurs éléments consécutifs.
  #PB_ListView_ClickSelect: Permet la sélection de plusieurs éléments.
                            Cliquez sur un élément pour le sélectionner ou le désélectionner
                            (sous OS X, même comportement que #PB_ListView_Multiselect).

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  Les fonctions suivantes peuvent être utilisées pour agir sur le contenu de cette liste:
  - AddGadgetItem()     : Ajoute un élément
  - CountGadgetItems()  : Renvoie le nombre de lignes contenues dans le gadget.
  - RemoveGadgetItem()  : Supprime un élément
  - ClearGadgetItems()  : Supprime tous les éléments
  - GetGadgetItemData() : Renvoie la valeur personnalisée associée à cet élément.
  - SetGadgetItemData() : Associe une valeur personnalisée à cet élément.
  - GetGadgetItemText() : Renvoie le texte de l'élément spécifié.
  - SetGadgetItemText() : Change le texte de l'élément spécifié.
  - GetGadgetItemState(): Renvoie 0 si l'élément n'est pas séléctionné, sinon une valeur non-nulle.
  - SetGadgetItemState(): Sélectionne ou désélectionne l'élément spécifié.
  - GetGadgetState()    : Renvoie le numéro de l'élément qui est sélectionné, -1 si il n'y a pas de sélection.
  - SetGadgetState()    : Change l'état de l'élément spécifié.
  - GetGadgetText()     : Renvoie le texte de l'élément sélectionné.
  - SetGadgetText()     : Sélectionne l'élément correspondant au texte indiqué. Le texte doit exactement correspondre.

  - SetGadgetColor() et GetGadgetColor() avec les valeurs 'TypeCouleur' suivantes:
    #PB_Gadget_BackColor : Couleur de fond
    #PB_Gadget_FrontColor: Couleur du texte

  Note: SetGadgetColor() n'est pas pris en charge sur la plate-forme MacOS X.
Les évènements suivants sont supportés par EventType():
  #PB_EventType_LeftClick
  #PB_EventType_LeftDoubleClick

Exemple

  If OpenWindow(0,0,0,270,140,"ListViewGadget",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ListViewGadget(0,10,10,250,120)
    For a=1 To 12
      AddGadgetItem (0,-1,"Elément "+Str(a)+" de la boîte à liste")   ; défini le contenu de la boîte de liste
    Next
    SetGadgetState(0,9)    ; sélectionne le dixième élément (la numérotation commmence à 0)
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf

Voir aussi

AddGadgetItem(), RemoveGadgetItem(), ClearGadgetItems(), CountGadgetItems(), GetGadgetState(), SetGadgetState(),
GetGadgetText(), SetGadgetText(), GetGadgetItemState(), SetGadgetItemState(), GetGadgetItemText(), SetGadgetItemText(),
GetGadgetItemData(), SetGadgetItemData(), GetGadgetColor(), SetGadgetColor(), ListIconGadget()


MDIGadget()

Syntaxe

Resultat = MDIGadget(#Gadget, x, y, Largeur, Hauteur, SousMenu, ElementMenu [, Options])
Description
Crée un espace dans lequel peut s'afficher une ou plusieurs fenêtres filles. Ces fenêtres peuvent être librement déplacées et redimensionnées à l'intérieur de cet espace. Ce type de gestion de fenêtres s'appelle MDI (Multiple Document Interface).

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur La position et les dimensions du nouveau gadget.
SousMenu L'indice du menu pour lequel l'élément de fenêtres MDI doit être ajouté.
Un MDIGadget() a toujours besoin d'une fenêtre avec menu (voir CreateMenu()). Il n'est pas possible de créer plusieurs contrôles MDI dans une seule fenêtre, car il n'y a qu'un seul menu disponible par fenêtre. Une fois créé, le gadget mettra automatiquement à jour le menu auquel il est rattaché, avec la liste des fenêtres filles ouvertes. Dans le paramètre 'SousMenu', il faut préciser l'index du sous-menu (créé avec MenuTitle()) qui sera le point d'attache aux éléments gérés par le gadget (l'index du premier sous-menu commence à 0). Le gadget ajoutera alors une barre de séparation à la fin de ce sous-menu et ajoutera la liste des fenêtres filles disponibles.
ElementMenu Le premier indice de menu à utiliser pour les fenêtres MDI.
Le gadget a besoin d'un certain nombre d'identifiants pour ses propres éléments du menu (voir le paramètre 'MenuID' de la commande MenuItem()). Dans le paramètre 'ElementMenu', il faudra indiquer le chiffre à partir duquel le gadget pourra identifier ses propres éléments. Il utilisera autant d'identifiants qu'il y aura de fenêtres filles ouvertes. Il est donc recommandé d'utiliser un nombre plus grand que le plus grand des nombres utilisé par les menus normaux du programme, pour éviter tout risque de collisions.
Options (optionnel) Peut être une combinaison de:
  #PB_MDI_AutoSize    : Le gadget sera automatiquement retaillé en fonction de la taille de la fenêtre mère.
                        Si il n'y a pas d'autres gadgets sur la fenêtre mère, cela peut être une option très pratique.
  #PB_MDI_BorderLess  : Il n'y aura pas de bords autour du gadget.
  #PB_MDI_NoScrollBars: Quand une fenêtre est déplacée en dehors de l'espace du gadget, il n'y aura pas de barres de défilement.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

A cause de la connexion avec les menus, il ne peut y avoir qu'un seul gadget MDI par fenêtre, cependant vous pouvez utiliser plusieurs fenêtres contenant un gadget MDI chacune. Ce gadget ne peut être créé que dans une fenêtre principale donc pas dans un ContainerGadget(), SplitterGadget() ou PanelGadget()).
Comme l'intérêt premier de ce gadget est de gérer de manière dynamique des fenêtres, il est recommandé d'utiliser #PB_Any (création dynamiques) pour les gadgets qui seront créés dans les fenêtres filles.

Quand la commande AddGadgetItem() est utilisée avec ce gadget, l'élément créé est en fait une nouvelle fenêtre.
Ainsi, toutes les commandes de la bibliothèque Window sont disponibles pour gérer cette nouvelle fenêtre (sauf StickyWindow()). Le numéro choisi pour cet élément ne doit pas entrer en conflit avec un numéro de fenêtre déjà existant sinon l'autre fenêtre sera fermée. Le gadget MDI ne génère pas d'évènements. Les évènements concernant les fenêtres MDI filles seront reçus comme des évènements fenêtre normaux (#PB_Event_SizeWindow, #PB_Event_CloseWindow, ...).
  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  En complément des commandes de la bibliothèque Window (sauf StickyWindow()),
  les commandes suivantes sont disponibles pour agir sur le gadget:
  - CountGadgetItems()  : Renvoie le nombre de fenêtres fille.
  - AddGadgetItem()     : Crée une nouvelle fenêtre fille.
  - ClearGadgetItems()  : Ferme toutes les fenêtres filles.
  - GetGadgetState()    : Renvoie l'identifiant de la fenêtre fille active.
  - SetGadgetState()    : Change la fenêtre fille active ou ré-arrange la disposition des fenêtres filles (voir GetGadgetState()).
  - SetGadgetAttribute(): Avec une des constantes suivantes:
    #PB_MDI_Image    : Applique une image de fond à la fenêtre MDI.
    #PB_MDI_TileImage: Applique une image de fond à la fenêtre MDI.
                       L'image est répétée le nombre de fois nécessaire
                       pour remplir complètement la surface de la fenêtre.

  - SetGadgetAttribute(): Avec une des constantes suivantes:
    #PB_ScrollArea_InnerWidth : Modifie la largeur (en pixels) de la zone interne du gadget.
    #PB_ScrollArea_InnerHeight: Modifie la hauteur (en pixels) de la zone interne du gadget.

  - SetGadgetColor() et GetGadgetColor() avec la constante #PB_Gadget_BackColor comme 'TypeCouleur'
    pour changer la couleur de fond de la fenêtre MDI.

Exemple

  #FenetrePrincipale = 0
  #FenetreFille = 1
  If OpenWindow(#FenetrePrincipale, 0, 0, 400, 300, "MDIGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget)
    If CreateMenu(#FenetrePrincipale, WindowID(#FenetrePrincipale))
      MenuTitle("Index de menu 0")
      MenuTitle("Menu des fenêtres filles")
        MenuItem(0, "Elément créé soi-même")
        MenuItem(1, "Elément créé soi-même")

      MDIGadget(0, 0, 0, 0, 0, 1, 2, #PB_MDI_AutoSize)
        AddGadgetItem(0, #FenetreFille, "Fenêtre fille")
          ; ajouter des gadgets ici...
      UseGadgetList(WindowID(#FenetrePrincipale)) ; retourne à la liste de gadgets de la fenêtre principale
    EndIf
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf

OS Supportés

Windows


OpenGadgetList()

Syntaxe

OpenGadgetList(#Gadget [, Element])
Description
Change la 'GadgetList' courante par la nouvelle spécifiée (en principe un gadget qui fait office de conteneur, comme un PanelGadget(), ScrollAreaGadget() etc..). Cela permet de rajouter des nouveaux gadgets à la volée sans avoir à recréer le gadget. Une fois que les nouveaux gadgets ont été ajoutés, il convient d'appeler CloseGadgetList() pour revenir à l'état précédent.

Arguments

#Gadget | Le gadget dans lequel de nouveaux gadgets seront créés.
Element (optionnel) | Pour le PanelGadget(): Indique l'onglet sur lequel les gadgets doivent être ajoutés. Pour ajouter un nouvel onglet dynamiquement, le paramètre 'Element' doit être omis.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Les gadgets suivants sont pris en charge par OpenGadgetList():
  - ContainerGadget()
  - PanelGadget(): Le paramètre 'Element' doit être spécifié (correspond à l'onglet)
  - ScrollAreaGadget()
Une fois tous les changements effectuées, CloseGadgetList() doit être appelée pour fermer la 'GadgetList'.

Voir aussi

CloseGadgetList(), ContainerGadget(), PanelGadget(), ScrollAreaGadget()


OptionGadget()

Syntaxe

Resultat = OptionGadget(#Gadget, x, y, Largeur, Hauteur, Texte$)
Description
Crée un gadget de cases à options (connu aussi sous le nom de 'boutons radio') dans la GadgetList en cours.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur | La position et les dimensions du nouveau gadget.
Texte$ (optionnel) | Texte$ décrit l'utilité de la case à option, il est placé à sa droite.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

Ce gadget permet de regrouper plusieurs cases à options, sachant qu'une seule d'entre elles peut être sélectionnée à la fois. Au premier appel de cette fonction, un groupe de cases à options est créé, et tous les appels suivants à la fonction OptionGadget ajouteront une nouvelle case à options au groupe. Pour terminer le groupe, il suffit d'appeler un autre type de gadget.

- GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

Exemple

  If OpenWindow(0, 0, 0, 170, 110, "OptionGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    OptionGadget(0, 30, 20, 60, 20, "Option 1")
    OptionGadget(1, 30, 45, 60, 20, "Option 2")
    OptionGadget(2, 30, 70, 60, 20, "Option 3")
    SetGadgetState(1, 1)   ; sélectionne la deuxième option
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetText(), SetGadgetText(), GetGadgetState(), SetGadgetState(), CheckBoxGadget()


PanelGadget()

Syntaxe

Resultat = PanelGadget(#Gadget, x, y, Largeur, Hauteur)
Description
Crée un gadget boîte à onglets (Panel) dans la GadgetList.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur La position et les dimensions du nouveau gadget.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  Les fonctions suivantes peuvent être appelées pour agir sur la liste :
  - AddGadgetItem()     : Ajoute un élément.
  - RemoveGadgetItem()  : Supprime un élément.
  - CountGadgetItems()  : Renvoie le nombre d'éléments.
  - ClearGadgetItems()  : Supprime tous les éléments.
  - GetGadgetItemText() : Renvoie le texte de l'élément spécifié.
  - SetGadgetItemText() : Change le texte de l'élément spécifié.
  - SetGadgetItemImage(): Change l'image de l'élément spécifié.
  - GetGadgetItemData() : Renvoie la valeur associée à l'élément spécifié.
  - SetGadgetItemData() : Associe une valeur à l'élément spécifié.
  - SetGadgetState()    : Change l'onglet affiché.
  - GetGadgetState()    : Renvoie le numéro de l'onglet actuellement affiché.

  - GetGadgetAttribute() avec un des attributs suivants (il doit y avoir au moins un
  élément dans le PanelGadget()):
    #PB_Panel_ItemWidth : Renvoie la largeur de la zone utilisable d'un onglet.
    #PB_Panel_ItemHeight: Renvoie la hauteur de la zone utilisable d'un onglet.
    #PB_Panel_TabHeight : Renvoie la hauteur d'un bouton de changement d'onglet.

  Lorsqu'une boîte à onglets est créée, sa liste d'éléments est vide.
  Avant de pouvoir ajouter des gadgets, il est nécessaire d'appeler la commande AddGadgetItem()
  pour ajouter au moins un onglet. Les prochains gadgets créés le seront automatiquement sur le dernier onglet.
  Lorsque tous les gadgets de la boîte à onglets ont été placés, CloseGadgetList()
  doit être appelé pour revenir à la GadgetList précédente. Il est ainsi parfaitement
  possible de créer une boîte à onglets dans une autre boîte à onglets...

Exemple

  ; Exemple d'utilisation de plusieurs onglets...
  If OpenWindow(0, 0, 0, 322, 220, "PanelGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    PanelGadget     (0, 8, 8, 306, 203)
      AddGadgetItem (0, -1, "Onglet 1")
        PanelGadget (1, 5, 5, 290, 166)
          AddGadgetItem(1, -1, "Sous-onglet 1")
          AddGadgetItem(1, -1, "Sous-onglet 2")
          AddGadgetItem(1, -1, "Sous-onglet 3")
        CloseGadgetList()
      AddGadgetItem (0, -1,"Onglet 2")
        ButtonGadget(2, 10, 15, 80, 24,"Bouton 1")
        ButtonGadget(3, 95, 15, 80, 24,"Bouton 2")
    CloseGadgetList()
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

AddGadgetItem(), RemoveGadgetItem(), CountGadgetItems(), ClearGadgetItems(), GetGadgetItemText(), SetGadgetItemText(), GetGadgetState(), SetGadgetState(), GetGadgetAttribute(), CloseGadgetList(), OpenGadgetList(), SetGadgetItemImage()


ProgressBarGadget()

Syntaxe

Resultat = ProgressBarGadget(#Gadget, x, y, Largeur, Hauteur, Minimum, Maximum [, Options])
Description
Crée un gadget 'Barre de progression' (ProgressBar) dans la GadgetList.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur | La position et les dimensions du nouveau gadget.
Minimum, Maximum | Les valeurs 'Minimum-Maximum' spécifient l'intervalle qui sera utilisé par la barre de progression.
Options (optionnel) Peut être une combinaison de:
  #PB_ProgressBar_Smooth  : La progression est précise, au lieu d'utiliser des blocs (Note: sous Windows XP avec
                            le support des skins activé et sous OS X, cette option n'a aucun effet).
  #PB_ProgressBar_Vertical: La barre de progression sera verticale.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  Les fonctions suivantes peuvent être appelées pour agir sur la barre de progression :
  - SetGadgetState(): Change la valeur de la barre de progression.
  - GetGadgetState(): Renvoie la valeur courante de la barre de progression.
  - SetGadgetAttribute() avec les attributs suivants:
    #PB_ProgressBar_Minimum: Change la valeur minimale.
    #PB_ProgressBar_Maximum: Change la valeur maximale.

  - GetGadgetAttribute() avec les attributs suivants:
    #PB_ProgressBar_Minimum: Renvoie la valeur minimale.
    #PB_ProgressBar_Maximum: Renvoie la valeur maximale.

  -SetGadgetColor() et GetGadgetColor() avec les valeurs suivantes comme 'TypeCouleur'
  (Note: Sous Windows XP avec le support des skins activé, la couleur n'a aucun effet):
    #PB_Gadget_FrontColor: Couleur de la barre de progression
    #PB_Gadget_BackColor : Couleur du fond

  Note: SetGadgetColor() n'est pas pris en charge sur la plate-forme MacOS X.

Exemple

  If OpenWindow(0, 0, 0, 320, 160, "ProgressBarGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget       (3,  10, 10, 250,  20, "Barre de progression standard  (50/100)", #PB_Text_Center)
    ProgressBarGadget(0,  10, 30, 250,  30, 0, 100)
    SetGadgetState   (0, 50)   ;  change la valeur de la 1ère barre de progression (ID = 0) à 50 sur 100
    TextGadget       (4,  10, 70, 250,  20, "Barre de progression précise  (50/200)", #PB_Text_Center)
    ProgressBarGadget(1,  10, 90, 250,  30, 0, 200, #PB_ProgressBar_Smooth)
    SetGadgetState   (1, 50)   ;  change la valeur de la 2ème barre de progression (ID = 1) à 50 sur 200
    TextGadget       (5, 100,135, 200,  20, "Barre de progression verticale  (100/300)", #PB_Text_Right)
    ProgressBarGadget(2, 270, 10,  30, 120, 0, 300, #PB_ProgressBar_Vertical)
    SetGadgetState   (2, 100)   ; change la valeur de la 3ème barre de progression (ID = 2) à 100 sur 300
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetState(), SetGadgetState(), GetGadgetAttribute(), SetGadgetAttribute(), GetGadgetColor(), SetGadgetColor(), SetGadgetItemImage()


RemoveGadgetColumn()

Syntaxe

RemoveGadgetColumn(#Gadget, Colonne)
Description
Supprime une colonne à un gadget.

Arguments

#Gadget Le gadget à utiliser
Colonne La colonne à supprimer.

La première colonne commence à 0

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le gadget peut être l'un des suivants:

- ListIconGadget()
- ExplorerListGadget()

Exemple

  If OpenWindow(0, 0, 0, 320, 160, "RemoveGadgetColumn", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

    ListIconGadget(0, 10, 10, 300, 140, "Salut", 100)
      AddGadgetColumn(0, 1, "Colonne 2", 70)
      AddGadgetColumn(0, 2, "Colonne 3", 70)

    RemoveGadgetColumn(0, 1) ; Supprime la 'colonne 2'

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

AddGadgetColumn(), ListIconGadget(), ExplorerListGadget()


RemoveGadgetItem()

Syntaxe

RemoveGadgetItem(#Gadget, Position)
Description
Supprime un élément d'un gadget.

Arguments

#Gadget | Le gadget à utiliser
Position | Position représente la position de l'élément dans la liste dont l'index commence à 0.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette fonction s'applique aux gadgets suivants :

- ComboBoxGadget()
- EditorGadget()
- PanelGadget()
- ListViewGadget()
- ListIconGadget()
- MDIGadget()
- TreeGadget()

Voir aussi

AddGadgetItem(), ClearGadgetItems(), CountGadgetItems()


ResizeGadget()

Syntaxe

ResizeGadget(#Gadget, x, y, Largeur, Hauteur)
Description
Change la taille et la position d'un gadget.

Arguments

#Gadget Le gadget à utiliser
x, y, Largeur, Hauteur Les nouvelles positions et dimensions du gadget.
Pour faciliter le redimensionnement de l'interface en temps réel, la constante #PB_Ignore peut être spécifiée à chacun des paramètres (x, y, Largeur ou Hauteur) et la valeur précédente de ce paramètre sera conservée.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  ResizeGadget(0, #PB_Ignore, #PB_Ignore, 300, #PB_Ignore) ; Change seulement la largeur du gadget.

  ResizeGadget(0, 150, 100, #PB_Ignore, #PB_Ignore) ; Déplacement du gadget sans redimensionnement.

Voir aussi

GadgetX(), GadgetY(), GadgetWidth(), GadgetHeight()


ScrollAreaGadget()

Syntaxe

Resultat = ScrollAreaGadget(#Gadget, x, y, Largeur, Hauteur, LargeurZoneInterne, HauteurZoneInterne [, ValeurDeplacement [, Options]])
Description
Crée un gadget permettant d'afficher une zone plus grande que celle affichée à l'écran, à l'aide de barres de déplacement.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur | La position et les dimensions du nouveau gadget.
LargeurZoneInterne, HauteurZoneInterne | 'LargeurZoneInterne' et 'HauteurZoneInterne' sont les dimensions de la zone interne, qui devraient être supérieures ou égales aux dimensions 'Largeur' et 'Hauteur' du #Gadget.
ValeurDeplacement (optionnel) | 'ValeurDeplacement' est le nombre de pixels qui seront décalés quand on presse l'une des flèches de déplacement, pour permettre une vitesse de déplacement variable.
Options (optionnel) Peut être une combinaison de:
  #PB_ScrollArea_Flat      : Cadre simple
  #PB_ScrollArea_Raised    : Cadre élevé
  #PB_ScrollArea_Single    : Cadre enfoncé
  #PB_ScrollArea_BorderLess: Sans bordure
  #PB_ScrollArea_Center    : La zone interne est automatiquement centrée si sa taille est
                             plus petite que les dimensions du gadget.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

Tout le déplacement de la zone interne est géré automatiquement par le gadget. Par exemple, il est très utile pour afficher une image trop grande pour être vue en entier (à l'aide d'un ImageGadget(). Cette zone peut contenir n'importe quel type de gadgets. Quand ce gadget est créé la 'GadgetList' courante est automatiquement changée et les nouveaux gadgets qui sont créés après cette commande seront placés dans ce #Gadget.
CloseGadgetList() permet de revenir à la 'GadgetList' précédente.
OpenGadgetList() pourra être utilisé pour ajouter des gadgets dynamiquement dans ce #Gadget.
Un évènement est généré lorsque l'utilisateur déplace les ascenseurs du gadget.

Les commandes suivantes peuvent être utilisées pour agir sur un ScrollAreaGadget:
  - GetGadgetAttribute(): Avec une des constantes suivantes:
    #PB_ScrollArea_InnerWidth : Renvoie la largeur (en pixels) de la zone interne du gadget.
    #PB_ScrollArea_InnerHeight: Renvoie la hauteur (en pixels) de la zone interne du gadget.
    #PB_ScrollArea_X          : Renvoie la position horizontale actuelle de l'ascenseur (en pixels).
    #PB_ScrollArea_Y          : Renvoie la position verticale actuelle de l'ascenseur (en pixels).

  - SetGadgetAttribute(): Avec une des constantes suivantes:
    #PB_ScrollArea_InnerWidth : Modifie la largeur (en pixels) de la zone interne du gadget.
    #PB_ScrollArea_InnerHeight: Modifie la hauteur (en pixels) de la zone interne du gadget.
    #PB_ScrollArea_X          : Modifie la position horizontale actuelle de l'ascenseur (en pixels).
    #PB_ScrollArea_Y          : Modifie la position verticale actuelle de l'ascenseur (en pixels).

  - SetGadgetColor() et GetGadgetColor() avec la constante #PB_Gadget_BackColor comme 'TypeCouleur'
    pour changer la couleur de fond du gadget.

Exemple

  If OpenWindow(0, 0, 0, 305, 140, "ScrollAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ScrollAreaGadget(0, 10, 10, 290,120, 375, 155, 30)
      ButtonGadget  (1, 10, 10, 230, 30,"Bouton 1")
      ButtonGadget  (2, 50, 50, 230, 30,"Bouton 2")
      ButtonGadget  (3, 90, 90, 230, 30,"Bouton 3")
      TextGadget    (4,130,130, 230, 20,"Ceci est le contenu d'une zone de défilement !",#PB_Text_Right)
      CloseGadgetList()
    Repeat
      Select WaitWindowEvent()
        Case  #PB_Event_CloseWindow
          End
        Case  #PB_Event_Gadget
          Select EventGadget()
            Case 1
              MessageRequester("Info","Le bouton 1 a été appuyé !",#PB_MessageRequester_Ok)
            Case 2
              MessageRequester("Info","Le bouton 2 a été appuyé !",#PB_MessageRequester_Ok)
            Case 3
              MessageRequester("Info","Le bouton 3 a été appuyé !",#PB_MessageRequester_Ok)
          EndSelect
      EndSelect
    ForEver
  EndIf

Voir aussi

GetGadgetAttribute(), SetGadgetAttribute(), ScrollBarGadget()


ScrollBarGadget()

Syntaxe

Resultat = ScrollBarGadget(#Gadget, x, y, Largeur, Hauteur, Minimum, Maximum, LongueurPage [, Options])
Description
Crée une nouvelle barre de défilement (ascenseur vertical ou horizontal) dans la GadgetList courante.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur | La position et les dimensions du nouveau gadget.
Minimum, Maximum | Les valeurs 'Minimum-Maximum' spécifie l'intervalle qui sera utilisé par la barre de déplacement (valeurs comprises entre 0 et 10 000).
LongueurPage Un ascenceur permet de se déplacer par page (lorque l'on clique en dehors du curseur de déplacement) et le paramètre 'LongueurPage' permet de définir la valeur de ce déplacement.
Exemple concret: La longueur totale du composant (image, document, container etc...) fait 500 pixels. On ne peut en afficher que 100 pixels. Donc on aura une valeur minimale de 0, une valeur Maximale de 500 et une longueur de page de 100. Le curseur sera 5 fois plus petit que la barre de déplacement, car sa dimension est proportionnelle (dimension = Maximum/LongueurPage).
Options (optionnel)
  #PB_ScrollBar_Vertical: La barre de déplacement sera verticale.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  Les fonctions suivantes peuvent être appelées pour agir sur la barre de déplacement :
  - GetGadgetState(): Renvoie la position actuelle du curseur
                     (valeur comprise dans l'intervalle Minimum - longueur de la page + 1)
  - SetGadgetState(): Change la position actuelle du curseur.
  - GetGadgetAttribute() avec un des attributs suivants:
    #PB_ScrollBar_Minimum   : Renvoie la position minimale de l'ascenseur.
    #PB_ScrollBar_Maximum   : Renvoie la position maximale de l'ascenseur.
    #PB_ScrollBar_PageLength: Renvoie la longueur de la page.

  - SetGadgetAttribute(): avec un des attributs suivants:
    #PB_ScrollBar_Minimum   : Change la position minimale de l'ascenseur.
    #PB_ScrollBar_Maximum   : Change la position maximale de l'ascenseur.
    #PB_ScrollBar_PageLength: Change la longueur de la page.

Exemple

  If OpenWindow(0, 0, 0, 305, 140, "ScrollBarGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget       (2,  10, 25, 250,  20, "Ascenseur standard  (début = 50, page = 30/100)",#PB_Text_Center)
    ScrollBarGadget  (0,  10, 42, 250,  20, 0, 100, 30)
    SetGadgetState   (0,  50)   ; change la valeur de la 1ère barre de défilement (ID = 0) à 50 sur 100
    TextGadget       (3,  10,115, 250,  20, "Ascenseur vertical  (début = 100, page = 50/300)",#PB_Text_Right)
    ScrollBarGadget  (1, 270, 10,  25, 120 ,0, 300, 50, #PB_ScrollBar_Vertical)
    SetGadgetState   (1, 100)   ; change la valeur de la 2ème barre de défilement (ID = 1) à 100 sur 300
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetState(), SetGadgetState(), GetGadgetAttribute(), SetGadgetAttribute(), ScrollAreaGadget()


SetActiveGadget()

Syntaxe

SetActiveGadget(#Gadget)
Description
Active un gadget etlui donne le focus clavier.

Arguments

#Gadget Le gadget à activer

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette fonction est utilisée principalement avec ComboBoxGadget() and StringGadget().
Cela permet a un gadget d'obtenir le focus du clavier.

Exemple

  If OpenWindow(0, 0, 0, 270, 140, "SetActiveGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    StringGadget  (0, 10, 10, 250, 20, "bla bla...")
    ComboBoxGadget(1, 10, 40, 250, 100)
    For a = 1 To 5 : AddGadgetItem(1, -1, "Elément de liste déroulante " + Str(a)) : Next
    SetGadgetState(1, 2)                ; sélectionne le troisième élément (la numérotation commence à 0)
    ButtonGadget  (2, 10,  90, 250, 20, "Activer le gadget de saisie de texte")
    ButtonGadget  (3, 10, 115, 250, 20, "Activer la liste déroulante")
    Repeat
      Evenement = WaitWindowEvent()
      If Evenement = #PB_Event_Gadget
        Select EventGadget()
          Case 2 : SetActiveGadget(0)   ; Activer le gadget 'saisie de texte'
          Case 3 : SetActiveGadget(1)   ; Activer la liste déroulante
        EndSelect
      EndIf
    Until Evenement = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetActiveGadget(), SetActiveWindow()


SetGadgetAttribute()

Syntaxe

SetGadgetAttribute(#Gadget, Attribut, Valeur)
Description
Change la valeur de l'attribut d'un gadget.

Arguments

#Gadget | Le gadget à utiliser
Attribut L'attribut à définir.
Consultez la documentation de chaque gadget pour les attributs pris en charge et leur signification.
Valeur | La valeur à donner à l'attribut.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette fonction est disponible avec les gadgets suivants:

- ButtonImageGadget()
- CalendarGadget()
- CanvasGadget()
- DateGadget()
- EditorGadget()
- ExplorerListGadget()
- ListIconGadget()
- MDIGadget()
- ProgressBarGadget()
- ScrollAreaGadget()
- ScrollBarGadget()
- SpinGadget()
- SplitterGadget()
- TrackBarGadget()
- WebGadget()

Voir aussi

GetGadgetAttribute(), GetGadgetItemAttribute(), SetGadgetItemAttribute()


SetGadgetColor()

Syntaxe

SetGadgetColor(#Gadget, TypeCouleur, Couleur)
Description
Change la couleur de l'attribut 'TypeCouleur' d'un gadget.

Arguments

#Gadget Le gadget à utiliser
TypeCouleur L'attribut de couleur à changer.

Le paramètre 'TypeCouleur' peut prendre l'une des valeurs suivantes (tous les gadgets ne supportent pas toutes ces valeurs):
  #PB_Gadget_FrontColor     : Texte du gadget
  #PB_Gadget_BackColor      : Fond du gadget
  #PB_Gadget_LineColor      : Couleur de la grille
  #PB_Gadget_TitleFrontColor: Couleur du texte dans le titre (pour CalendarGadget())
  #PB_Gadget_TitleBackColor : Couleur du fond dans le titre (pour CalendarGadget())
  #PB_Gadget_GrayTextColor  : Couleur du texte inactif (pour CalendarGadget())
Couleur La nouvelle couleur de l'attribut.

RGB() peut être utilisé pour obtenir une couleur valide.

Pour supprimer la couleur personnalisée et revenir à la couleur par défaut, utiliser la valeur -1.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette commande supporte les gadgets suivants:

- CalendarGadget()
- ContainerGadget()
- DateGadget()
- EditorGadget()
- ExplorerListGadget()
- ExplorerTreeGadget()
- HyperLinkGadget()
- ListViewGadget()
- ListIconGadget()
- MDIGadget()
- ProgressBarGadget()
- ScrollAreaGadget()
- SpinGadget()
- StringGadget()
- TextGadget()
- TreeGadget()

Note: Avec le support des thèmes activé sur Windows XP, les couleurs personnalisées ne seront probablement pas
pris en compte sur certains gadgets.

Exemple

  If OpenWindow(0, 0, 0, 210, 170, "SetGadgetColor", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    StringGadget(0, 10, 10, 180, 20, "Chaîne...")
    ListViewGadget(1, 10, 40, 180, 60)
    For i = 0 To 4
      AddGadgetItem(1, -1, "Texte")
    Next i
    ContainerGadget(2, 10, 110, 180, 50, #PB_Container_Raised)

    SetGadgetColor(0, #PB_Gadget_BackColor, $00FFFF)
    SetGadgetColor(1, #PB_Gadget_FrontColor, $FFFFFF)
    SetGadgetColor(1, #PB_Gadget_BackColor, $000000)
    SetGadgetColor(2, #PB_Gadget_BackColor, $0000FF)

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetColor(), GetGadgetItemColor(), SetGadgetItemColor()


SetGadgetData()

Syntaxe

SetGadgetData(#Gadget, Valeur)
Description
Associe une 'Valeur' à un gadget.

Arguments

#Gadget | Le gadget à utiliser
Value | La valeur à définir.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette valeur peut être récupérée avec GetGadgetData().

Tous les gadgets sont supportés par cette commande.

Exemple

  ; Ce programme utilise SetGadgetData pour associer un indice du tableau Messages()
  ; à chaque bouton. Cela rend la boucle d'évènements plus simple car les gadgets
  ; n'ont plus besoin d'être traités séparément un par un
  ;
  Dim Messages.s(2)
  Messages(0) = "Bonjour"
  Messages(1) = "Salut le Monde"
  Messages(2) = "Rien à dire"
  If OpenWindow(0, 0, 0, 230, 100, "SetGadgetData", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0,  10, 10, 80, 20, "Bouton 0"): SetGadgetData(0, 1)
    ButtonGadget(1,  10, 40, 80, 20, "Bouton 1"): SetGadgetData(1, 2)
    ButtonGadget(2,  10, 70, 80, 20, "Bouton 2"): SetGadgetData(2, 1)
    ButtonGadget(3, 100, 10, 80, 20, "Bouton 3"): SetGadgetData(3, 2)
    ButtonGadget(4, 100, 40, 80, 20, "Bouton 4") ; aura la valeur 0 car aucune valeur n'a été attribuée
    ButtonGadget(5, 100, 70, 80, 20, "Bouton 5")
    Repeat
      Evenement = WaitWindowEvent()
      If Evenement = #PB_Event_Gadget
        Valeur = GetGadgetData(EventGadget())
        MessageRequester("Message", Messages(Valeur))
      EndIf
    Until Evenement = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetData(), GetGadgetItemData(), SetGadgetItemData()


SetGadgetFont()

Syntaxe

SetGadgetFont(#Gadget, PoliceID)
Description
Change la police du #Gadget spécifié.

Arguments

#Gadget Le gadget à utiliser.

Si la valeur de #Gadget est #PB_Default, alors la police par défaut utilisée par les nouveaux gadgets est changée par la nouvelle valeur.
PoliceID Le numéro d'identification de la police à utiliser.

Si la valeur de 'PoliceID' est #PB_Default, alors la police par défaut du système d'exploitation sera utilisée.

'PoliceID' peut être facilement obtenu par la fonction FontID() de la bibliothèque Font.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  If OpenWindow(0, 0, 0, 222, 130, "SetGadgetFont", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If LoadFont(0, "Arial", 16)
      SetGadgetFont(#PB_Default, FontID(0))   ; la police par défaut est remplacée par celle chargée (Arial 16)
    EndIf
    ButtonGadget(0, 10, 10, 200, 30, "Bouton - Arial 16")
    SetGadgetFont(#PB_Default, #PB_Default)  ; remet la police par défaut originale (standard)
    ButtonGadget(1, 10, 50, 200, 30, "Bouton - standard")
    If LoadFont(1,"Courier",10, #PB_Font_Bold | #PB_Font_Underline)
      SetGadgetFont(#PB_Default, FontID(1))   ; la police par défaut est remplacée par celle chargée (Courier 10)
    EndIf
    TextGadget(2, 10, 90, 200, 40, "Texte en Courier 10 Gras + souligné", #PB_Text_Center)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetFont(), FontID(), LoadFont()


SetGadgetItemAttribute()

Syntaxe

SetGadgetItemAttribute(#Gadget, Element, Attribut, Valeur [, Colonne])
Description
Change la valeur de l'attribut de l'élément d'un gadget.

Arguments

#Gadget | Le gadget à utiliser.
Element L'élément à utiliser.

Le premier élément commence à 0.
Attribut L'attribut à définir.
Voir ci-dessous pour les valeurs prises en charge.
Valeur | La valeur à définir pour l'attribut.
Colonne (optionnel) La colonne à utiliser pour les gadgets qui prennent en charge plusieurs colonnes.

La première colonne a indice 0.

La valeur par défaut est 0 colonne.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette fonction est disponible avec les gadgets suivants:
  - ExplorerListGadget():
    #PB_Explorer_ColumnWidth: Change la largeur de la 'Colonne' spécifiée. Le paramètre 'Element' est ignoré.

  - ListIconGadget():
    #PB_ListIcon_ColumnWidth: Change la largeur de la 'Colonne' spécifiée. Le paramètre 'Element' est ignoré.

Voir aussi

GetGadgetItemAttribute(), GetGadgetAttribute(), SetGadgetAttribute()


SetGadgetItemColor()

Syntaxe

SetGadgetItemColor(#Gadget, Element, TypeCouleur, Couleur [, Colonne])
Description
Change la couleur de l'élément d'un gadget.

Arguments

#Gadget Le gadget à utiliser.
Element L'élément à utiliser.

Le premier élément commence à 0.

Si le paramètre 'Element' est egal à -1, la couleur sera appliquée à tous les éléments de la 'Colonne' spécifiée.
TypeCouleur Le paramètre 'TypeCouleur' peut prendre l'une des valeurs suivante:
  #PB_Gadget_FrontColor: Texte de l'élément.
  #PB_Gadget_BackColor : Fond de l'élément.
Couleur La nouvelle couleur de l'attribut.

RGB() peut être utilisé pour obtenir une couleur valide.

Pour supprimer la couleur personnalisée et revenir à la couleur par défaut, utiliser la valeur -1.
Colonne (optionnel) La colonne à utiliser pour les gadgets qui prennent en charge plusieurs colonnes.

La première colonne a indice 0.

La valeur par défaut est 0 colonne.

Si le paramètre 'Colonne' est egal à -1, la couleur sera appliquée à toute les colonnes de l'Element spécifié.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette commande est supportée par les gadgets suivants:
  - ListIconGadget()
  - TreeGadget()
Note: Avec le support des skins activé sur Windows XP, les couleurs personnalisées ne seront probablement pas prises en compte sur certains gadgets.

Exemple

  If OpenWindow(0, 0, 0, 300, 300, "SetGadgetItemColor", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ListIconGadget(0, 10, 10, 280, 280, "Colonne 0", 100)
    AddGadgetColumn(0, 1, "Colonne 1", 100)
    For i = 1 To 10
      AddGadgetItem(0, -1, "Texte "+Str(i)+Chr(10)+"Texte "+Str(i))
    Next
                                                                  ; la numérotation commence à 0 pour les éléments/colonnes
    SetGadgetItemColor(0, -1, #PB_Gadget_FrontColor, $0000FF,  1) ; tous les éléments de la 2ème colonne en rouge
    SetGadgetItemColor(0,  3, #PB_Gadget_BackColor,  $00FFFF, -1) ; le 4ème élément de toutes les colonnes sur fond jaune
    SetGadgetItemColor(0,  9, #PB_Gadget_BackColor,  $FFFF00,  1) ; le 10ème élément de la 2ème colonne sur fond bleu
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetItemColor(), GetGadgetColor(), SetGadgetColor()


SetGadgetItemData()

Syntaxe

SetGadgetItemData(#Gadget, Element, Valeur)
Description
Associe la 'Valeur' spécifiée avec l''Element' du #Gadget.

Arguments

#Gadget | Le gadget à utiliser.
Element | L'élément à utiliser. Le premier élément commence à 0.
Valeur | La valeur à définir.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette valeur peut être récupérée avec la commande GetGadgetItemData().

Si l'index de l'élément change (par exemple d'autres éléments sont effacés), la valeur restera toujours associée à son élément.

Cette commande est supportée par les gadgets suivants:

- ComboBoxGadget()
- ListIconGadget()
- ListViewGadget()
- PanelGadget()
- TreeGadget()

Exemple

  ; Ce programme utilise SetGadgetItemData pour stocker la position d'origine
  ; de chaque élément pour la connaitre plus tard, même si l'index des éléments a changé.
  ;
  If OpenWindow(0, 0, 0, 290, 250, "SetGadgetItemData", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0,  10, 10, 80, 20, "Ajouter")
    ButtonGadget(1, 100, 10, 80, 20, "Supprimer")
    ButtonGadget(2, 190, 10, 80, 20, "Test")
    ListViewGadget(3, 10, 40, 260, 200)
    For i = 0 To 10
      AddGadgetItem(3, i, "Ancien élément "+Str(i))
      SetGadgetItemData(3, i, i)
    Next i

    Repeat
      Evenement = WaitWindowEvent()
      If Evenement = #PB_Event_Gadget
        element = GetGadgetState(3)

        Select EventGadget()
          Case 0 ; Ajouter
            AddGadgetItem(3, element, "Nouvel élément")
            If element <> -1
              SetGadgetItemData(3, element, -1)
            Else
              SetGadgetItemData(3, CountGadgetItems(3)-1, -1)
            EndIf

          Case 1 ; Supprimer
            If element <> -1
              RemoveGadgetItem(3, element)
            EndIf

          Case 2 ; Test
            If element <> -1
              valeur = GetGadgetItemData(3, element)
              If valeur = -1
                MessageRequester("", "C'est un nouvel élément")
              Else
                MessageRequester("", "C'était l'élément numéro "+Str(valeur))
              EndIf
            EndIf

        EndSelect
      EndIf
    Until Evenement = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetItemData(), GetGadgetData(), SetGadgetData()


SetGadgetItemImage()

Syntaxe

SetGadgetItemImage(#Gadget, Element, ImageID)
Description
Change l'image d'un élément.

Arguments

#Gadget Le gadget à utiliser.
Element L'élément concerné.

Le premier élément dans le gadget commence à zéro.
ImageID La nouvelle image à utiliser pour l'élément.

L'image utilisée doit être dans le format standard 16x16.
Utilisez la commande ImageID() pour obtenir l'ID de l'image.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Il s'agit d'une fonction universelle qui fonctionne avec les gadgets suivants:
  - ComboBoxGadget()
  - ListIconGadget()
  - PanelGadget()
  - TreeGadget()

Voir aussi

AddGadgetItem()


SetGadgetItemState()

Syntaxe

SetGadgetItemState(#Gadget, Element, Etat)
Description
Change l'état de l'élément d'un gadget.

Arguments

#Gadget | Le gadget à utiliser.
Element L'élément à utiliser.

Le premier élément commence à 0.
Etat | Le nouvel état de l'élément.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette commande est disponible pour les gadgets suivants:
  - CalendarGadget(): 'Etat'
    #PB_Calendar_Bold : Afficher la date en gras.
    #PB_Calendar_Normal Afficher la date sans graisse (normal).
                      'Element' est une date au format PureBasic.

  - ExplorerListGadget(): 'Etat'
    #PB_ListIcon_Selected : L'élément sera selectionné.

  - ListViewGadget(): 'Etat' = 1 si l'élément doit être sélectionné, 0 sinon.

  - ListIconGadget(): 'Etat' est une combinaison des valeurs suivantes:
    #PB_ListIcon_Selected : L'élément sera selectionné.
    #PB_ListIcon_Checked  : L'élément aura sa case à cocher associée cochée (crée avec l'option #PB_ListIcon_CheckBoxes).
    #PB_ListIcon_Inbetween: L'élément doit avoir sa case à cocher associée dans l'état indéterminé (#PB_ListIcon_ThreeState).

  - TreeGadget()    : 'Etat' est une combinaison des valeurs suivantes:
    #PB_Tree_Selected : L'élément sera sélectionné.
    #PB_Tree_Expanded : L'élément sera déployé (noeud ouvert).
    #PB_Tree_Collapsed: L'élément sera fermé.
    #PB_Tree_Checked  : La case à cocher associée à l'élément sera cochée (crée avec l'option #PB_Tree_CheckBoxes).
    #PB_Tree_Inbetween: L'élément doit avoir sa case à cocher associée dans l'état indéterminé.

  SetGadgetItemState(0, 1, #PB_Tree_Expanded | #PB_Tree_Selected) ; l'élément 2 sera déployé et sélectionné.

Voir aussi

GetGadgetItemState(), GetGadgetState(), SetGadgetState()


SetGadgetItemText()

Syntaxe

SetGadgetItemText(#Gadget, Element, Texte$ [, Colonne])
Description
Change le texte de l'élément d'un gadget.

Arguments

#Gadget | Le gadget à utiliser.
Element L'élément à utiliser.

Le premier élément commence à 0.
Texte$ | Le nouveau texte de l'élément.
Colonne (optionnel) La colonne à utiliser pour les gadgets qui prennent en charge plusieurs colonnes.

La première colonne a indice 0.

La valeur par défaut est 0 colonne.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

  Cette commande est disponible pour les gadgets suivants:

  - ComboBoxGadget()
  - EditorGadget()
  - ExplorerListGadget(): Si Element = -1 alors l'entête de la colonne indiquée est changé.
  - ListIconGadget()    : Si Element = -1 alors l'entête de la colonne indiquée est changé.
  - ListViewGadget()
  - MDIGadget()
  - PanelGadget()
  - TreeGadget()
  - WebGadget(): Change le code html dans le gadget avec #PB_Web_HtmlCode comme 'Element'.

Voir aussi

GetGadgetItemText(), GetGadgetText(), SetGadgetText()


SetGadgetState()

Syntaxe

SetGadgetState(#Gadget, Etat)
Description
Change l'état en cours d'un gadget.

Arguments

#Gadget | Le gadget à utiliser.
Etat | Le nouvel état de l'élément.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette fonction est universelle et s'applique à pratiquement tous les gadgets :
  - ButtonImageGadget(): change l'état d'un bouton poussoir (#PB_Button_Toggle): 1 = pressé, 0 = normal.
  - ButtonGadget()     : change l'état d'un bouton poussoir (#PB_Button_Toggle): 1 = pressé, 0 = normal.
  - CalendarGadget()   : Change la date affichée.
  - CheckBoxGadget()   : Change l'etat de la case à cocher. Valeurs disponibles:
    #PB_CheckBox_Checked  : Coche la case.
    #PB_CheckBox_Unchecked: Décoche la case.
    #PB_CheckBox_Inbetween: Active l'état intermédiaire
                            (seulement pour les case à cocher de type #PB_CheckBox_ThreeState).
  - ComboBoxGadget()   : Change l'élément sélectionné en cours.
  - DateGadget()       : Change la date ou l'heure affichée. Si #PB_Date_CheckBox est utilisé,
                         mettre 'Etat' à 0 pour décocher la case à cocher.
  - ImageGadget()      : Change l'image affichée par le gadget ('Etat' sera un ImageID()).
                         Si Etat = 0, l'image est retirée du gadget.
  - IPAddressGadget()  : change l'adresse IP courante.
  - ListIconGadget()   : Change l'élément sélectionné (tous les autres éléments sont alors désélectionnés).
                         Si 'Etat' = -1, alors aucun élément n'est sélectionné.
  - ListViewGadget()   : Change l'élément sélectionné. Si 'Etat' = -1, alors aucun élément n'est sélectionné.
  - MDIGadget()        : Change la fenêtre fille active (En indiquant son numéro de #fenetre), ou exécute une des actions suivantes:
    #PB_MDI_Cascade         : Ré-organise les fenêtres filles sous forme de cascade.
    #PB_MDI_TileVertically  : Ré-organise les fenêtres filles sous forme de mosaïque verticale.
    #PB_MDI_TileHorizontally: Ré-organise les fenêtres filles sous forme de mosaïque horizontale.
    #PB_MDI_Next            : Active la fenêtre fille suivante.
    #PB_MDI_Previous        : Active la fenêtre fille précédente.
    #PB_MDI_Arrange         : Ré-organise les fenêtres filles qui sont réduites.

  - OptionGadget()     : 'Etat' = 1 pour l'activer, sinon 0.
  - PanelGadget()      : Change l'onglet en cours.
  - ProgressBarGadget(): Change la valeur de la barre de progression.
  - ScrollBarGadget()  : Change la position du curseur.
  - ShortcutGadget()   : Change le raccourci clavier.
  - SpinGadget()       : Change la valeur actuelle.
  - SplitterGadget()   : Change la position de la barre de séparation (en pixels).
  - TrackBarGadget()   : Change la valeur du curseur.
  - TreeGadget()       : Change l'élément actuellement sélectionné, -1 pour tout déselectionner.
  - WebGadget()        : Effectue des actions sur le navigateur.

Note: Veuillez consulter les informations du chapitre Gestion des messages Windows à propos de la gestion des fenêtres sur Windows.

Voir aussi

GetGadgetState(), GetGadgetItemState(), SetGadgetItemState()


SetGadgetText()

Syntaxe

SetGadgetText(#Gadget, Texte$)
Description
Modifie le texte contenu dans un gadget.

Arguments

#Gadget | Le gadget à utiliser.
Texte$ | Le nouveau texte de l'élément.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette fonction est particulièrement utile pour :

- ButtonGadget()
- ComboBoxGadget()
- DateGadget()
- EditorGadget()
- ExplorerComboGadget()
- ExplorerListGadget()
- ExplorerTreeGadget()
- Frame3DGadget()
- HyperLinkGadget()
- ListViewGadget()
- StringGadget()
- TextGadget()
- TreeGadget()
- WebGadget()

Voir aussi

GetGadgetText(), GetGadgetItemText(), SetGadgetItemText()


ShortcutGadget()

Syntaxe

Resultat = ShortcutGadget(#Gadget, x, y, Largeur, Hauteur, Raccourci)
Description
Crée un gadget de 'saisie de raccourci clavier' dans la GadgetList. L'utilisateur peut le sélectionner et taper directement la combinaison de touches souhaitées pour définir le raccourci clavier.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur La position et les dimensions du nouveau gadget.
Raccourci 'Raccourci' est la combinaison de touches initiales affichées par le gadget.

Les valeurs possibles sont les mêmes que celles citées dans AddKeyboardShortcut().

La valeur 0 indique qu'aucun raccourci n'est défini.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

- GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

Les fonctions suivantes peuvent être appelées pour contrôler le gadget: - GetGadgetState(): Renvoie le raccourci clavier actuel.
- SetGadgetState(): Change le raccourci clavier actuel.

Exemple

  If OpenWindow(0, 0, 0, 240, 70, "ShortcutGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ShortcutGadget(0, 20, 20, 200, 25, #PB_Shortcut_Control | #PB_Shortcut_A)
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetState(), SetGadgetState(), AddKeyboardShortcut()


SpinGadget()

Syntaxe

Resultat = SpinGadget(#Gadget, x, y, Largeur, Hauteur, Minimum, Maximum [, Options])
Description
Crée un gadget 'incrémentiel' (Spin) dans la GadgetList.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur | La position et les dimensions du nouveau gadget.
Minimum, Maximum | Les valeurs minimales et maximales pour le gadget.
Options (optionnel) Peut être une combinaison de:
  #PB_Spin_ReadOnly: Le gadget n'est pas éditable, sa valeur ne peut être changée que par les flèches.
  #PB_Spin_Numeric : Le gadget va mettre à jour automatiquement le texte affiché par rapport à sa valeur
                     interne spécifiée par SetGadgetState(), donc SetGadgetText() n'est pas nécessaire.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  Les fonctions suivantes peuvent être appelées pour contrôler le gadget:
  GetGadgetState()    : Renvoie la valeur du curseur interne.
  SetGadgetState()    : Change la valeur du curseur interne.
  GetGadgetText()     : Renvoie le texte du gadget.
  SetGadgetText()     : Change le texte du gadget.
  GetGadgetAttribute() avec un des attributs suivants:
    #PB_Spin_Minimum: Renvoie la valeur minimale possible.
    #PB_Spin_Maximum: Renvoie la valeur maximale possible.

  SetGadgetAttribute(): avec un des attributs suivants:

    #PB_Spin_Minimum: Change la valeur minimale possible.
    #PB_Spin_Maximum: Change la valeur maximale possible.

  Les évènements suivants sont supportés par EventType():
    #PB_EventType_Change: L'utilisateur a changé le texte dans la zone d'édition.
                       1: Le bouton 'Haut' a été pressé.
                      -1: Le bouton 'Bas' a été pressé.

  - SetGadgetColor() et GetGadgetColor() avec les valeurs 'TypeCouleur' suivantes:
    #PB_Gadget_FrontColor: couleur du texte
    #PB_Gadget_BackColor : couleur du fond

  Note: SetGadgetColor() n'est pas pris en charge sur la plate-forme MacOS X.

Exemple

  If OpenWindow(0, 0, 0, 160, 70, "SpinGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    SpinGadget     (0, 20, 20, 100, 25, 0, 1000)
    SetGadgetState (0, 5) : SetGadgetText(0, "5")   ; définit la valeur initiale
    Repeat
      Evenement = WaitWindowEvent()
      If Evenement = #PB_Event_Gadget
        If EventGadget() = 0
          SetGadgetText(0,Str(GetGadgetState(0)))
        EndIf
      EndIf
    Until Evenement = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetState(), SetGadgetState(), GetGadgetText(), SetGadgetText(), GetGadgetAttribute(), SetGadgetAttribute(), GetGadgetColor(), SetGadgetColor()


SplitterGadget()

Syntaxe

Resultat = SplitterGadget(#Gadget, x, y, Largeur, Hauteur, #Gadget1, #Gadget2 [, Options])
Description
Créé une zone séparée en deux parties (horizontalement ou verticalement), chacune pouvant contenir un gadget.
La barre de séparation peut être déplacée librement par l'utilisateur et les deux gadgets associés seront redimensionnés automatiquement.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur | La position et les dimensions du nouveau gadget.
#Gadget1, #Gadget2 | Les gadgets à utiliser avec le séparateur.
Options (optionnel) Peut être une combinaison de:
  #PB_Splitter_Vertical   : La zone sera séparée verticalement.
  #PB_Splitter_Separator  : Un motif 3D est affiché dans la barre de séparation.
  #PB_Splitter_FirstFixed : Quand le SplitterGadget sera redimensionné, le premier gadget associé gardera sa taille.
  #PB_Splitter_SecondFixed: Quand le SplitterGadget sera redimensionné, le deuxième gadget associé  gardera sa taille.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  Les fonctions suivantes peuvent être utilisées pour agir sur le gadget:
  GetGadgetState(): Renvoie la position de la barre de séparation, en pixels.
  SetGadgetState(): Change la position de la barre de séparation, en pixels.
  GetGadgetAttribute() avec un des attributs suivants:
    #PB_Splitter_FirstMinimumSize : Renvoie la taille minimale (en pixels) que le premier gadget associé peut avoir.
    #PB_Splitter_SecondMinimumSize: Renvoie la taille minimale (en pixels) que le deuxième gadget associé peut avoir.
    #PB_Splitter_FirstGadget      : Renvoie le numéro du premier gadget.
    #PB_Splitter_SecondGadget     : Renvoie le numéro du deuxième gadget.

  SetGadgetAttribute() avec un des attributs suivants:
    #PB_Splitter_FirstMinimumSize : Fixe la taille minimale (en pixels) que le premier gadget associé peut avoir.
    #PB_Splitter_SecondMinimumSize: Fixe la taille minimale (en pixels) que le deuxième gadget associé peut avoir.
    #PB_Splitter_FirstGadget      : Remplace le premier gadget avec un nouveau.
    #PB_Splitter_SecondGadget     : Remplace le deuxième gadget avec un nouveau.

  Note: quand un gadget est remplacé à l'aide de SetGadgetAttribute(), l'ancien gadget n'est pas automatiquement
  supprimé. Il sera remis sur la fenêtre qui contient le splitter, pour permettre de permuter les gadgets entre différents
  splitters sans avoir à les recréer. Si l'ancien gadget doit être supprimé, son numéro peut être recupéré avec
  GetGadgetAttribute() puis supprimé par FreeGadget() après son remplacement. Un gadget ne
  peut pas être dans deux splitters à la fois.

Exemple

  If OpenWindow(0, 0, 0, 230, 210, "SplitterGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

    #Bouton1    = 0
    #Bouton2    = 1
    #Separateur = 2

    ButtonGadget(#Bouton1, 0, 0, 0, 0, "Bouton 1") ; Inutile de préciser la taille ou les coordonnées
    ButtonGadget(#Bouton2, 0, 0, 0, 0, "Bouton 2") ; car elles seront déterminées automatiquement
    SplitterGadget(#Separateur, 5, 5, 220, 120, #Bouton1, #Bouton2, #PB_Splitter_Separator)

    TextGadget(3, 10, 135, 210, 70, "Le composant d'interface graphique ci-dessus affiche deux boutons automatiquement redimensionnés à l'intérieur de la zone séparée de taille 220x120.",#PB_Text_Center)

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetState(), SetGadgetState(), GetGadgetAttribute(), SetGadgetAttribute()


StringGadget()

Syntaxe

Resultat = StringGadget(#Gadget, x, y, Largeur, Hauteur, Texte$ [, Options])
Description
Crée un gadget de 'saisie de texte' (une seule ligne) dans la GadgetList en cours.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur La position et les dimensions du nouveau gadget.
Texte$ Le texte initial de ce StringGadget.

Ce gadget accepte une seule ligne de texte. Pour obtenir plusieurs lignes d'entrée, utilisez le gadget EditorGadget().
Options (optionnel) Peut être une combinaison de:
  #PB_String_Password  : Mode 'mot de passe', n'affiche que des '*'.
  #PB_String_ReadOnly  : Mode 'lecture seulement'.
  #PB_String_Numeric   : Mode 'numeric'. Seuls des chiffres peuvent être saisis.
  #PB_String_LowerCase : Tous les caractères saisis sont transformés en minuscules.
  #PB_String_UpperCase : Tous les caractères saisis sont transformés en majuscules.
  #PB_String_BorderLess: Aucune bordure n'est affichée autour du gadget.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  - Le texte pourra être ensuite modifié par les fonctions SetGadgetText() et GetGadgetText().

  - Les évènements suivants sont disponibles par l'intermédiaire d'EventType():
    #PB_EventType_Change    : Le texte a été modifié par l'utilisateur.
    #PB_EventType_Focus     : Le StringGadget obtient le focus.
    #PB_EventType_LostFocus : Le StringGadget a perdu le focus.

  - Les fonctions suivantes peuvent agir sur le gadget:
    SetGadgetColor() et GetGadgetColor() avec les valeurs 'TypeCouleur' suivantes:
      #PB_Gadget_BackColor    : Couleur de fond
      #PB_Gadget_FrontColor   : Couleur du texte

  - GetGadgetAttribute() avec les attributs suivants:
      #PB_String_MaximumLength: Renvoie le nombre maximal de caractères qui peuvent être entrés.

  - SetGadgetAttribute() avec les attributs suivants:
      #PB_String_MaximumLength: Limite le nombre maximum de caractères qui peuvent être entrés.

Exemple

  ; Démonstration des options possibles pour le gadget de saisie de texte...
  If OpenWindow(0, 0, 0, 322, 205, "Les options de StringGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    StringGadget(0, 8,  10, 306, 20, "Gadget saisie de texte normal...")
    StringGadget(1, 8,  35, 306, 20, "1234567", #PB_String_Numeric)
    StringGadget(2, 8,  60, 306, 20, "Gadget saisie de texte en lecture seule", #PB_String_ReadOnly)
    StringGadget(3, 8,  85, 306, 20, "minuscules...", #PB_String_LowerCase)
    StringGadget(4, 8, 110, 306, 20, "majuscules...", #PB_String_UpperCase)
    StringGadget(5, 8, 140, 306, 20, "Gadget saisie de texte sans bordure", #PB_String_BorderLess)
    StringGadget(6, 8, 170, 306, 20, "Mot de passe", #PB_String_Password)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetText(), SetGadgetText(), GetGadgetColor(), SetGadgetColor(), EditorGadget()


TextGadget()

Syntaxe

Resultat = TextGadget(#Gadget, x, y, Largeur, Hauteur, Texte$ [, Options])
Description
Crée un gadget 'Texte' dans la GadgetList en cours.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur | La position et les dimensions du nouveau gadget.
Texte$ | Le texte à afficher.
Options (optionnel) Peut être une combinaison de:
  #PB_Text_Center: Le texte est centré.
  #PB_Text_Right : Le texte est aligné à droite.
  #PB_Text_Border: Un bord est dessiné autour du gadget.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

Son contenu peut être modifié à l'aide des fonctions SetGadgetText() et GetGadgetText(). La police d'un TextGadget() peut facilement être changée avec SetGadgetFont().

Ce gadget supporte les commandes SetGadgetColor() et GetGadgetColor() avec les valeurs 'TypeCouleur' suivantes:
  #PB_Gadget_BackColor : Couleur de fond
  #PB_Gadget_FrontColor: Couleur du texte
Note: SetGadgetColor() n'est pas pris en charge sur la plate-forme MacOS X.

Note: Ce gadget ne reçoit pas les événements utilisateur, et GadgetToolTip() ne peut pas être utilisé.

Exemple

  If OpenWindow(0,0,0,270,160,"TextGadget",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget(0, 10, 10,250,20,"Gadget texte standard (texte aligné à gauche)")
    TextGadget(1, 10, 40,250,20,"Gadget texte (texte aligné à droite)", #PB_Text_Right)
    TextGadget(2, 10, 70,250,20,"Gadget texte (texte centré)",#PB_Text_Center)
    TextGadget(3, 10,100,250,20,"Gadget texte avec bordure",#PB_Text_Border)
    TextGadget(4, 10,130,250,20,"Gadget texte (texte centré) + bordure", #PB_Text_Center | #PB_Text_Border)
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetText(), SetGadgetText(), GetGadgetColor(), SetGadgetColor()


TrackBarGadget()

Syntaxe

Resultat = TrackBarGadget(#Gadget, x, y, Largeur, Hauteur, Minimum, Maximum [, Options])
Description
Crée un gadget 'Curseur' dans la GadgetList en cours.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur | La position et les dimensions du nouveau gadget.
Minimum, Maximum | La plage 'Minimum-Maximum' doit être comprise entre 0 et 10 000.
Options (optionnel) Peut être une combinaison de:
  #PB_TrackBar_Ticks   : Affiche un trait de marquage à chaque valeur.
  #PB_TrackBar_Vertical: Le gadget est vertical.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  Les commandes suivantes peuvent être utilisées pour contrôler le gadget:
  - GetGadgetState(): Renvoie la position actuelle du curseur (Valeur comprise entre 'Minimum' et 'Maximum')
  - SetGadgetState(): Change la position actuelle du curseur.
  - GetGadgetAttribute() avec l'un des attributs suivants:
    #PB_TrackBar_Minimum: Renvoie la valeur minimale.
    #PB_TrackBar_Maximum: Renvoie la valeur maximale.

  - SetGadgetAttribute() avec un des attributs suivants:
    #PB_TrackBar_Minimum: Change la valeur minimale.
    #PB_TrackBar_Maximum: Change la valeur maximale.

Exemple

If OpenWindow(0, 0, 0, 320, 200, "TrackBarGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget    (3, 10,  20, 250, 20,"Barre à curseur standard", #PB_Text_Center)
    TrackBarGadget(0, 10,  40, 250, 20, 0, 10000)
    SetGadgetState(0, 5000)
    TextGadget    (4, 10, 100, 250, 20, "Barre à curseur avec traits de marquage", #PB_Text_Center)
    TrackBarGadget(1, 10, 120, 250, 20, 0, 30, #PB_TrackBar_Ticks)
    SetGadgetState(1, 3000)
    TextGadget    (5,  90, 180, 200, 20, "Barre à curseur verticale", #PB_Text_Right)
    TrackBarGadget(2, 270, 10, 20, 170, 0, 10000, #PB_TrackBar_Vertical)
    SetGadgetState(2, 8000)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetState(), SetGadgetState(), GetGadgetAttribute(), SetGadgetAttribute()


TreeGadget()

Syntaxe

Resultat = TreeGadget(#Gadget, x, y, Largeur, Hauteur [, Options])
Description
Crée une 'liste arborescente' dans la GadgetList en cours.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur La position et les dimensions du nouveau gadget.
Options (optionnel) Peut être une combinaison de:
  #PB_Tree_AlwaysShowSelection: Montre toujours la sélection, même si le gadget n'est plus actif.
  #PB_Tree_NoLines            : Cache les lignes reliant les noeuds.
  #PB_Tree_NoButtons          : Cache les boutons des noeuds.
  #PB_Tree_CheckBoxes         : Ajoute une case à cocher devant chaque élément.
  #PB_Tree_ThreeState         : Les cases à cocher peuvent avoir un état "indéterminé".
L'option #PB_Tree_ThreeState peut être utilisée en combinaison avec l'option #PB_Tree_CheckBoxes pour obtenir des cases à cocher qui peuvent avoir un état "on", "off" et "indéterminé". L'utilisateur ne peut sélectionner que les états "on" ou "off". L'état "indéterminé" peut être définie en utilisant la fonction SetGadgetItemState().

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Remarques

Lorsque cette liste est créée, sa liste d'éléments est vide. Chaque élément dans l'arbre a un niveau assigné, qui détermine la relation avec l'élément au dessus et en dessous de lui. Les éléments avec le même niveau appartiennent à la même branche, les éléments avec un niveau supérieur sont les fils etc. Le paramètre 'Options' de la commande AddGadgetItem() est toujours requis pour les éléments du TreeGadget() et sert à spécifier le niveau de l'élément qui doit être ajouté. A noter que si un élément est ajouté avec un niveau invalide, alors il sera quand même ajouté, au niveau le plus proche.
  - GadgetToolTip() permet d'ajouter une 'mini aide' à ce gadget.

  Les fonctions suivantes peuvent alors être utilisées pour agir sur le contenu de cette liste :
  - AddGadgetItem()     : Ajoute un élément, et éventuellement une icône
  - RemoveGadgetItem()  : Efface un élément (et ses sous-élements)
  - ClearGadgetItems()  : Supprime tous les éléments
  - CountGadgetItems()  : Renvoie le nombre d'éléments actuellement contenus dans le gadget.
  - GetGadgetItemState(): Renvoie l'état de l'élément spécifié.
  - SetGadgetItemState(): Change l'état de l'élément spécifié.
  - GetGadgetItemText() : Renvoie le texte de l'élément spécifié.
  - SetGadgetItemText() : Change le texte de l'élément spécifié.
  - SetGadgetItemImage(): Change l'image actuelle de l'élément spécifié.
  - GetGadgetItemData() : Renvoie la valeur personnalisée associée à cet élément.
  - SetGadgetItemData() : Associe une valeur personnalisée à cet élément.
  - GetGadgetState()    : Renvoie l'élément selectionné.
  - SetGadgetState()    : Change l'élément selectionné.
  - GetGadgetText()     : Renvoie le texte de l'élément sélectionné.
  - SetGadgetText()     : Change le texte de l'élément sélectionné.
  - GetGadgetItemAttribute() avec l'attribut suivant:
    #PB_Tree_SubLevel: Renvoie le niveau actuel de l'élément dans l'arbre.

  - GadgetItemID(): Renvoie le 'handle' système de l'élément spécifié (utile pour les fonctions API)

  - SetGadgetColor() et GetGadgetColor() avec les  valeurs 'TypeCouleur' suivantes:
    #PB_Gadget_FrontColor: Couleur du texte
    #PB_Gadget_BackColor : Couleur du fond
    #PB_Gadget_LineColor : Couleur des lignes reliant les noeuds

  - SetGadgetItemColor() et GetGadgetItemColor() avec les valeurs 'TypeCouleur' suivantes:
    #PB_Gadget_FrontColor: Texte de l'élément.
    #PB_Gadget_BackColor : Fond de l'élément.

  Les évènements suivants sont supportés par EventType():
    #PB_EventType_LeftClick        : Clic gauche sur un élément, ou une case à cocher a été cochée/décochée.
    #PB_EventType_LeftDoubleClick  : Double-clic gauche sur un élément.
    #PB_EventType_RightClick       : Clic droit sur un élément.
    #PB_EventType_RightDoubleClick : Double-Clic droit sur un élément.
    #PB_EventType_Change           : L'élément courant a changé
    #PB_EventType_DragStart        : L'utilisateur a essayé de lancer Une opération 'Glisser & Déposer'.

  Après un évènement #PB_EventType_DragStart , la bibliothèque Drag & Drop peut être
  utilisée pour commencer une opération 'Glisser & Déposer'.

Exemple

  If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TreeGadget(0, 10, 10, 160, 160)                                         ; liste arborescente standard
    TreeGadget(1, 180, 10, 160, 160, #PB_Tree_CheckBoxes | #PB_Tree_NoLines)  ; liste arborescente avec cases à cocher + sans lignes reliant les noeuds
    For ID = 0 To 1
      For a = 0 To 10
        AddGadgetItem (ID, -1, "Elément normal "+Str(a), 0, 0) ; si vous souhaitez ajouter une image, utilisez
        AddGadgetItem (ID, -1, "Noeud "+Str(a), 0, 0)          ; ImageID(x) comme 4ème paramètre
        AddGadgetItem (ID, -1, "Sous-élément 1", 0, 1)         ; Ceux-là sont au premier sous-niveau
        AddGadgetItem (ID, -1, "Sous-élément 2", 0, 1)
        AddGadgetItem (ID, -1, "Sous-élément 3", 0, 1)
        AddGadgetItem (ID, -1, "Sous-élément 4", 0, 1)
        AddGadgetItem (ID, -1, "Fichier "+Str(a), 0, 0) ; sous-niveau 0 à nouveau
      Next
    Next
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

AddGadgetItem(), RemoveGadgetItem(), ClearGadgetItems(), CountGadgetItems(), GetGadgetItemState(), SetGadgetItemState(), GetGadgetItemText(), SetGadgetItemText(), SetGadgetItemImage(), GetGadgetItemData(), SetGadgetItemData(), GetGadgetState(), SetGadgetState(), GetGadgetText(), SetGadgetText(), GetGadgetItemAttribute(), SetGadgetItemImage(), GadgetItemID(), GetGadgetColor(), SetGadgetColor(), ExplorerTreeGadget()


UseGadgetList()

Syntaxe

Resultat = UseGadgetList(FenetreID)
Description
Sélectionne la GadgetList dans laquelle les gadgets seront ajoutés.
Si la GadgetList n'existe pas pour cette fenêtre alors elle sera créée.
(Par exemple dans le cas d'une fenêtre créée avec l'option #PB_Window_NoGadgets, voir OpenWindow() ou parce que ce n'est pas une fenêtre PB)

Arguments

FenetreID L'identifiant de la nouvelle fenêtre dans laquelle les gadgets seront ajoutés.

'FenetreID' peut être obtenu facilement avec la commande WindowID().

Si 'FenetreID' est égal à 0, c'est la GadgetList courante qui sera renvoyée par la commande et il n'y aura aucun changement.

Valeur de retour

Renvoie l'identifiant 'FenetreID' de la GadgetList précédente, ou 0 s'il n'y en a pas.

Cette valeur peut être utilisée pour revenir à la GadgetList précédente.

Exemple

Cet exemple montre comment utiliser cette commande pour créer une nouvelle fenêtre avec des gadgets sans interrompre la création de gadgets sur la première fenêtre :
  If OpenWindow(0, 0, 0, 500, 500, "Fenêtre principale", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0, 10, 10, 150, 25, "Bouton 1")

    ; Creation d'une seconde fenêtre avec #PB_Window_NoGadgets pour empêcher la création automatique d'une GadgetList
    If OpenWindow(1, 0, 0, 300, 200, "Fenêtre secondaire", #PB_Window_TitleBar | #PB_Window_WindowCentered | #PB_Window_NoGadgets, WindowID(0))
      OldGadgetList = UseGadgetList(WindowID(1)) ; Creation d'une GadgetList et sauvegarde l'ancienne GadgetList

      ButtonGadget(10, 10, 10, 150, 25, "Bouton Fenêtre secondaire") ; Ajoute ce bouton dans la nouvelle GadgetList(Fenêtre secondaire)

      UseGadgetList(OldGadgetList)               ; Retour à la GadgetList précédente
    EndIf

    ButtonGadget(1, 10, 45, 150, 25, "Bouton 2") ; Ce bouton sera sur la fenêtre principale

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

OpenWindow(), WindowID()


WebGadget()

Syntaxe

Resultat = WebGadget(#Gadget, x, y, Largeur, Hauteur, URL$ [, Options])
Description
Crée un Navigateur Internet (WebGadget) dans la GadgetList en cours.

Arguments

#Gadget Le numéro d'identification du nouveau gadget.

Si #PB_Any est utilisé à la place de '#Gadget', alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
x, y, Largeur, Hauteur | La position et les dimensions du nouveau gadget.
URL$ | L'URL à charger.
Options (optionnel) Peut être une combinaison de:
  #PB_Web_Mozilla: Utilise l'ActiveX Mozilla à la place de IE (Windows seulement).

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Gadget, alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.

Cette fonction échoue si les composants requis pour le WebGadget ne peuvent pas être chargés. Voir ci-dessous les exigences pour le WebGadget sur chaque OS.

Remarques

Les composants suivants sont requis pour utiliser le WebGadget sur chaque OS. Ces composants sont nécessaires pour utiliser le WebGadget, pas seulement pour la compilation du programme.

Windows
Sur Microsoft Windows, ce gadget utilise l'object ActiveX Internet Explorer 4.0+. IE 4.0 ou plus se doit d'être présent sur le système (déjà présent sur Win98/Me et Win2000/XP). Si IE n'est pas présent, WebGadget renvoie 0. Le fichier ATL.dll, présent dans le répertoire PureBasic\Compilers\ est nécessaire (à mettre dans le même répertoire que l'exécutable).

omme alternative, l'ActiveX Mozilla peut être utilisée à la place d'Internet Explorer (http://www.iol.ie/~locka/mozilla/mozilla.htm) si l'option #PB_Web_Mozilla est spécifiée (l'ActiveX Mozilla doit être installée séparément car elle n'est pas fournie avec FireFox ou la suite Mozilla). Le fichier ATL.dll est aussi nécessaire.
Linux
Le WebGadget utilise la bibliothèque WebKitGtk sur Linux. Le paquet est nommé «libwebkit». Certaines distributions peuvent comprendre une ancienne version de ce paquet qui est nommé «WebKitGtk». Si votre distribution ne contient pas ce paquet alors les sources peuvent être téléchargées sur Internet WebKitGtk home page.
Mac OSX
Le WebGadget utilise le composant WebKit de Mac OSX. Ce composant est fourni avec le système d'exploitation. Il n'y a pas d'autres exigences.
Les fonctions suivantes peuvent être utilisées avec WebGadget:
  - SetGadgetText(): Change l'URL.
  - GetGadgetText(): Renvoie l'URL actuelle.
  - SetGadgetState(): Effectue une action sur le gadget. 'Etat' peut prendre une des valeurs suivantes:
    #PB_Web_Back   : Retour en arrière dans la navigation.
    #PB_Web_Forward: Avance d'un pas dans la navigation.
    #PB_Web_Stop   : Arrête le chargement de la page.
    #PB_Web_Refresh: Recharge la page actuelle.

Note: Les fonctionnalités suivantes ne fonctionnent pas avec l'ActiveX Mozilla sur windows (option #PB_Web_Mozilla)

  - SetGadgetItemText(): avec #PB_Web_HtmlCode comme 'Element' le code html peut être inséré dans le Gadget.

  - GetGadgetItemText(): Les constantes suivantes peuvent être utilisées pour obtenir une information:
    #PB_Web_HtmlCode     : Renvoie le code html du gadget.
    #PB_Web_PageTitle    : Renvoie le titre de la page affichée.
    #PB_Web_StatusMessage: Renvoie le message actuel de la barre d'état.
    #PB_Web_SelectedText : Renvoie le texte sélectionné à l'intérieur du gadget.

  - SetGadgetAttribute(): Définit les attributs suivants:
    #PB_Web_ScrollX       : Fixe la position de la barre de défilement horizontale .
    #PB_Web_ScrollY       : Fixe la position de la barre de défilement verticale.
    #PB_Web_BlockPopups   : Bloque les fenêtres popup(Valeur=1 pour bloquer et 0 pour débloquer). #PB_EventType_PopupWindow est renvoyé si cet attribut est validé.
    #PB_Web_BlockPopupMenu: Bloque le menu popup standard. #PB_EventType_PopupMenu est renvoyé si cet attribut est validé.
    #PB_Web_NavigationCallback: Définit une callback pour contrôler (et désactiver) la navigation.
La callback de la navigation doit avoir le format suivant :
  Procedure NavigationCallback(Gadget, Url$)
    ;
    ; Renvoie #True pour autoriser cette navigation ou #False pour la refuser.
    ;
    ProcedureReturn #True
  EndProcedure

  - GetGadgetAttribute(): Pour obtenir les attributs suivants :
    #PB_Web_ScrollX       : Renvoie la position de la barre de défilement horizontale.
    #PB_Web_ScrollY       : Renvoie la position de la barre de défilement verticale.
    #PB_Web_Busy          : Renvoie une valeur différente de zéro si le gadget est occupé à charger une page.
    #PB_Web_Progress      : Renvoie la progression actuelle (parfois estimé) après un évènement #PB_EventType_DownloadProgress.
    #PB_Web_ProgressMax   : Renvoie la progression actuelle maximum (parfois estimé) après un évènement #PB_EventType_DownloadProgress .
    #PB_Web_BlockPopups   : Renvoie la valeur actuelle de l'attribut de blocage des fenêtres popup.
    #PB_Web_BlockPopupMenu: Renvoie la valeur actuelle de l'attribut de blocage du menu popup.
    #PB_Web_NavigationCallback: Renvoie la valeur actuelle de la callback (si elle existe).
Notes: Les fenêtres popups et les menus popups ne sont pas supportés pour le WebGadget sous Linux. Cependant, le #PB_Web_BlockPopups peut encore être défini pour activer l'évènement #PB_EventType_PopupWindow. La même chose s'applique à #PB_Web_BlockPopupMenu.

Les évènements suivants sont supportés par EventType() pour ce gadget:
  #PB_EventType_TitleChange     : Le titre de la page a changé (Windows seulement).
  #PB_EventType_StatusChange    : Le message de la barre d'état a changé (Windows seulement).
  #PB_EventType_DownloadStart   : Le téléchargement d'une page a commencé (Windows, OS X).
  #PB_EventType_DownloadProgress: L'information de progression du téléchargement est disponible avec GetGadgetAttribute()  (Windows seulement).
  #PB_EventType_DownloadEnd     : Le téléchargement d'une page s'est terminé (fini ou annulé) (Windows, OS X).
  #PB_EventType_PopupWindow     : Une fenêtre popup vient d'être bloquée (Windows seulement).
  #PB_EventType_PopupMenu       : Le menu popup vient d'être bloqué (utile pour afficher un menu personnalisé) (Windows seulement).

Exemple

  If OpenWindow(0,0,0,600,300,"WebGadget",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    WebGadget(0,10,10,580,280,"http://www.purebasic.com")
    ; Note: si vous désirez utiliser un fichier local, changez le dernier paramètre en "file://" + chemin + nomdufichier
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Example 2: Utilisation de la procedure NavigationCallback()
  ; Cet exemple affiche le site Web PureBasic.com. La procédure callback interdit la
  ; navigation vers les 'News' du site (#False retourné), mais l'autorise
  ; pour tous les autres sites (#True retourné).

  Procedure NavigationCallback(Gadget, Url$)
    If Url$= "http://www.purebasic.com/news.php"
      MessageRequester("", "Pas de News aujourd'hui !")
      ProcedureReturn #False
    Else
      ProcedureReturn #True
    EndIf
  EndProcedure

  If OpenWindow(0, 0, 0, 600, 300, "WebGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    WebGadget(0, 10, 10, 580, 280, "http://www.purebasic.com")
    SetGadgetAttribute(0, #PB_Web_NavigationCallback, @NavigationCallback())
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Voir aussi

GetGadgetText(), SetGadgetText(), GetGadgetItemText(), SetGadgetItemText(), SetGadgetState(), GetGadgetAttribute(), SetGadgetAttribute()


WebGadgetPath()

Syntaxe

Resultat = WebGadgetPath(FichierBibliotheque$ [, MozillaPath$])
Description
Attention
Cette fonction est dépréciée, elle sera peut-être supprimée dans une future version de PureBasic. Elle ne doit pas être utilisée dans du nouveau code.

Cette fonction n'est plus nécessaire. Elle ne fait rien et renvoit une valeur different de zéro.


Gadget3D

PureBasic - Gadget3D

Généralités

La bibliothèque Gadget3D permet de créer des interfaces graphiques complexes (GUI) directement sur la zone d'écran utilisant le moteur 3D. Elle est principalement destinée à la création de jeux ou d'applications qui doivent se lancer en mode plein écran et qui nécessitent une interface utilisateur.
La syntaxe de cette bibliothèque est similaire à la bibliothèque Gadget.
Le moteur utilisé pour l'interface graphique se nomme CEGUI, il permet l'utilisation de skins, il est rapide et contient de nombreux gadgets prédéfinis. Vous trouverez plus d'informations au sujet de CEGUI ici : http://www.cegui.org.uk.

InitEngine3D() doit être appelé avec succès avant de pouvoir utiliser les commandes relatives aux gadgets 3D.

Pour utiliser les gadgets, une fenêtre 3D doit être ouverte au préalable.

Sommaire des commandes

AddGadgetItem3D
ButtonGadget3D
CheckBoxGadget3D
ClearGadgetItems3D
CloseGadgetList3D
ComboBoxGadget3D
ContainerGadget3D
CountGadgetItems3D
DisableGadget3D
EditorGadget3D
Frame3DGadget3D
FreeGadget3D
GadgetHeight3D
GadgetID3D
GadgetToolTip3D
GadgetType3D
GadgetWidth3D
GadgetX3D
GadgetY3D
GetActiveGadget3D
GetGadgetAttribute3D
GetGadgetData3D
GetGadgetItemData3D
GetGadgetItemState3D
GetGadgetItemText3D
GetGadgetState3D
GetGadgetText3D
HideGadget3D
ImageGadget3D
IsGadget3D
ListViewGadget3D
OpenGadgetList3D
OptionGadget3D
PanelGadget3D
ProgressBarGadget3D
RemoveGadgetItem3D
ResizeGadget3D
ScrollAreaGadget3D
ScrollBarGadget3D
SetActiveGadget3D
SetGadgetAttribute3D
SetGadgetData3D
SetGadgetItemData3D
SetGadgetItemState3D
SetGadgetItemText3D
SetGadgetState3D
SetGadgetText3D
SpinGadget3D
StringGadget3D
TextGadget3D

Exemple

Gadget3D.pb

OS Supportés

Tous

Guide de référence - Index


AddGadgetItem3D()

Syntaxe

Resultat = AddGadgetItem3D(#Gadget3D, Position, Texte$)
Description
Ajoute un élément au gadget 3D spécifié par #Gadget3D. Le paramètre 'TextureID' est facultatif et peut être ajouté pour n'importe quel gadget qui le supporte.

Les gadgets supportant cette commande sont:

- ComboBoxGadget3D()
- ListViewGadget3D()
- PanelGadget3D()

La 'Position' précise le numéro d'emplacement où sera inséré le nouvel élément. Pour ajouter l'élément au début, indiquez 0 dans Position. Pour ajouter l'élément à la fin de la liste, indiquez -1 dans Position. Souvenez vous que lors de l'ajout d'un élément, tous les éléments qui suivent cet élément verront leur position s'incrémenter de 1.


ButtonGadget3D()

Syntaxe

Resultat = ButtonGadget3D(#Gadget3D, x, y, Largeur, Hauteur, Texte$)
Description
Crée un bouton dans la GadgetList en cours. Si #PB_Any est utilisé pour le paramètre '#Gadget3D', le numéro du nouveau gadget sera renvoyé dans 'Resultat'. #Gadget3D sera la valeur retournée par la fonctionEventGadget3D(). 'x' et 'y' sont les coordonnées de la position du bouton dans la fenêtre 3D. 'Largeur' et 'Hauteur' sont ses dimensions, 'Texte$' contient le texte qui sera affiché dans le bouton 3D.

Vous pouvez ajouter une 'mini aide' à ce gadget en utilisant GadgetToolTip3D().

Les commandes suivantes peuvent être utilisées pour agir sur le gadget:

- SetGadgetText3D(): Change le texte affiché par le bouton.
- GetGadgetText3D(): Renvoie le texte affiché par le bouton.


CheckBoxGadget3D()

Syntaxe

Resultat = CheckBoxGadget3D(#Gadget3D, x, y, Largeur, Hauteur, Texte$)
Description
Crée un gadget checkbox (case à cocher) dans la GadgetList. Si #PB_Any est utilisé pour le paramètre '#Gadget3D', le numéro du nouveau gadget sera renvoyé dans 'Resultat'. #Gadget3D sera le numéro retourné par la fonction EventGadget3D(). 'x' et 'y' représentent la position de la case à cocher sur la fenêtre 3D, 'Largeur' et 'Hauteur', ses dimensions Texte$ compris. Texte$ décrit l'utilité de la case à cocher, il est placé à sa droite.

Vous pouvez ajouter une 'mini aide' à ce gadget en utilisant GadgetToolTip3D().

- GetGadgetState3D() est utilisé pour récupérer l'état du gadget (coché ou non).
- SetGadgetState3D() est utilisé pour changer l'état du gadget (coché ou non).


ClearGadgetItems3D()

Syntaxe

ClearGadgetItems3D(#Gadget3D)
Description
Supprime les éléments du gadget spécifié par #Gadget3D. Le gadget doit être
de l'un des types suivants :

- ComboBoxGadget3D()
- ListViewGadget3D()
- PanelGadget3D()


CloseGadgetList3D()

Syntaxe

CloseGadgetList3D()
Description
Termine la liste de gadgets courante et revient à la précédente.
C'est particulièrement utile pour les gadgets suivants:

- ContainerGadget3D()
- PanelGadget3D()
- ScrollAreaGadget3D()


ComboBoxGadget3D()

Syntaxe

Resultat = ComboBoxGadget3D(#Gadget3D, x, y, Largeur, Hauteur [, Options])
Description
Crée un gadget ComboBox (Liste déroulante) dans la GadgetList en cours. Si #PB_Any est utilisé pour le paramètre '#Gadget3D', le numéro du nouveau gadget sera renvoyé dans 'Resultat'. #Gadget3D sera le numéro retourné par la fonction EventGadget3D(). 'x' et 'y' représentent la position de la ligne de titre de la liste.
Lorsqu'une liste déroulante est créée, elle est vide.

Vous pouvez ajouter une 'mini aide' à ce gadget en utilisant GadgetToolTip3D().

Les commandes suivantes peuvent être utilisées pour agir sur le contenu de la liste :

- AddGadgetItem3D(): Ajoute un élément.
- GetGadgetItemText3D(): Renvoie le texte de l'élément spécifié.
- CountGadgetItems3D(): Renvoie le nombre d'éléments que contient le ComboBox.
- ClearGadgetItems3D(): Supprime tous les éléments.
- RemoveGadgetItem3D(): Supprime un élément.
- SetGadgetItemText3D(): Change le texte de l'élément spécifié.

- SetGadgetState3D(): Change l'élément sélectionné.
- GetGadgetState3D(): Récupère l'index de l'élément sélectionné.
- SetGadgetText3D(): Change le texte affiché. Si le ComboBoxGadget n'est pas éditable, le texte doit être dans la liste déroulante.
- GetGadgetText3D(): Renvoie le contenu texte de la zone visible de la ComboBox.
Le paramètre facultatif 'Options' peut être une combinaison des constantes suivantes:
  #PB_ComboBox3D_Editable : Rend la liste déroulante éditable


ContainerGadget3D()

Syntaxe

Resultat = ContainerGadget3D(#Gadget3D, x, y, Largeur, Hauteur)
Description
Crée un gadget container dans la GadgetList en cours. Si #PB_Any est utilisé pour le paramètre '#Gadget3D', le numéro du nouveau gadget sera renvoyé dans 'Resultat'.

Il s'agit simplement d'un panel qui peut contenir d'autres gadgets. La 'GadgetList' courante est automatiquement changée et les nouveaux gadgets qui sont créés après cette commande seront placés dans ce #Gadget3D. CloseGadgetList3D() permet de revenir à la 'GadgetList' précédente. OpenGadgetList3D() pourra être utiliser pour ajouter des gadgets dynamiquement dans ce #Gadget3D.

Vous pouvez ajouter une 'mini aide' à ce gadget en utilisant GadgetToolTip3D().


CountGadgetItems3D()

Syntaxe

Resultat = CountGadgetItems3D(#Gadget3D)
Description
Renvoie le nombre d'éléments que contient le #Gadget3D. Si le #Gadget3D ne contient pas d'élément, alors le Résultat est 0. Le premier élément commence à 1. Cette fonction est disponible avec les gadgets suivants:

- ComboBoxGadget3D()
- ListViewGadget3D()
- PanelGadget3D()


DisableGadget3D()

Syntaxe

DisableGadget3D(#Gadget3D, Etat)
Description
Active ou désactive un gadget référencé par #Gadget. Si Etat = 0, le gadget est activé. Si Etat = 1, le gadget est désactivé


EditorGadget3D()

Syntaxe

Resultat = EditorGadget3D(#Gadget3D, x, y, Largeur, Hauteur [, Options])
Description
Crée un #Gadget3D de type 'editeur' permettant de saisie une grande quantité de texte dans la 'GadgetList' courante. Si #PB_Any est utilisé pour le paramètre '#Gadget', le numéro du nouveau gadget sera renvoyé dans 'Resultat'. Les paramètres 'x' et 'y' représentent la position du gadget, 'Largeur' et 'Hauteur', ses dimensions. #Gadget3D sera le numéro retourné par la fonction EventGadget3D().

Le paramètre facultatif 'Options' peut prendre la valeur suivante:
  #PB_Editor3D_ReadOnly: L'utilisateur ne peut pas éditer le texte dans ce gadget.
Vous pouvez ajouter une 'mini aide' à ce gadget en utilisant GadgetToolTip3D().

Les commandes suivantes peuvent être utilisées pour agir sur le contenu du gadget:

- AddGadgetItem3D(): Ajoute une ligne de texte.
- CountGadgetItems3D(): Renvoie le nombre de lignes contenues dans le gadget.
- GetGadgetItemText3D(): Renvoie la ligne de texte spécifié.
- GetGadgetText3D(): Renvoie tout le texte contenu dans le gadget.
- RemoveGadgetItem3D(): Efface la ligne spécifiée.
- ClearGadgetItems3D(): Efface tout le texte.
- SetGadgetItemText3D(): Change le contenu de la ligne spécifiée.
- SetGadgetText3D(): Remplace tout le texte contenu par le gadget par un autre.
- SetGadgetAttribute3D() avec l'attribut suivant:
  #PB_Editor3D_ReadOnly: Change l'état 'lecture seule' du gadget (0 = éditable, 1 = non éditable).
- GetGadgetAttribute() avec l'attribut suivant:
  #PB_Editor3D_ReadOnly: Renvoie l'état 'lecture seule' du gadget (0 = éditable, 1 = non éditable).


Frame3DGadget3D()

Syntaxe

Resultat = Frame3DGadget3D(#Gadget3D, x, y, Largeur, Hauteur, Texte$)
Description
Crée dans la GadgetList un cadre en relief qui permet de regrouper un ensemble de gadgets. Si #PB_Any est utilisé pour le paramètre '#Gadget3D', le numéro du nouveau gadget sera renvoyé dans 'Resultat'. Ce gadget ne peut être activé, il ne sert qu'à rendre plus compréhensible la présentation d'une fenêtre. 'x' et 'y' représentent la position du bord supérieur gauche du cadre dans la fenêtre, 'Largeur' et 'Hauteur', ses dimensions. 'Texte$' est un titre qui s'affiche près du bord supérieur gauche du cadre.

Note: Comme ce gadget est seulement décoratif, GadgetToolTip3D() ne peut pas être utilisé (ce gadget ne reçoit aucun évènement).


FreeGadget3D()

Syntaxe

FreeGadget3D(#Gadget3D)
Description
Enlève le #Gadget3D de la fenêtre à laquelle il était attaché et le détruit.

Note: tous les gadgets restants sont automatiquement supprimés quand le programme se termine.


GadgetHeight3D()

Syntaxe

Resultat = GadgetHeight3D(#Gadget3D)
Description
Renvoie la hauteur (en pixels) du #Gadget3D.


GadgetID3D()

Syntaxe

GadgetID = GadgetID3D(#Gadget3D)
Description
Renvoie l'identifiant propre à l'OS du #Gadget3D.


GadgetToolTip3D()

Syntaxe

GadgetToolTip3D(#Gadget3D, Texte$)
Description
Associe ou remplace un texte flottant au #gadget3D spécifié. Un 'Tooltip' est un texte flottant
qui apparaît au bout d'un certain temps lorsque le curseur de la souris est
immobile au dessus d'un gadget.

Les gadgets suivants sont supportés:

- ButtonGadget3D()
- CheckBoxGadget3D()
- ComboBoxGadget3D()
- ContainerGadget3D()
- EditorGadget3D()
- ImageGadget3D()
- ListViewGadget3D()
- OptionGadget3D()
- PanelGadget3D()
- ProgressBarGadget3D()
- ScrollBarGadget3D()
- SpinGadget3D()
- StringGadget3D()


GadgetType3D()

Syntaxe

Resultat = GadgetType3D(#Gadget3D)
Description
Renvoie le type du #Gadget3D spécifié. Cette commande peut être utile pour écrire des fonctions génériques qui fonctionnent avec plusieurs types de gadgets.

'Resultat' peut prendre une des valeurs suivantes:
  #PB_GadgetType3D_Button        : ButtonGadget3D()
  #PB_GadgetType3D_CheckBox      : CheckBoxGadget3D()
  #PB_GadgetType3D_ComboBox      : ComboBoxGadget3D()
  #PB_GadgetType3D_Container     : ContainerGadget3D()
  #PB_GadgetType3D_Editor        : EditorGadget3D()
  #PB_GadgetType3D_Frame3D       : Frame3DGadget3D()
  #PB_GadgetType3D_Image         : ImageGadget3D()
  #PB_GadgetType3D_ListView      : ListViewGadget3D()
  #PB_GadgetType3D_Option        : OptionGadget3D()
  #PB_GadgetType3D_Panel         : PanelGadget3D()
  #PB_GadgetType3D_ProgressBar   : ProgressBarGadget3D()
  #PB_GadgetType3D_ScrollArea    : ScrollAreaGadget3D()
  #PB_GadgetType3D_ScrollBar     : ScrollBarGadget3D()
  #PB_GadgetType3D_Spin          : SpinGadget3D()
  #PB_GadgetType3D_String        : StringGadget3D()
  #PB_GadgetType3D_Text          : TextGadget3D()
  #PB_GadgetType3D_Unknown       : Type inconnu, problablement pas un gadget PureBasic.


GadgetWidth3D()

Syntaxe

Resultat = GadgetWidth3D(#Gadget3D)
Description
Renvoie la largeur (en pixels) du #Gadget.


GadgetX3D()

Syntaxe

Resultat = GadgetX3D(#Gadget3D)
Description
Renvoie la position en X (en pixels) du #Gadget3D.


GadgetY3D()

Syntaxe

Resultat = GadgetY3D(#Gadget3D)
Description
Renvoie la position en Y (en pixels) du #Gadget3D.


GetActiveGadget3D()

Syntaxe

Resultat = GetActiveGadget3D()
Description
Renvoie le numéro du #Gadget3D qui a actuellement le 'focus' clavier. Si aucun gadget a le focus, -1 est renvoyé.


GetGadgetAttribute3D()

Syntaxe

Valeur = GetGadgetAttribute3D(#Gadget3D, Attribut)
Description
Renvoie la valeur de l'attribut du #Gadget3D spécifié. Cette fonction est disponible avec
les gadgets suivants:

- EditorGadget3D()
- PanelGadget3D()
- ProgressBarGadget3D()
- ScrollAreaGadget3D()
- ScrollBarGadget3D()
- SpinGadget3D()


GetGadgetData3D()

Syntaxe

Resultat = GetGadgetData3D(#Gadget3D)
Description
Renvoie la valeur qui a été stockée dans ce #Gadget3D avec la commande SetGadgetData3D(). Cela permet d'associer une valeur personnalisée pour chaque gadget. Si aucune valeur n'est associée à ce #Gadget3D, 'Resultat' sera égal à 0.

Cette commande fonctionne avec tous les types de gadget du PureBasic. Pour un exemple d'utilisation, consulter la définition de la commande SetGadgetData3D().


GetGadgetItemData3D()

Syntaxe

Resultat = GetGadgetItemData3D(#Gadget3D, Element)
Description
Renvoie la valeur qui a été stockée dans cet 'Element' du #Gadget3D avec la commande SetGadgetItemData3D(). Cela permet d'associer une valeur personnalisée pour chaque élément d'un gadget. Si aucune valeur n'est associée à cet élément, 'Resultat' sera égal à 0.

Cette commande est supportée par les gadgets suivants:
- ComboBoxGadget3D()
- ListViewGadget3D()

Pour un exemple d'utilisation, consulter la définition de la commande SetGadgetItemData3D().


GetGadgetItemState3D()

Syntaxe

Resultat = GetGadgetItemState3D(#Gadget3D, Element)
Description
Renvoie l'état de l'élément du #Gadget3D spécifié. Cette fonction est disponible avec les gadgets suivants:

- ListViewGadget3D(): Renvoie 1 si l'élément est sélectionné, 0 sinon.


GetGadgetItemText3D()

Syntaxe

Resultat$ = GetGadgetItemText3D(#Gadget3D, Element [, Colonne])
Description
Renvoie le texte de l'élément du #Gadget3D spécifié. Cette fonction est disponible avec les gadgets suivants:

- ComboBoxGadget3D() - renvoie le texte de l'élément de la liste déroulante ('Colonne' est ignorée).
- ListViewGadget3D() - renvoie le texte de l'élément de la liste ('Colonne' est ignorée).
- PanelGadget3D() - renvoie le texte de l'élément spécifié ('Colonne' est ignorée).

Note: La numérotation des éléments commence à partir de 0.


GetGadgetState3D()

Syntaxe

Resultat = GetGadgetState3D(#Gadget3D)
Description
Renvoie dans Resultat l'état actuel du gadget référencé par #Gadget3D. Cette fonction est universelle et fonctionne avec pratiquement tous les gadgets.

- CheckBoxGadget3D(): renvoie 1 s'il est activé, 0 sinon.
- ComboBoxGadget3D(): renvoie le numéro de l'élément sélectionné ou -1 si pas de sélection.
- ImageGadget3D(): renvoie le TextureID de l'image actuellement affichée.
- ListViewGadget3D(): renvoie le numéro de l'élément sélectionné ou -1 si il n'y a pas d'élément sélectionné.
- OptionGadget3D(): renvoie 1 s'il est activé, 0 sinon.
- PanelGadget3D(): renvoie le numéro d'onglet sélectionné ou -1 si pas de sélection.
- ProgressBarGadget3D(): renvoie la valeur actuelle de la barre de progression.
- ScrollBarGadget3D(): renvoie la position actuelle de l'ascenseur.
- SpinGadget3D(): renvoie la valeur actuelle du SpinGadget.


GetGadgetText3D()

Syntaxe

Texte$ = GetGadgetText3D(#Gadget3D)
Description
Renvoie dans Texte$ le texte contenu dans le gadget référencé par #Gadget3D. Cette commande est particulièrement utile pour :

- ButtonGadget3D() - renvoie le texte affiché par le BoutonGadget3D.
- ComboBoxGadget3D() - renvoie le texte de l'élément sélectionné.
- EditorGadget3D() - Renvoie le texte contenu dans l'éditeur. Les différentes lignes seront séparées par la combinaison "Chr(13)+Chr(10)".
- ListViewGadget3D() - renvoie le texte de l'élément sélectionné.
- StringGadget3D() - renvoie le contenu du StringGadget3D.
- TextGadget3D() - renvoie le contenu du TextGadget3D.


HideGadget3D()

Syntaxe

HideGadget3D(#Gadget3D, Etat)
Description
Cache ou affiche un #Gadget3D. Si 'Etat' = 1, le gadget sera caché, si 'Etat' = 0 le gadget sera affiché.


ImageGadget3D()

Syntaxe

Resultat = ImageGadget3D(#Gadget3D, x, y, Largeur, Hauteur, TextureID [, Options])
Description
Crée un gadget Image dans la GadgetList en cours. Un gadget Image permet de positionner une image dans une fenêtre. Si #PB_Any est utilisé pour le paramètre '#Gadget3D',le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
'TextureID' représente l'identifiant d'une image et peut être obtenu en utilisant la fonction TextureID() de la bibliothèque Texture. Si 'TextureID' est 0, alors aucune image ne sera affichée. La 'Hauteur' et la 'Largeur' du gadget s'ajustent automatiquement à la taille de l'image (les paramètres 'Largeur' et 'Hauteur' sont donc actuellement sans effet).

Vous pouvez ajouter une 'mini aide' à ce gadget en utilisant GadgetToolTip3D().

- SetGadgetState3D(): Permet de changer dynamiquement l'image contenue dans le gadget. Un 'TextureID' valide peut être obtenu via TextureID(). Si 'TextureID' est 0, alors l'image est retirée du gadget.

Le paramètre facultatif 'Options' peut être une combinaison des constantes suivantes:
  #PB_Image3D_Border : Affiche un cadre autour de l'image.


IsGadget3D()

Syntaxe

Resultat = IsGadget3D(#Gadget3D)
Description
Teste si le #Gadget3D est correctement initialisé. Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. Si le 'Résultat' est différent de zéro, alors cet objet est valide. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.


ListViewGadget3D()

Syntaxe

Resultat = ListViewGadget3D(#Gadget3D, x, y, Largeur, Hauteur)
Description
Crée une boîte de listes (ListView) dans la GadgetList en cours. Si #PB_Any est utilisé pour le paramètre '#Gadget3D', le numéro du nouveau gadget sera renvoyé dans 'Resultat'. #Gadget3D est le numéro du gadget renvoyé par la fonction EventGadget3D(). Lorsqu'une boîte de listes est créée, sa liste d'éléments est vide.

Vous pouvez ajouter une 'mini aide' à ce gadget en utilisant GadgetToolTip3D().

Les fonctions suivantes peuvent être utilisées pour agir sur le contenu de cette liste:

- AddGadgetItem3D(): Ajoute un élément
- CountGadgetItems3D(): Renvoie le nombre d'éléments.
- RemoveGadgetItem3D(): Supprime un élément
- ClearGadgetItems3D(): Supprime tous les éléments
- GetGadgetItemData3D(): Renvoie la valeur personnalisée associée à cet élément.
- SetGadgetItemData3D(): Associe une valeur personnalisée à cet élément.
- GetGadgetItemText3D(): Renvoie le texte de l'élément spécifié.
- SetGadgetItemText3D(): Change le texte de l'élément spécifié.
- GetGadgetItemState3D(): Renvoie 0 si l'élément n'est pas séléctionné, sinon une valeur non-nulle.
- SetGadgetItemState3D(): Sélectionne ou désélectionne l'élément spécifié.
- GetGadgetState3D(): Renvoie le numéro de l'élément qui est sélectionné, -1 si il n'y a pas de sélection.
- SetGadgetState3D(): Change l'état de l'élément spécifié.
- GetGadgetText3D(): Renvoie le texte de l'élément sélectionné.
- SetGadgetText3D(): Sélectionne l'élément correspondant au texte indiqué. Le texte doit exactement correspondre.


OpenGadgetList3D()

Syntaxe

OpenGadgetList3D(#Gadget3D [, Element])
Description
Change la GadgetList courant par la nouvelle spécifiée (en principe un gadget qui fait office de conteneur, comme un PanelGadget3D(), ScrollAreaGadget3D() etc..). Cela permet de rajouter des nouveaux gadgets à la volée sans avoir à recréer le gadget. Une fois que les nouveaux gadgets ont été ajouté, il convient d'appeler CloseGadgetList3D() pour revenir à l'état précédent.

- ContainerGadget3D()
- PanelGadget3D() : Le paramètre 'Element' doit être spécifié (correspond à l'onglet)
- ScrollAreaGadget3D()


OptionGadget3D()

Syntaxe

Resultat = OptionGadget3D(#Gadget3D, x, y, Largeur, Hauteur, Texte$)
Description
Crée un gadget de cases à options (connu aussi sous le nom de 'boutons radio') dans la GadgetList. Si #PB_Any est utilisé pour le paramètre '#Gadget3D', le numéro du nouveau gadget sera renvoyé dans 'Resultat'. Ce gadget permet de regrouper plusieurs cases à options, sachant qu'une seule d'entre elles peut être sélectionnée à la fois. Au premier appel de cette fonction, un groupe de cases à options est créé, et tous les appels suivants à la fonction OptionGadget3D ajouteront une nouvelle case à options au groupe. Pour terminer le groupe, il suffit d'appeler un autre type de gadget.
'x' et 'y' représentent la position de la case à cocher sur la fenêtre, 'Largeur' et 'Hauteur'ses dimensions (incluant le 'Texte$'). 'Texte$' décrit l'utilité de la case à option, il est placé à sa droite.

Vous pouvez ajouter une 'mini aide' à ce gadget en utilisant GadgetToolTip3D().


PanelGadget3D()

Syntaxe

Resultat = PanelGadget3D(#Gadget3D, x, y, Largeur, Hauteur)
Description
Crée un gadget Boîte à onglets (Panel) dans la GadgetList. Si #PB_Any est utilisé pour le paramètre '#Gadget3D', le numéro du nouveau gadget sera renvoyé dans 'Resultat'. #Gadget3D est le numéro du gadget renvoyé par la fonction EventGadget3D(). 'x' et 'y' représentent la position de la boîte à onglets dans la fenêtre, 'Largeur' et 'Hauteur', ses dimensions. Lorsqu'une boîte à onglets est créée, sa liste d'éléments est vide.

Vous pouvez ajouter une 'mini aide' à ce gadget en utilisant GadgetToolTip3D().

Les fonctions suivantes peuvent être appelées pour agir sur la liste :

- AddGadgetItem3D(): Ajoute un élément
- RemoveGadgetItem3D(): Supprime un élément
- CountGadgetItems3D(): Renvoie le nombre d'éléments.
- ClearGadgetItems3D(): Supprime tous les éléments
- GetGadgetItemText3D(): Renvoie le texte de l'élément spécifié.
- SetGadgetItemText3D(): Change le texte de l'élément spécifié.

- SetGadgetState3D(): Change l'onglet affiché.
- GetGadgetState3D(): Renvoie le numéro de l'onglet actuellement affiché.
- GetGadgetAttribute3D() avec un des attributs suivants (il doit y avoir au moins un élément dans le PanelGadget3D()):
  #PB_Panel3D_ItemWidth : Renvoie la largeur de la zone utilisable d'un onglet.
  #PB_Panel3D_ItemHeight: Renvoie la hauteur de la zone utilisable d'un onglet.
  #PB_Panel3D_TabHeight : Renvoie la hauteur d'un bouton de changement d'onglet.

Avant de pouvoir ajouter des gadgets, il est nécessaire d'appeler la commande AddGadgetItem3D() pour ajouter au moins un onglet. Les prochains gadgets créés le seront automatiquement sur le dernier onglet. Lorsque tous les gadgets de la boîte à onglets ont été placés, CloseGadgetList3D() doit être appelé pour revenir à la GadgetList précédente. Il est ainsi parfaitement possible de créer une boîte à onglets dans une autre boîte à onglets...


ProgressBarGadget3D()

Syntaxe

Resultat = ProgressBarGadget3D(#Gadget3D, x, y, Largeur, Hauteur, Minimum, Maximum)
Description
Crée un gadget 'Barre de progression' (ProgressBar) dans la GadgetList. Si #PB_Any est utilisé pour le paramètre '#Gadget3D', le numéro du nouveau gadget sera renvoyé dans 'Resultat'. #Gadget3D est le numéro du gadget renvoyé par la fonction EventGadget3D(). 'x' et 'y' représentent la position de la barre de progression dans la fenêtre, 'Largeur' et 'Hauteur', ses dimensions. Les valeurs 'Minimum-Maximum' spécifient l'intervalle qui sera utilisé par la barre de progression.

Vous pouvez ajouter une 'mini aide' à ce gadget en utilisant GadgetToolTip3D().

Les fonctions suivantes peuvent être appelées pour agir sur la barre de progression :

- SetGadgetState3D(): Change la valeur de la barre de progression.
- GetGadgetState3D(): Renvoie la valeur courante de la barre de progression.
- SetGadgetAttribute3D() avec les attributs suivants:
  #PB_ProgressBar3D_Minimum: Change la valeur minimale.
  #PB_ProgressBar3D_Maximum: Change la valeur maximale.
- GetGadgetAttribute3D() avec les attributs suivants:
  #PB_ProgressBar3D_Minimum: Renvoie la valeur minimale.
  #PB_ProgressBar3D_Maximum: Renvoie la valeur maximale.


RemoveGadgetItem3D()

Syntaxe

RemoveGadgetItem3D(#Gadget3D, Position)
Description
Supprime un élément du gadget spécifié par #Gadget3D. 'Position' représente la position de l'élément dans la liste dont l'index commence à 0. Cette fonction s'applique aux gadgets suivants :

- ComboBoxGadget3D()
- PanelGadget3D()
- ListViewGadget3D()


ResizeGadget3D()

Syntaxe

ResizeGadget3D(#Gadget3D, x, y, Largeur, Hauteur)
Description
Change la taille et la position du #Gadget3D spécifié. Pour faciliter le redimensionnement de l'interface en temps réel, la constante #PB_Ignore peut être spécifiée à chacun des paramètres (x, y, Largeur ou Hauteur) et la valeur précédente de ce paramètre sera conservée.
  [...]

  ResizeGadget3D(0, #PB_Ignore, #PB_Ignore, 300, #PB_Ignore) ; Change seulement la largeur du gadget.


ScrollAreaGadget3D()

Syntaxe

Resultat = ScrollAreaGadget3D(#Gadget3D, x, y, Largeur, Hauteur, LargeurZoneInterne, HauteurZoneInterne, ValeurDeplacement)
Description
Crée une gadget permettant d'afficher une zone plus grande que celle affichée à l'écran, à l'aide de barre de déplacement. Si #PB_Any est utilisé pour le paramètre '#Gadget3D', le numéro du nouveau gadget sera renvoyé dans 'Resultat'. Tout le déplacement de la zone interne est gérée automatiquement par le gadget. Par exemple, il est très utile pour afficher une image trop grande pour être vu en entière (à l'aide d'un ImageGadget3D(). Cette zone peut contenir n'importe quel type de gadgets. Quand ce gadget est créé la 'GadgetList' courante est automatiquement changée et les nouveaux gadgets qui sont créés après cette commande seront placés dans ce #Gadget3D. CloseGadgetList3D() permet de revenir à la 'GadgetList' précédente. OpenGadgetList3D() pourra être utiliser pour ajouter des gadgets dynamiquement dans ce #Gadget3D.

'LargeurZoneInterne' et 'HauteurZoneInterne' sont les dimensions de la zone interne, qui devraient être supérieures ou égales aux dimensions 'Largeur' et 'Hauteur' du #Gadget3D. 'ValeurDeplacement' est le nombre de pixels qui sera affiché quand on presse l'une des flèches de déplacements, pour permettre une vitesse de déplacement variable. #Gadget3D est le numéro du gadget renvoyé par la fonction EventGadget3D(). Un évènement est généré lorsque l'utilisateur déplace les ascenseurs du gadget.

Les commandes suivantes peuvent être utilisées pour agir sur un ScrollAreaGadget3D:

GetGadgetAttribute3D(): Avec une des constantes suivantes:
  #PB_ScrollArea3D_InnerWidth : Renvoie la largeur (en pixels) de la zone interne du gadget.
  #PB_ScrollArea3D_InnerHeight: Renvoie la hauteur (en pixels) de la zone interne du gadget.
  #PB_ScrollArea3D_X          : Renvoie la position horizontale actuelle de l'ascenseur (en pixels).
  #PB_ScrollArea3D_Y          : Renvoie la position verticale actuelle de l'ascenseur (en pixels).
SetGadgetAttribute3D(): Avec une des constantes suivantes:
  #PB_ScrollArea3D_InnerWidth : Modifie la largeur (en pixels) de la zone interne du gadget.
  #PB_ScrollArea3D_InnerHeight: Modifie la hauteur (en pixels) de la zone interne du gadget.
  #PB_ScrollArea3D_X          : Modifie la position horizontale actuelle de l'ascenseur (en pixels).
  #PB_ScrollArea3D_Y          : Modifie la position verticale actuelle de l'ascenseur (en pixels).


ScrollBarGadget3D()

Syntaxe

Resultat = ScrollBarGadget3D(#Gadget3D, x, y, Largeur, Hauteur, Minimum, Maximum, LongueurPage [, Options])
Description
Crée une nouvelle barre de défilement (ascenseur vertical ou horizontal) dans la GadgetList courante. Si #PB_Any est utilisé pour le paramètre '#Gadget3D', le numéro du nouveau gadget sera renvoyé dans 'Resultat'. #Gadget3D est le numéro du gadget renvoyé par la fonction EventGadget3D(). 'x' et 'y' représentent la position de la barre de déplacement dans la fenêtre, 'Largeur' et 'Hauteur', ses dimensions.

Les valeurs 'Minimum-Maximum' spécifient l'intervalle qui sera utilisé par la barre de déplacement (valeurs comprises entre 0 et 10 000). Un ascenceur permet de se déplacer par page (lorque l'on clique en dehors du curseur de déplacement) et le paramètre 'LongueurPage' permet de définir la valeur de ce déplacement. Exemple concret: La longueur totale du composant (image, document, container etc...) fait 500 pixels. On ne peut en afficher que 100 pixels. Donc on aura une valeur minimale de 0, une valeur Maximale de 500 et une longueur de page de 100. Le curseur sera 5 fois plus petit que la barre de déplacement, car sa dimension est proportionnelle (dimension = Maximum/LongueurPage).

Le paramètre facultatif 'Options' peut être une combinaison des constantes suivantes:
  #PB_ScrollBar3D_Vertical: La barre de déplacement sera verticale.
Vous pouvez ajouter une 'mini aide' à ce gadget en utilisant GadgetToolTip3D().

Les fonctions suivantes peuvent être appelées pour agir sur la barre de déplacement :

- GetGadgetState3D(): Renvoie la position actuelle du curseur (valeur comprise dans l'intervalle Minimum-Maximum)
- SetGadgetState3D(): Change la position actuelle du curseur.
- GetGadgetAttribute3D() avec un des attributs suivants:
  #PB_ScrollBar3D_Minimum   : Renvoie la position minimale de l'ascenseur.
  #PB_ScrollBar3D_Maximum   : Renvoie la position maximale de l'ascenseur.
  #PB_ScrollBar3D_PageLength: Renvoie la longueur de la page.
- SetGadgetAttribute3D(): avec un des attributs suivants:
  #PB_ScrollBar3D_Minimum   : Change la position minimale de l'ascenseur.
  #PB_ScrollBar3D_Maximum   : Change la position maximale de l'ascenseur.
  #PB_ScrollBar3D_PageLength: Change la longueur de la page.


SetActiveGadget3D()

Syntaxe

SetActiveGadget3D(#Gadget3D)
Description
Active le #Gadget3D spécifié (donne le focus). Cette fonction est utilisée principalement avec ComboBoxGadget3D() and StringGadget3D(). Cela permet a un gadget d'obtenir le focus du clavier. Si #Gadget3D est -1, alors le focus (si il y'en avait un) est enlevé.


SetGadgetAttribute3D()

Syntaxe

SetGadgetAttribute3D(#Gadget3D, Attribute, Value)
Description
Change la valeur de l'attribut du #Gadget3D spécifié. Cette fonction est disponible avec
les gadgets suivants:

- EditorGadget3D()
- ProgressBarGadget3D()
- ScrollAreaGadget3D()
- ScrollBarGadget3D()
- SpinGadget3D()


SetGadgetData3D()

Syntaxe

SetGadgetData3D(#Gadget3D, Valeur)
Description
Associe la 'Valeur' spécifiée au #Gadget3D. Cette valeur peut être récupérée avec GetGadgetData3D().

Tous les gadgets sont supportés par cette commande.


SetGadgetItemData3D()

Syntaxe

SetGadgetItemData3D(#Gadget3D, Element, Valeur)
Description
Associe la 'Valeur' specifiée avec l'Element du #Gadget3D. Cette valeur peut être récupérée avec la commande GetGadgetItemData3D(). Si l'index de l'élément change (par exemple d'autres éléments sont éffacés), la valeur restera toujours associée à son élément.

Cette commande est supportée par les gadgets suivants:
- ComboBoxGadget3D()
- ListViewGadget3D()


SetGadgetItemState3D()

Syntaxe

SetGadgetItemState3D(#Gadget3D, Element, Etat)
Description
Change l'état de l'élément du #Gadget3D spécifié. Cette commande est disponible pour les gadgets suivants:

- ListViewGadget3D(): 'Etat' = 1 si l'élément doit être sélectionné, 0 sinon.


SetGadgetItemText3D()

Syntaxe

SetGadgetItemText3D(#Gadget3D, Element, Texte$ [, Colonne])
Description
Change le texte de l'élément du #Gadget3D spécifié. Cette commande est disponible pour les gadgets suivants:

- ComboBoxGadget3D()
- ListViewGadget3D()
- PanelGadget3D()


SetGadgetState3D()

Syntaxe

SetGadgetState3D(#Gadget3D, Etat)
Description
Change l'état en cours du gadget #Gadget3D. Cette fonction est universelle et s'applique à pratiquement tous les gadgets :
- CheckBoxGadget3D(): 'Etat' = 1 pour valider la case, sinon 0.
- ComboBoxGadget3D(): Change l'élément sélectionné en cours.
- ImageGadget3D(): Change l'image affichée par le gadget.
- ListViewGadget3D(): Change l'élément sélectionné. Si 'Etat' = -1, alors aucun élément n'est sélectionné.
- OptionGadget3D(): 'Etat' = 1 pour l'activer, sinon 0.
- PanelGadget3D(): Change l'onglet en cours.
- ProgressBarGadget3D(): Change la valeur de la barre de progression.
- ScrollBarGadget3D(): Change la position du curseur.
- SpinGadget3D(): Change la valeur actuelle.


SetGadgetText3D()

Syntaxe

SetGadgetText3D(#Gadget3D, Texte$)
Description
Modifie le texte contenu dans le gadget #Gadget3D. Cette fonction est particulièrement utile pour :

- ButtonGadget3D(): change le texte du ButtonGadget3D.
- ComboBoxGadget3D()
- EditorGadget3D(): change le texte contenu dans l'EditorGadget3D.
- Frame3DGadget3D(): change le titre du Frame3DGadget3D.
- ListViewGadget3D(): selectionne l'élément qui correspond exactement au texte.
- StringGadget3D(): change le contenu du StringGadget3D.
- TextGadget3D(): change le contenu du TextGadget3D.


SpinGadget3D()

Syntaxe

Resultat = SpinGadget3D(#Gadget3D, x, y, Largeur, Hauteur, Minimum, Maximum)
Description
Crée un gadget 'incrémental' (Spin) dans la GadgetList. Si #PB_Any est utilisé pour le paramètre '#Gadget3D', le numéro du nouveau gadget sera renvoyé dans 'Resultat'. #Gadget3D est le numéro du gadget renvoyé par la fonction EventGadget3D(). 'x' et 'y' représentent la position du gadget dans la fenêtre, 'Largeur' et 'Hauteur', ses dimensions.

Vous pouvez ajouter une 'mini aide' à ce gadget en utilisant GadgetToolTip3D().

Les fonctions suivantes peuvent être appelées pour contrôler le gadget:

GetGadgetState3D(): Renvoie la valeur du curseur interne.
SetGadgetState3D(): Change la valeur du curseur interne.
GetGadgetText3D(): Renvoie le texte du gadget.
SetGadgetText3D(): Change le texte du gadget.
GetGadgetAttribute3D() avec un des attributs suivants:
  #PB_Spin3D_Minimum: Renvoie la valeur minimale possible.
  #PB_Spin3D_Maximum: Renvoie la valeur maximale possible.
SetGadgetAttribute3D(): avec un des attributs suivants:
  #PB_Spin3D_Minimum: Change la valeur minimale possible.
  #PB_Spin3D_Maximum: Change la valeur maximale possible.


StringGadget3D()

Syntaxe

Resultat = StringGadget3D(#Gadget3D, x, y, Largeur, Hauteur, Texte$ [, Options])
Description
Crée un gadget de 'saisie de texte' dans la GadgetList. Si #PB_Any est utilisé pour le paramètre '#Gadget3D', le numéro du nouveau gadget sera renvoyé dans 'Resultat'. #Gadget3D est le numéro retourné par la fonction EventGadget3D(). 'Texte$' contient le texte initial du gadget. Ce texte pourra être ensuite modifié par les fonctions SetGadgetText3D() et GetGadgetText3D()

Le paramètre facultatif 'Options' peut être une combinaison des constantes suivantes:
  #PB_String3D_Password  : Mode 'mot de passe', n'affiche que des '*'.
  #PB_String3D_ReadOnly  : Mode 'lecture seulement'.
  #PB_String3D_Numeric   : Mode 'numeric'. Seuls des chiffres peuvent être saisis.

Les évènements suivants sont disponibles par l'intermédiaire d'EventType3D():
  #PB_EventType3D_Change    : Le texte a été modifié par l'utilisateur.
  #PB_EventType3D_Focus     : Le StringGadget obtient le focus.
  #PB_EventType3D_LostFocus : Le StringGadget a perdu le focus.
Vous pouvez ajouter une 'mini aide' à ce gadget en utilisant GadgetToolTip3D().


TextGadget3D()

Syntaxe

Resultat = TextGadget3D(#Gadget3D, x, y, Largeur, Hauteur, Texte$)
Description
Crée un gadget 'Texte' dans la GadgetList. Si #PB_Any est utilisé pour le paramètre '#Gadget3D', le numéro du nouveau gadget sera renvoyé dans 'Resultat'. Un TextGadget3D est un texte simple placé dans la fenêtre en cours. Son contenu peut être modifié à l'aide des fonctions SetGadgetText3D() et GetGadgetText3D().
'x' et 'y' représentent la position du bord supérieur gauche du cadre dans la fenêtre, 'Largeur' et 'Hauteur', ses dimensions.

Note: Ce gadget ne reçoit aucun évènement, et GadgetToolTip3D() ne peut pas être utilisé.


Help

PureBasic - Help

Généralités

L'aide (help) est un composant clé d'un logiciel. Cela permet à l'utilisateur d'en découvrir facilement et efficacement les fonctions. PureBasic permet d'afficher des fichiers d'aide normalisés traitant un niveau global et un niveau contextuel.

Sous Microsoft Windows, deux types de formats sont supportés: .hlp (ancien format) et .chm (nouveau format compatible HTML).

Sommaire des commandes

CloseHelp
OpenHelp

Exemple

Help.pb

OS Supportés

Tous

Guide de référence - Index


CloseHelp()

Syntaxe

CloseHelp()
Description
Ferme la fenêtre d'aide préalablement ouverte avec OpenHelp().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

OpenHelp()


OpenHelp()

Syntaxe

OpenHelp(NomFichier$, Theme$)
Description
Ouvre et affiche une fenêtre d'aide.

Arguments

NomFichier$ | Le nom du fichier d'aide à utiliser.
Theme$ | Le nom de la page à afficher. Si Theme$ n'est pas une chaîne vide, l'aide s'affiche directement à la page spécifiée (très utile pour l'aide en ligne / contextuelle).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

   OpenHelp("help.chm",  "index.htm")
   OpenHelp("help.chm",  "print.txt")

Voir aussi

CloseHelp()


Http

PureBasic - Http

Généralités

Http est le nom du protocole utilisé par les navigateurs Web pour accéder aux sites distants, comme par exemple une page Web. Chaque donnée distante a son adresse unique: l'URL (Uniform Resource Locator). Cette bibliothèque permet de manipuler facilement les URLs et de télécharger des fichiers distants.

Sommaire des commandes

GetHTTPHeader
GetURLPart
ReceiveHTTPFile
SetURLPart
URLDecoder
URLEncoder

Exemple

Http.pb

OS Supportés

Tous

Guide de référence - Index


GetHTTPHeader()

Syntaxe

Resultat$ = GetHTTPHeader(URL$)
Description
Récupère les en-têtes HTTP de l'URL$ spécifiée. Ils permettent d'accéder à des informations intéressantes comme la date de modification du fichier, le type du serveur et sa version, etc.

Arguments

URL$ L'URL$ doit être complète, en incluant le préfixe "http://".

Valeur de retour

Le Resultat$ est une chaîne de caractères contenant des lignes terminées par #LF$. StringField() peut servir à analyser facilement les en-têtes ligne par ligne.

Le format des en-têtes est dépendant du serveur Web, donc il est possible d'avoir des informations différentes en fonction du serveur.

Exemple d'un en-tête:
  HTTP/1.1 200 OK
  Date: Fri, 21 Mar 2008 09:49:30 GMT
  Server: Apache/1.3.34 (Debian) mod_vhost_online/1.1 mod_fastcgi/2.4.2 mod_log_online/0.1
  X-Powered-By: PHP/4.4.8-1
  Content-Type: text/html

Remarques

InitNetwork() doit avoir été appelé avec succès avant de pouvoir utiliser cette commande.

Exemple

  InitNetwork()

  EnTete$ = GetHTTPHeader("http://www.purebasic.com/index.php3")

  Repeat
    Index+1
    Ligne$ = StringField(EnTete$, Index, #LF$)
    Debug Ligne$
  Until Ligne$ = ""

Voir aussi

ReceiveHTTPFile(), URLEncoder()


GetURLPart()

Syntaxe

Resultat$ = GetURLPart(URL$, Parametre$)
Description
Renvoie une partie de l'URL$ spécifiée.

Arguments

URL$ Une URL$ peut contenir des paramètres. C'est utile quand un langage de script est utilisé sur le serveur Web (comme PHP). La syntaxe est la suivante: http://www.purebasic.com/index.php3?test=1. Ici le paramètre se nomme "test" et sa valeur associée est "1".
Parametre$ Cette commande renverra la valeur d'un 'Parametre$' donné. Les paramètres ne sont pas sensibles aux majuscules/minuscules. De surcroît, 'Parametre$' peut être une des constantes suivantes, pour accéder facilement à une partie standard de l'URL$:
  #PB_URL_Protocol  : Renvoie le protocole de URL$
  #PB_URL_Site      : Renvoie le site de l'URL$
  #PB_URL_Port      : Renvoie le port de l'URL$ (s'il existe)
  #PB_URL_Parameters: Renvoie tous les paramètres de l'URL$
  #PB_URL_Path      : Renvoie le chemin de l'URL$
  #PB_URL_User      : Renvoie le nom d'utilisateur de l'URL$ (s'il existe)
  #PB_URL_Password  : Renvoie le mot de passe de l'URL$ (s'il existe)

Valeur de retour

Renvoie la valeur du paramètre ou une autre partie de l'URL.

Exemple

  URL$ = "http://user:pass@www.purebasic.com:80/index.php3?test=1&ok=2"

  Debug GetURLPart(URL$, #PB_URL_Protocol) ; Affichera "http"
  Debug GetURLPart(URL$, #PB_URL_Site)     ; Affichera "www.purebasic.com"
  Debug GetURLPart(URL$, #PB_URL_Port)     ; Affichera "80"
  Debug GetURLPart(URL$, #PB_URL_Parameters) ; Affichera "test=1&ok=2"
  Debug GetURLPart(URL$, #PB_URL_Path)     ; Affichera "index.php3"
  Debug GetURLPart(URL$, #PB_URL_User)     ; Affichera "user"
  Debug GetURLPart(URL$, #PB_URL_Password) ; Affichera "pass"
  Debug GetURLPart(URL$, "test")           ; Affichera "1"
  Debug GetURLPart(URL$, "ok")             ; Affichera "2"

Remarques

Cette commande sera très utile pour découper facilement une URL$ lors de l'écriture d'un CGI.

Voir aussi

SetURLPart(), URLDecoder()


ReceiveHTTPFile()

Syntaxe

Resultat = ReceiveHTTPFile(URL$, NomFichier$)
Description
Télécharge un fichier sur le disque à partir de l'URL$ spécifiée.

Arguments

URL$ L'URL de téléchargement.
NomFichier$ Le nom du fichier qui sera enregistré sur le disque. Si le nom de fichier ne contient pas de chemin complet, il sera enregistré dans le répertoire courant.
Si le fichier existe, il sera écrasé.

Valeur de retour

Renvoie une valeur non nulle en cas de succès ou zéro si l'URL$ n'existe pas ou qu'une erreur est survenue lors du téléchargement.

Remarques

InitNetwork() doit avoir été appelé avec succès avant de pouvoir utiliser cette commande.

Exemple

  InitNetwork()

  NomDeFichier$ = SaveFileRequester("Enregistrer index.php3 ?", "", "", 0)
  If ReceiveHTTPFile("http://www.purebasic.com/index.php3", NomDeFichier$)
    Debug "Succès"
  Else
    Debug "Echec"
  EndIf

Voir aussi

GetHTTPHeader(), URLEncoder()


SetURLPart()

Syntaxe

Resultat$ = SetURLPart(URL$, Parametre$, Valeur$)
Description
Change une partie de l'URL$ spécifiée.

Arguments

URL$ L'URL à modifier.
Une URL$ peut contenir des paramètres. C'est utile quand un langage de script est utilisé sur le serveur Web (comme PHP). La syntaxe est la suivante: http://www.purebasic.com/index.php3?test=1. Ici le paramètre se nomme "test" et sa valeur associée est "1".

Les informations fournies dans "URL$" doivent (au minimum), être de la forme suivante: ("http://www.purebasic.com")
Parametre$ Le paramètre à modifier. Les paramètres ne sont pas sensibles aux majuscules/minuscules. De surcroît, 'Parametre$' peut être une des constantes suivantes, pour modifier facilement une partie standard de l'URL$:
  #PB_URL_Protocol  : Modifie le protocole de l'URL$
  #PB_URL_Site      : Modifie le site de l'URL$
  #PB_URL_Port      : Modifie le port de l'URL$ (s'il existe)
  #PB_URL_Parameters: Modifie tous les paramètres de l'URL$
  #PB_URL_Path      : Modifie le chemin de l'URL$
  #PB_URL_User      : Modifie le nom d'utilisateur de l'URL$ (s'il existe)
  #PB_URL_Password  : Renvoie le mot de passe de l'URL$ (s'il existe)
Valeur$ La valeur à affecter au paramètre donné, ou une partie d'une URL.

Valeur de retour

Renvoie l'URL modifiée.

Remarques

Cette commande sera très utile pour modifier facilement une URL$ lors de l'écriture d'un CGI.

Exemple

  URL$ = "http://www.test.com/hello.php3"

  URL$ = SetURLPart(URL$, #PB_URL_Site, "ftp")
  URL$ = SetURLPart(URL$, #PB_URL_Site, "www.purebasic.com")
  URL$ = SetURLPart(URL$, #PB_URL_Port, "80")
  URL$ = SetURLPart(URL$, #PB_URL_Path, "english/index.php3")
  URL$ = SetURLPart(URL$, #PB_URL_User, "user")
  URL$ = SetURLPart(URL$, #PB_URL_Password, "pass")
  URL$ = SetURLPart(URL$, "test", "1")
  URL$ = SetURLPart(URL$, "ok", "2")

  Debug URL$ ; Affichera "ftp://user:pass@www.purebasic.com:80/english/index.php3?test=1&ok=2"

Voir aussi

GetURLPart(), URLEncoder()


URLDecoder()

Syntaxe

Resultat$ = URLDecoder(URL$)
Description
Renvoie l'URL$ décodée. L'URL avait été encodée au format HTTP.

Arguments

URL$ L'URL à décoder.

Valeur de retour

Renvoie l'URL décodée.

Remarques

Une URL$ ne peut pas contenir certains caractères (comme la tabulation, l'espace, les lettres accentuées etc.) donc il est nécessaire de les encoder, principalement en utilisant le caractère "%" suivi d'un chiffre. Si l'URL$ n'était pas encodée, cette fonction n'a aucun effet et renverra l'URL$ originale.

Cette commande sera très utile pour découper facilement une URL$ lors de l'écriture d'un CGI.

Pour encoder une URL, utilisez URLEncoder()

Exemple

  Debug URLDecoder("http://www.purebasic.com/test%20with%20space.php3")
  ; Affichera "http://www.purebasic.com/test with space.php3"

Voir aussi

URLEncoder()


URLEncoder()

Syntaxe

Resultat$ = URLEncoder(URL$)
Description
Renvoie l'URL$ encodée au format HTTP.

Arguments

URL$ L'URL à encoder.

Valeur de retour

Renvoie l'URL encodée.

Remarques

Une URL$ ne peut pas contenir certains caractères (comme la tabulation, l'espace, les lettres accentuées etc.) donc il est nécessaire de les encoder, principalement en utilisant le caractère "%" suivi d'un chiffre.

Cette commande sera très utile pour découper facilement une URL$ lors de l'écriture d'un CGI.

Pour décoder une URL: voir URLDecoder()

Exemple

  Debug URLEncoder("http://www.purebasic.com/test with space.php3")
  ; Affichera "http://www.purebasic.com/test%20with%20space.php3"

Voir aussi

URLDecoder()


Image

PureBasic - Image

Généralités

Les images sont des objets graphiques qui peuvent être affichés dans une fenêtre ou dans un gadget. Actuellement, PureBasic accepte les images aux formats BMP, Icône (.ico - seulement sous Windows) et tous les autres formats qui sont supportés via la bibliothèque ImagePlugin.

Le format PNG peut être utilisé pour afficher des images transparentes dans les gadgets, menus et toolbars. Sous Windows, les icônes peuvent aussi remplir ce rôle, mais l'utilisation des image PNG est recommandée, car elles sont supportées sur toutes les plateformes.

Sommaire des commandes

CatchImage
CopyImage
CreateImage
EncodeImage
FreeImage
GrabImage
ImageDepth
ImageFormat
ImageHeight
ImageID
ImageOutput
ImageWidth
IsImage
LoadImage
ResizeImage
SaveImage

Exemple

Image.pb
MDI_ImageViewer.pb

OS Supportés

Tous

Guide de référence - Index


CatchImage()

Syntaxe

Resultat = CatchImage(#Image, *AdresseMemoire [, Taille])
Description
Charge l'image à partir de l'emplacement mémoire spécifié.

Arguments

#Image Le numéro d'identification de l'image.
Si #PB_Any est utilisé pour le paramètre '#Image', le numéro de la nouvelle image sera renvoyé dans 'Resultat'.
*AdresseMemoire | L'adresse mémoire où se trouve l'image à charger.
Taille (optionnel) | La taille de l'image en octets. La taille est facultative car le chargeur (loader) peut déterminer quand arrêter la lecture, à partir de l'image. Il est cependant conseillé de prévoir une taille lors du chargement d'images inconnues, car le chargeur peut ensuite gérer correctement les images corrompues (sans préciser la taille de l'image, une image corrompue peut faire planter le programme).

Valeur de retour

Renvoie une valeur non nulle si l'image a été chargée avec succès et zéro sinon. Si #PB_Any a été spécifié comme paramètre #Image alors le numéro généré automatiquement est renvoyé dans 'Resultat' en cas de succès.

Remarques

La taille maximale de l'image est fonction du système d'exploitation et de la quantité de mémoire disponible. Si la mémoire disponible est suffisante alors une image de 8192x8192 pixels au moins peut être traitée par tous les systèmes d'exploitation pris en charge par PureBasic.

L'image peut être au format BMP, icône (.ico, seulement supporté sous Windows) ou dans un des formats supportés par la bibliothèque ImagePlugin. Sous Windows, si le format de l'image est une icône (.ico), les commandes suivantes ne seront pas disponibles pour la manipuler: SaveImage() et ImageOutput().

Quand une image est chargée, elle est convertie soit en 24-bit (si la profondeur de l'image est inférieure ou égale à 24-bit) soit en 32-bit (si l'image a un canal alpha). Quand une image n'est plus utile, elle peut être détruite avec la commande FreeImage() pour libérer de la mémoire.

Cette commande est utile pour inclure directement des images (logo etc..) directement dans l'exécutable avec la commande 'IncludeBinary'. Néanmoins, n'abusez pas de cette fonctionnalité car une image incluse dans un exécutable consomme automatiquement de la mémoire supplémentaire (car tout l'exécutable, y compris les images, sont chargées en mémoire).

Les commandes suivantes peuvent être utilisées pour activer automatiquement le support des formats d'images suivants:

UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
UseTGAImageDecoder()

Exemple

  CatchImage(0, ?Logo)
  End

  DataSection
    Logo: IncludeBinary "Logo.bmp"
  EndDataSection
Notes: Le "?" est un pointeur vers un label. Vous trouverez plus d'informations au sujet des pointeurs et des accès mémoire ici

Voir aussi

CreateImage(), LoadImage(), FreeImage(), ImagePlugin library


CopyImage()

Syntaxe

Resultat = CopyImage(#Image1, #Image2)
Description
Crée une nouvelle #Image2, copie exacte de l'#Image1.

Arguments

#Image1 Le numéro de l'image à copier.
#Image2 Le numéro de la copie. Si #PB_Any est utilisé pour le paramètre '#Image2', le numéro de la nouvelle image sera renvoyé dans 'Resultat'.

Note: Si l'#Image2 existait déjà, l'ancienne image est automatiquement supprimée.

Valeur de retour

Renvoie une valeur non nulle si l'image a été copiée avec succès et zéro sinon. Si #PB_Any a été spécifié comme paramètre #Image2 alors le numéro généré automatiquement est renvoyé dans 'Resultat' en cas de succès.

Voir aussi

GrabImage(), FreeImage()


CreateImage()

Syntaxe

Resultat = CreateImage(#Image, Largeur, Hauteur [, Profondeur])
Description
Crée une nouvelle image vide (fond noir) qui peut être utilisée par les fonctions 2D comme surface de dessin.

Arguments

#Image Le numéro d'identification de l'image.
Si #PB_Any est utilisé pour le paramètre '#Image', le numéro de la nouvelle image sera renvoyé dans 'Resultat'.
Largeur, Hauteur | Les dimensions de la nouvelle image. À la fois la largeur et la hauteur doivent être supérieures à zéro.
Profondeur (optionnel) | La profondeur de couleur de la nouvelle image. Les valeurs valides sont: 24-bit et 32-bit. La valeur par défaut est 24-bit, si la profondeur n'est pas spécifiée. La valeur de la profondeur est combinable avec #PB_Image_Transparent (en utilisant l'opérateur '|') pour créer une image avec un canal alpha complètement transparent. Cette option n'a d'effet que sur les images 32-bit.

Valeur de retour

Renvoie une valeur non nulle si l'image a été créée avec succès et zéro sinon. Si #PB_Any a été spécifié comme paramètre #Image2 alors le numéro généré automatiquement est renvoyé dans 'Resultat' en cas de succès.

Remarques

La taille maximale de l'image est fonction du système d'exploitation et de la quantité de mémoire disponible. Si la mémoire disponible est suffisante alors une image de 8192x8192 peut être traitée par tous les systèmes d'exploitation pris en charge par PureBasic.

Le format de l'image est celui de l'écran courant: DrawImage() peut servir à afficher cette image dans une fenêtre par exemple.

Avec l'image créée , vous pouvez notamment utiliser les commandes suivantes :
StartDrawing() avec ImageOutput() pour dessiner dans l'image.
CopyImage() pour créer une copie de l'image.
GrabImage() pour créer une autre image en copiant une zone définie dans l'image.
DrawImage() avec ImageID() pour dessiner l'image sur la surface de dessin en cours.
ImageGadget() pour afficher l'image dans une application fenêtrée.
ButtonImageGadget() pour créer un bouton avec image dans une application fenêtrée.

Voir aussi

LoadImage(), CatchImage(), FreeImage()


EncodeImage()

Syntaxe

*Memoire = EncodeImage(#Image [, ImagePlugin [, Options [, Profondeur]]])
Description
Encode une image dans une mémoire tampon.

Arguments

#Image L'image à encoder.
ImagePlugin (optionnel) Le format de l'image à encoder. Il peut être une des valeurs suivantes:
  #PB_ImagePlugin_JPEG     : Encoder l'image en JPEG (UseJPEGImageEncoder() doit être utilisé)
  #PB_ImagePlugin_JPEG2000 : Encoder l'image en JPEG2000 (UseJPEG2000ImageEncoder() doit être utilisé)
  #PB_ImagePlugin_PNG"     : Encoder l'image en PNG (UsePNGImageEncoder() doit être utilisé)
Options (optionnel) Qualité de l'image pour #PB_ImagePlugin_JPEG et #PB_ImagePlugin_JPEG2000:
De 0 = Qualité médiocre à 10 = Qualité maximale.
Qualité par défaut = 7, si aucune option n'est spécifiée.

Quand une image est codée en utilisant une profondeur palettisée (1, 4 ou 8), la constante suivante peut faire partie de la combinaison:
  #PB_Image_FloydSteinberg: Applique un filtre Floyd-Steinberg.
Profondeur (optionnel) La profondeur dans lequel vous souhaitez enregistrer l'image.

Les valeurs valides sont 1, 4, 8, 24 et 32.
La valeur par défaut est la profondeur de l'image originale.
Pour l'instant, seul l'encodeur PNG supporte le format d'image palettisée (1, 4 ou 8-bit).

Valeur de retour

Renvoie un pointeur vers une mémoire tampon nouvellement allouée contenant l'image encodée, ou zéro si l'encodeur a échoué.

MemorySize() peut être utilisé pour obtenir la taille de l'image encodée.
FreeMemory() doit être utilisé pour libérer la mémoire tampon après utilisation.

Voir aussi

LoadImage(), ImagePlugin library


FreeImage()

Syntaxe

FreeImage(#Image)
Description
Supprime l'image spécifiée par #Image et libère la mémoire qui lui était associée.

Arguments

#Image L'image à supprimer.

Si #PB_All est spécifié, toutes les images restantes seront libérées.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Toutes les images restantes sont automatiquement supprimées quand le programme se termine.

Voir aussi

CreateImage(), LoadImage(), CatchImage(), CopyImage(), GrabImage()


GrabImage()

Syntaxe

Resultat = GrabImage(#Image1, #Image2, x, y, Largeur, Hauteur)
Description
Crée une nouvelle #Image2 avec la zone sélectionnée de l'#Image1.

Arguments

#Image1 | L'image source.
#Image2 Le numéro de la nouvelle image. Si #PB_Any est utilisé pour le paramètre '#Image2', le numéro de la nouvelle image sera renvoyé dans 'Resultat'.

Note: Si l'#Image2 existait déjà, l'ancienne image est automatiquement supprimée.
x, y, Largeur, Hauteur | La position et la taille de la zone à copier dans la nouvelle image.

Valeur de retour

Renvoie une valeur non nulle si l'image a été créée avec succès et zéro sinon. Si #PB_Any a été spécifié comme paramètre #Image2 alors le numéro généré automatiquement est renvoyé dans 'Resultat' en cas de succès.

Voir aussi

CreateImage(), LoadImage(), CatchImage(), CopyImage()


ImageDepth()

Syntaxe

Resultat = ImageDepth(#Image [, Options])
Description
Renvoie la profondeur de l'#Image.

Arguments

#Image L'image à utiliser.
Options (optionnel) 'Options' peut prendre une des valeurs suivantes:
  #PB_Image_InternalDepth: Renvoie la profondeur de l'image une fois décodée (défaut). Valeurs valides:
                                    - 24 (24-bit soit 16 millions de couleurs)
                                    - 32 (32-bit soit 16 millions de couleurs + 8-bit de canal alpha)
  #PB_Image_OriginalDepth: Renvoie la profondeur original de l'image avant le décodage. Valeurs valides:
                                    - 1 (1-bit soit 2 couleurs, image monochrome)
                                    - 4 (4-bit soit 16 couleurs)
                                    - 8 (8-bit soit 256 couleurs)
                                    - 16 (16-bit soit 65536 couleurs)
                                    - 24 (24-bit soit 16 millions de couleurs)
                                    - 32 (32-bit soit 16 millions de couleurs + 8-bit de canal alpha)

Valeur de retour

Renvoie l'une des valeurs de profondeur possibles décrites ci-dessus.

Remarques

Quand une image est chargée, elle est convertie soit en 24-bit (si la profondeur de l'image est inférieure ou égale à 24-bit) soit en 32-bit (si l'image a un canal alpha).

Voir aussi

ImageWidth(), ImageHeight()


ImageFormat()

Syntaxe

Resultat = ImageFormat(#Image)
Description
Renvoie le format d'une image.

Arguments

#Image L'image à utiliser.

Valeur de retour

Renvoie le format d'origine de l'image. Il peut être une des valeurs suivantes:
  #PB_ImagePlugin_JPEG
  #PB_ImagePlugin_JPEG2000
  #PB_ImagePlugin_PNG
  #PB_ImagePlugin_TGA
  #PB_ImagePlugin_TIFF
  #PB_ImagePlugin_BMP
  #PB_ImagePlugin_ICON
Si l'image n'a pas été chargée avec l'un de ces formats, la fonction renverra zéro. C'est le cas pour les images créées avec CreateImage() ou GrabImage().

Voir aussi

LoadImage(), CreateImage(), CatchImage(), GrabImage(), ImagePlugin library


ImageHeight()

Syntaxe

Hauteur = ImageHeight(#Image)
Description
Renvoie la hauteur en pixels de l'#Image spécifiée.

Arguments

#Image L'image à utiliser.

Valeur de retour

Renvoie la hauteur de l'image en pixels.

Voir aussi

ImageWidth(), ImageDepth()


ImageID()

Syntaxe

Resultat = ImageID(#Image)
Description
Renvoie l'identifiant système de l'#Image spécifiée.

Arguments

#Image L'image à utiliser.

Valeur de retour

Renvoie le handle de l'image (envoyé par le système d'exploitation).

Voir aussi

DrawImage(),
ImageGadget(),
ButtonImageGadget(),
CanvasGadget()


ImageOutput()

Syntaxe

OutputID = ImageOutput(#Image)
Description
Renvoie l'identifiant 'OutputID' nécessaire pour les opérations de rendu 2D. Voir StartDrawing().

Arguments

#Image L'image qui reçoit le dessin.

Valeur de retour

Renvoie l'identifiant 'OutputID' ou zéro si le dessin n'est pas possible. Cette valeur doit être transmise directement à la fonction StartDrawing() pour commencer l'opération de dessin. La valeur de retour n'est valide que pour une seule opération de dessin et ne peut pas être réutilisées. Chaque StartDrawing() nécessite un nouvel appel à ImageOutput().

Exemple

  StartDrawing(ImageOutput(#Image))
    ; faire des trucs de dessin ici ...
  StopDrawing()

Remarques

Cette fonction ne peut pas être utilisée si l'image est une icône (*.ico).

L'image doit être préalablement initialisée à l'aide de LoadImage(), CatchImage() ou with CreateImage().

Voir aussi

StartDrawing()


ImageWidth()

Syntaxe

Largeur = ImageWidth(#Image)
Description
Renvoie la largeur en pixels de l'#Image spécifiée.

Arguments

#Image L'image à utiliser.

Valeur de retour

Renvoie la largeur de l'image en pixels.

Voir aussi

ImageHeight(), ImageDepth()


IsImage()

Syntaxe

Resultat = IsImage(#Image)
Description
Teste si l'#Image est correctement initialisée.

Arguments

#Image L'image à tester.

Valeur de retour

Renvoie une valeur non nulle si #image est une image valide et zéro sinon.

Remarques

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. Si le 'Résultat' est différent de zéro alors cet objet est valide. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

CreateImage(), LoadImage(), CatchImage(), CopyImage(), GrabImage()


LoadImage()

Syntaxe

Resultat = LoadImage(#Image, FichierImage$ [, Options])
Description
Charge l'image contenue dans FichierImage$.

Arguments

#Image Le numéro d'identification de l'image à charger.
Si #PB_Any est utilisé pour le paramètre '#Image', le numéro de la nouvelle image sera renvoyé dans 'Resultat'.
FichierImage$ | Le nom du fichier à charger. Si le nom de fichier ne contient pas de chemin complet, le chemin est relatif; Voir répertoire courant.
Options (optionnel) | Ce paramètre n'a pour l'instant pas d'utilité. S'il est spécifié, 0 doit être utilisé pour assurer une future compatibilité.

Valeur de retour

Renvoie une valeur non nulle si l'image a été chargée avec succès et zéro sinon. Si #PB_Any a été spécifié comme paramètre #Image2 alors le numéro généré automatiquement est renvoyé dans 'Resultat' en cas de succès.

Remarques

La taille des images est actuellement limitée à 8192x8192 pixels (si la mémoire disponible le permet). Sous Windows, si le format de l'image est une icône (.ico), les commandes suivantes ne seront pas disponibles pour la manipuler: SaveImage() et ImageOutput().

Quand une image est chargée, elle est convertie soit en 24-bit (si la profondeur de l'image est inférieure ou égale à 24-bit) soit en 32-bit (si l'image a un canal alpha).

Une image chargée peut être libérée en utilisant la fonction FreeImage().

Par défaut, le format de l'image sera 24-bit (ou 32-bit si le fichier supporte l'alpha-channel, comme le PNG et le TIFF). L'image peut être au format BMP, icône (.ico, seulement supporté sous Windows) ou dans un des formats supportés par la bibliothèque ImagePlugin.

Les commandes suivantes peuvent être utilisées pour activer automatiquement davantage de formats d'images:

UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
UseTGAImageDecoder()

Avec l'image chargée, vous pouvez notamment utiliser les commandes suivantes :
StartDrawing() avec ImageOutput() pour dessiner dans l'image.
CopyImage() pour créer une copie de l'image.
GrabImage() pour créer une autre image en copiant une zone définie dans l'image.
DrawImage() avec ImageID() pour dessiner l'image sur la surface de dessin en cours.
DrawAlphaImage() avec ImageID() pour dessiner l'image. (avec ses composantes alpha) sur la surface de dessin en cours.
ImageGadget() pour afficher l'image dans une application fenêtrée.
ButtonImageGadget() pour créer un bouton avec image dans une application fenêtrée.

Voir aussi

CreateImage(), CatchImage(), CopyImage(), GrabImage(), ImagePlugin library


ResizeImage()

Syntaxe

Resultat = ResizeImage(#Image, Largeur, Hauteur [, Mode])
Description
Redimensionne l'#Image conformément aux largeur et hauteur spécifiées (en pixels).

Arguments

#Image L'image à redimensionner.
Largeur, Hauteur Les nouvelles dimensions de l'image.
À la fois la largeur et la hauteur doivent être supérieures à zéro.
#PB_Ignore peut être spécifié pour la largeur ou la hauteur, ainsi la valeur ne sera pas modifiée.
Mode (optionnel) Peut prendre une des valeurs suivantes:
  #PB_Image_Smooth: Redimensionne l'image avec interpolation (mode par défaut).
  #PB_Image_Raw   : Redimensionne l'image sans interpolation (peut donner des résultats peu satisfaisants).

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Remarques

Cette fonction modifie le handle de l'image utilisée. Par conséquent, il doit être ré-affecté par exemple à un ImageGadget() avec SetGadgetState().

Cette fonction ne fonctionne pas avec des icônes (.ico).

La limite de la taille de l'image qui peut être traitée est fonction du système d'exploitation et de la quantité de mémoire disponible. Si la mémoire disponible est suffisante alors une image de 8192x8192 peut être traitée par tous les systèmes d'exploitation pris en charge par PureBasic.

Voir aussi

ImageWidth(), ImageHeight()


SaveImage()

Syntaxe

Resultat = SaveImage(#Image, NomFichier$ [, ImagePlugin [, Options [, Profondeur]]])
Description
Enregistre l'#Image sur le disque.

Arguments

#Image | L'image à enregistrer.
NomFichier$ | Le nom du fichier. Si le nom de fichier ne contient pas de chemin complet alors le chemin est relatif. Voir répertoire courant.
ImagePlugin (optionnel) Le format de l'image enregistrée:
  #PB_ImagePlugin_BMP  : Enregistre l'image en BMP (défaut).
  #PB_ImagePlugin_JPEG : Enregistre l'image en JPEG (UseJPEGImageEncoder() doit être utilisé)
  #PB_ImagePlugin_JPEG2000 : Enregistre l'image en JPEG2000 (UseJPEG2000ImageEncoder() doit être utilisé)
  #PB_ImagePlugin_PNG  : Enregistre l'image en PNG  (UsePNGImageEncoder() doit être utilisé)
Options (optionnel) Le paramètre facultatif 'Options' n'est utilisé qu'avec les plugin JPEG et JPEG 2000. Il est possible de régler la qualité d'une image à l'aide d'une valeur allant de 0 (plus mauvaise qualité) à 10 (qualité maximale), la qualité par défaut étant fixée à 7 si aucune option n'est spécifiée avec l'encodeur JPEG ou JPEG 2000.

Quand une image est enregistrée en utilisant une palette (1, 4 ou 8), l'option suivante est disponible:
   #PB_Image_FloydSteinberg: Appliquer un tramage Floyd-Steinberg.
Profondeur (optionnel) | La 'Profondeur' de l'image lors de son enregistrement. Les valeurs valides sont 1, 4, 8, 24 et 32. La valeur par défaut est la profondeur originale de l'image. Pour l'instant, seuls les encodeurs BMP et PNG supportent le mode palettisé (1, 4 ou 8-bit).

Valeur de retour

Renvoie une valeur non nulle si l'opération a réussi et zéro si elle a échoué.

Voir aussi

ImageDepth(), ImagePlugin library


ImagePlugin

PureBasic - ImagePlugin

Généralités

PureBasic supporte différents formats d'images grâce à un système de plugins dynamiques. Seul l'encodeur ou le décodeur nécessaire sera intégré au fichier exécutable, réduisant ainsi considérablement sa taille.

Par exemple, si vous avez seulement besoin du format JPEG, seule la routine concernant ce format sera utilisée.

Une autre caractéristique intéressante est l'auto-détection du format de fichier, si plusieurs décodeurs sont utilisés.

Les commandes suivantes supportent les plugins d'images: LoadImage(), CatchImage(), SaveImage(), LoadSprite() CatchSprite(), et SaveSprite().

Sommaire des commandes

UseJPEG2000ImageDecoder
UseJPEG2000ImageEncoder
UseJPEGImageDecoder
UseJPEGImageEncoder
UsePNGImageDecoder
UsePNGImageEncoder
UseTGAImageDecoder
UseTIFFImageDecoder

Exemple

ImagePlugin.pb
MDI_ImageViewer.pb

OS Supportés

Tous

Guide de référence - Index


UseJPEG2000ImageDecoder()

Syntaxe

UseJPEG2000ImageDecoder()
Description
Active le support du format JPEG 2000 pour les commandes CatchImage(), LoadImage(), CatchSprite() et LoadSprite().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le format de compression JPEG 2000 est dit 'destructif', ce qui veut dire que de l'information (plus ou moins essentielle) est perdue lors du processus de compression, permettant par la même occasion de diminuer considérablement la taille du fichier. C'est actuellement l'un des meilleurs formats de compression de sa catégorie, utilisé principalement sur internet et dans le monde de la photographie.

Voir aussi

UseJPEG2000ImageEncoder(),
LoadImage(), CatchImage(),
LoadSprite(), CatchSprite()


UseJPEG2000ImageEncoder()

Syntaxe

UseJPEG2000ImageEncoder()
Description
Active le support du format JPEG 2000 pour les commandes SaveImage() and SaveSprite().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le format de compression JPEG 2000 est dit 'destructif', ce qui veut dire que de l'information (plus ou moins essentielle) est perdue lors du processus de compression, permettant par la même occasion de diminuer considérablement la taille du fichier. C'est actuellement l'un des meilleurs formats de compression de sa catégorie, utilisé principalement sur internet et dans le monde de la photographie. Cet encodeur supporte les images 32-bit avec canal aplha.

Voir aussi

UseJPEG2000ImageDecoder(), SaveImage(), SaveSprite()


UseJPEGImageDecoder()

Syntaxe

UseJPEGImageDecoder()
Description
Active le support du format JPEG (Join Picture Expert Group) pour les commandes CatchImage(), LoadImage(), CatchSprite() et LoadSprite().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Toutes les variantes du JPEG sont supportées, y compris la forme progressive. Le format de compression JPEG est dit 'destructif', ce qui veut dire que de l'information (plus ou moins essentielle) est perdue lors du processus de compression, permettant par la même occasion de diminuer considérablement la taille du fichier. C'est actuellement l'un des meilleurs formats de compression de sa catégorie, utilisé principalement sur internet et dans le monde de la photographie.

Voir aussi

UseJPEGImageEncoder(),
LoadImage(), CatchImage(),
LoadSprite(), CatchSprite()


UseJPEGImageEncoder()

Syntaxe

UseJPEGImageEncoder()
Description
Active le support du format JPEG (Join Picture Expert Group) pour les commandes SaveImage() and SaveSprite().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le format de compression JPEG est dit 'destructif', ce qui veut dire que de l'information (plus ou moins essentielle) est perdue lors du processus de compression, permettant par la même occasion de diminuer considérablement la taille du fichier. C'est actuellement l'un des meilleurs formats de compression de sa catégorie, utilisé principalement sur internet et dans le monde de la photographie.

Voir aussi

UseJPEGImageDecoder(), SaveImage(), SaveSprite()


UsePNGImageDecoder()

Syntaxe

UsePNGImageDecoder()
Description
Active le support du format PNG (Portable Network Graphic) pour les commandes CatchImage(), LoadImage(), CatchSprite() et LoadSprite().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Toutes les variantes du PNG sont supportés, y compris la forme progressive. Le format PNG utilise un algorithme de compression non-destructif, ce qui veut dire que l'intégralité de l'information est conservée. C'est actuellement le meilleur format pour stocker des images sans perte d'information.

Voir aussi

UsePNGImageEncoder(),
LoadImage(), CatchImage(),
LoadSprite(), CatchSprite()


UsePNGImageEncoder()

Syntaxe

UsePNGImageEncoder()
Description
Active le support du format PNG (Portable Network Graphic) pour les commandes SaveImage() and SaveSprite().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le format PNG utilise un algorithme de compression non-destructif, ce qui veut dire que l'intégralité de l'information est conservée. C'est actuellement le meilleur format pour stocker des images sans perte d'information. Cet encodeur supporte les images 32-bit avec canal aplha.

Voir aussi

UsePNGImageDecoder(), SaveImage(), SaveSprite()


UseTGAImageDecoder()

Syntaxe

UseTGAImageDecoder()
Description
Active le support du format TGA (Targa) pour les commandes CatchImage(), LoadImage(), CatchSprite() et LoadSprite().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le format TGA utilise un algorithme de compression non-destructif, ce qui veut dire que l'intégralité de l'information est conservée. La taille des images TGA est souvent très élévée car l'algorithme de compression (quand il est utilisé) est peu performant (RLE). Ce format est principalement utilisé dans le monde de la 3D car c'était l'un des premiers formats à intégrer une couche alpha directement dans l'image. Si une couche alpha (alphachannel) est présente dans l'image, elle ne sera pas prise en compte.

Voir aussi

LoadImage(), CatchImage(), LoadSprite(), CatchSprite()


UseTIFFImageDecoder()

Syntaxe

UseTIFFImageDecoder()
Description
Active le support du format TIFF pour les commandes CatchImage(), LoadImage(), CatchSprite() et LoadSprite().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le format TIFF est très complexe et peut regrouper différents sous-algorithmes de compressions tels que le JPEG, LZW, etc... Toutes les variantes du TIFF sont supportées, rendant l'éxécutable relativement imposant.

Voir aussi

LoadImage(), CatchImage(), LoadSprite(), CatchSprite()


Joint

PureBasic - Joint

Généralités

Les articulations, comme les charnières, les glissières... sont utilisées pour définir un lien entre deux entités.

Ce lien permet d'obtenir un comportement automatique lorsque l'une des entités est mises en mouvement.

Elles peuvent être utilisées pour simuler une interaction de façon réaliste entre deux objets, comme par exemple: Une porte qui tourne sur ses gonds, un train qui glisse sur ses rails et ainsi de suite.

InitEngine3D() doit être appelé avec succès avant d'utiliser les fonctions communes.

Sommaire des commandes

ConeTwistJoint
EnableHingeJointAngularMotor
FreeJoint
GetJointAttribute
HingeJoint
HingeJointMotorTarget
PointJoint
SetJointAttribute
SliderJoint

Exemple

Joint.pb
ConeJoint.pb
HingeJoint.pb
PointJoint.pb
SliderJoint.pb

OS Supportés

Tous

Guide de référence - Index


ConeTwistJoint()

Syntaxe

Resultat = ConeTwistJoint(#Joint, EntityID, TransformationX, TransformationY, TransformationZ, EntityID2, TransformationX2, TransformationY2, TransformationZ2)
Description
Crée une nouvelle articulation de type cône de torsion entre les deux entités données.

Un cône de torsion peut être utilisé pour attacher les bras ou les jambes au corps, etc.

Arguments

#Joint Le numéro d'identification de la nouvelle articulation.

PB_Any # peut être utilisé pour générer automatiquement ce numéro.

EntityID La première entité associée à l'articulation.

Pour obtenir un identifiant valide, utilisez EntityID().

TransformX, TransformY, TransformZ La valeur de la transformation de la première entité.

EntityID2 La deuxième entité associée à l'articulation.

Pour obtenir un identifiant valide, utilisez EntityID().

TransformX2, TransformY2, TransformZ2 La valeur de la transformation de la seconde entité.

Valeur de retour

Renvoie zéro si l'articulation ne peut être créée.

Si #PB_Any est utilisé à la place de '#Joint', le nouveau numéro sera renvoyé dans 'Resultat'.

Remarques

GetJointAttribute() et SetJointAttribute() peuvent être utilisés avec les attributs suivants pour modifier le comportement de l'articulation:
  #PB_ConeTwistJoint_SwingSpan : Première amplitude de balancement de l'articulation.
  #PB_ConeTwistJoint_SwingSpan2: Seconde amplitude de balancement de l'articulation.
  #PB_ConeTwistJoint_TwistSpan : Amplitude de torsion de l'articulation.

Voir aussi

FreeJoint(), GetJointAttribute(), SetJointAttribute()


EnableHingeJointAngularMotor()

Syntaxe

EnableHingeJointAngularMotor(#Joint, Activer, Vitesse, ImpulsionMax)
Description
Active le moteur angulaire d'une charnière.

Arguments

#Joint | La charnière à utiliser.
Activer Active ou désactive le moteur angulaire de la charnière.
  #True : Le moteur est activé,
  #False: Le moteur est désactivé.
Vitesse | La vitesse que le moteur doit produire.
ImpulsionMax | L'impulsion maximale que le moteur doit produire.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

HingeJoint()


FreeJoint()

Syntaxe

FreeJoint(#Joint)
Description
Libère une articulation et toute la mémoire associée.

Arguments

#Joint L'articulation à libérer.

Si #PB_All est spécifié, toutes les articulation restantes seront libérées.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

L'articulation ne doit pas être utilisée après l'appel de cette fonction (ex: en utilisant son numéro avec les autres fonctions de cette bibliothèque).

Toutes les articulation restantes sont automatiquement libérées lorsque le programme se termine.

Voir aussi

PointJoint(), HingeJoint(), ConeTwistJoint(), SliderJoint()


GetJointAttribute()

Syntaxe

Resultat = GetJointAttribute(#Joint, Attribut)
Description
Obtenir la valeur d'un attribut d'une articulation.

Arguments

#Joint | L'articulation à utiliser.
Attribut | L'attribut à obtenir.

Valeur de retour

Renvoie la valeur de l'attribut spécifié ou zéro si l'articulation ne prend pas en charge l'attribut.

Remarques

Cette fonction est disponible pour toutes les articulations qui supportent les attributs.

Voir les commandes individuelles pour les attributs communs:

- PointJoint()
- ConeTwistJoint()
- HingeJoint()
- SliderJoint()

Voir aussi

SetJointAttribute()


HingeJoint()

Syntaxe

Resultat = HingeJoint(#Joint, EntityID, PivotX, PivotY, PivotZ, AxeX, AxeY, AxeZ, EntityID2, PivotX2, PivotY2, PivotZ2, AxeX2, AxeY2, AxeZ2)
Description
Crée une nouvelle charnière entre deux entités.

Une charnière peut être utilisée pour simuler une porte, le mouvement d'un pont, etc.

Arguments

#Joint Le numéro d'identification de la nouvelle articulation.

PB_Any # peut être utilisé pour générer automatiquement ce numéro.

EntityID La première entité associée à l'articulation.

Pour obtenir un identifiant valide, utilisez EntityID().

PivotX, PivotY, PivotZ La coordonnée du point de pivot de l'articulation, par rapport au centre de l'entité.

AxeX, AxeY, AxeZ L'orientation de l'axe de la charnière.

EntityID2 La deuxième entité associée à l'articulation.

Pour obtenir un identifiant valide, utilisez EntityID().

PivotX2, PivotY2, PivotZ2 La coordonnée du second point de pivotement de l'articulation, par rapport au centre de la seconde entité.

AxeX2, AxeY2, AxeZ2 L'orientation de l'axe de la charnière.

Valeur de retour

Renvoie zéro si l'articulation ne peut être créée.

Si #PB_Any est utilisé à la place de '#Joint', le nouveau numéro sera renvoyé dans 'Resultat'.

Remarques

GetJointAttribute() et SetJointAttribute() peuvent être utilisés avec les attributs suivants pour modifier le comportement de l'articulation:
  #PB_HingeJoint_LowerLimit : Limite inférieure de l'articulation
  #PB_HingeJoint_UpperLimit : Limite supérieure de l'articulation

Voir aussi

FreeJoint(), GetJointAttribute(), SetJointAttribute(), EnableHingeJointAngularMotor()


HingeJointMotorTarget()

Syntaxe

HingeJointMotorTarget(#Joint, Angle, Vitesse)
Description
Définit le moteur d'une charnière.

Arguments

#Joint | La charnière à utiliser.
Angle | L'angle (en degrés) que le moteur doit atteindre.
Vitesse | La vitesse que le moteur doit produire.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

HingeJoint()


PointJoint()

Syntaxe

Resultat = PointJoint(#Joint, EntityID, PivotX, PivotY, PivotZ [, EntityID2, PivotX2, PivotY2, PivotZ2])
Description
Crée une nouvelle articulation basée sur un ou deux points.

Arguments

#Joint Le numéro d'identification de la nouvelle articulation.

PB_Any # peut être utilisé pour générer automatiquement ce numéro.

EntityID Le numéro d'identification de l'entité associée à l'articulation.

Pour obtenir un identifiant valide, utilisez EntityID().

PivotX, PivotY, PivotZ La coordonnée du point de pivot de l'articulation, par rapport au centre de l'entité.

EntityID2 (optionnel) La deuxième entité associée à l'articulation.

Si ce paramètre n'est pas spécifié, une seule articulation est créée entre le point de pivotement et l'entité.

Si ce paramètre est spécifié, la première entité est fixée à la seconde entité.

Pour obtenir un identifiant valide, utilisez EntityID().

PivotX2, PivotY2, PivotZ2 (optionnel) La coordonnée du second point de pivotement de l'articulation, par rapport au centre de la seconde entité.

Valeur de retour

Renvoie zéro si l'articulation ne peut être créée.

Si #PB_Any est utilisé à la place de '#Joint', le nouveau numéro sera renvoyé dans 'Resultat'.

Remarques

GetJointAttribute() et SetJointAttribute() peuvent être utilisés avec les attributs suivants pour modifier le comportement de l'articulation:
  #PB_PointJoint_Tau    : Valeur Tau de l'articulation
  #PB_PointJoint_Damping: Valeur d'amortissement de l'articulation

Voir aussi

FreeJoint(), GetJointAttribute(), SetJointAttribute()


SetJointAttribute()

Syntaxe

SetJointAttribute(#Joint, Attribut, Valeur)
Description
Régle la valeur de l'attribut d'une articulation.

Arguments

#Joint | L'articulation à utiliser.
Attribut | L'attribut à définir.
Valeur | Valeur de l'attribut à définir.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette fonction est disponible pour toutes les articulations qui supportent les attributs.

Voir les commandes individuelles pour les attributs communs:

- PointJoint()
- ConeTwistJoint()
- HingeJoint()
- SliderJoint()

Voir aussi

GetJointAttribute()


SliderJoint()

Syntaxe

Resultat = SliderJoint(#Joint, EntityID, TransformationX, TransformationY, TransformationZ, EntityID2, TransformationX2, TransformationY2, TransformationZ2)
Description
Crée une nouvelle articulation de type glissière ou curseur entre les deux entités données.

La glissière peut être utilisée pour déplacer une entité avec contrainte sur une surface plane, etc.

Arguments

#Joint Le numéro d'identification de la nouvelle articulation.

PB_Any # peut être utilisé pour générer automatiquement ce numéro.

EntityID La première entité associée à l'articulation.

Pour obtenir un identifiant valide, utilisez EntityID().

TransformX, TransformY, TransformZ La valeur de la transformation de la première entité.

EntityID2 La deuxième entité associée à l'articulation.

Pour obtenir un identifiant valide, utilisez EntityID().

TransformX2, TransformY2, TransformZ2 La valeur de la transformation de la seconde entité.

Valeur de retour

Renvoie zéro si l'articulation ne peut être créée.

Si #PB_Any est utilisé à la place de '#Joint', le nouveau numéro sera renvoyé dans 'Resultat'.

Remarques

GetJointAttribute() et SetJointAttribute() peuvent être utilisés avec les attributs suivants pour modifier le comportement de l'articulation:
  #PB_SliderJoint_LowerLimit : Limite inférieure de l'articulation.
  #PB_SliderJoint_UpperLimit : Limite supérieure de l'articulation.

Voir aussi

FreeJoint(), GetJointAttribute(), SetJointAttribute()


Joystick

PureBasic - Joystick

Généralités

PureBasic permet la gestion complète des joysticks connectés à l'ordinateur.
Tous les joysticks standards, jusqu'à 8 boutons, sont acceptés. Sur Windows l'interface est assurée par la technologie DirectX.

Sommaire des commandes

ExamineJoystick
InitJoystick
JoystickAxisX
JoystickAxisY
JoystickButton

Exemple

Joystick.pb

OS Supportés

Tous

Guide de référence - Index


ExamineJoystick()

Syntaxe

Resultat = ExamineJoystick(#Joystick)
Description
Met à jour l'état actuel d'un joystick qui pourra être interrogé grâce aux commandes JoystickAxisX(), JoystickAxisY() et JoystickButton().

Arguments

#Joystick Le numéro du joystick.

Le premier numéro de joystick commence à 0.

Valeur de retour

Renvoie une valeur non nulle si le joystick est prêt.

Remarques

Le nombre de joysticks disponibles est renvoyé par par la fonction InitJoystick().

Voir aussi

InitJoystick()


InitJoystick()

Syntaxe

Resultat = InitJoystick()
Description
Initialise l'environnement propre à la gestion des joysticks.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le nombre de joysticks disponibles.

Remarques

Vous devez appeler cette fonction avant toute autre fonction de cette bibliothèque.

Cette fonction tente d'ouvrir DirectX (Version 3.0 pour NT4.0, sinon Version 7.0). Si la fonction échoue (Resultat = 0), cela peut donc provenir de l'absence de DirectX sur votre ordinateur ou d'une version de DirectX trop ancienne.

Voir aussi

ExamineJoystick()


JoystickAxisX()

Syntaxe

Resultat = JoystickAxisX(#Joystick)
Description
Renvoie l'état de l'axe X d'un joystick.

Arguments

#Joystick Le numéro du joystick.

Le numéro du premier joystick commence à 0.

Valeur de retour

Renvoie l'une des valeurs suivantes:
  -1: Mouvement vers la gauche
   0: Aucun mouvement sur l'axe X
   1: Mouvement vers la droite

Remarques

La fonction ExamineJoystick() doit être appelée avant cette fonction pour mettre à jour l'état du joystick.

Le nombre de joysticks disponibles est renvoyé par InitJoystick().

Voir aussi

JoystickAxisY(), InitJoystick()


JoystickAxisY()

Syntaxe

Resultat = JoystickAxisY(#Joystick)
Description
Renvoie l'état de l'axe X d'un joystick.

Arguments

#Joystick Le numéro du joystick.

Le numéro du premier joystick commence à 0.

Valeur de retour

Renvoie l'une des valeurs suivantes:
  -1: Mouvement vers le haut
   0: Aucun mouvement sur l'axe Y
   1: Mouvement vers le bas

Remarques

La fonction ExamineJoystick() doit être appelée avant cette fonction pour mettre à jour l'état du joystick.

Le nombre de joysticks disponibles est renvoyé par InitJoystick().

Voir aussi

JoystickAxisX(), InitJoystick()


JoystickButton()

Syntaxe

Resultat = JoystickButton(#Joystick, NumeroBouton)
Description
Renvoie l'état d'un bouton d'un joystick.

Arguments

#Joystick Le numéro du joystick.

Le numéro du premier joystick commence à 0.
NumeroBouton Le bouton à tester.

Valeur de retour

Renvoie zéro si le bouton 'NumeroBouton' n'est pas pressé, sinon renvoie une valeur non nulle.

L'index du premier bouton est 1.

Remarques

La fonction ExamineJoystick() doit être appelée avant cette fonction pour mettre à jour l'état des boutons.

Un nombre quelconque de boutons peuvent être pressés simultanément.

Voir aussi

JoystickAxisX(), JoystickAxisY(), InitJoystick()


Keyboard

PureBasic - Keyboard

Généralités

PureBasic propose un accès simple et rapide au clavier qui ne doit être utilisé que pour des jeux ou applications qui nécessitent une gestion directe, exlusive et très rapide de celui-ci.

Pour les applications normales, il convient d'utiliser AddKeyboardShortcut(). L'interface est assurée par la technologie DirectX.

Sommaire des commandes

ExamineKeyboard
InitKeyboard
KeyboardInkey
KeyboardMode
KeyboardPushed
KeyboardReleased

Exemple

Keyboard.pb

OS Supportés

Tous

Guide de référence - Index


ExamineKeyboard()

Syntaxe

ExamineKeyboard()
Description
Met à jour l'état du clavier.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette fonction doit être appelée avant d'utiliser les commandes KeyboardInkey(), KeyboardPushed() et KeyboardReleased().

Voir aussi

InitKeyboard(), KeyboardMode()


InitKeyboard()

Syntaxe

Resultat = InitKeyboard()
Description
Initialise l'environnement propre à la gestion du clavier.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Si 'Resultat' = 0, l'initialisation a échoué.

Remarques

Vous devez appeler cette fonction avant tout appel de fonctions de cette bibliothèque.

Cette fonction tente d'ouvrir DirectX (Version 3.0 pour NT4.0, sinon Version 7.0). Si la fonction échoue (Resultat = 0), cela peut donc provenir de l'absence de DirectX sur votre ordinateur ou d'une version de DirectX trop ancienne.

Voir aussi

ExamineKeyboard(), KeyboardMode()


KeyboardInkey()

Syntaxe

Caractère$ = KeyboardInkey()
Description
Renvoie le dernier caractère tapé sur le clavier.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le dernier 'Caractère$' tapé sur le clavier, très utile pour interagir facilement avec l'utilisateur (nom dans les highscores, console dans le jeu, etc.).

Exemple

  If InitSprite() And InitKeyboard() And OpenScreen(800,600,32,"")
    Repeat
      FlipBuffers()
      ClearScreen(RGB(0, 0, 0))

      ExamineKeyboard()

      ; Efface le dernier caractère si la touche 'Back' est appuyée
      ;
      If KeyboardReleased(#PB_Key_Back)
        FullText$ = Left(FullText$, Len(FullText$)-1)
      Else
        resultat$=KeyboardInkey()
        If FindString("1234567890 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzéèçàù", resultat$) ; Ajouter vos propres caractères valides ici
          FullText$ + resultat$
        EndIf ; Ajouter le nouveau texte à l'actuel (le cas échéant)
      EndIf

      ; Affiche le résultat
      ;
      If StartDrawing(ScreenOutput())
        DrawingMode(1)
        FrontColor(RGB(128, 255, 0))
        DrawText(20, 20, "Ecrivez un petit texte...:")
        DrawText(20, 40, FullText$)
        StopDrawing()
      EndIf
    Until KeyboardPushed(#PB_Key_Escape)
  EndIf

Voir aussi

KeyboardPushed(), KeyboardReleased()


KeyboardMode()

Syntaxe

KeyboardMode(Mode)
Description
Modifie le comportement du clavier.

Arguments

Mode Peut être une combinaison de:
  #PB_Keyboard_Qwerty         : Le clavier ignore l'agencement des touches propres au langage de l'utilisateur et utilise toujours l'agencement QWERTY (mode par défault).
  #PB_Keyboard_International  : Le clavier utilise l'agencement des touches propres au langage de l'utilisateur (utile pour les claviers non QWERTY).
  #PB_Keyboard_AllowSystemKeys: Les touches systèmes de l'OS ne sont pas bloquées (comme Win+R etc.). Cette option peut être gênante en mode plein écran
                                si l'utilisateur presse l'une de ces touches accidentellement.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette commande affecte le résultat de KeyboardPushed() et KeyboardReleased().

Voir aussi

ExamineKeyboard(), InitKeyboard()

OS Supportés

Windows


KeyboardPushed()

Syntaxe

Resultat = KeyboardPushed(IdentifiantTouche)
Description
Teste l'état enfoncé ou non d'une touche du clavier.

Arguments

IdentifiantTouche L'identifiant pureBasic de la touche à tester.

Valeur de retour

Renvoie 0 si la touche spécifiée n'est pas pressée, sinon, renvoie une valeur non nulle.

Remarques

- Un nombre quelconque de touches peut être pressé simultanément.

- Si vous voulez tester si une touche spécifique a été appuyée puis relâchée, utilisez la commande KeyboardReleased().

- La fonction ExamineKeyboard() doit être appelée avant pour mettre à jour l'état du clavier.

- Le comportement du clavier peut être changé avec la commande KeyboardMode().

Exemple

  If InitSprite() And InitKeyboard() And OpenScreen(800,600,16,"")
    Repeat
      FlipBuffers()

      If StartDrawing(ScreenOutput())
        DrawText(0, 0, "Appuyez sur la touche [Echap] pour quitter")
        StopDrawing()
      EndIf

      ExamineKeyboard()
      If KeyboardPushed(#PB_Key_Escape)   ; Appuyez sur la touche [Echap] pour quitter
        End
      EndIf
    ForEver
  EndIf
Valeurs possibles pour 'IdentifiantTouche':
    #PB_Key_All   ; Toutes les touches sont testées.

    #PB_Key_1
    #PB_Key_2
    #PB_Key_3
    #PB_Key_4
    #PB_Key_5
    #PB_Key_6
    #PB_Key_7
    #PB_Key_8
    #PB_Key_9
    #PB_Key_0

    #PB_Key_A
    #PB_Key_B
    #PB_Key_C
    #PB_Key_D
    #PB_Key_E
    #PB_Key_F
    #PB_Key_G
    #PB_Key_H
    #PB_Key_I
    #PB_Key_J
    #PB_Key_K
    #PB_Key_L
    #PB_Key_M
    #PB_Key_N
    #PB_Key_O
    #PB_Key_P
    #PB_Key_Q
    #PB_Key_R
    #PB_Key_S
    #PB_Key_T
    #PB_Key_U
    #PB_Key_V
    #PB_Key_W
    #PB_Key_X
    #PB_Key_Y
    #PB_Key_Z

    #PB_Key_Escape
    #PB_Key_Minus
    #PB_Key_Equals
    #PB_Key_Back
    #PB_Key_Tab
    #PB_Key_LeftBracket
    #PB_Key_RightBracket
    #PB_Key_Return
    #PB_Key_LeftControl
    #PB_Key_SemiColon
    #PB_Key_Apostrophe
    #PB_Key_Grave
    #PB_Key_LeftShift
    #PB_Key_BackSlash
    #PB_Key_Comma
    #PB_Key_Period
    #PB_Key_Slash
    #PB_Key_RightShift
    #PB_Key_Multiply
    #PB_Key_LeftAlt
    #PB_Key_Space
    #PB_Key_Capital
    #PB_Key_F1
    #PB_Key_F2
    #PB_Key_F3
    #PB_Key_F4
    #PB_Key_F5
    #PB_Key_F6
    #PB_Key_F7
    #PB_Key_F8
    #PB_Key_F9
    #PB_Key_F10
    #PB_Key_F11
    #PB_Key_F12
    #PB_Key_NumLock
    #PB_Key_Scroll
    #PB_Key_Pad0
    #PB_Key_Pad1
    #PB_Key_Pad2
    #PB_Key_Pad3
    #PB_Key_Pad4
    #PB_Key_Pad5
    #PB_Key_Pad6
    #PB_Key_Pad7
    #PB_Key_Pad8
    #PB_Key_Pad9
    #PB_Key_Add
    #PB_Key_Subtract
    #PB_Key_Decimal
    #PB_Key_PadEnter
    #PB_Key_RightControl
    #PB_Key_PadComma
    #PB_Key_Divide
    #PB_Key_RightAlt
    #PB_Key_Pause
    #PB_Key_Home
    #PB_Key_Up
    #PB_Key_Down
    #PB_Key_Left
    #PB_Key_Right
    #PB_Key_End
    #PB_Key_PageUp
    #PB_Key_PageDown
    #PB_Key_Insert
    #PB_Key_Delete

Voir aussi

KeyboardInkey(), KeyboardReleased()


KeyboardReleased()

Syntaxe

Resultat = KeyboardReleased()
Description
Teste l'état relaché ou non d'une touche du clavier.

Arguments

IdentifiantTouche L'identifiant pureBasic de la touche à tester.

Valeur de retour

Renvoie 1 si la touche spécifiée par 'IdentifiantTouche' a été appuyée puis relâchée, sinon, renvoie 0.

Remarques

L'utilisation typique de cette commande est la touche 'Pause' (P) dans un jeu qui arrête puis reprend le jeu.

La fonction ExamineKeyboard() doit être appelée avant pour mettre à jour l'état du clavier.

Pour la liste complète des valeurs possibles pour 'IdentifiantTouche', voir KeyboardPushed().

Exemple

  If InitSprite() And InitKeyboard() And OpenScreen(800,600,16,"")
    Paused = #False
    Repeat
      FlipBuffers()

      If StartDrawing(ScreenOutput())

        ExamineKeyboard()
        If KeyboardReleased(#PB_Key_P)
          If Paused = #False
            Paused = #True
          Else
            Paused = #False
          EndIf
        EndIf

        DrawingMode(0)

        If Paused = #False
          DrawText(20, 20, "Le programme tourne...        ")
        Else
          DrawText(20, 20, "Le programme est à l'arrêt...")
        EndIf

        StopDrawing()
      EndIf
    Until KeyboardPushed(#PB_Key_Escape)
  EndIf

Voir aussi

KeyboardInkey(), KeyboardPushed()


Library

PureBasic - Library

Généralités

Les bibliothèques sont des composants partagés du système d'exploitation contenant des fonctions spécifiques à l'intention des programmeurs. Par exemple, une bibliothèque peut contenir des commandes pour traiter et manipuler facilement des images. Chaque système d'exploitation a ses propres bibliothèques partagées pour faciliter la vie du programmeur. Avec PureBasic, il est possible d'utiliser ces bibliothèques tierces facilement et dynamiquement !

La raison pour laquelle les bibliothèques sont si importantes, c'est qu'elles évitent au programmeur d'avoir à reprogrammer sans cesse les mêmes routines. Elle sont conçues pour pouvoir être utilisées par n'importe quel programme, en utilisant un minimum de mémoire (si par exemple 10 programmes utilisent la même bibliothèque, elle ne sera chargée qu'une seule fois en mémoire).

Un autre avantage est la possibilité de faire évoluer un programme sans changer son exécutable (en mettant à jour uniquement la bibliothèque).

Sous Windows, ces bibliothèques sont bien connues sous le nom de 'DLL' (Dynamically Linked Library).

Sommaire des commandes

CallCFunction
CallCFunctionFast
CallFunction
CallFunctionFast
CloseLibrary
CountLibraryFunctions
ExamineLibraryFunctions
GetFunction
GetFunctionEntry
IsLibrary
LibraryFunctionAddress
LibraryFunctionName
LibraryID
NextLibraryFunction
OpenLibrary

Exemple

Library.pb

OS Supportés

Tous

Guide de référence - Index


CallCFunction()

Syntaxe

Resultat = CallCFunction(#Bibliotheque, FunctionName$ [,Parameter1 [, Parameter2...]])
Description
Appelle une fonction d'une bibliothèque à la manière du language C pour les paramètres.

Arguments

#Bibliotheque | La bibliothèque à utiliser.
NomFonction$ | Le nom de la fonction à appeler (sensible à la casse).
Parameter1, Parameter2... (optionnel) Les paramètres de la fonction.

Le nombre de paramètres doivent correspondre aux paramètres de la fonction appelée.

Le nombre maximum de paramètres pris en charge est de 20.

Valeur de retour

Renvoie la valeur de retour de la fonction appelée ou zéro si la bibliothèque ne contient pas la fonction demandée.

Remarques

Attention, cette fonction n'est utile que si la commande appelée a été déclaré avec la convention 'CDECL' ce qui n'est pas le standard sous Windows. La plupart des DLL sous Windows nécessite l'utilisation de CallFunction(). Par contre sous linux, toutes les fonctions des bibliothèques partagées sont en 'CDECL'.

Pour appeler une fonction qui utilise la convention d'appel stdcall, utilisez la fonction CallFunction().

Cette fonction n'est pas très flexible car elle n'accepte pas les paramètres de type double ou quad, et ne peut pas renvoyer des valeurs de type double, quad ou float. Il est vivement conseillé d'utiliser les prototypes à la place de cette fonction.

Voir aussi

CallFunction(), GetFunction(), prototypes


CallCFunctionFast()

Syntaxe

Resultat = CallCFunctionFast(*PointeurFonction [,Parametre1 [, Parametre2...]])
Description
Appelle une fonction directement, en utilisant son adresse.
La fonction doit utiliser l'appel cdecl (la convention utilisée par le langage C).

Arguments

*PointeurFonction L'adresse de la fonction à appeler.

Son pointeur est obtenu par GetFunction() , GetFunctionEntry() ou par LibraryFunctionAddress().
L'utilisation de cette fonction est la méthode la plus rapide pour appeler des fonctions d'une bibliothèque, en particulier lorsque les résultats ont été obtenus avec GetFunction() ou LibraryFunctionAddress(). Cela est dû au fait que cette fonction n'est pas tenu de rechercher le nom de la fonction de bibliothèque.
Parametre1, Parametre2... (optionnel) Les paramètres de la fonction.

Le nombre maximum de paramètres est 20.
Le nombre de paramètres autorisés est quelconque mais doit correspondre exactement aux besoins de la fonction. Par exemple, si une fonction nécessite 2 paramètres, alors 2 paramètres doivent être passés même si les valeurs de ces 2 paramètres sont nulles.

Valeur de retour

Renvoie la valeur de retour de la fonction appelée.

Remarques

Attention, cette fonction n'est utile que si la commande appelée a été déclaré avec la convention 'CDECL' ce qui n'est pas le standard sous Windows. La plupart des DLL sous Windows nécessite l'utilisation de CallFunction(). Par contre sous linux, toutes les fonctions des bibliothèques partagées sont en 'CDECL'.

Pour appeler une fonction qui utilise la convention d'appel stdcall, utilisez la fonction CallFunction().

Note: Cette fonction n'est pas très flexible car elle n'accepte pas les paramètres de type string, float, double ou quad, et ne peut pas renvoyer des valeurs de type string, float, double ou quad. Il est vivement conseillé d'utiliser les prototypes à la place de cette fonction.

Voir aussi

GetFunction(), CallFunctionFast(), prototypes


CallFunction()

Syntaxe

Resultat = CallFunction(#Bibliotheque, NomFonction$ [,Parametre1 [, Parametre2...]])
Description
Appelle une fonction d'une bibliothèque (en utilisant son nom).

Arguments

#Bibliotheque | La bibliothèque à utiliser.
NomFonction$ | Le nom de la fonction à appeler (sensible à la casse).
Parameter1, Parameter2... (optionnel) Les paramètres de la fonction.

Le nombre de paramètres doivent correspondre aux paramètres de la fonction appelée.

Le nombre maximum de paramètres pris en charge est de 20.

Valeur de retour

Renvoie la valeur de retour de la fonction appelée ou zéro si la bibliothèque ne contient pas la fonction demandée.

Remarques

La bibliothèque sera préalablement ouverte avec OpenLibrary().

Le nombre de paramètres autorisés est quelconque mais doit correspondre exactement aux besoins de la fonction. Par exemple, si une fonction nécessite 2 paramètres, alors 2 paramètres doivent être passés même si les valeurs de ces 2 paramètres sont nulles.

Le nombre maximum de paramètres est 20. De plus cette fonction n'est pas très flexible car elle n'accepte pas les paramètres de type string, float, double ou quad, et ne peut pas renvoyer des valeurs de type string, float, double ou quad. Il est vivement conseillé d'utiliser les prototypes à la place de cette fonction.

Voir aussi

CallCFunction(), GetFunction(), prototypes


CallFunctionFast()

Syntaxe

Resultat = CallFunctionFast(*PointeurFonction [,Parametre1 [, Parametre2...]])
Description
Appelle une fonction directement, en utilisant son adresse.
La fonction doit utiliser l'appel stdcall (la plupart des DLL de Windows).

Arguments

*PointeurFonction L'adresse de la fonction à appeler.

Son pointeur est obtenu par GetFunction() , GetFunctionEntry() ou par LibraryFunctionAddress().
L'utilisation de cette fonction est la méthode la plus rapide pour appeler des fonctions d'une bibliothèque, en particulier lorsque les résultats ont été obtenus avec GetFunction() ou LibraryFunctionAddress(). Cela est dû au fait que cette fonction n'est pas tenu de rechercher le nom de la fonction de bibliothèque.
Parameter1, Parameter2... (optionnel) Les paramètres de la fonction.

Le nombre maximum de paramètres est 20.
Le nombre de paramètres autorisés est quelconque mais doit correspondre exactement aux besoins de la fonction. Par exemple, si une fonction nécessite 2 paramètres, alors 2 paramètres doivent être passés même si les valeurs de ces 2 paramètres sont nulles.

Valeur de retour

Renvoie la valeur de retour de la fonction appelée.

Remarques

Pour appeler une fonction qui utilise la convention d'appel cdecl, utilisez la fonction CallCFunctionFast().

Note: Cette fonction n'est pas très flexible car elle n'accepte pas les paramètres de type string, float, double ou quad, et ne peut pas renvoyer des valeurs de type string, float, double ou quad. Il est vivement conseillé d'utiliser les prototypes à la place de cette fonction.

Voir aussi

CallCFunctionFast(), GetFunction(), prototypes


CloseLibrary()

Syntaxe

CloseLibrary(#Bibliotheque)
Description
Ferme une bibliotheque et libère la mémoire associée.

Arguments

#Bibliotheque Le numéro de la bibliothèque.

Si #PB_All est spécifié, toutes les autres bibliothèques seront fermées.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Toutes les bibliothèques ouvertes sont automatiquement fermées quand le programme se termine.

Voir aussi

OpenLibrary()


CountLibraryFunctions()

Syntaxe

Resultat = CountLibraryFunctions(#Bibliotheque)
Description
Renvoie le nombre de fonctions contenues dans une bibliothèque.

Arguments

#Bibliotheque La bibliothèque à utiliser.

Valeur de retour

Renvoie le nombre de fonctions disponibles dans la bibliothèque.

Remarques

La bibliothèque doit être ouverte avec OpenLibrary() avant de pouvoir utiliser cette commande.

OS Supportés

Windows, Linux


ExamineLibraryFunctions()

Syntaxe

'Resultat' = ExamineLibraryFunctions(#Bibliotheque)
Description
Commence l'énumeration des fonctions contenues dans une bibliothèque.

Arguments

#Bibliotheque La bibliothèque à utiliser.

Valeur de retour

Renvoie une valeur non nulle si les fonctions peuvent être examinées ou zéro sinon.

Remarques

La bibliothèque doit être ouverte avec OpenLibrary() avant de pouvoir utiliser cette commande.

L'énumeration peut continuer avec NextLibraryFunction() et les commandes LibraryFunctionName() et LibraryFunctionAddress() permettant alors de récuperer le nom et l'adresse de chaque fonction.

Voir aussi

NextLibraryFunction(), LibraryFunctionAddress(), LibraryFunctionName()

OS Supportés

Windows, Linux


GetFunction()

Syntaxe

Resultat = GetFunction(#Bibliotheque, NomFonction$)
Description
Teste la présence d'une fonction dans une bibliothèque.

Arguments

#Bibliotheque | La bibliothèque à utiliser.
NomFonction$ | Le nom de la fonction à appeler (sensible à la casse).

Valeur de retour

Renvoie l'adresse de la fonction dans la bibliothèque en cas de succès ou zéro si la bibliothèque ne contient pas une fonction portant ce nom.

Remarques

La bibliothèque doit préalablement être ouverte avec OpenLibrary().

La fonction peut être appelée par son adresse en utilisant un prototype.

Les fonctions CallFunctionFast() et CallCFunctionFast() peuvent également être utilisées pour cela, mais l'utilisation des prototypes est recommandée car ils sont plus souples.

Voir les prototypes pour un exemple.

Voir aussi

GetFunctionEntry(), CallFunctionFast(), CallCFunctionFast(), prototypes


GetFunctionEntry()

Syntaxe

Resultat = GetFunctionEntry(#Bibliotheque, Index)
Description
Teste si un numéro de fonction est présent dans une bibliothèque.

Cela permet de tester la présence d'une fonction par sa position dans la bibliothèque plutôt que par son nom.

Arguments

#Bibliotheque La bibliothèque à utiliser.
Index Un nombre représentant l'index de la fonction dans la bibliothèque.

La première fonction est à l'index 1.

Valeur de retour

Renvoie l'adresse de la fonction en cas de succès ou zéro si la bibliothèque ne contient pas de fonction à cet index.

Remarques

La bibliothèque doit préalablement être ouverte avec OpenLibrary(),

Cette commande peut être utile pour accéder aux fonctions API non documentées, qui n'ont pas de nom de fonctions attribués.

La fonction peut être appelée par son adresse en utilisant un prototype.

Les fonctions CallFunctionFast() et CallCFunctionFast() peuvent également être utilisées pour cela, mais l'utilisation des prototypes est recommandée car ils sont plus souples.

Voir les prototypes pour un exemple.

Voir aussi

GetFunction(), CallFunctionFast(), CallCFunctionFast(), prototypes

OS Supportés

Windows


IsLibrary()

Syntaxe

Resultat = IsLibrary(#Bibliotheque)
Description
Teste si une bibliothèque est correctement initialisée.

Arguments

#Bibliotheque La bibliothèque à tester.

Valeur de retour

Renvoie une valeur non nulle en cas de succès ou zéro sinon.

Remarques

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.

C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

OpenLibrary(), CloseLibrary()


LibraryFunctionAddress()

Syntaxe

Resultat = LibraryFunctionAddress()
Description
Renvoie l'adresse de la fonction de la bibliothèque en cours d'examen avec les commandes ExamineLibraryFunctions() et NextLibraryFunction().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie l'adresse en mémoire de la fonction de la bibliothèque, qui peut être utilisée avec les commandes CallFunctionFast() ou CallCFunctionFast().

Les fonctions CallFunctionFast() et CallCFunctionFast() peuvent également être utilisées pour cela, mais l'utilisation des prototypes est recommandée car ils sont plus souples.

Voir les prototypes pour un exemple.

Voir aussi

ExamineLibraryFunctions(), NextLibraryFunction(), LibraryFunctionName(), CallFunctionFast(), CallCFunctionFast()

OS Supportés

Windows, Linux


LibraryFunctionName()

Syntaxe

Resultat$ = LibraryFunctionName()
Description
Renvoie le nom de la fonction de la bibliothèque en cours d'examen avec les commandes ExamineLibraryFunctions() et NextLibraryFunction().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le nom de la fonction de la bibliothèque, qui peut être utilisé avec les commandes CallFunction() ou CallCFunction().

Voir aussi

ExamineLibraryFunctions(), NextLibraryFunction(), LibraryFunctionAddress()

OS Supportés

Windows, Linux


LibraryID()

Syntaxe

Resultat = LibraryID(#Bibliotheque)
Description
Renvoie l'identifiant unique du système (souvent appelé 'handle') de la bibliothèque spécifiée.

Arguments

#Bibliotheque La bibliothèque à tester.

Valeur de retour

Renvoie l'identifiant système de la bibliothèque.


NextLibraryFunction()

Syntaxe

Resultat = NextLibraryFunction()
Description
Cette fonction ne peut être utilisée qu'après l'appel avec succès de la commande ExamineLibraryFunctions(). Elle permet d'examiner une à une les fonctions contenues dans la bibliothèque. Le nom et l'adresse de chaque fonction peuvent être obtenus avec les commandes LibraryFunctionName() et LibraryFunctionAddress().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie une valeur non nulle si la fonction suivante a été trouvée ou zéro s'il n'y a pas d'autres fonctions qui seront examinées.

Voir aussi

ExamineLibraryFunctions(), LibraryFunctionName(), LibraryFunctionAddress()

OS Supportés

Windows, Linux


OpenLibrary()

Syntaxe

Resultat = OpenLibrary(#Bibliotheque, NomFichier$)
Description
Ouvre une bibliothèque partagée afin que ses fonctions puissent être consultées.

Arguments

#Bibliotheque La bibliothèque à tester.

Si #PB_Any est utilisé pour le paramètre '#Bibliotheque', le numéro de la nouvelle bibliothèque sera renvoyé dans 'Resultat'.
NomFichier$ Le nom du fichier de la bibliothèque à charger.
Si le nom de fichier ne comporte pas de chemin, alors le système d'exploitation recherche la bibliothèque dans ses dossiers systèmes, le répertoire des applications et le répertoire courant.

Valeur de retour

Renvoie une valeur non nulle si la bibliothèque a été ouvert avec succès ou zéro sinon. Si #PB_Any a été utilisé à la place de #Bibliothèque alors le numéro généré pour le bibliothèque est retourné en cas de succès.

Remarques

Si une autre bibliothèque était déjà chargé avec le même numéro de #Bibliotheque, elle sera automatiquement fermée lors du chargement de la nouvelle.

Voir aussi

CloseLibrary(), GetFunction(), prototypes


Light

PureBasic - Light

Généralités

Les lumières sont des composantes essentielles d'un monde 3D.

Comme dans le monde réel, il est possible de créer des lumières dynamiques et de modifier leurs attributs tels que la couleur, la luminosité, etc.

InitEngine3D() doit être appelé avec succès avant de pouvoir utiliser les commandes relatives aux lumières.

Sommaire des commandes

CopyLight
CreateLight
DisableLightShadow
FreeLight
GetLightColor
HideLight
IsLight
LightAttenuation
LightDirection
LightDirectionX
LightDirectionY
LightDirectionZ
LightID
LightLookAt
LightPitch
LightRoll
LightX
LightY
LightYaw
LightZ
MoveLight
RotateLight
SetLightColor
SpotLightRange

Exemple

Light.pb
LightAttenuation.pb
LightDirectionXYZ.pb
LightLookAt.pb
RotateLight.pb

OS Supportés

Tous

Guide de référence - Index


CopyLight()

Syntaxe

Resultat = CopyLight(#Lumiere, #NouvelleLumiere)
Description
Crée une copie d'une lumière.

Arguments

#Lumiere La lumière à copier.
#NouvelleLumiere Numéro de la nouvelle lumière.

Si #PB_Any est utilisé pour le paramètre '#NouvelleLumiere', le numéro de la nouvelle lumière sera renvoyé dans 'Resultat'.

Tous les attributs de la #Lumiere (couleur, position, ...) sont dupliqués.

Remarques

Si le numéro #NouvelleLumiere est déjà créé alors il est automatiquement supprimée et remplacé par le nouveau.

Valeur de retour

Si le 'Resultat' est zéro alors la copie a échouée.

Voir aussi

CreateLight(), FreeLight()


CreateLight()

Syntaxe

Resultat = CreateLight(#Lumiere, Couleur [, x, y, z [, Options]])
Description
Crée une nouvelle lumière.

Arguments

#Lumiere La lumière à utiliser.

Si #PB_Any est utilisé pour le paramètre '#Lumiere', le numéro de la nouvelle lumière sera renvoyé dans 'Resultat'.
Couleur Couleur de la nouvelle lumière.

RGB() peut être utilisée pour obtenir facilementla couleur désirée.
x, y, z (optionnel) Position de la nouvelle lumière.

La nouvelle lumière est créée par défaut à la position 0,0,0.
Options (optionnel)
  #PB_Light_Point         : Créer un point de lumière
                            (la lumière est émise dans toutes les directions).
  #PB_Light_Directional   : Crée une lumière directionnelle.
  #PB_Light_Spot          : Crée une lumière de type spot.
                            SpotLightRange() peut être utilisés pour modifier
                            le comportement de la lumière.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro sinon.

Si la lumière était déjà créée alors elle est automatiquement supprimée et remplacée par la nouvelle.

Exemple: :

  CreateLight(0, RGB(255,0,0)) ; Crée une lumière rouge

  CreateLight(1, RGB(0,255,0),  0, 100.7, 50) ; Crée une lumière verte à la position (0, 100.7, 50)

Voir aussi

FreeLight(), HideLight()


DisableLightShadow()

Syntaxe

DisableLightShadow(#Lumiere, Etat)
Description
Désactive ou active la projection des ombres.

Arguments

#Lumiere La lumière à utiliser.
Etat
  #True : L'ombre est désactivée.
  #False: L'ombre est activée.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

LightAttenuation()


FreeLight()

Syntaxe

FreeLight(#Lumiere)
Description
Supprime une lumière.

Arguments

#Lumiere La lumière à supprimer.

Si #PB_All est spécifié, toutes les lumières restantes sont libérées.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Toutes les lumières restantes sont automatiquement supprimées quand le programme se termine.

Voir aussi

CreateLight()


GetLightColor()

Syntaxe

Resultat = GetLightColor(#Lumiere, Type)
Description
Renvoie la couleur d'une lumière.

Arguments

#Lumiere La lumière à utiliser.
Type
  #PB_Light_DiffuseColor : Renvoie la valeur de la couleur de diffusion de la lumière (default)
  #PB_Light_SpecularColor: Renvoie la valeur de la couleur spéculaire de la lumière

Valeur de retour

Renvoie la valeur de la couleur au format RGB.

Voir aussi

SetLightColor


HideLight()

Syntaxe

HideLight(#Lumiere, Etat)
Description
Affiche ou cache une lumière.

Arguments

#Lumiere La lumière à utiliser.
Etat
  0: la #Lumière est affichée
  1: la #Lumière est cachée

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateLight(), FreeLight()


IsLight()

Syntaxe

Resultat = IsLight(#Lumiere)
Description
Teste si une lumière est correctement initialisée.

Arguments

#Lumiere La lumière à tester.

Valeur de retour

Si le 'Résultat' est différent de zéro alors cet objet est valide.

Remarques

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.

C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

CreateLight(), LightID()


LightAttenuation()

Syntaxe

LightAttenuation(#Lumiere, Champ, Attenuation)
Description
Change l'attenuation d'une lumière.

Arguments

#Lumiere | La lumière à utiliser.
#Champ | Le champ (dans l'unité du monde) au-delà duquel la lumière n'éclaire plus le monde.
Attenuation L'atténuation globale de la lumière.

Une valeur de 0.0 signifie aucune atténuation globale (l'atténuation est fonction du champ).

Elle peut être utilisée pour régler la luminosité de la lumière.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

SetLightColor()


LightDirection()

Syntaxe

LightDirection(#Lumiere, x, y, z)
Description
Change la direction de la lumière.

Arguments

#Lumiere La lumière à utiliser.
x, y, z Direction du vecteur.

Généralement une valeur pour x, y ou z, comprise entre -1.0 et 1.0, sinon il sera automatiquement normalisé.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

La position de la lumière n'est pas modifiée.

Voir aussi

LightDirectionX(), LightDirectionY(), LightDirectionZ()


LightDirectionX()

Syntaxe

Resultat = LightDirectionX(#Lumiere)
Description
Renvoie le vecteur de direction 'x' de la lumière.

Arguments

#Lumiere La lumière à utiliser.

Valeur de retour

Renvoie le vecteur de direction 'x' de la lumière.

Cette valeur est toujours comprise entre -1.0 et 1.0.

Voir aussi

LightDirection(), LightDirectionY(), LightDirectionZ()


LightDirectionY()

Syntaxe

Resultat = LightDirectionY(#Lumiere)
Description
Renvoie le vecteur de direction 'y' de la lumière.

Arguments

#Lumiere La lumière à utiliser.

Valeur de retour

Renvoie le vecteur de direction 'y' de la lumière.

Cette valeur est toujours comprise entre -1.0 et 1.0.

Voir aussi

LightDirection(), LightDirectionX(), LightDirectionZ()


LightDirectionZ()

Syntaxe

Resultat = LightDirectionZ(#Lumiere)
Description
Renvoie le vecteur de direction 'z' de la lumière.

Arguments

#Lumiere La lumière à utiliser.

Valeur de retour

Renvoie le vecteur de direction 'z' de la lumière.

Cette valeur est toujours comprise entre -1.0 et 1.0.

Voir aussi

LightDirection(), LightDirectionX(), LightDirectionY()


LightID()

Syntaxe

LumiereID = LightID(#Lumiere)
Description
Renvoie l'identificateur système unique de la lumière.

Arguments

#Lumiere La lumière à utiliser.

Valeur de retour

Renvoie le numéro de la lumière.

Voir aussi

CreateLight(), IsLight()


LightLookAt()

Syntaxe

LightLookAt(#Lumiere, x, y, z)
Description
Modifie l'orientation d'une lumière dans le monde et pointe vers le point x, y, z .

Arguments

#Lumiere | La lumière à utiiser.
x, y, z | Coordonnées du point.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

LightDirection(), LightDirectionX(), LightDirectionY(), LightDirectionZ()


LightPitch()

Syntaxe

Resultat = LightPitch(#Lumiere [, Mode])
Description
Renvoie le tangage de #Lumiere.

Arguments

#Lumiere La lumière à utiliser.
Mode (optionnel) Peut être une des valeurs suivantes:
  #True : La valeur brute, mais elle ne peut pas être utilisée avec RotateLight() pour récupérer la même orientation (par défaut).
  #False: Le tangage est ajusté, de sorte qu'il peut être réutiliser avec RotateLight() pour récupérer la même orientation.

Valeur de retour

La valeur courante du tangage de la lumière.

Valeur toujours comprise entre -180.0 et 180.0 degrés.

Voir aussi

LightYaw(), LightRoll()


LightRoll()

Syntaxe

Resultat = LightRoll(#Lumiere [, Mode])
Description
Renvoie le roulis de #Lumiere.

Arguments

#Lumiere La lumière à utiliser.
Mode (optionnel) Peut être une des valeurs suivantes:
  #True : La valeur brute, mais elle ne peut pas être utilisée avec RotateLight() pour récupérer la même orientation (par défaut).
  #False: Le tangage est ajusté, de sorte qu'il peut être réutiliser avec RotateLight() pour récupérer la même orientation.

Valeur de retour

La valeur courante du roulis de la lumière.

Valeur toujours comprise entre -180.0 et 180.0 degrés.

Voir aussi

LightYaw(), LightPitch()


LightX()

Syntaxe

Resultat = LightX(#Lumiere)
Description
Renvoie la position actuelle de la lumière dans le monde.

Arguments

#Lumiere La lumière à utiliser.

Valeur de retour

Renvoie la position de la lumière en 'x'.

Voir aussi

LightY(), LightZ(), MoveLight()


LightY()

Syntaxe

Resultat = LightY(#Lumiere)
Description
Renvoie la position actuelle de la lumière dans le monde.

Arguments

#Lumiere La lumière à utiliser.

Valeur de retour

Renvoie la position de la lumière en 'y'.

Voir aussi

LightX(), LightZ(), MoveLight()


LightYaw()

Syntaxe

Resultat = LightYaw(#Lumiere [, Mode])
Description
Renvoie le lacet de #Lumiere.

Arguments

#Lumiere La lumière à utiliser.
Mode (optionnel) Peut être une des valeurs suivantes:
  #True : La valeur brute, mais elle ne peut pas être utilisée avec RotateLight() pour récupérer la même orientation (par défaut).
  #False: Le tangage est ajusté, de sorte qu'il peut être réutiliser avec RotateLight() pour récupérer la même orientation.

Valeur de retour

La valeur courante du lacet de la lumière.

Valeur toujours comprise entre -180.0 et 180.0 degrés.

Voir aussi

LightPitch(), LightRoll()


LightZ()

Syntaxe

Resultat = LightZ(#Lumiere)
Description
Renvoie la position actuelle de la lumière dans le monde.

Arguments

#Lumiere La lumière à utiliser.

Valeur de retour

Renvoie la position de la lumière en 'z'.

Voir aussi

LightX(), LightY(), MoveLight()


MoveLight()

Syntaxe

MoveLight(#Lumiere, x, y, z [, Mode])
Description
Déplace une lumière dans le monde 3D.

Arguments

#Lumiere La lumière à utiliser.
x, y, z Déplacement de la lumière.

Le déplacement est relatif à la position actuelle de la lumière.
Mode (optionnel) Peut être une des valeurs suivantes:
  #PB_Relative: Déplacement relatif, à partir de la position actuelle de la lumière (par défaut).
  #PB_Absolute: Déplacement absolu à la position spécifiée.
combinée avec l'une des valeurs suivantes:
  #PB_Local : Déplacement local.
  #PB_Parent: Déplacement par rapport à la position du parent.
  #PB_World : Déplacement par rapport au monde.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

LightX(), LightY(), LightZ(), RotateLight()


RotateLight()

Syntaxe

RotateLight(#Lumiere, x, y, z [, Mode])
Description
Rotation d'une lumière

Arguments

#Lumiere La lumière à utiliser.
x, y, z Valeurs des angles de rotation.

Tous les angles sont en degrés.
Mode (optionnel)
  PB_Absolute: Rotation absolue (par défaut).
  PB_Relative: Rotation relative basée sur la rotation précédente.
En combinaison avec l'une de ces constantes :
  PB_Local   : Rotation par rapport à l'espace local.
  PB_Parent  : Rotation par rapport à l'espace de son parent.
  PB_World   : Rotation par rapport à l'espace du monde (Par défaut).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

MoveLight()


SetLightColor()

Syntaxe

SetLightColor(#Lumiere, Type, Couleur)
Description
Modifie la valeur de la couleur d'une lumière.

Arguments

#Lumiere La lumière à utiliser.
Type
  #PB_Light_DiffuseColor : Change la valeur de la couleur de diffusion.
  #PB_Light_SpecularColor: Change la valeur de la couleur speculaire.
Couleur La nouvelle valeur de la couleur au format RGB.

Elle peut être facilement créée avec RGB().

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

GetLightColor


SpotLightRange()

Syntaxe

SpotLightRange(#Lumiere, AngleInterne, AngleExterne [, Attenuation])
Description
Modifie le comportement d'une lumière de type 'Spot'.

Arguments

#Lumiere | La lumière à utiliser.
AngleInterne | Angle interne de la lumière.
AngleExterne | Angle externe de la lumière.
Attenuation (optionnel) Atténuation de la lumière en fonction de la distance.

Une valeur de 1 signifie une diminution linéaire.

Une valeur inférieure à 1 signifie une lente atténuation.

Une valeur supérieure à 1 signifie une rapide atténuation.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Attention: La lumière doit être créé avec l'option #PB_Light_Spot.

Voir aussi

CreateLight()


LinkedList

PureBasic - LinkedList

Généralités

Les listes (aussi appelée listes chaînées) regroupent des objets qui sont alloués dynamiquement en fonction de vos besoins. Elles se présentent sous la forme de listes d'éléments totalement indépendants les uns des autres. Vous pouvez y ajouter un nombre infini d'éléments, insérer des éléments à une position choisie, en effacer, etc... Cette méthode de stockage d'information est très pratique et très souple. C'est la meilleure solution pour gérer des données dont vous ne connaissez pas le nombre à l'avance.

Avant de travailler avec les listes, vous devez les déclarer. Cela se fait avec le mot-clef NewList. Les structures sont également fréquemment utilisées pour enregistrer leur contenu.

Pour analyser le contenu d'une liste, il est possible d'utiliser les boucles suivantes: For : Next, ForEach : Next, Repeat : Until ou While : Wend.

Les autres possibilités pour stockées des données multiples sont les Tableaux et les Maps.

Sommaire des commandes

AddElement
ChangeCurrentElement
ClearList
CopyList
DeleteElement
FirstElement
FreeList
InsertElement
LastElement
ListIndex
ListSize
MergeLists
MoveElement
NextElement
PopListPosition
PreviousElement
PushListPosition
ResetList
SelectElement
SplitList
SwapElements

Exemple

LinkedList.pb

OS Supportés

Tous

Guide de référence - Index


AddElement()

Syntaxe

Resultat = AddElement(Liste())
Description
Ajoute un nouvel élément vide après l'élément courant de la Liste() ou en tant que premier élément si la liste est vide. Ce nouvel élément devient l'élément courant de la liste.

Arguments

Liste() - Le nom de votre variable liste, créée à l'aide de la commande NewList. Les parenthèses sont obligatoires après le nom de la liste.

Valeur de retour

La valeur renvoyée par cette commande peut être utilisée pour déterminer si le nouvel élément a pu être ajouté ou non (si la mémoire est insuffisante par exemple). Si le nouvel élément a été créé, cette commande renvoie une valeur différente de zéro. Si le nouvel élément n'a pu être créé, alors elle renvoie la valeur zéro.

Pour programmeurs expérimentés:
La valeur renvoyée par cette commande est un pointeur vers les données du nouvel élément ou zéro si le nouvel élément n'a pu être crée.

Exemple

  ; La manière la plus simple d'utiliser AddElement
  NewList simple.w()
  AddElement(simple())    ; Crée le premier nouvel élément de la liste
  simple() = 23

  AddElement(simple())    ; La position courante est le premier élément, alors nous en ajoutons un à la deuxième position
  simple() = 45

  ; Ceci montre comment utiliser la valeur de retour de la fonction AddElement
  NewList experimentes.l()
  If AddElement(experimentes()) <> 0
    experimentes() = 12345
  Else
    MessageRequester("Erreur !", "Impossible d'allouer de la mémoire pour le nouvel élément", #PB_MessageRequester_OK)
  EndIf

  ; Une petite structure pour démontrer la description "programmeurs expérimentés" (ci-dessus)
  Structure Programmeur
    Nom.s
    Talent.b
  EndStructure

  NewList LesProgrammeurs.Programmeur()  ; La liste pour stocker les éléments

  *Element.Programmeur = AddElement(LesProgrammeurs())
  If *Element<>0
    *Element\Nom = "Dave"
    *Element\Talent = 3   ; Celui-là, c'est un féru de PureBasic ! ;)
  Else
    MessageRequester("Erreur !", "Impossible d'allouer de la mémoire pour le nouvel élément", #PB_MessageRequester_OK)
  EndIf


ChangeCurrentElement()

Syntaxe

ChangeCurrentElement(Liste(), *NouvelElement)
Description
Change l'élément courant de la liste spécifiée par le nouvel élément fourni. *NouvelElement doit être un pointeur vers un autre élément qui existe déjà dans la liste. Cette fonction est très utile pour mémoriser un élément et le réutiliser après avoir exécuté d'autres traitements. Elle doit être utilisée avec prudence, par des programmeurs expérimentés.

Arguments

Liste() - Le nom de votre variable, créée à l'aide de la commande NewList. Les parenthèses sont obligatoires après le nom de la liste.

*NouvelElement - Le nouvel élément à placer à la position courante de la liste. Cette adresse devrait être récupérée seulement avec l'opérateur @ sur le nom de la liste et pas par une autre manière.

Valeur de retour

Aucune.

Exemple

  *Ancien_Element = @MaListe()   ; On mémorise l'adresse de l'élément courant

  ResetList(MaListe())           ; Effectue une recherche de tous les éléments nommés
  While NextElement(MaListe())   ; "John" et les change en "J"
    If MaListe()\nom = "John"
      MaListe()\nom = "J"
    EndIf
  Wend

  ChangeCurrentElement(MaListe(), *Ancien_Element) ; Restitue l'ancien élément courant (mémorisé avant la recherche)


ClearList()

Syntaxe

ClearList(Liste())
Description
Efface tous les éléments de la liste spécifiée et libère la mémoire utilisée. Après l'appel de cette fonction, la liste reste utilisable, mais elle ne contient plus d'éléments.

Arguments

Liste() - Le nom de votre variable liste, créée à l'aide de la commande NewList. Les parenthèses sont obligatoires après le nom de la liste.

Valeur de retour

Aucune.

Exemple

  NewList nombres.w()

  ; Une petite boucle pour ajouter plusieurs éléments à la liste
  For i=1 To 100
    AddElement(nombres())
    nombres() = i
  Next

  ; Preuve que les éléments ont été ajoutés à la liste
  MessageRequester("Information", "Il y a "+Str(ListSize(nombres()))+" éléments dans la liste", #PB_MessageRequester_OK)

  ; Effacer la liste et montrer que la liste est vraiment vide
  ClearList(nombres())
  MessageRequester("Information", "Il y a "+Str(ListSize(nombres()))+" élements dans la liste", #PB_MessageRequester_OK)
Note: PureBasic libèrera seulement la mémoire occupée par les éléments. Si la liste a été utilisée pour stocker des objets dynamiques, il n'est pas possible de le détecter (en PureBasic ou dans un autre langage). Dans ce cas, il convient de libérer tous ces objets avant la destruction de la liste.


CopyList()

Syntaxe

Resultat = CopyList(ListeSource(), ListeDestination())
Description
Copie tous les éléments de la 'ListeSource()' dans la 'ListeDestination()'. Si les deux listes ne sont pas du même type (natif ou structuré) la copie ne se fera pas, et 'Resultat' sera égal à zéro. Tous les éléments présents dans la 'ListeDestination()' seront effacés. Après une copie réussie, les deux listes seront identiques.

Exemple

  NewList Friends$()
  NewList FriendsCopy$()

  AddElement(Friends$())
  Friends$() = "John"

  AddElement(Friends$())
  Friends$() = "Elise"

  CopyList(Friends$(), FriendsCopy$())

  ForEach FriendsCopy$()
    Debug FriendsCopy$()
  Next


DeleteElement()

Syntaxe

DeleteElement(Liste() [, Options])
Description
Supprime l'élément courant de la liste spécifiée. Après l'appel de cette fonction, le nouvel élément courant est celui qui précédait l'élément supprimé. Si l'élément supprimé était le premier, alors il n'y a plus d'élément courant (la position de la liste est avant le premier élément, comme après un ResetList()). Pour conserver quoiqu'il arrive un élément courant valide après un DeleteElement(), il suffit d'utiliser la valeur 1 dans le paramètre 'Options'. Le nouvel élément est alors l'élément qui suivait l'élément supprimé. Si la liste ne contenait plus qu'un seul élément, alors il n'y a plus d'élément courant.

Arguments

Liste() - Le nom de votre variable liste, créée à l'aide de la commande NewList. Les parenthèses sont obligatoires après le nom de la liste.

Valeur de retour

Aucune.

Exemple

  NewList personnes.s()

  AddElement(personnes()) : personnes() = "Tom"
  AddElement(personnes()) : personnes() = "Dick"
  AddElement(personnes()) : personnes() = "Harry"
  AddElement(personnes()) : personnes() = "Bob"

  FirstElement(personnes())     ; se déplace sur "Tom"
  DeleteElement(personnes(),1)  ; et le supprime. L'élément courant devient (paramètre 1 utilisé) celui qui suivait
  MessageRequester("Information", "La première personne de la liste est "+personnes(), #PB_MessageRequester_OK)

  LastElement(personnes())      ; se déplace vers "Bob"
  PreviousElement(personnes())  ; se déplace vers "Harry"
  DeleteElement(personnes())    ; et le supprime.Il y a un élément avant Harry, alors il devient l'élément courant
  MessageRequester("Information", "La personne actuellement pointée dans la liste est "+personnes(), #PB_MessageRequester_OK)


FirstElement()

Syntaxe

Resultat = FirstElement(Liste())
Description
Le premier élément de la liste spécifiée devient l'élément courant.

Arguments

Liste() - Le nom de votre variable liste, créée à l'aide de la commande NewList. Les parenthèses sont obligatoires après le nom de la liste.

Valeur de retour

Si la liste est vide alors la valeur de retour de cette fonction est 0. Elle peut donc être utilisée pour vérifier si une liste est vide ou non. Pour programmeurs expérimentés:
La valeur renvoyée par cette commande est un pointeur vers les données du premier élément ou zéro si le premier élément n'existe pas.

Exemple

  ; Un exemple d'utilisation simple
  NewList nombres.w()

  AddElement(nombres())
  nombres() = 5
  AddElement(nombres())
  nombres() = 8

  FirstElement(nombres())
  MessageRequester("Information", "La valeur du premier élément est "+Str(nombres()), #PB_MessageRequester_OK)

  ; Un exemple qui utilise la valeur de retour
  NewList nombres.w()

  If FirstElement(nombres()) <> 0
    MessageRequester("Information", "La valeur du premier élément est "+Str(nombres()), #PB_MessageRequester_OK)
  Else
    MessageRequester("Information", "La liste est vide", #PB_MessageRequester_OK)
  EndIf

  AddElement(nombres())
  nombres() = 5
  AddElement(nombres())
  nombres() = 8

  If FirstElement(nombres()) <> 0
    MessageRequester("Information", "La valeur du premier élément est "+Str(nombres()), #PB_MessageRequester_OK)
  Else
    MessageRequester("Information", "La liste est vide", #PB_MessageRequester_OK)
  EndIf

  ; Un exemple réservé aux programmeurs expérimentés
  NewList nombres.w()

  AddElement(nombres())
  nombres() = 5
  AddElement(nombres())
  nombres() = 8

  *Element.Word = FirstElement(nombres())
  If *Element
    MessageRequester("Information", "La valeur du premier élément est "+Str(*Element\w), #PB_MessageRequester_OK)
  Else
    MessageRequester("Information", "La liste est vide", #PB_MessageRequester_OK)
  EndIf


FreeList()

Syntaxe

FreeList(Liste())
Description
Détruit la 'Liste()' et libère toutes les ressources associées. Pour continuer à l'utiliser, NewList doit être appelé.


InsertElement()

Syntaxe

Resultat = InsertElement(Liste())
Description
Insère un nouvel élément avant l'élément courant, ou au début de la liste si la liste est vide (c-a-d si elle ne contient pas d'élément). Ce nouvel élément devient l'élément courant de la liste.

Arguments

Liste() - Le nom de votre variable liste, créée à l'aide de la commande NewList. Les parenthèses sont obligatoires après le nom de la liste.

Valeur de retour

La valeur renvoyée par cette commande peut être utilisée pour déterminer si le nouvel élément a pu être ajouté ou non (si la mémoire est insuffisante par exemple). Si le nouvel élément a été créé, cette commande renvoie une valeur différente de zéro. Si le nouvel élément n'a pu être créé, alors elle renvoie la valeur zéro. Pour programmeurs expérimentés:
La valeur renvoyée par cette commande est un pointeur vers les données du nouvel élément ou zéro si le nouvel élément n'a pu être crée.

Exemple

  ; La manière la plus simple d'utiliser InsertElement
  NewList simple.w()
  InsertElement(simple())    ; Crée le premier élément de la liste
  simple() = 23

  InsertElement(simple())    ; La position courant est le premier élément, nous ajoutons cet élément au début de la liste
  simple() = 45              ; L'ancien premier élément est maintenant le second élément de la liste

  ; Ceci montre comment utiliser la valeur de retour de InsertElement
  NewList experimentes.l()
  If InsertElement(experimentes()) <> 0
    experimentes() = 12345
  Else
    MessageRequester("Erreur !", "Impossible d'allouer de la mémoire pour le nouvel élément", #PB_MessageRequester_OK)
  EndIf

  ; Une petite structure pour démontrer la description "programmeurs expérimentés" (ci-dessus)
  Structure Programmeur
    Nom.s
    Talent.b
  EndStructure

  NewList LesProgrammeurs.Programmeur()  ; La liste pour stocker les éléments

  *Element.Programmeur = InsertElement(LesProgrammeurs())
  If *Element<>0
    *Element\Nom = "Dave"
    *Element\Talent = 3   ; Celui-là, c'est un féru de PureBasic ! ;)
  Else
    MessageRequester("Erreur !", "Impossible d'allouer de la mémoire pour le nouvel élément", #PB_MessageRequester_OK)
  EndIf


LastElement()

Syntaxe

Resultat = LastElement(Liste())
Description
Le dernier élément de la liste spécifiée devient l'élément courant.

Arguments

Liste() - Le nom de votre variable liste, créée à l'aide de la commande NewList. Les parenthèses sont obligatoires après le nom de la liste.

Valeur de retour

Si la liste est vide alors la valeur de retour de cette fonction est 0. Elle peut donc être utilisée pour vérifier si une liste est vide ou non. Pour programmeurs expérimentés:
La valeur renvoyée par cette commande est un pointeur vers les données du dernier élément ou zéro si le dernier élément n'existe pas.

Exemple

  ; Un exemple d'utilisation simple
  NewList nombres.w()

  AddElement(nombres())
  nombres() = 5
  AddElement(nombres())
  nombres() = 8

  LastElement(nombres())
  MessageRequester("Information", "La valeur du dernier élément est "+Str(nombres()), #PB_MessageRequester_OK)

  ; Un exemple qui utilise la valeur de retour
  NewList nombres.w()

  If LastElement(nombres()) <> 0
    MessageRequester("Information", "La valeur du dernier élément est "+Str(nombres()), #PB_MessageRequester_OK)
  Else
    MessageRequester("Information", "La liste est vide", #PB_MessageRequester_OK)
  EndIf

  AddElement(nombres())
  nombres() = 5
  AddElement(nombres())
  nombres() = 8

  If LastElement(nombres()) <> 0
    MessageRequester("Information", "La valeur du dernier élément est "+Str(nombres()), #PB_MessageRequester_OK)
  Else
    MessageRequester("Information", "La liste est vide", #PB_MessageRequester_OK)
  EndIf

  ; Un exemple réservé aux programmeurs expérimentés
  NewList nombres.w()

  AddElement(nombres())
  nombres() = 5
  AddElement(nombres())
  nombres() = 8

  *Element.Word = LastElement(nombres())
  If *Element
    MessageRequester("Information", "La valeur du dernier élément est "+Str(*Element\w), #PB_MessageRequester_OK)
  Else
    MessageRequester("Information", "La liste est vide", #PB_MessageRequester_OK)
  EndIf


ListIndex()

Syntaxe

Index = ListIndex(Liste())
Description
Renvoie dans Index la position de l'élément courant de la liste spécifiée, sachant que le premier élément est en position 0. Cette commande est très rapide car elle utilise une valeur précalculée.

Arguments

Liste() - Le nom de votre variable liste, créée à l'aide de la commande NewList. Les parenthèses sont obligatoires après le nom de la liste.

Valeur de retour

Un nombre indiquant la position actuelle de l'élément courant dans la liste. Le premier élément a la position 0, le deuxième la position 1, etc.. Une valeur de -1 indique qu'il n'y a pas d'élément courant (soit la liste est vide, soit les limites de la liste on été franchies à l'aide des commandes PreviousElement(), NextElement() ou ResetList().

Exemple

  NewList fruit.s()

  AddElement(fruit()) : fruit() = "oranges"
  AddElement(fruit()) : fruit() = "bananes"
  AddElement(fruit()) : fruit() = "pommes"
  AddElement(fruit()) : fruit() = "poires"

  FirstElement(fruit())
  MessageRequester("Fruit : "+fruit(), "Maintenant à la position "+Str(ListIndex(fruit())),  #PB_MessageRequester_OK)

  NextElement(fruit())
  MessageRequester("Fruit : "+fruit(), "Maintenant à la position "+Str(ListIndex(fruit())),  #PB_MessageRequester_OK)

  NextElement(fruit())
  MessageRequester("Fruit : "+fruit(), "Maintenant à la position "+Str(ListIndex(fruit())),  #PB_MessageRequester_OK)

  NextElement(fruit())
  MessageRequester("Fruit : "+fruit(), "Maintenant à la position "+Str(ListIndex(fruit())),  #PB_MessageRequester_OK)


ListSize()

Syntaxe

Resultat = ListSize(Liste())
Description
Renvoie le nombre d'éléments contenus dans la liste spécifiée. Cette fonction ne modifie pas l'élément courant. Elle est très rapide (elle utilise une valeur précalculée) et peut être utilisée sereinement pour savoir si une liste est vide ou non.

Arguments

Liste() - Le nom de votre variable liste, créée à l'aide de la commande NewList. Les parenthèses sont obligatoires après le nom de la liste.

Valeur de retour

Le nombre total d'éléments dans la liste.

Exemple

  NewList CompteMoi.w()

  ; Petite boucle pour ajouter quelques éléments à la liste.
  For i=0 To 10
    AddElement(CompteMoi())
    CompteMoi() = i * 23
  Next

  ; Affiche le nombre d'éléments qu'il y a dans la liste. J'espère que vous avez pensé
  ; à la même valeur que celle affichée par l'ordinateur ;)
  MessageRequester("Information", "Il y a "+Str(ListSize(CompteMoi()))+" éléments dans la liste", #PB_MessageRequester_OK)


MergeLists()

Syntaxe

MergeLists(ListeSource(), ListeDestination() [, Location])
Description
Déplace tous les éléments de la liste ListeSource() vers la liste ListeDestination(). Cette opération est rapide car les données elles-même ne sont pas déplacées pour fusionner les deux listes.

Arguments

ListeSource() | La liste à partir de laquelle les éléments seront pris. Cette liste sera vide après l'opération.
ListeDestination() | La liste vers laquelle les éléments seront déplacés. Cette liste contiendra les éléments des deux listes.
Location (optionnel) Indique l'emplacement où les éléments seront insérés dans la liste ListeDestination(). Ce peut être une des valeurs suivantes:
  #PB_List_First : Insère les éléments au début de ListeDestination()
  #PB_List_Last  : Ajoute des éléments à la fin de ListeDestination()
  #PB_List_Before: Insère les éléments avant l'élément courant de ListeDestination()
  #PB_List_After : Insère les éléments après l'élément courant de ListeDestination()

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  NewList A.s()
  AddElement(A()): A() = "a0"
  AddElement(A()): A() = "a1"
  AddElement(A()): A() = "a2"
  AddElement(A()): A() = "a3"

  NewList B.s()
  AddElement(B()): B() = "b0"
  AddElement(B()): B() = "b1"
  AddElement(B()): B() = "b2"
  AddElement(B()): B() = "b3"

  ; Insère les éléments de A() avant l'élément "b1" de B()
  SelectElement(B(), 1)
  MergeLists(A(), B(), #PB_List_Before)

  ForEach B()
    Debug B()
  Next

Voir aussi

SplitList()


MoveElement()

Syntaxe

MoveElement(LinkedList(), Location [, *ElementRelatif])
Description
Déplace l'élément courant de la liste vers une autre position dans la liste. L'élément déplacé reste l'élément courant de la liste. Cette opération est rapide car la donnée elle-même n'est pas déplacée.

Arguments

LinkedList() Le nom de la liste chaînée, créée avec la fonction NewList.
Vous devez inclure les parenthèses après le nom de la liste.
Location L'emplacement de l'élément courant. Ce peut être une des valeurs suivantes:
  #PB_List_First : Déplacer l'élément vers le début de la liste
  #PB_List_Last  : Déplacer l'élément vers la fin de la liste
  #PB_List_Before: Déplacer l'élément avant le *ElementRelatif
  #PB_List_After : Déplacer l'élément après le *ElementRelatif
*ElementRelatif (optionnel) Indique l'adresse d'un autre élément auprès duquel l'élément actuel doit être déplacé. Ce paramètre est requis lorsque le paramètre "Localisation" est #PB_List_Before ou #PB_List_After. Vous pouvez obtenir cette adresse en utilisant l'opérateur @ avec le nom de la liste.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  NewList Nombres()

  For k=0 To 10
    AddElement(Nombres())
    Nombres() = k
  Next

  SelectElement(Nombres(), 5)
  *Relatif = @Nombres()                             ; l'adresse de l'élément 5

  SelectElement(Nombres(), 0)
  MoveElement(Nombres(), #PB_List_After, *Relatif)  ; déplacement après l'élément 5

  SelectElement(Nombres(), 10)
  MoveElement(Nombres(), #PB_List_First)            ; déplacement au début

  ; Resultat
  ;
  ForEach Nombres()
    Debug Nombres()
  Next

Voir aussi

SwapElements()


NextElement()

Syntaxe

Resultat = NextElement(Liste())
Description
Passe de l'élément courant à l'élément suivant de la liste, ou au premier élement si vous avez précédement fait appel à ResetList()

Arguments

Liste() - Le nom de votre variable liste, créée à l'aide de la commande NewList. Les parenthèses sont obligatoires après le nom de la liste.

Valeur de retour

La valeur renvoyée par cette commande peut être utilisée pour déterminer si l'élément suivant existe ou pas (il n'existera pas si vous êtes à la fin de la liste). Si l'élément suivant existe, la valeur renvoyée est différente de zéro. Si l'élément suivant n'existe pas alors la valeur renvoyée sera zéro. Pour programmeurs expérimentés: La valeur renvoyée par cette commande est un pointeur vers les données du nouvel élément ou zéro si l'élément suivant n'existe pas.

Exemple

  NewList scores.w()

  For i=1 To 10
    AddElement(scores())
    scores() = 100 - i
  Next

  ResetList(scores())
  While NextElement(scores())
    ; Ceci est correct car le premier appel à NextElement() va déplacer l'élément courant vers le premier élément de la liste
    MessageRequester("Score", Str(scores()), #PB_MessageRequester_OK)
  Wend


PopListPosition()

Syntaxe

PopListPosition(LinkedList())
Description
Restaure l'élément courant de la liste, précédemment mise en mémoire avec PushListPosition().

Arguments

LinkedList() Le nom de la liste chaînée, créée avec la fonction NewList.
Vous devez inclure les parenthèses après le nom de la liste.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

L'état de la liste sera le même que celui de l'appel correspondant à PushListPosition(). S'il n'y avait pas d'élément courant après un PushListPosition() alors il n'y a pas d'élément courant après cet appel aussi.

Voir la fonction PushListPosition() pour un exemple.

Voir aussi

PushListPosition(), SelectElement(), ChangeCurrentElement(), NextElement(), PreviousElement(), ForEach


PreviousElement()

Syntaxe

Resultat = PreviousElement(Liste())
Description
L'élément précédent dans la liste spécifiée devient l'élément courant. Cette fonction renvoie dans Resultat l'adresse du nouvel élément courant ou 0 s'il n'y a pas d'élément précédent ou s'il n'y a pas d'éléments dans la liste.

Arguments

Liste() - Le nom de votre variable liste, créée à l'aide de la commande NewList. Les parenthèses sont obligatoires après le nom de la liste.

Valeur de retour

La valeur renvoyée par cette commande peut être utilisée pour déterminer si l'élément précédent existe ou pas (il n'existera pas si vous êtes au début de la liste). Si l'élément précédent existe, cette commande renvoie une valeur différente de zéro. Si l'élément précédent n'existe pas alors la valeur renvoyée sera zéro. Pour programmeurs expérimentés:
La valeur renvoyée par cette commande est un pointeur vers les données de l'élément précédent ou zéro si l'élément précédent n'existe pas.

Exemple

  NewList nombres.w()

  For i=1 To 10
    AddElement(nombres())
    nombres() = i
  Next

  Repeat
    MessageRequester("Nombre ", Str(nombres()), #PB_MessageRequester_OK)
  Until PreviousElement(nombres()) = 0


PushListPosition()

Syntaxe

PushListPosition(LinkedList())
Description
Mémorise l'élément courant (s'il existe) de la liste afin qu'il puisse être restauré plus tard en utilisant PopListPosition(). La position est mémorisé sur une structure de pile, donc plusieurs appels à cette fonction sont possibles.

Arguments

LinkedList() Le nom de la liste chaînée, créée avec la fonction NewList.
Vous devez inclure les parenthèses après le nom de la liste.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette fonction peut être utilisée pour sauvegarder l'élément courant, donc une itération peut être faite sur la liste en utilisant NextElement() ou foreach et l'élément courant peut être restauré après l'itération en utilisant PopListPosition(). Plusieurs appels à cette fonction peuvent être fait, aussi longtemps que chacun est équilibré avec un appel PopListPosition() correspondant.

Note: Il n'est pas permis de supprimer un élément qui a été mémorisé, en utilisant DeleteElement() ou ClearList(). Cela peut entraîner un plantage lors de l'appel de PopListPosition() parce que la mémoire n'est plus valide.

Exemple

  NewList Nombres()
  AddElement(Nombres()): Nombres() = 1
  AddElement(Nombres()): Nombres() = 2
  AddElement(Nombres()): Nombres() = 5
  AddElement(Nombres()): Nombres() = 3
  AddElement(Nombres()): Nombres() = 5
  AddElement(Nombres()): Nombres() = 2

  ; Un simple élimination de doublon
  ;
  ForEach Nombres()
    Valeur = Nombres()
    PushListPosition(Nombres())
    While NextElement(Nombres())
      If Nombres() = Valeur
        DeleteElement(Nombres())
      EndIf
    Wend
    PopListPosition(Nombres())
  Next

  ForEach Nombres()
    Debug Nombres()
  Next

Voir aussi

PopListPosition(), SelectElement(), ChangeCurrentElement(), NextElement(), PreviousElement(), ForEach


ResetList()

Syntaxe

ResetList(Liste())
Description
Change l'index de l'élément courant et le place avant le premier élément de la liste. Donc il n'y a plus d'éléments de valides. C'est particulierement utile en combinaison avec 'While' et NextElement().

Arguments

Liste() - Le nom de votre variable liste, créée à l'aide de la commande NewList. Les parenthèses sont obligatoires après le nom de la liste.

Valeur de retour

Aucune

Exemple

  NewList Amis.s()

  AddElement(Amis())
  Amis() = "Arnaud"

  AddElement(Amis())
  Amis() = "Seb"

  ResetList(Amis())
  While NextElement(Amis())
    Debug Amis() ; Affiche tous les éléments de la liste
  Wend


SelectElement()

Syntaxe

SelectElement(Liste(), Position)
Description
Déplace l'élément courant de la liste à la position spécifiée. Le premier élément de la liste est à la position 0, le suivant à la position 1 et ainsi de suite. Ceci est très utile si vous souhaitez sauter à une position précise de la liste sans avoir à gérer vous même le parcours des éléments un à un jusqu'à la position souhaitée.

Comme les listes n'utilisent pas d'index, un saut d'élément en élément est effectué jusqu'à la position cible recherchée. Si une commande plus rapide est nécessaire, utilisez la commande ChangeCurrentElement().

Arguments

Liste() - Le nom de votre variable liste, créée à l'aide de la commande NewList. Les parenthèses sont obligatoires après le nom de la liste.

Position - La position de l'élément à sélectionner dans la liste en sachant que le premier élément se situe à la position 0, le deuxième à la position 1, etc.. Assurez-vous de ne pas spécifier une position située en dehors de la liste (valeur négative ou supérieure à ListSize() -1) !

Valeur de retour

Renvoie un pointeur vers les données de l'élément sélectionné ou zéro si la position est hors limite.

Exemple

  NewList MaListe.l()

  AddElement(MaListe()) : MaListe() = 23
  AddElement(MaListe()) : MaListe() = 56
  AddElement(MaListe()) : MaListe() = 12
  AddElement(MaListe()) : MaListe() = 73

  SelectElement(MaListe(), 0)
  MessageRequester("Position", "A la position 0, la valeur est "+Str(MaListe()),0)

  SelectElement(MaListe(), 2)
  MessageRequester("Position", "A la position 2, la valeur est "+Str(MaListe()),0)

  SelectElement(MaListe(), 1)
  MessageRequester("Position", "A la position 1, la valeur est "+Str(MaListe()),0)

  SelectElement(MaListe(), 3)
  MessageRequester("Position", "A la position 3, la valeur est "+Str(MaListe()),0)


SplitList()

Syntaxe

SplitList(ListeSource(), ListeDestination() [, GarderElementCourant])
Description
Découpe une liste en deux. Déplace les éléments de la liste ListeSource(), l'élément courant y compris, vers la liste ListeDestination(). Cette opération est rapide car les données elles-même ne sont pas déplacées.

Arguments

ListeSource() | La liste à partir de laquelle les éléments seront déplacés. L'élément courant de la liste précise le point de division de la liste. S'il n'y a pas d'élément courant, alors tous les éléments restent dans ListeSource().
ListeDestination() | La liste vers laquelle les éléments seront déplacés. Tous les éléments existants dans cette liste sont supprimés avant l'ajout des nouveaux éléments.
GarderElementCourant (optionnel) | Indique si l'élément courant de ListeSource() reste dans ListeSource() ou s'il est déplacé vers ListeDestination(). Si ce paramètre est #True alors l'élément courant reste dans ListeSource(). S'il est #False (par défaut) alors l'élément courant est déplacé vers ListeDestination().

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Si 'GarderElementCourant' est fixé à #True alors le nouvel élément courant dans ListeSource() sera l'élément précédent de la liste. S'il n'y a pas d'élément précédent alors la liste n'aura plus d'élément courant. La ListeDestination() n'aura aucun élément courant.

Exemple

  NewList A()
  NewList B()

  For i = 0 To 10
    AddElement(A())
    A() = i
  Next i

  ; Coupe en deux la liste A() à l'élément 5 et déplace les éléments restants dans la liste B()
  SelectElement(A(), 5)
  SplitList(A(), B())

  Debug " -- A() -- "
  ForEach A()
    Debug A()
  Next

  Debug " -- B() -- "
  ForEach B()
    Debug B()
  Next

Voir aussi

MergeLists()


SwapElements()

Syntaxe

SwapElements(linkedlist(), *PremierElement, *DeuxiemeElement)
Description
Permute la place de 2 éléments de la liste spécifiée. Les paramètres '*PremierElement' et '*DeuxiemeElement' doivent être des pointeurs vers des éléments valides, appartenant à la liste en question. Cette fonction est particulièrement utile pour réorganiser ou trier rapidement une liste. Elle doit être utilisée avec prudence, par des programmeurs expérimentés.

Arguments

Liste() - Le nom de la liste, créée à l'aide de la commande NewList. Les parenthèses sont obligatoires après le nom de la liste.

*PremierElement - Adresse du premier élément à échanger. Vous pouvez récupérer cette adresse en utilisant l'opérateur @ sur le nom de la liste.

*DeuxiemeElement - Adresse du deuxième élément à échanger. Vous pouvez récupérer cette adresse en utilisant l'opérateur @ sur le nom de la liste.

Valeur de retour

Aucune.

Exemple

  NewList Nombres()

  For k=0 To 10
    AddElement(Nombres())
    Nombres() = k
  Next

  SelectElement(Nombres(), 3) ; Sélectionne le 4ème élément
  *PremierElement = @Nombres()

  SelectElement(Nombres(), 9) ; Sélectionne le 10ème élément
  *DeuxiemeElement = @Nombres()

  ; Echange le 4ème et le 10ème
  ;
  SwapElements(Nombres(), *PremierElement, *DeuxiemeElement)

  ; Prouvons-le
  ;
  ForEach Nombres()
    Debug Nombres()
  Next

Voir aussi

MoveElement()


Mail

PureBasic - Mail

Généralités

Les e-mails sont maintenant un moyen commun pour communiquer entre deux ordinateurs distants. Cette bibliothèque permet de créer des e-mails, avec ou sans attachement et de les envoyer à un ou plusieurs destinataires. En outre, les pièces jointes facultatives peuvent être faites au moment voulu. Elles peuvent ensuite être envoyées par un serveur de messagerie.

Toutes ces commandes sont basées sur la bibliothèque network, donc InitNetwork() doit être appelé avant de pouvoir les utiliser.

Sommaire des commandes

AddMailAttachment
AddMailAttachmentData
AddMailRecipient
CreateMail
FreeMail
GetMailAttribute
GetMailBody
IsMail
MailProgress
RemoveMailRecipient
SendMail
SetMailAttribute
SetMailBody

Exemple

Mail.pb

OS Supportés

Tous

Guide de référence - Index


AddMailAttachment()

Syntaxe

Resultat = AddMailAttachment(#Mail, Description$, Fichier$ [, MimeType$])
Description
Ajoute un 'Fichier$' comme pièce jointe au #Mail. La 'Description$' sera le texte qui apparaitra à côté du fichier lors de l'affichage du mail. 'Fichier$' est le nom du fichier à ajouter au #Mail. Une fois que la pièce jointe a été ajoutée, son contenu est entièrement copié dans le mail. Si la pièce jointe ne peut pas être créée, le 'Resultat' sera 0.

Le paramètre facultatif 'MimeType$' permet de spécifier le type de fichier joint. Si ce paramètre est omis, alors l'extension du fichier sera utilisé pour déterminer le type mime, à partir de la liste ci-dessous. Si le type n'est pas dans la liste alors le type "application/octet-stream" sera utilisé.
  application/acad          | AutoCAD    dwg
  application/clariscad     | ClarisCAD  ccad
  application/drafting      | MATRA Prelude drafting   drw
  application/dxf           | AutoCAD  dxf
  application/i-deas        | SDRC I-deas  unv
  application/iges          | Format d'échange CAO IGES   igs,iges
  application/oda           | ODA  oda
  application/pdf           | Adobe Acrobat  pdf
  application/postscript    | PostScript   ai,eps,ps
  application/pro_eng       | ProEngineer  prt
  application/rtf           | Rich text   rtf
  application/set           | CAO SET  set
  application/sla           | stéréolithographie   stl
  application/solids        | MATRA Solids   dwg
  application/step          | Données STEP  step
  application/vda           | Surface   vda
  application/x-mif         | Framemaker   mif
  application/x-csh         | Script C-Shell (UNIX)   dwg
  application/x-dvi         | texte dvi  dvi
  application/hdf           | Données   hdf
  application/x-latex       | LaTEX  latex
  application/x-netcdf      | NetCDF   nc,cdf
  application/x-sh          | Script Bourne Shell   dwg
  application/x-tcl         | Script Tcl  tcl
  application/x-tex         | Fichiers Tex  tex
  application/x-texinfo     | eMacs  texinfo,texi
  application/x-troff       | Troff  t,tr,troff
  application/x-troff-man   | Troff/macro man  man
  application/x-troff-me    | Troff/macro ME   me
  application/x-troff-ms    | Troff/macro MS   ms
  application/x-wais-source | Source Wais   src
  application/x-bcpio       | CPIO binaire  bcpio
  application/x-cpio        | CPIO Posix  cpio
  application/x-gtar        | Tar GNU   gtar
  application/x-shar        | Archives Shell  shar
  application/x-sv4cpio     | CPIO SVR4n  sv4cpio
  application/x-sv4crc      | CPIO SVR4 avec CRC  sc4crc
  application/x-tar         | Archive tar   tar
  application/x-ustar       | Archive tar Posix   man
  application/zip           | Archive ZIP   man
  audio/basic               | Audio   au,snd
  audio/x-aiff              | Audio AIFF   aif,aiff,aifc
  audio/x-wav               | Audio Wave   wav
  image/gif                 | Images gif  man
  image/ief                 | Images exchange format  ief
  image/jpeg                | Images Jpeg   jpg,jpeg,jpe
  image/png                 | Images Png  png
  image/tiff                | Images Tiff   tiff,tif
  image/x-cmu-raster        | Raster cmu  cmu
  image/x-portable-anymap   | Anymap PBM   pnm
  image/x-portable-bitmap   | Bitmap PBM   pbm
  image/x-portable-graymap  | Graymap PBM  pgm
  image/x-portable-pixmap   | Pixmap PBM   ppm
  image/x-rgb               | Image RGB   rgb
  image/x-xbitmap           | Images Bitmap X   xbm
  image/x-xpixmap           | Images Pixmap X   xpm
  image/x-xwindowdump       | Images dump X Window  man
  multipart/x-zip           | Archive zip  zip
  multipart/x-gzip          | Archive GNU zip  gz,gzip
  text/html                 | HTML   htm,html
  text/plain                | Texte sans mise en forme   txt,g,h,c,cc,hh,m,f90
  text/richtext             | Texte enrichi   rtx
  text/tab-separated-value  | Texte avec séparation des valeurs  tsv
  text/x-setext             | Texte Struct   etx
  video/mpeg                | Vidéos MPEG   mpeg,mpg,mpe
  video/quicktime           | Vidéos QuickTime  qt,mov
  video/msvideo             | Vidéos Microsoft Windows  avi
  video/x-sgi-movie         | Vidéos MoviePlayer  movie
Note: il est possible d'ajouter autant de pièces jointes que désiré, mais la taille d'une pièce jointe ne pourra pas dépasser 100 Mo. La plupart des serveurs et des clients mails ne pourront de toutes facons pas les gérer, donc il est conseillé de garder une taille raisonnable pour les pièces jointes.

Exemple

  InitNetwork()

  If CreateMail(0, "test@purebasic.com", "Hello")
    If AddMailAttachment(0, "Attachment 1", OpenFileRequester("Choisissez un fichier", "", "", 0))
      Debug "Pièce jointe correctement créé"
    Else
      Debug "Impossible de créer la pièce jointe "
    EndIf
  EndIf


AddMailAttachmentData()

Syntaxe

Resultat = AddMailAttachmentData(#Mail, Description$, *Buffer, TailleBuffer [, MimeType$])
Description
Ajoute une zone de mémoire comme pièce jointe au #Mail. La 'Description$' sera le texte qui apparaitra à côté du fichier lors de l'affichage du mail. '*Buffer' et 'TailleBuffer' représente la zone de mémoire et sa taille à ajouter au #Mail en tant que pièce jointe. Une fois que la pièce jointe a été ajoutée, son contenu est entièrement copié dans le mail donc la zone de mémoire peut être libérée ou modifiée. Si la pièce jointe ne peut pas être créée, le 'Resultat' sera 0.

Vous trouverez plus d'informations concernant le paramètre optionnel 'MimeType$' avec la commande AddMailAttachment().

Note: il est possible d'ajouter autant de pièces jointes que désiré, mais la taille d'une pièce jointe ne pourra pas dépasser 100 Mo. La plupart des serveurs et des clients mails ne pourront de toutes facons pas les gérer, donc il est conseillé de garder une taille raisonnable pour les pièces jointes.

Exemple

  InitNetwork()

  If CreateMail(0, "test@purebasic.com", "Hello")

    If AddMailAttachmentData(0, "Attachment 1", ?Hello, 5)
      Debug "Piece jointe ajoutee"
    Else
      Debug "Impossible d'ajouter la pièce jointe"
    EndIf
  EndIf

  DataSection
    Hello:
      Data.b 'H', 'e', 'l', 'l', 'o'


AddMailRecipient()

Syntaxe

AddMailRecipient(#Mail, Adresse$, Options)
Description
Ajoute un destinataire au #Mail spécifié. L'Adresse$' doit être dans un format correct ou le mail ne sera pas envoyé. 'Options' est une combinaison des valeurs suivantes:
  #PB_Mail_To : Destinataire principal du mail
  #PB_Mail_Cc : Destinataire en copie (tout le monde le voit)
  #PB_Mail_Bcc: Destinataire en copie invisible (personne ne le voit)

Exemple

  InitNetwork()

  If CreateMail(0, "test@purebasic.com", "Hello")
    AddMailRecipient(0, "andre@purebasic.com", #PB_Mail_To) ; Andre est le destinataire principal
    AddMailRecipient(0, "fred@purebasic.com", #PB_Mail_Cc)  ; Fred reçoit une copie du mail
    AddMailRecipient(0, "timo@purebasic.com", #PB_Mail_Bcc) ; Timo reçoit une copie du mail aussi mais Andre et Fred ne le savent pas
  EndIf


CreateMail()

Syntaxe

Resultat = CreateMail(#Mail, De$, Objet$ [, Encodage])
Description
Crée un nouveau #Mail. Si #PB_Any est utilisé pour le paramètre '#Mail', le numéro du mail sera renvoyé dans 'Resultat'. 'De$' sera l'adresse de retour utilisée pour le mail. 'Objet$' sera la ligne qui résume le contenu du #Mail. 'Encodage' est facultatif et peut prendre une des valeurs suivantes:
  @pb_ascii: Le contenu du mail sera en ascii (valeur par défaut)
  @pb_utf8: Le contenu du mail sera en UTF-8
Si le mail ne peut pas être créé correctement, le 'Resultat' sera 0.

SetMailBody(), SetMailAttribute(), AddMailAttachment() et AddMailAttachmentData() permet d'agir sur le contenu du #Mail.

Exemple

  InitNetwork()

  If CreateMail(0, "test@purebasic.com", "Hello")
    SetMailBody(0, "Ceci est un essai !"+LF$+"2ème ligne")
    Debug "Mail cree"
  Else
    Debug "Impossible de créer le mail"
  EndIf


FreeMail()

Syntaxe

FreeMail(#Mail)
Description
Supprime le #Mail et libère sa mémoire associée.

Si #PB_All est spécifié, tous les mails restants seront libérés.

Note: tous les mails restants sont automatiquement supprimés quand le programme se termine.


GetMailAttribute()

Syntaxe

Resultat$ = GetMailAttribute(#Mail, Attribut)
Description
Renvoie l'attribut du #Mail. 'Attribut' peut être une des valeurs suivantes:
  #PB_Mail_From   : Renvoie l'adresse de retour définie par CreateMail().
  #PB_Mail_Subject: Renvoie l'objet défini par CreateMail().
  #PB_Mail_XMailer: Renvoie le champ 'X-Mailer' (s'il existe)
  #PB_Mail_Date   : Renvoie le champ 'Date' (s'il existe)
  #PB_Mail_Custom : Renvoie les champs utilisateurs (s'ils existent)

Exemple

  InitNetwork()

  If CreateMail(0, "test@purebasic.com", "Hello")
    Debug GetMailAttribute(0, #PB_Mail_From)    ; Affichera "test@purebasic.com"
    Debug GetMailAttribute(0, #PB_Mail_Subject) ; Affichera "Hello"
  EndIf
SetMailAttribute() est disponible pour modifier les attributs du #Mail.


GetMailBody()

Syntaxe

Resultat$ = GetMailBody(#Mail)
Description
Renvoi le contenu du #Mail, préalablement défini par SetMailBody().

Exemple

  InitNetwork()

  If CreateMail(0, "test@purebasic.com", "Hello")
    SetMailBody(0, "C'est le contenu")
    Debug GetMailBody(0) ; Affichera "C'est le contenu"
  EndIf


IsMail()

Syntaxe

Resultat = IsMail(#Mail)
Description
Teste si le #Mail est correctement initialisé. Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. Si le 'Résultat' est différent de zéro, alors cet objet est valide. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.


MailProgress()

Syntaxe

Resultat = MailProgress(#Mail)
Description
Renvoie la progression de l'envoi du #Mail, démarré par SendMail().

'Resultat' est le nombre d'octets déjà envoyés ou une des valeurs suivantes:
  #PB_Mail_Connected: L'envoi du mail est dans sa phase d'initialisation.
  #PB_Mail_Finished : Le mail a été correctement envoyé.
  #PB_Mail_Error    : Le mail n'a pas pu être envoyé, car une erreur est survenue.


RemoveMailRecipient()

Syntaxe

RemoveMailRecipient(#Mail, [, Addresse$ [, Options])
Description
Supprimer un destinataire de l'e-mail spécifiée. 'Options' est une combinaison des valeurs suivantes: Remove all recipients from the specified mail.

Arguments

#Mail Le courrier à utiliser.
Addresse$ (optionnel) L'adresse à supprimer.

L'adresse doit être dans un format correct ou le mail ne sera pas envoyé et doit correspondre à une adresse à partir d'un appel à AddMailRecipient().

S'il n'est pas spécifié, tous les destinataires sont retirés de l'e-mail.
Options La ou les catégories à partir de laquelle supprimer le destinataire. Peut être une combinaison des valeurs suivantes:
  #PB_Mail_To : Principal(aux) destinataire(s) du courrier.
  #PB_Mail_Cc : Destinataire(s) en copie conforme (tout le monde le voit).
  #PB_Mail_Bcc: Destinataire(s) en copie invisible (personne ne le voit).
S'il n'est pas spécifié, toutes les catégories sont retirés pour l'adresse indiquée.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  InitNetwork()

    AddMailRecipient(0, "andre@purebasic.com", #PB_Mail_To) ; Andre est le destinataire principal
    AddMailRecipient(0, "fred@purebasic.com", #PB_Mail_Cc)  ; Fred reçoit une copie du mail
    AddMailRecipient(0, "timo@purebasic.com", #PB_Mail_Bcc) ; Timo reçoit une copie du mail aussi mais Andre et Fred ne le savent pas

    ; Assurez-vous que Fred soit retiré de toutes les destinations :-)
    RemoveMailRecipient(0, "fred@purebasic.com")
  EndIf

Voir aussi

AddMailRecipient()


SendMail()

Syntaxe

Resultat = SendMail(#Mail, Smtp$ [, Port [, Asynchrone [, Identifiant$, MotdePasse$]])
Description
Envoie le #Mail spécifié.

Arguments

#Mail | Le courrier à utiliser.
Smtp$ | L'adresse du serveur mail qui sera utilisé pour envoyer le mail.
Port (optionnel) | Le port du serveur mail (par défaut 25).
Asynchronous (optionnel) Si le transfert doit être fait en arrière-plan.

Si ce paramètre n'est pas nulle, alors la fonction retourne immédiatement et la progression peut être contrôlée avec la fonction MailProgress().

Si ce paramètre est égal à zéro ou non spécifié, alors la fonction bloc jusqu'à ce que le mail ait été envoyé ou s'il y avait une erreur.
Identifiant$, MotdePasse$ (optionnel) | L'utilisateur et le mot de passe utilisé pour l'authentification SMTP, si le serveur les requiers.

Valeur de retour

Renvoie une valeur non nulle si le courrier a été envoyé correctement ou zéro sinon.

Exemple

  InitNetwork()

  ; Note: changez l'adresse de destination et le smtp pour avoir un exemple fonctionnel.
  ;
  If CreateMail(0, "test@votreadresse.com", "Salut")
    AddMailRecipient(0, "votreadresse@votreadresse.com", #PB_Mail_To)

    Debug SendMail(0, "smtp.votresmtpici.com")
  EndIf

Voir aussi

CreateMail(), MailProgress()


SetMailAttribute()

Syntaxe

SetMailAttribute(#Mail, Attribut, Valeur$)
Description
Modifie l'attribut du #Mail. 'Attribut' peut être une des valeurs suivantes:
  #PB_Mail_From   : Change l'adresse de retour définie par CreateMail().
  #PB_Mail_Subject: Change l'objet défini par CreateMail().
  #PB_Mail_XMailer: Change le champ 'X-Mailer' (par défaut: aucun)
  #PB_Mail_Date   : Change le champ 'Date' (par défaut la date de l'ordinateur)
  #PB_Mail_Custom : Change les champs utilisateurs (peuvent être sur plusieurs lignes)

Exemple

  InitNetwork()

  If CreateMail(0, "test@purebasic.com", "Hello")
    SetMailAttribute(0, #PB_Mail_XMailer, "PureMailer")
    Debug GetMailAttribute(0, #PB_Mail_XMailer) ; Affichera "PureMailer"
  EndIf


SetMailBody()

Syntaxe

SetMailBody(#Mail, CorpsMessage$)
Description
Modifie le contenu du #Mail. GetMailBody() est disponible pour le récupérer.

Arguments

#Mail | Le courrier à utiliser.
Body$ | Le texte du nouveaux corps de message.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Selon le standard RFC 2822 un saut de ligne dans un e-mail utilise #CRLF$ .

Exemple

  InitNetwork()

  If CreateMail(0, "test@purebasic.com", "Hello")
    SetMailBody(0, "C'est le contenu")
    Debug GetMailBody(0) ; Affichera "C'est le contenu"
  EndIf

Voir aussi

GetMailAttribute(), CreateMail()


Map

PureBasic - Map

Généralités

Les maps (aussi connues sous la dénomination 'table de hachage' ou 'dictionnaire') sont des structures pour stocker des données qui sont allouées dynamiquement en fonction du besoin. C'est une collection d'éléments qui sont complètement indépendants les uns des autres. Il est possible d'ajouter autant d'éléments que désiré (limité uniquement par la quantité de mémoire disponible), et de les consulter à l'aide d'une clef. Ce type de gestion de données est très utile quand un accès rapide à un élément quelconque est requis. L'ordre d'insertion des éléments n'est pas conservé (contrairement à une liste chaînée), une map ne peut donc pas être triée.

Avant de travailler avec les maps, il faut préalablement les déclarer. Cela se fait avec le mot-clef NewMap. Les structures sont également fréquemment utilisées pour enregistrer leur contenu.

Pour analyser le contenu d'une map, il est possible d'utiliser les boucles suivantes: For : Next, ForEach : Next, Repeat : Until ou While : Wend.

Les autres possibilités pour stockées des données multiples sont les Tableaux et les Listes.

Sommaire des commandes

AddMapElement
ClearMap
CopyMap
DeleteMapElement
FindMapElement
FreeMap
MapKey
MapSize
NextMapElement
PopMapPosition
PushMapPosition
ResetMap

OS Supportés

Tous

Guide de référence - Index


AddMapElement()

Syntaxe

Resultat = AddMapElement(Map(), Clef [, Option])
Description
Ajoute un nouvel élément vide dans la Map() avec la 'Clef' spécifiée. Ce nouvel élément devient l'élément courant de la map. Si le 'Resultat' est 0, alors l'élément n'a pas été ajouté (manque de mémoire), sinon il représente le pointeur vers les données de l'élément.

'Options' est un paramètre facultatif qui peut prendre l'une des valeurs suivantes:
  #PB_Map_ElementCheck  : Vérifie si un élément avec la 'Clef' spécifiée existe déjà dans la map, et le remplace (défaut).
  #PB_Map_NoElementCheck: Pas de vérification, donc si un élément avec la 'Clef' spécifiée existe déjà, il sera perdu
                      et inaccessible. Sa mémoire ne sera libérée que si ClearMap() est utilisé. Ce mode est plus rapide
                      mais plus dangereux: à utiliser avec précaution.
Note: Cette fonction n'est pas obligatoire pour gérer les maps, car les éléments sont ajoutés automatiquement quand une valeur est affectée à une nouvelle clef.

Exemple:
  NewMap Pays.s()

  ; Manière normale d'ajouter un élément
  Pays("US") = "United State"

  ; Et maintenant en utilisant 'AddMapElement()'
  AddMapElement(Pays(), "FR")
  Pays() = "France"

  ForEach Pays()
    Debug Pays()
  Next


ClearMap()

Syntaxe

ClearMap(Map())
Description
Efface tous les éléments dans la Map() spécifiée et libère la mémoire associée. Après cette opération, la map est toujours utilisable, mais elle ne contient plus d'éléments.

Exemple:
  NewMap Pays.s()

  Pays("FR") = "France"
  Pays("US") = "United States"

  ; La preuve que des éléments ont été ajoutés à la map
  MessageRequester("Information", "Il y a "+Str(MapSize(Pays()))+" éléments dans la map")

  ; Efface les éléments de la map
  ClearMap(Pays())
  MessageRequester("Information", "Il y a "+Str(MapSize(Pays()))+" éléments dans la map")

Note: PureBasic libèrera seulement la mémoire occupée par les éléments. Si la map a été utilisée pour stocker des objets dynamiques, il n'est pas possible de le détecter (en PureBasic ou dans un autre langage). Dans ce cas, il convient de libérer tous ces objets avant la destruction de la liste.


CopyMap()

Syntaxe

Resultat = CopyMap(MapSource(), MapDestination())
Description
Copie tous les éléments de la 'MapSource()' dans la 'MapDestination()'. Si les deux maps ne sont pas du même type (natif ou structuré) la copie ne se fera pas, et 'Resultat' sera égal à zéro. Tous les éléments présents dans la 'MapDestination()' seront effacés. Après une copie réussie, les deux maps seront identiques.

Exemple

  NewMap Age()
  NewMap AgeCopie()

  Age("Jean")  = 15
  Age("Elise") = 30

  CopyMap(Age(), AgeCopie())

  Debug AgeCopy("Jean")
  Debug AgeCopy("Elise")


DeleteMapElement()

Syntaxe

DeleteMapElement(Map() [, Clef$])
Description
Efface l'élément courant de la 'Map()' spécifiée. Après cette opération, le nouvel élément courant est l'élément précédent celui venant d'être effacé, mais comme une map n'est pas ordonnée, ce peut être n'importe quel élément. Si cet élément n'existe pas (le premier élément a été effacé), alors il n'y aura plus d'élément courant (il sera avant le premier élément, comme après un ResetMap()).

Si le paramètre facultatif 'Clef$' est spécifié, l'élément associé à cette clef sera supprimé de la map (s'il existe). Il n'y a plus d'élément courant après cette opération.

Exemple:
  NewMap Pays.s()

  Pays("US") = "United States"
  Pays("FR") = "France"
  Pays("DE") = "Allemagne"

  ; Supprime un pays
  DeleteMapElement(Pays(), "FR")

  ForEach Pays()
    Debug Pays()
  Next


FindMapElement()

Syntaxe

Resultat = FindMapElement(Map(), Clef$)
Description
Change l'élément courant de la map par celui associé à la 'Clef$' spécifiée. Si le 'Resultat' est 0, il n'y a pas d'élément correspondant à cette clef, sinon il représente le pointeur vers les données de l'élément.

Exemple:
  NewMap Pays.s()

  Pays("US") = "United States"
  Pays("FR") = "France"
  Pays("DE") = "Allemagne"

  If FindMapElement(Pays(), "US")
    Debug "'US' est dans la liste des Pays."
  Else
    Debug "'US' n'est PAS dans la liste des Pays !"
  EndIf

  If FindMapElement(Pays(), "UK")
    Debug "'UK' est dans la liste des Pays."
  Else
    Debug "'UK' n'est PAS dans la liste des Pays !"
  EndIf


FreeMap()

Syntaxe

FreeMap(Map())
Description
Détruit la 'Map()' et libère toutes les ressources associées. Pour continuer à l'utiliser, NewMap doit être appelé.


MapKey()

Syntaxe

Key$ = MapKey(Map())
Description
Renvoie la clef de l'élément courant de la map. S'il n'y a pas d'élément courant, une chaîne de caractères vide est renvoyée.

Exemple:
  NewMap Pays.s()

  Pays("US") = "United States"
  Pays("FR") = "France"
  Pays("DE") = "Allemagne"

  ForEach Pays()
    Debug MapKey(Pays())
  Next


MapSize()

Syntaxe

Resultat = MapSize(Map())
Description
Renvoie le nombre d'éléments contenus dans la map spécifiée. Cette fonction ne modifie pas l'élément courant. Elle est très rapide (elle utilise une valeur précalculée) et peut être utilisée sereinement pour savoir si une map est vide ou non.

Exemple:
  NewMap Pays.s()

  Pays("FR") = "France"
  Pays("US") = "United States"

  ; Affichera '2'
  Debug "Taille de la map: " + Str(MapSize(Pays()))


NextMapElement()

Syntaxe

Resultat = NextMapElement(Map())
Description
Passe de l'élément courant à l'élément suivant de la map, ou au premier élément si vous avez précédemment fait appel à ResetMap(). Si le 'Resultat' est 0, il n'y a plus d'élément suivant dans la map, sinon il représente le pointeur vers les données de l'élément.

Exemple:
  NewMap Pays.s()

  Pays("US") = "United States"
  Pays("FR") = "France"
  Pays("DE") = "Allemagne"

  ResetMap(Pays())
  While NextMapElement(Pays())
    Debug Pays()
  Wend


PopMapPosition()

Syntaxe

PopMapPosition(Map())
Description
Restaure l'élément courant de la map, précédemment mise en mémoire avec PushMapPosition().

Arguments

Map() La map à utiliser.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

L'état de la map sera le même que celui de l'appel correspondant à PushMapPosition(). S'il n'y avait pas d'élément courant après un PushMapPosition() alors il n'y a pas d'élément courant après cet appel aussi.

Voir la fonction PushMapPosition() pour un exemple.

Voir aussi

PushMapPosition(), FindMapElement(), NextMapElement(), ResetMap(), ForEach


PushMapPosition()

Syntaxe

PushMapPosition(Map())
Description
Mémorise l'élément courant (s'il existe) de la map. Il pourra être restauré à l'aide de PopMapPosition(). La position est sauvgardée dans une structure de pile, donc plusieurs appels à cette fonction sont possibles.

Arguments

Map() La map à utiliser.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette fonction peut être utilisée pour sauvegarder l'élément courant, donc une itération peut être utilisée sur la carte en utilisant NextMapElement() ou foreach et l'élément courant peut être restauré après l'itération en utilisant PopMapPosition(). Plusieurs appels peuvent être fait à cette fonction, aussi longtemps que chacun est équilibré avec un appel PopMapPosition() correspondant.

Note: Il n'est pas permis de supprimer un élément qui a été mémorisé, en utilisant DeleteMapElement() ou ClearMap() function. Cela peut entraîner un plantage lors de l'appel de PopMapPosition() parce que la mémoire n'est plus valide.

Exemple

  NewMap Nombres()
  Nombres("A") = 1
  Nombres("B") = 2
  Nombres("C") = 5
  Nombres("D") = 3
  Nombres("E") = 2
  Nombres("F") = 5

  ; Un simple élimination de doublon
  ;
  ForEach Nombres()
    Value = Nombres()
    PushMapPosition(Nombres())
    While NextMapElement(Nombres())
      If Nombres() = Value
        DeleteMapElement(Nombres())
      EndIf
    Wend
    PopMapPosition(Nombres())
  Next

  ForEach Nombres()
    Debug Nombres()
  Next

Voir aussi

PopMapPosition(), FindMapElement(), NextMapElement(), ResetMap(), ForEach


ResetMap()

Syntaxe

ResetMap(Map())
Description
Change l'élément courant et le place avant le premier élément de la map. Donc il n'y a plus d'élément courant valide. C'est particulièrement utile pour parcourir tous les éléments avec NextMapElement().

Exemple:
  NewMap Pays.s()

  Pays("US") = "United States"
  Pays("FR") = "France"
  Pays("DE") = "Allemagne"

  ResetMap(Pays())
  While NextMapElement(Pays())
    Debug Pays()
  Wend


Material

PureBasic - Material

Généralités

Les matières ou matériaux sont composés d'une ou plusieurs textures et parfois de couleurs.

Elles sont utilisées par les objets 3D tels que les 'Entités', les 'Billboards' et les 'Particules'.

Chaque matière regroupe un grand nombre de propriétés tel que l'éclairage, la couleur spéculaire et de réfraction, etc, ce qui permet à une matière de ressembler à un revêtement complexe comme le verre, l'eau, le bois...

InitEngine3D() doit être correctement initialisé avant de pouvoir utiliser ces commandes.

Les mots 'matière' et 'matériau' sont considérés ici comme synonymes afin d'alléger la lecture.

Sommaire des commandes

AddMaterialLayer
CopyMaterial
CountMaterialLayers
CreateMaterial
DisableMaterialLighting
FreeMaterial
GetMaterialAttribute
GetMaterialColor
GetScriptMaterial
IsMaterial
MaterialBlendingMode
MaterialCullingMode
MaterialDepthWrite
MaterialFilteringMode
MaterialFog
MaterialID
MaterialShadingMode
MaterialShininess
ReloadMaterial
RemoveMaterialLayer
ResetMaterial
RotateMaterial
ScaleMaterial
ScrollMaterial
SetMaterialColor

Exemple

Material.pb
AddMaterialLayer.pb
CopyMaterial.pb
GetScriptMaterial.pb
MaterialFog.pb
MaterialTransparent.pb
ReloadMaterial.pb
ResetMaterial.pb
ScaleMaterial.pb

OS Supportés

Tous

Guide de référence - Index


AddMaterialLayer()

Syntaxe

Resultat = AddMaterialLayer(#Matiere, TextureID [, Mode])
Description
Ajoute une nouvelle couche à une matière et lui affecte la texture spécifiée.

Arguments

#Matiere | La matière à utiliser.
TextureID La texture à utiliser.

Un numéro 'TextureID' valide est obtenu facilement à l'aide de la commande TextureID().
Mode (optionnel)
  #PB_Material_Add        : Combine la nouvelle couche en ajoutant (Add) la valeur des pixels
                            (donc le noir est complètement transparent)
  #PB_Material_Replace    : Combine la nouvelle couche en remplaçant (Replace) les pixels
  #PB_Material_AlphaBlend : Utilise le canal alpha de la texture
                            (la texture doit être en TGA ou PNG) et la combine avec la couche précédente
  #PB_Material_Modulate   : Combine la nouvelle couche sur la précédente en modulant la valeur des pixels (Modulate)
TextureCoordinateIndex (optionnel) | Index à utiliser pour les coordonnées de la texture (par défaut l'index = 0).

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Voir aussi

CountMaterialLayers(), RemoveMaterialLayer()


CopyMaterial()

Syntaxe

Resultat = CopyMaterial(#Matiere, #NouvelleMatiere)
Description
Crée une nouvelle matière qui est la copie exacte d'une matière spécifiée.

Arguments

#Matiere La matière à copier.
#NouvelleMatiere La copie, c'est une nouvelle matière.

Si #PB_Any est utilisé pour le paramètre '#NouvelleMatiere', le numéro de la nouvelle matière sera renvoyé dans 'Resultat'.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si la #NouvelleMatière était déjà créée, elle est automatiquement libérée et remplacée par la nouvelle.

Voir aussi

CreateMaterial(), FreeMaterial()


CountMaterialLayers()

Syntaxe

Resultat = CountMaterialLayers(#Matiere)
Description
Renvoie le nombre de couches d'une matière.

Arguments

#Matiere La matière à utiliser.

Valeur de retour

Renvoie le nombre de couches que contient la matière.

Voir aussi

AddMaterialLayer(), RemoveMaterialLayer()


CreateMaterial()

Syntaxe

Resultat = CreateMaterial(#Matiere, TextureID)
Description
Crée une nouvelle matière basée sur la texture spécifiée.

Arguments

#Matiere La nouvelle matière.
TextureID La texture à utiliser.

Si #PB_Any est utilisé pour le paramètre '#Matiere', le numéro de la nouvelle matière sera renvoyé dans 'Resultat'.

Un 'TextureID' valide est obtenu facilement à l'aide de la commande TextureID().

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si la #NouvelleMatière était déjà créée, elle est automatiquement libérée et remplacée par la nouvelle.

Voir aussi

FreeMaterial(), IsMaterial(), MaterialID()


DisableMaterialLighting()

Syntaxe

DisableMaterialLighting(#Matiere, Etat)
Description
Active ou désactive l'éclairage dynamique d'une matière.

Arguments

#Matiere La matière à utiliser.
Etat
  #True : L'éclairage dynamique est désactivé
  #False: L'éclairage dynamique est activé

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

L'objet qui utilisera cette matière ne sera pas affecté par les lumières dynamiques créées par CreateLight().

L'éclairage d'une matière est activée par défaut quand une matière est créée.

pour obtenir l'état courant du matériaux, voir GetMaterialAttribute()


FreeMaterial()

Syntaxe

FreeMaterial(#Matiere)
Description
Libère et détruit une matière.

Arguments

#Matiere La matière à détruire.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Les propriétés ainsi que la mémoire occupée par la matière sont libérées, donc cette matière ne peut plus être utilisée par un objet.

Attention: Tous les objets (entités, billboards, etc) qui utilisent cette matière devront être modifiés avant la destruction de la matière).

Toutes les matières sont automatiquement libérées quand le programme se termine.

Voir aussi

CreateMaterial()


GetMaterialAttribute()

Syntaxe

Resultat.f = GetMaterialAttribute(#Matiere, Attribut)
Description
Renvoie l'attribut de la matière.

Arguments

#Matiere La matière à utiliser.
Attribut L'attribut à obtenir. Il peut être une des valeurs suivantes:
  #PB_Material_Shininess     : La brillance tel que définie avec MaterialShininess().
  #PB_Material_TextureRotate : La rotation, en degré.
  #PB_Material_TextureUScale : La valeur uscale, voir ScaleMaterial().
  #PB_Material_TextureVScale : La valeur vscale, voir ScaleMaterial().
  #PB_Material_TextureUScroll: La valeur uscroll, voir ScrollMaterial().
  #PB_Material_TextureVScroll: La valeur vscroll, voir ScrollMaterial().
  #PB_Material_DepthWrite    : La valeur profondeur d'écriture, voir MaterialDepthWrite().
  #PB_Material_Lighting      : L'éclairage, voir DisableMaterialLighting().
  #PB_Material_ShadingMode   : La teinte, voir MaterialShadingMode().

Valeur de retour

Renvoie la valeur de la couleur RGB.

Les valeurs des canaux de couleur peuvent facilement être récupérées avec Red(), Green() et Blue().


GetMaterialColor()

Syntaxe

Resultat = GetMaterialColor(#Matiere, Type)
Description
Renvoie la couleur d'une matière.

Arguments

#Matiere La matière à utiliser.
Type Le type de couleur à obtenir. Il peut être une des valeurs suivantes:
  #PB_Material_AmbientColor:  La couleur utilisée par défaut, sans autre éclairage.
  #PB_Material_DiffuseColor:  La couleur que le matériau reflètera quand il sera éclairé de façon dynamique.
                               Par exemple, utiliser une couleur blanche se traduira par un éclairage normal
                               (toutes les couleurs sont réfléchies). Si vous utilisez un rouge, alors uniquement
                               les couleurs rouges du matériau seront réfléchie, ce qui donnera un matériau
                               entièrement rouge (ou noir s'il ne contient aucune couleur rouge).
  #PB_Material_SpecularColor: La couleur du matériau qu'il réfléchira quand il sera dynamiquement éclairé par
                               une lumière qui a une valeur de couleur spéculaire. Par exemple, utiliser une
                               couleur blanche se traduira par un éclairage normal (toutes les couleurs sont
                               réfléchies). Si vous utilisez un rouge, alors uniquement les couleurs rouges
                               du matériau seront réfléchies, résultant en un matériau entièrement rouge
                               (ou noir si le matériau ne contient aucune couleur rouge).
  #PB_Material_SelfIlluminationColor: La couleur du matériau qu'il émettra, même si aucune lumière ne l'atteint.

Valeur de retour

Renvoie la valeur de la couleur RGB.

Les valeurs des canaux de couleur peuvent facilement être récupérées avec Red(), Green() et Blue().


GetScriptMaterial()

Syntaxe

Resultat = GetScriptMaterial(#Matiere, Nom$)
Description
Renvoie un numéro de matière défini dans un fichier de script OGRE.

Arguments

#Matiere | La matière à utiliser.
Nom$ | Nom du fichier script OGRE.

Valeur de retour

Si 'Resultat' est zéro alors la matière n'a pas été trouvée ou n'a pas pu être chargée.

Voir aussi

ReloadMaterial(), ResetMaterial()


IsMaterial()

Syntaxe

Resultat = IsMaterial(#Matiere)
Description
Teste si une matière est correctement initialisée.

Arguments

#Matiere La matière à utiliser.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Remarques

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.

C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

CreateMaterial(), MaterialID()


MaterialBlendingMode()

Syntaxe

MaterialBlendingMode(#Matiere, Mode)
Description
Change la manière dont une matière sera mixée avec le monde 3D et donc la manière dont l'objet qui utilise cette matière sera rendue.

Arguments

#Matiere La matière à utiliser.
Mode
  #PB_Material_Add       : Utilise le mode addition des pixels (Add) pour mixer l'objet avec la scène
                           (donc la couleur noire (0,0,0) est considérée comme transparente).
  #PB_Material_AlphaBlend: Utilise le canal alpha de la texture (TGA ou PNG) pour le mixage avec la scène.
  #PB_Material_Color     : Utilise la couleur transparente de la texture pour le mixage avec la scène.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

MaterialFilteringMode(), MaterialShadingMode()


MaterialCullingMode()

Syntaxe

MaterialCullingMode(#Matiere, Mode)
Description
Modifie le mode élimination de la matière.

Le 'culling' est le fait d'éliminer prématurément des parties de la scène qui ne seront pas visibles à l'écran ; soit parce qu'elles sont cachées, soit parce qu'elles ne sont pas dans le champ de vision.

Arguments

#Matiere La matière à utiliser.
Mode Peut être l'une des valeurs suivantes:
  #PB_Material_NoCulling        : Pas d'élimination.
  #PB_Material_ClockWiseCull    : Elimination dans le sens horaire.
  #PB_Material_AntiClockWiseCull: Elimination dans le sens anti-horaire.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Pour obtenir l'état courant de ce mode, voir GetMaterialAttribute().


MaterialDepthWrite()

Syntaxe

MaterialDepthWrite(#Matiere, Etat)
Description
Active ou désactive l'écriture de profondeur d'une matière.

Arguments

#Matiere La matière à utiliser.
Etat
#True : Ecriture activée.
#False: Ecriture désactivée.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Pour obtenir l'état courant d'écriture de profondeur, voir GetMaterialAttribute().

Voir aussi

CreateMaterial()


MaterialFilteringMode()

Syntaxe

MaterialFilteringMode(#Matiere, Mode [, ValeurAnisotropicMax])
Description
Change le mode filtrage d'une matière.

Arguments

#Matiere La matière à utiliser.

Si #Matière est réglé sur #PB_Default alors le mode de filtrage utilisé pour la future matière est modifié.
Mode
  #PB_Material_None     : Aucun filtrage n'est effectué, ce qui donne un résultat très pixelisé
                          quand la matière est zoomée.
  #PB_Material_Bilinear : Effectue un filtre bi-linéaire quand la texture zoome, ce qui donne une
                          texture plus agréable, mais un peu floue.
  #PB_Material_Trilinear: Effectue un filtre tri-linéaire quand la texture zoome, ce qui donne le
                          meilleur rendu possible.
  #PB_Material_Anisotropic: Régle la valeur maximale anisotropique. 'ValeurAnisotropicMax' est
                            généralement comprise entre 1 et 8.
ValeurAnisotropicMax (optionnel) Valeur maximale du filtrage anisotropique avec l'option #PB_Material_Anisotropic.

Valeur généralement comprise entre 1 et 8.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Quand une matière est créée, le filtre bi-lineaire est activé par défaut.

Utiliser un filtrage n'a plus un grand impact sur les performances vidéos car toutes les cartes graphiques modernes le font au niveau matériel.

Voir aussi

MaterialBlendingMode(), MaterialShadingMode()


MaterialFog()

Syntaxe

MaterialFog(#Matiere, Couleur, Intensite, DistanceDebut, DistanceFin)
Description
Crée un effet de brouillard sur la #Matière.

Arguments

#Matiere | La matière à utiliser.
Couleur La couleur du brouillard.

RGB() peut être utilisé pour obtenir une 'Couleur' valide.
Intensite | Avec une valeur égal à zéro, l'effet de brouillard est retiré.
DistanceDebut | Distance (en unités du monde) d'où le brouillard doit commencer.
DistanceFin | Distance (en unités du monde) d'où le brouillard est totalement opaque.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

MaterialShininess()


MaterialID()

Syntaxe

MaterialID = MaterialID(#Matiere)
Description
Renvoie le MaterialID d'une matière.

Arguments

#Matiere La matière à utiliser.

Valeur de retour

Renvoie le numéro MaterialID de la matière.

C'est l'identifiant unique de la matière requise par la commande SetEntityMaterial().

Voir aussi

CreateMaterial(), MaterialID()


MaterialShadingMode()

Syntaxe

MaterialShadingMode(#Matiere, Mode)
Description
Change le mode d'ombrage d'une matière.

Arguments

#Matiere La matière à utiliser.
Mode Peut être l'une des valeurs suivantes:
  #PB_Material_Flat     : La matière sera rendue en mode solide, l'ombrage est effectué face par face.
  #PB_Material_Gouraud  : Effectue un ombrage progressif en utilisant l'algorithme de Gouraud (Par défaut).
  #PB_Material_Phong    : Effectue un ombrage progressif en utilisant l'algorithme de Phong.
combinée avec l'une des valeurs suivantes:
  #PB_Material_Solid    : La matière sera rendue en mode solide et texturé (par défaut).
  #PB_Material_Wireframe: La matière sera rendue en mode fils de fer.
  #PB_Material_Point    : La matière sera rendue en utilisant des points d'arêtes seulement.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Pour obtenir l'état courant de ce mode, voir GetMaterialAttribute().

Voir aussi

MaterialBlendingMode(), MaterialFilteringMode()


MaterialShininess()

Syntaxe

MaterialShininess(#Matiere, Brillance)
Description
Modifie la brillance d'une matière.

Arguments

#Matiere | La matière à utiliser.
Brillance | Nouvelle brillance.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Pour obtenir l'état courant de ce mode, voir GetMaterialAttribute().

Voir aussi

MaterialFog()


ReloadMaterial()

Syntaxe

ReloadMaterial(NomMatiere$, NomFichierScript$, ParseScript)
Description
Recharge une matière à partir d'un script OGRE.

Arguments

NomMatiere$ | Le nom de la matière à utiliser.
NomFichierScript$ | Le nom du fichier script à utiliser.
ParseScript
  #True : Le 'NomFichierScript$' est analysée à nouveau pour obtenir des informations de mises
          à jour sur la matière.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Ceci est utile lors de l'utilisation de matériaux (matières) personnalisés stockés dans des fichiers de script.

Un matériau peut être obtenu à partir des scripts OGRE par GetScriptMaterial().

Voir aussi

GetScriptMaterial(), ResetMaterial()


RemoveMaterialLayer()

Syntaxe

RemoveMaterialLayer(#Matiere)
Description
Supprime la dernière couche ajoutée sur une matière.

Arguments

#Matiere La matière à utiliser.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

AddMaterialLayer(), CountMaterialLayers()


ResetMaterial()

Syntaxe

ResetMaterial(TypeObjet)
Description
Réinitialise tous les matériaux pour les types d'objets spécifiés.

Arguments

TypeObjet
  #PB_Entity         : Réinitialisation des matériaux pour toutes les entités.
  #PB_ParticleEmitter: Réinitialisation des matériaux pour tous les émetteurs de particules.
  #PB_BillboardGroup : Réinitialisation des matériaux pour tous les Billboards.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

GetScriptMaterial(), ReloadMaterial()


RotateMaterial()

Syntaxe

RotateMaterial(#Matiere, Angle, Mode [, Couche])
Description
Rotation d'une matière.

Arguments

#Matiere | La matière à utiliser.
Angle | Angle de rotation.
Mode
  #PB_Material_Fixed   : La matière est inclinée de manière absolue, sans tenir compte de
                         l'inclinaison précédente.
  #PB_Material_Animated: A chaque rendu, la couche est automatiquement inclinée des valeurs x,y
                         (relatif à l'inclinaison précédente).
Couche La couche à déplacer.

Par défaut, la couche 0 est tournée.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Pour obtenir l'état courant de ce mode, voir GetMaterialAttribute().

Voir aussi

ScaleMaterial(), ScrollMaterial()


ScaleMaterial()

Syntaxe

ScaleMaterial(#Matiere, x, y)
Description
Mise à l'échelle (agrandissement ou rapetissement) d'une matière.

Arguments

#Matiere La matière à utiliser.
x, y Facteurs d'échelle (la taille est multipliée par ces valeurs):

Une valeur de 1.0 signifie que la taille n'est pas modifiée
Une valeur comprise entre 0.0 et 1.0 de signifie que le matériau est réduit (par exemple: une échelle de 0.5 fera la moitié de la taille).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Pour obtenir l'état courant de ce mode, voir GetMaterialAttribute().

Voir aussi

RotateMaterial(), ScrollMaterial()


ScrollMaterial()

Syntaxe

ScrollMaterial(#Matiere, x, y, Mode [, Couche])
Description
Déplace une couche d'une matière.

Arguments

#Matiere | La matière à utiliser.
x, y | Les valeurs du déplacement.
Mode
  #PB_Material_Fixed   : La matière est déplacée de manière absolue, sans tenir compte des déplacements précédents.
  #PB_Material_Animated: A chaque rendu, la couche est déplacée des valeurs x,y automatiquement (relatif au déplacement précédent).
Couche (optionnel) La couche à déplacer.

Par défaut, la couche 0 est déplacée.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Pour obtenir l'état courant de ce mode, voir GetMaterialAttribute().

Voir aussi

RotateMaterial(), ScaleMaterial()


SetMaterialColor()

Syntaxe

SetMaterialColor(#Matiere, Type, Couleur)
Description
Modifie la couleur de la matière.

Arguments

#Matiere | La matière à utiliser.
Type Le type de couleur à obtenir. Il peut être une des valeurs suivantes:
  #PB_Material_AmbientColor:  La couleur utilisée par défaut, sans autre éclairage.
  #PB_Material_DiffuseColor:  La couleur que le matériau reflètera quand il sera éclairé de façon dynamique.
                               Par exemple, utiliser une couleur blanche se traduira par un éclairage normal
                               (toutes les couleurs sont réfléchies). Si vous utilisez un rouge, alors uniquement
                               les couleurs rouges du matériau seront réfléchie, ce qui donnera un matériau
                               entièrement rouge (ou noir s'il ne contient aucune couleur rouge).
  #PB_Material_SpecularColor: La couleur du matériau qu'il réfléchira quand il sera dynamiquement éclairé par
                               une lumière qui a une valeur de couleur spéculaire. Par exemple, utiliser une
                               couleur blanche se traduira par un éclairage normal (toutes les couleurs sont
                               réfléchies). Si vous utilisez un rouge, alors uniquement les couleurs rouges
                               du matériau seront réfléchies, résultant en un matériau entièrement rouge
                               (ou noir si le matériau ne contient aucune couleur rouge).
  #PB_Material_SelfIlluminationColor: La couleur du matériau qu'il émettra, même si aucune lumière ne l'atteint.
Couleur | Valeur de la couleur RGB. Une valeur RGB valide peut être créé avec RGB().

Valeur de retour

Cette fonction n'a pas de valeur de retour.


Math

PureBasic - Math

Généralités

La bibliothèque Math propose des fonctions arithmétiques telles que Cos(), Sin(), Pow(), Log() etc. La plupart des commandes fonctionnent avec des nombres flottants (.f) ou des doubles (.d). Si une commande est utilisée avec une valeur de type double (.d) en entrée ou en sortie, alors la version double précision de la commande sera automatiquement utilisée.

Sommaire des commandes

ACos
ACosH
ASin
ASinH
ATan
ATan2
ATanH
Abs
Cos
CosH
Degree
Exp
Infinity
Int
IntQ
IsInfinity
IsNaN
Log
Log10
Mod
NaN
Pow
Radian
Round
Sign
Sin
SinH
Sqr
Tan
TanH

Exemple

Math.pb

OS Supportés

Tous

Guide de référence - Index


ACos()

Syntaxe

Resultat.f = ACos(Nombre.f)
Description
Renvoie l'arc-cosinus (exprimé en radian) du nombre spécifié. La valeur du nombre doit être comprise entre -1 et 1.

Exemple

  Debug ACos(1) ; Affichera '0'
  Debug Acos(-1) ; Affichera '3.14159' (pi)
ACos() est la fonction inverse de Cos().


ACosH()

Syntaxe

Resultat.f = ACosH(Valeur.f)
Description
Renvoie l'arc-cosinus hyperbolique de la 'Valeur' spécifiée. 'Valeur' doit être supérieur ou égal à 1.

Exemple

  Debug ACosH(1)                 ; Affichera '0'
  Debug Exp(ACosH(0.5 * Sqr(5))) ; Affichera '1.618033' (the golden ratio)
ACosH() est la fonction inverse de CosH().


ASin()

Syntaxe

Resultat.f = ASin(Nombre.f)
Description
Renvoie l'arc-sinus (exprimé en radian) du nombre spécifié. La valeur du nombre doit être comprise entre -1 et 1.

Exemple

  Debug ASin(1) ; Affichera '1.570796' (pi/2)
  Debug ASin(0) ; Affichera '0'
ASin() est la fonction inverse de Sin().


ASinH()

Syntaxe

Resultat.f = ASinH(Valeur.f)
Description
Renvoie l'arc-sinus hyperbolique de la 'Valeur' spécifiée. L'intervalle de 'Valeur' n'est pas limité.

Exemple

  Debug ASinH(0)        ; Affichera '0'
  Debug Exp(ASinH(0.5)) ; Affichera '1.618033' (the golden ratio)

Debug
Debug
ASinH() est la fonction inverse de SinH().


ATan()

Syntaxe

Resultat.f = ATan(Nombre.f)
Description
Renvoie l'arc-tangente (exprimé en radian) du nombre spécifié. Le nombre peut prendre n'importe quelle valeur.

Exemple

  Debug ATan(1) ; Affichera '0.785398' (pi/4)
ATan() est la fonction inverse de Tan().


ATan2()

Syntaxe

Resultat.f = ATan2(x.f, y.f)
Description
Calcule l'angle, en radian, entre l'axe des x et une ligne tracée dans la direction définie par 'x' et 'y'. C'est utile pour calculer des angles entre des lignes en 2D, ou pour transformer des coordonnées rectangulaires en coordonnées polaires.

Cette commande est similaire au résultat de ATan(x/y), mais ajoute l'examen du signe de x et de y pour placer l'angle dans le bon quadrant. Elle gère aussi le cas où 'y' est nul, pour éviter une division par zéro.

Valeur de retour

Le résultat est toujours compris entre -#PI et +#PI. Un angle négatif indique que la ligne est en dessous de l'axe des x, un angle positif indique que la ligne est au dessus de l'axe de x. Si 'x' et 'y' sont egals à zéro, alors la commande renvoie zéro.

Exemple

  Debug ATan2(10, 10) ; Affichera #PI/4 (45 degrés en radian)


ATanH()

Syntaxe

Resultat.f = ATanH(Value.f)
Description
Renvoie l'arc-tangente hyperbolique de la 'Valeur' spécifiée. 'Valeur' doit être comprise entre -1 et 1 (en excluant -1 et 1).

Exemple

  Debug Exp(ATanH(0.2 * Sqr(5))) ; Affichera '1.618033' (the golden ratio)
ATanH() est la fonction inverse de TanH().


Abs()

Syntaxe

Resultat.f = Abs(Nombre.f)
Description
Renvoie la valeur absolue (non signée) de la valeur flottante spécifiée. Cette fonction ne peut être utilisée correctement qu'avec des nombres flottants. Si un entier est passé en argument et que sa valeur est grande une perte de précision sera constatée. Une autre fonction sera proposée au seul usage des valeurs entières.


Cos()

Syntaxe

Resultat.f = Cos(Angle.f)
Description
Renvoie le cosinus (compris entre -1 et 1) de l'angle spécifié (exprimé en radian).

Exemple

  Debug Cos(3.141593) ; Affichera '-1'
Cos() est la fonction inverse de ACos().


CosH()

Syntaxe

Resultat.f = CosH(Angle.f)
Description
Renvoie le cosinus hyperbolique de l'angle spécifié (exprimé en radian). Le 'Resultat' sera toujours supérieur ou égal à 1.

Exemple

  Debug CosH(0)  ; Affichera 1
CosH() est la fonction inverse de ACosH().


Degree()

Syntaxe

Resultat.f = Degree(Angle.f)
Description
Convertit la valeur d'un 'Angle' en radian en degré. L'opération inverse est disponible à l'aide de la commande Radian().

Exemple

  Debug Degree(#PI/4) ; renvoie 45


Exp()

Syntaxe

Resultat.f = Exp(Nombre.f)
Description
Renvoie le résultat de la fonction exponentielle. C'est la valeur e élevée à la puissance 'Nombre'. C'est la commande inverse de Log().


Infinity()

Syntaxe

Resultat = Infinity()
Description
Renvoie la valeur flottante spéciale représentant l'infini positif. L'infini négatif peut être calculé en utilisant "-Infinity()".

L'infini et l'infini négatif sont des valeurs spéciales, et se comportent de façon attendue lors des calculs. Par exemple, diviser l'infini par une valeur positive (mise à part 0 et l'infini) donnera l'infini. La fonction IsInfinity() permet de determiner si une valeur représente l'infini positif ou négatif.

Exemple

  Debug IsInfinity(Infinity() / 1000) ; Affichera 1


Int()

Syntaxe

Resultat = Int(Nombre.f)
Description
Renvoie la partie entière d'un nombre flottant.

Exemple

  Debug Int(10.565)  ; Affichera '10'


IntQ()

Syntaxe

Resultat.q = IntQ(Nombre.d)
Description
Renvoie la partie entière d'un nombre flottant.

Exemple

  Debug IntQ(12345678901.565)  ; Affichera '12345678901'

OS Supportés

Windows, Linux, MacOS X (x86)


IsInfinity()

Syntaxe

Resultat.f = IsInfinity(Valeur.f)
Description
Renvoie une valeur différente de zéro si 'Valeur' représente l'infini négatif ou positif.

Comparer les valeurs infinies n'est pas conseillé, car cela dépend de l'implémentation matérielle si l'infini est égal à lui-même ou non. Les valeurs de l'infini négatif et positif peuvent être générées par la fonction Infinity().

Exemple

  Debug IsInfinity(Infinity())  ; infini
  Debug IsInfinity(Log(0))      ; -infini
  Debug IsInfinity(1234.5)      ; nombre fini
  Debug IsInfinity(NaN())       ; NaN


IsNaN()

Syntaxe

Resultat.f = IsNaN(Valeur.f)
Description
Renvoie une valeur différente de zéro si la 'Valeur' n'est pas un nombre (Not a Number). Cette valeur est le résultat d'un calcul incorrect. Il peut aussi être généré à l'aide de la fonction NaN().

NaN est une valeur spéciale. Tester sa valeur ne doit pas être fait avec une comparaison normale, car il y a de nombreuses valeurs pour NaN. Le fait que NaN soit considéré égal à lui-même dépend de l'implémentation matérielle.

Exemple

  Debug IsNAN(NaN())       ; NaN
  Debug IsNAN(Sqr(-1))     ; NaN
  Debug IsNAN(1234.5)      ; un nombre classique
  Debug IsNAN(Infinity())  ; l'infini n'est pas NaN


Log()

Syntaxe

Resultat.f = Log(Nombre.f)
Description
Renvoie le logarithme naturel du nombre. C'est la fonction inverse de Exp().


Log10()

Syntaxe

Resultat.f = Log10(Nombre.f)
Description
Renvoie le logarithme base 10 du nombre.


Mod()

Syntaxe

Result.f = Mod(Nombre.f, Diviseur.f)
Description
Renvoie le reste de la division de Nombre.f par Diviseur.f. Ceci est la version en virgule flottante de l'opérateur '%' .

Arguments

Nombre.f | Le nombre à diviser.
Diviseur.f | Le nombre diviseur.

Valeur de retour

Renvoie le reste de la division. Le résultat a le même signe que le paramètre Nombre.f


NaN()

Syntaxe

Resultat.f = NaN()
Description
Renvoie la valeur flottante représentant 'Pas un Nombre' ('Not a Number'). Cette valeur est renvoyée lors d'un calcul invalide, comme calculer la racine carrée d'un nombre négatif.

NaN est une valeur spéciale. Utiliser NaN dans un calcul renverra toujours NaN. La fonction IsNaN() peut être utilisée pour déterminer si une valeur représente NaN.

Exemple

  Debug IsNaN(NaN() * 5 + 2) ; Affichera 1


Pow()

Syntaxe

Resultat.f = Pow(Nombre.f, Puissance.f)
Description
Renvoie Nombre élevé à la puissance Puissance.


Radian()

Syntaxe

Resultat.f = Radian(Angle.f)
Description
Convertit la valeur d'un 'Angle' en degré en radian. L'opération inverse est disponible à l'aide de la commande Degree().

Exemple

  Debug Radian(90) ; Affichera #PI/2


Round()

Syntaxe

Resultat.f = Round(Nombre.f, Mode)
Description
Arrondi le nombre flottant spécifié selon le mode choisi. 'Mode' peut prendre l'une des valeurs suivantes :
  #PB_Round_Down   : Le nombre est arrondi par défaut.
  #PB_Round_Up     : Le nombre est arrondi par excès.
  #PB_Round_Nearest: Le nombre est arrondi à l'entier le plus proche (0.5 est arrondi à 1)

Exemple

  Debug Round(11.6, #PB_Round_Down)    ; Affichera '11'
  Debug Round(-3.6, #PB_Round_Down)    ; Affichera '-4'

  Debug Round(11.6, #PB_Round_Up)      ; Affichera '12'
  Debug Round(-1.6, #PB_Round_Up)      ; Affichera '-1'

  Debug Round(11.6, #PB_Round_Nearest) ; Affichera '12'
  Debug Round(11.4, #PB_Round_Nearest) ; Affichera '11'
  Debug Round(11.5, #PB_Round_Nearest) ; Affichera '12'
  Debug Round(-7.5, #PB_Round_Nearest) ; Affichera '-8'


Sign()

Syntaxe

Resultat.f = Sign(Nombre.f)
Description
Renvoie une valeur flottante représentant le signe du 'Nombre' spécifié.

Valeur de retour

- Renvoie 0 si le 'Nombre' est 0.
- Renvoie 1 si le 'Nombre' est positif.
- Renvoie -1 si le 'Nombre' est négatif.

Exemple

  Debug Sign(-7)   ; Affichera -1.0
  Debug Sign(0)    ; Affichera 0.0
  Debug Sign(7)    ; Affichera 1.0


Sin()

Syntaxe

Resultat.f = Sin(Angle.f)
Description
Renvoie le sinus (compris entre -1 et 1) de l'angle spécifié (exprimé en radian).

Exemple

  Debug Sin(1.5708) ; Affichera '1'
La fonction inverse est ASin().


SinH()

Syntaxe

Resultat.f = SinH(Angle.f)
Description
Renvoie le sinus hyperbolique de l'angle spécifié (exprimé en radian).

Exemple

  Debug SinH(Log(1.618033)) ; Affichera approximativement 0.5
SinH() est la fonction inverse de ASinH().


Sqr()

Syntaxe

Resultat.f = Sqr(Nombre.f)
Description
Renvoie la racine carrée du nombre spécifié.


Tan()

Syntaxe

Resultat.f = Tan(Angle.f)
Description
Renvoie la tangente de l'angle spécifié (exprimé en radian).

Exemple

  Debug Tan(0.785398) ; Affichera '1'
La fonction inverse est ATan().


TanH()

Syntaxe

Resultat.f = TanH(Angle.f)
Description
Renvoie la tangente hyperbolique de l'angle spécifié (exprimé en radian).

Exemple

  Debug TanH(Log(1.618033)) ; Affichera '0.447213' (1/5 * Sqr(5))
TanH() est la fonction inverse de ATanH().


Memory

PureBasic - Memory

Généralités

Il est parfois très utile d'avoir un accès direct à la mémoire vive (RAM) de l'ordinateur pour exécuter et accélérer des routines gourmandes en temps d'exécution. Cette bibliothèque vous permet d'allouer un nombre quelconque de zones mémoire et de les utiliser directement avec PureBasic.

Sommaire des commandes

AllocateMemory
CompareMemory
CompareMemoryString
CopyMemory
CopyMemoryString
FillMemory
FreeMemory
MemorySize
MemoryStringLength
MoveMemory
PeekA
PeekB
PeekC
PeekD
PeekF
PeekI
PeekL
PeekQ
PeekS
PeekU
PeekW
PokeA
PokeB
PokeC
PokeD
PokeF
PokeI
PokeL
PokeQ
PokeS
PokeU
PokeW
ReAllocateMemory

Exemple

MemoryBank.pb

OS Supportés

Tous

Guide de référence - Index


AllocateMemory()

Syntaxe

*MemoireID = AllocateMemory(Taille [, Options])
Description
Alloue une zone mémoire contigüe de la 'Taille' spécifiée (en octets).
La nouvelle zone mémoire sera effacée et remplie de zéros.

Arguments

Taille La taille en octets de la nouvelle zone mémoire.
Options (optionnel) Peut être une des valeurs suivantes:
  #PB_Memory_NoClear: Ne pas remplir la zone de mémoire avec des zéros. Cela peut aider à l'avoir plus rapidement
                      si la mémoire allouée est utilisée immédiatement.

Valeur de retour

Renvoie l'adresse de la mémoire allouée, ou zéro si la mémoire ne peut pas être attribuée.

Remarques

La commande FreeMemory() peut être utilisée pour retourner la mémoire allouée au système.
La commande ReAllocateMemory() peut être utilisée pour changer la taille de la zone allouée.
Toutes les zones de mémoire allouées sont automatiquement libérées lorsque les programmes se terminent.

Note: Si le programme se bloque à cette commande, c'est généralement dû à une corruption de la mémoire plus tôt dans le programme après écriture dans une zone en dehors de la zone de mémoire allouée. La cause de ce genre d'erreur peut être trouvée en utilisant le purificateur

Exemple

  *MemoireID = AllocateMemory(5000)
  If *MemoireID
    Debug "Adresse de début de la zone mémoire de 5000 octets :"
    Debug *MemoireID
    PokeS(*MemoireID, "Stocke cette chaîne dans la zone mémoire")
    FreeMemory(*MemoireID)  ; sera également effectué automatiquement à la fin du programme
  Else
    Debug "Impossible d'allouer la mémoire demandée !"
  EndIf


CompareMemory()

Syntaxe

Resultat = CompareMemory(*MemoireID1, *MemoireID2, Longueur)
Description
Compare deux zones mémoire et renvoie 1 si elles sont identiques ou 0 sinon. *MemoireID1 et *MemoireID2 sont des adresses mémoire, qui peuvent être obtenues par les commandes AllocateMemory() ou ReAllocateMemory().


CompareMemoryString()

Syntaxe

Resultat = CompareMemoryString(*Texte1, *Texte2 [, Mode [, Longueur [, Options]]])
Description
Pour les programmeurs expérimentés seulement. Compare deux chaînes de caractères situées aux adresses spécifiées. Les chaînes de caractères doivent être terminées par un caractère nul (0) si la longueur n'est pas indiquée. Cette commande est très utile pour comparer à haute vitesse des chaînes de caractères dans un buffer.

'Mode' peut prendre l'une des valeurs suivantes:
  #PB_String_CaseSensitive : La recherche est sensible à  la casse (a=a). Par défaut si le paramètre est omis.
  #PB_String_NoCase        : Comparaison ne tenant pas compte de la casse (a=A). Par défaut la comparaison est sensible à la casse.
'Resultat' peut prendre l'une des valeurs suivantes:
  #PB_String_Equal  : Le 'Texte1' est égal au 'Texte2'.
  #PB_String_Lower  : Le 'Texte1' est inférieur au 'Texte2'.
  #PB_String_Greater: Le 'Texte1' est supérieur au 'Texte2'.
Le paramètre facultatif 'Options' peut prendre l'une des valeurs suivantes:
  #PB_Ascii  : Compare la chaîne de caractères ASCII, même si le programme est en mode unicode
  #PB_UTF8   : Compare la chaîne de caractères UTF-8 (que le programme soit en mode unicode ou ASCII)
  #PB_Unicode: Compare la chaîne de caractères Unicode, même si le programme est en mode ASCII
Note: quand le paramètre 'Options' est spécifié, la 'Longueur' peut être mise à -1, pour comparer la chaîne de caractères jusqu'à ce qu'un caractère null soit trouvé.


CopyMemory()

Syntaxe

CopyMemory(*MemoireSourceID, *MemoireDestinationID, Longueur)
Description
Copie la zone mémoire située à l'adresse '*MemoireSourceID' dans la zone mémoire située à l'adresse *MemoireDestinationID'.

Si les zones mémoires source et destination se chevauchent, il est préférable d'utiliser MoveMemory(), sinon le résultat peut être erroné.


CopyMemoryString()

Syntaxe

Resultat = CopyMemoryString(*Adresse [, @*MemoireDestinationID])
Description
Pour programmeurs expérimentés. Copie le texte situé à l'adresse spécifiée dans la zone mémoire destination si elle est indiquée ou à la fin du tampon courant si elle est omise. Si @*MemoireDestinationID est spécifiée, la fonction se sert du contenu de la variable indiquée pour copier le 'Texte'. Cette variable est automatiquement mise à jour par la fonction, donc elle contiendra la valeur de fin de buffer. Le programmeur peut ainsi garder le contrôle sur son pointeur, tout en utilisant la fonction de copie de chaîne. Cela permet de manipuler des chaînes de caractères très rapidement.

Exemple

  *Tampon = AllocateMemory(1000)
  *Pointeur = *Tampon
  CopyMemoryString("Salut", @*Pointeur)
  CopyMemoryString(" le Monde")  ; Cette chaîne sera copiée juste après "Salut"
  *Pointeur-2                    ; revient en arrière de 2 caractères (sur le 'd' de 'Monde')
  CopyMemoryString("DE")         ; les deux dernières lettres seront en majuscules
  Debug PeekS(*Tampon)


FillMemory()

Syntaxe

FillMemory(*Memoire, Taille [, Valeur [, Type]])
Description
Rempli la zone de mémoire à l'adresse spécifiée avec une 'Valeur' donnée.

Arguments

*Memoire | L'adresse de la zone mémoire à remplir.
Taille | La taille en octets de la zone mémoire à remplir.
Valeur (optionnel) La valeur à écrire dans la zone de mémoire.

La valeur par défaut est la valeur 0.
Type (optionnel) Peut être une des constantes suivantes:
  #PB_Byte     : Rempli la mémoire avec une valeur de type 'byte' (1 octet) (défaut).
  #PB_Ascii    : Rempli la mémoire avec une valeur de type 'byte' (1 octet).
  #PB_Word     : Rempli la mémoire avec une valeur de type 'word' (2 octets).
  #PB_Unicode  : Rempli la mémoire avec une valeur de type 'word' (2 octets).
  #PB_Character: Rempli la mémoire avec un caractère (1 octet en ASCII, 2 octets en unicode).
  #PB_Long     : Rempli la mémoire avec une valeur de type 'long' (4 octets).
  #PB_Integer  : Rempli la mémoire avec une valeur de type 'integer' (4 octets dans un éxecutable 32-bit, 8 octets dans un éxecutable 64-bit).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  *Buffer = AllocateMemory(500)

  FillMemory(*Buffer, 500) ; Rempli 500 octets avec des zéros (vide la zone mémoire)
  FillMemory(*Buffer, 500, $FF) ; Rempli 500 octets avec la valeur $FF
  FillMemory(*Buffer, 500, $BADF00D, #PB_Long) ; Rempli 500 octets avec la value $BADF00D

Voir aussi

AllocateMemory(), MemorySize()


FreeMemory()

Syntaxe

FreeMemory(*MemoireID)
Description
Libère une zone mémoire précédemment allouée par la fonction AllocateMemory() ou ReAllocateMemory().

Note: toutes les zones mémoire restantes sont automatiquement libérées quand le programme se termine.


MemorySize()

Syntaxe

Resultat = MemorySize(*MemoireID)
Description
Renvoie la longueur totale (en octets) de la zone de mémoire '*MemoireID'. Cette zone mémoire doit avoir été créée à l'aide de la commande AllocateMemory() ou ReAllocateMemory().


MemoryStringLength()

Syntaxe

Resultat = MemoryStringLength(*Texte [, Options])
Description
Pour programmeurs expérimentés. Renvoie la longueur (en caractères) du texte situé à l'adresse spécifiée (et terminé par un caractère null). Si le paramètre 'Options' n'est pas spécifié, le texte est considéré comme un texte unicode si le programme est compilé en mode unicode, ou un texte ASCII si le programme est compilé en mode ASCII.

Le paramètre facultatif 'Options' peut prendre l'une des valeurs suivantes:
  #PB_Ascii  : Renvoie la longueur de la chaîne de caractères ASCII, même si le programme est en mode unicode
  #PB_UTF8   : Renvoie la longueur de la chaîne de caractères UTF-8 (que le programme soit en mode unicode ou ASCII)
  #PB_Unicode: Renvoie la longueur de la chaîne de caractères Unicode, même si le programme est en mode ASCII


MoveMemory()

Syntaxe

MoveMemory(*MemoireSourceID, *MemoireDestinationID, Longueur)
Description
Copie la zone mémoire située à l'adresse '*MemoireSourceID' dans la zone mémoire située à l'adresse '*MemoireDestinationID' de la 'Longueur' indiquée.

Contrairement à CopyMemory(), les zones mémoires source et destination peuvent se chevaucher. Néanmoins, MoveMemory() est plus lent que CopyMemory(), donc il est préférable de l'utiliser que si c'est justifié.


PeekA()

Syntaxe

Valeur = PeekA(*ZoneMemoire)
Description
Lit un caractère ascii (1 octet) depuis l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.


PeekB()

Syntaxe

Valeur = PeekB(*ZoneMemoire)
Description
Lit un byte (1 octet) depuis l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.


PeekC()

Syntaxe

Valeur = PeekC(*ZoneMemoire)
Description
Lit un caractère (1 octet en mode ascii, 2 octets en mode unicode) depuis l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.


PeekD()

Syntaxe

Valeur.d = PeekD(*ZoneMemoire)
Description
Lit un double (8 octets) depuis l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.

OS Supportés

Windows, Linux, MacOS X (x86)


PeekF()

Syntaxe

Valeur.f = PeekF(*ZoneMemoire)
Description
Lit un float (4 octets) depuis l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.


PeekI()

Syntaxe

Valeur.i = PeekI(*ZoneMemoire)
Description
Lit un entier 'integer' (4 octets sur un éxecutable 32-bit, 8 octets sur un éxecutable 64-bit) depuis l'adresse mémoire spécifiée par *ZoneMemoire.

Arguments

*ZoneMemoire L'adresse de lecture.

Valeur de retour

Renvoie la valeur de l'entier 'integer'.

Voir aussi

PokeI()


PeekL()

Syntaxe

Valeur.l = PeekL(*ZoneMemoire)
Description
Lit un long (4 octets) depuis l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.


PeekQ()

Syntaxe

Valeur.q = PeekQ(*ZoneMemoire)
Description
Lit un quad (8 octets) depuis l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.

OS Supportés

Windows, Linux, MacOS X (x86)


PeekS()

Syntaxe

Texte$ = PeekS(*ZoneMemoire [, Longueur [, Format]])
Description
Lit une chaîne de caractères commençant à l'adresse spécifiée par *ZoneMemoire.

Arguments

*ZoneMemoire L'adresse de lecture.
Longueur (optionnel) Le nombre maximum de caractères à lire.
Si ce paramètre n'est pas spécifié ou si -1 est utilisé, il n'y a pas de maximum.
La chaîne est lue jusqu'a ce que le caractère NULL soit rencontré ou si la longueur maximale est atteinte.
Format (optionnel) Le format de chaîne à utiliser lors de la lecture. Ce peut être une des valeurs suivantes:
  #PB_Ascii  : Lit une chaîne de caractères ASCII.
  #PB_UTF8   : Lit une chaîne de caractères UTF-8.
  #PB_Unicode: Lit une chaîne de caractères Unicode.
La valeur par défaut est #PB_Unicode si le programme est compilé en mode unicode et #PB_Ascii autrement.

Valeur de retour

Renvoie la chaîne lue.

Voir aussi

PokeS(), MemoryStringLength(), CompareMemoryString(), CopyMemoryString()


PeekU()

Syntaxe

Valeur = PeekU(*ZoneMemoire)
Description
Lit un caractère unicode (2 octets) depuis l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.


PeekW()

Syntaxe

Valeur = PeekW(*ZoneMemoire)
Description
Lit un word (2 octets) depuis l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.


PokeA()

Syntaxe

PokeA(*ZoneMemoire, Valeur)
Description
Ecrit un caractère ascii (1 octet) à l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.


PokeB()

Syntaxe

PokeB(*ZoneMemoire, Valeur)
Description
Ecrit un byte (1 octet) à l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.


PokeC()

Syntaxe

PokeC(*ZoneMemoire, Valeur)
Description
Ecrit un caractère (1 octet en mode ASCII, 2 octets en mode unicode) à l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.


PokeD()

Syntaxe

PokeD(*ZoneMemoire, Valeur.d)
Description
Ecrit un double (8 octets) à l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.

OS Supportés

Windows, Linux, MacOS X (x86)


PokeF()

Syntaxe

PokeF(*ZoneMemoire, Valeur.f)
Description
Ecrit un float (4 octets) à l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.


PokeI()

Syntaxe

PokeI(*ZoneMemoire, Valeur)
Description
Ecrit un integer (4 octets sur un processeur 32-bit, 8 octets sur un processeur 64-bit) à l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.


PokeL()

Syntaxe

PokeL(*ZoneMemoire, Valeur.l)
Description
Ecrit un long (4 octets) à l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.


PokeQ()

Syntaxe

PokeQ(*ZoneMemoire, Valeur.q)
Description
Ecrit un quad (8 octets) à l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.

OS Supportés

Windows, Linux, MacOS X (x86)


PokeS()

Syntaxe

Resultat = PokeS(*ZoneMemoire, Texte$ [, Longueur [, Options]])
Description
Ecrit une chaîne de caractères, y comprit son caractère nul de fin de chaîne (0), à l'adresse *ZoneMémoire. Une 'Longueur' maximale (en caractères) peut être spécifiée. Si le paramètre 'Options' n'est pas spécifié, le texte est considéré comme un texte unicode si le programme est compilé en mode unicode, ou un texte ASCII si le programme est compilé en mode ASCII. 'Resultat' contiendra le nombre d'octets écrit (en excluant le caractère nul de fin de chaîne): soit le nombre de caractères en mode Ascii, ou le double du nombre de caractères en mode Unicode.

Le paramètre facultatif 'Options' peut prendre l'une des valeurs suivantes:
  #PB_Ascii  : Ecrit la chaîne de caractères en ASCII, même si le programme est en mode unicode
  #PB_UTF8   : Ecrit la chaîne de caractères en UTF-8 (que le programme soit en mode unicode ou ASCII)
  #PB_Unicode: Ecrit la chaîne de caractères en Unicode, même si le programme est en mode ASCII
Note: quand le paramètre 'Options' est spécifié, la 'Longueur' peut être mise à -1, pour écrire toute la chaîne de caractère 'Texte$'.

Cette fonction est réservée aux programmeurs confirmés.


PokeU()

Syntaxe

PokeU(*ZoneMemoire, Valeur)
Description
Ecrit un caractère unicode (2 octets) à l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.


PokeW()

Syntaxe

PokeW(*ZoneMemoire, Valeur.w)
Description
Ecrit un word (2 octets) à l'adresse mémoire spécifiée par *ZoneMemoire.

Cette fonction est réservée aux programmeurs confirmés.


ReAllocateMemory()

Syntaxe

*NouvelleMemoireID = ReAllocateMemory(*MemoireID, Taille [, Options])
Description
Redimensionne une mémoire tampon à une nouvelle taille. La mémoire peut être copiée vers un nouvel emplacement s'il n'y a pas assez de mémoire disponible à son emplacement actuel.

Arguments

*MemoireID L'adresse de la zone mémoire à redimensionner.
Cette valeur doit être le résultat d'un appel à AllocateMemory() ou ReAllocateMemory().

Si ce paramètre est #Null, la commande agit comme AllocateMemory() et alloue une zone de mémoire de la nouvelle dimension donnée.
Taille La taille en octets de la zone mémoire redimensionnée ou allouée.
Options (optionnel)
  #PB_Memory_NoClear: Ne remplit pas la zone mémoire étendue avec des zéros. Cela peut aider à l'avoir plus rapidement si la
                      mémoire étendue est utilisée immédiatement. Si la mémoire est rétrécie, cette option n'a aucun effet.

Valeur de retour

Renvoie la nouvelle adresse de la zone mémoire si elle peut être redimensionnée. Dans ce cas, l'ancienne adresse '*MemoireID' ne peut plus être utilisée. Si le redimensionnement de la zone de mémoire a échoué (car il n'y a pas assez de mémoire disponible), le résultat est égal à zéro et le '*MemoireID' est toujours valide avec la zone de mémoire existante et l'ancienne taille.

Remarques

Si la taille de la zone de mémoire est augmentée, les nouveaux octets sont tout d'abord remplis de zéros à moins que #PB_Memory_NoClear ne soit indiqué.

Note: Si le programme se bloque à cette commande, même si l'entrée semble correcte, c'est généralement le résultat d'une altération de la mémoire qui s'est produit antérieurement dans le programme par l'écriture dans une zone à l'extérieur de la zone de mémoire allouée. Il est possible de trouver la cause de ce genre d'erreur en utilisant le purificateur

Note: Tous les blocs de mémoire alloués restants sont automatiquement libérés lorsque le programme se termine.

Exemple

  *MemoireID = AllocateMemory(1000)
  PokeS(*MemoireID, "Stocke cette chaîne")
  ; faire quelque chose en plus avec ça ici...
  ;
  *NouvelleMemoireID = ReAllocateMemory(*MemoireID, 2000) ; besoin de plus de mémoire
  If *NouvelleMemoireID
    ; maintenant travailler avec *NouvelleMemoireID avec une taille de 2000 octets
    Debug "L'ancien contenu est toujours là :"
    Debug PeekS(*NouvelleMemoireID)
    ;
    FreeMemory(*NouvelleMemoireID)
  Else
    ; le redimensionnement a échoué, continuons de travailler avec *MemoireID (de taille 1000 octets)
    ;
    FreeMemory(*MemoireID)
  EndIf

Voir aussi

AllocateMemory(), FreeMemory(), MemorySize()


Menu

PureBasic - Menu

Généralités

Il est très simple de gérer des menus avec PureBasic, et vous pourrez bien sûr paramétrer tout ce dont vous avez besoin.

Sommaire des commandes

CloseSubMenu
CreateImageMenu
CreateMenu
CreatePopupImageMenu
CreatePopupMenu
DisableMenuItem
DisplayPopupMenu
FreeMenu
GetMenuItemState
GetMenuItemText
GetMenuTitleText
HideMenu
IsMenu
MenuBar
MenuHeight
MenuID
MenuItem
MenuTitle
OpenSubMenu
SetMenuItemState
SetMenuItemText
SetMenuTitleText

Exemple

Menu.pb
PopupMenu.pb

OS Supportés

Tous

Guide de référence - Index


CloseSubMenu()

Syntaxe

CloseSubMenu()
Description
Ferme le sous-menu actuel et revient au menu précédent. La fonction OpenSubMenu() doit avoir été appelée avant !


CreateImageMenu()

Syntaxe

Resultat = CreateImageMenu(#Menu, WindowID [, Flags])
Description
Crée un nouveau menu vide sur la fenêtre 'WindowID' qui porte le numéro #Menu et devient le menu en cours de création. Il est alors possible d'utiliser les fonctions MenuItem(), MenuBar(), etc... 'WindowID' peut être obtenu facilement grâce a la commande WindowID() de la librarie Window. Si #PB_Any est utilisé pour le paramètre '#Menu', le numéro du nouveau menu sera renvoyé dans 'Resultat'. Si le menu ne peut pas être créé, 'Resultat' prendra la valeur 0.

'Flags' est une combinaison des valeurs suivantes:
  #PB_Menu_ModernLook: Active le nouveau look et affiche un dégradé.
Pour gérer les évènements relatifs aux menus, voir la description des commandes suivantes:
WaitWindowEvent() (ou WindowEvent())
EventWindow()
EventMenu()

Exemple

  If LoadImage(0, OpenFileRequester("Choisissez une icône", "", "", 0))
    If OpenWindow(0, 200, 200, 200, 100, "Image menu - exemple")
      If CreateImageMenu(0, WindowID(0))
        MenuTitle("Projet")
          MenuItem(1, "Ouvrir"   +Chr(9)+"Ctrl+O", ImageID(0))
          MenuItem(2, "Enregistrer"   +Chr(9)+"Ctrl+S")
          MenuItem(3, "Enregistrer sous"+Chr(9)+"Ctrl+R")
          MenuItem(4, "Fermer"  +Chr(9)+"Ctrl+F")
      EndIf

      Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
    EndIf
  EndIf


CreateMenu()

Syntaxe

Resultat = CreateMenu(#Menu, WindowID)
Description
Crée un nouveau menu vide sur la fenêtre 'WindowID' qui porte le numéro #Menu et devient le menu en cours de création. Il est alors possible d'utiliser les fonctions MenuItem(), MenuBar(), etc... 'WindowID' peut être obtenu facilement grâce a la commande WindowID() de la librarie Window. Si #PB_Any est utilisé pour le paramètre '#Menu', le numéro du nouveau menu sera renvoyé dans 'Resultat'. Si le menu ne peut pas être créé, 'Resultat' prendra la valeur 0.

Pour gérer les évènements relatifs aux menus, voir la description des commandes suivantes:
WaitWindowEvent() (ou WindowEvent())
EventWindow()
EventMenu()

Exemple

  If OpenWindow(0, 200, 200, 200, 100, "Exemple de menu")
    If CreateMenu(0, WindowID(0))
      MenuTitle("Projet")
        MenuItem(1, "Ouvrir"   +Chr(9)+"Ctrl+O")
        MenuItem(2, "Enregistrer"   +Chr(9)+"Ctrl+E")
        MenuItem(3, "Enregistrer sous"+Chr(9)+"Ctrl+R")
        MenuItem(4, "Fermer"  +Chr(9)+"Ctrl+F")
    EndIf
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf


CreatePopupImageMenu()

Syntaxe

Result = CreatePopupImageMenu(#Menu [, Options])
Description
Crée un nouveau menu contextuel (PopUp) vide qui porte le numéro #Menu et devient le menu en cours de création. Il est alors possible d'utiliser les fonctions MenuItem(), MenuBar(), etc... La fonction DisplayPopupMenu() sera ensuite utilisée pour afficher ce menu contextuel à l'écran. Si #PB_Any est utilisé pour le paramètre '#Menu', le numéro du nouveau menu sera renvoyé dans 'Resultat'. Si le menu ne peut pas être créé, 'Resultat' prendra la valeur 0.

'Options' est une combinaison des valeurs suivantes:
  #PB_Menu_ModernLook: Active le nouveau look et affiche un dégradé.
Pour gérer les événements du menu correctement, reportez vous à la descriptions des commandes suivantes:
WaitWindowEvent() (ou WindowEvent())
EventWindow()
EventMenu()

Exemple

  If OpenWindow(0, 200, 200, 220, 120, "Exemple de menu contextuel")
    If CreatePopupImageMenu(0, #PB_Menu_ModernLook)        ; La création du menu contextuel commence...
      MenuTitle("Projet")        ; Vous pouvez utiliser toutes les commandes relatives au menu,
        MenuItem(1, "Ouvrir")    ; comme si c'était un menu normal...
        MenuItem(2, "Enregistrer")
        MenuItem(3, "Enregistrer sous")
        MenuItem(4, "Quitter")
        MenuBar()
        OpenSubMenu("Fic&hiers récents")
          MenuItem(5, "PureBasic.exe")
          MenuItem(6, "Test.txt")
        CloseSubMenu()
      MenuTitle("Editer")
      MenuTitle("Options")
    EndIf
    Repeat
      Select WaitWindowEvent()             ; Examine quel type d'évènement est survenu sur la fenêtre
        Case #WM_RBUTTONDOWN               ; Le bouton droit de la souris a été clické =>
          DisplayPopupMenu(0,WindowID(0))  ; On affiche le menu contextuel
        Case #PB_Event_Menu      ; Un élément du menu a été sélectionné
          Select EventMenu()     ; On récupère le numéro de cet élément...
            Case 1 : Debug "Menu : Ouvrir"
            Case 2 : Debug "Menu : Enregistrer"
            Case 3 : Debug "Menu : Enregistrer sous"
            Case 4 : Quitter = 1
            Case 5 : Debug "Menu : PureBasic.exe"
            Case 6 : Debug "Menu : Texte.txt"
          EndSelect
        Case #PB_Event_CloseWindow
          Quitter = 1
      EndSelect
    Until Quitter = 1
  EndIf


CreatePopupMenu()

Syntaxe

Resultat = CreatePopupMenu(#Menu)
Description
Crée un nouveau menu contextuel (PopUp) vide qui porte le numéro #Menu et devient le menu en cours de création. Il est alors possible d'utiliser les fonctions MenuItem(), MenuBar(), etc... La fonction DisplayPopupMenu() sera ensuite utilisée pour afficher ce menu contextuel à l'écran. Si #PB_Any est utilisé pour le paramètre '#Menu', le numéro du nouveau menu sera renvoyé dans 'Resultat'. Si le menu ne peut pas être créé, 'Resultat' prendra la valeur 0.

Pour gérer les évènements relatifs aux menus, voir la description des commandes suivantes:
WaitWindowEvent() (ou WindowEvent())
EventWindow()
EventMenu()

Exemple

  If OpenWindow(0, 200, 200, 220, 120, "Exemple de menu contextuel")
    If CreatePopupMenu(0)        ; La création du menu contextuel commence...
      MenuTitle("Projet")        ; Vous pouvez utiliser toutes les commandes relatives au menu,
        MenuItem(1, "Ouvrir")    ; comme si c'était un menu normal...
        MenuItem(2, "Enregistrer")
        MenuItem(3, "Enregistrer sous")
        MenuItem(4, "Quitter")
        MenuBar()
        OpenSubMenu("Fic&hiers récents")
          MenuItem(5, "PureBasic.exe")
          MenuItem(6, "Test.txt")
        CloseSubMenu()
      MenuTitle("Editer")
      MenuTitle("Options")
    EndIf
    Repeat
      Select WaitWindowEvent()            ; Examine quel type d'évènement est survenu sur la fenêtre
        Case #WM_RBUTTONDOWN              ; Le bouton droit de la souris a été clické =>
          DisplayPopupMenu(0,WindowID(0))  ; On affiche le menu contextuel
        Case #PB_Event_Menu      ; Un élément du menu a été sélectionné
          Select EventMenu()     ; On recupère le numéro de cet élement...
            Case 1 : Debug "Menu : Ouvrir"
            Case 2 : Debug "Menu : Enregistrer"
            Case 3 : Debug "Menu : Enregistrer sous"
            Case 4 : Quitter = 1
            Case 5 : Debug "Menu : PureBasic.exe"
            Case 6 : Debug "Menu : Text.txt"
          EndSelect
        Case #PB_Event_CloseWindow
          Quitter = 1
      EndSelect
    Until Quitter = 1
  EndIf


DisableMenuItem()

Syntaxe

DisableMenuItem(#Menu, Element, Etat)
Description
Active ou désactive l'élément du #Menu spécifié. Si Etat est à 1, l'élément est désactivé. Si Etat est à 0 l'élément est activé.

Exemple

  If OpenWindow(0, 200, 200, 200, 100, "Exemple DisableMenuItem")
    If CreateMenu(0, WindowID(0))
      MenuTitle("Projet")
        MenuItem(1, "Ouvrir")
        MenuItem(2, "Enregistrer")
        DisableMenuItem(0,2,1)     ; Désactive le second élément du menu ("Enregistrer")
    EndIf
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


DisplayPopupMenu()

Syntaxe

DisplayPopupMenu(#Menu, WindowID [x, y])
Description
Affiche un #Menu contextuel déjà créé avec CreatePopupMenu() dans la fenêtre 'WindowID' sous le curseur de la souris. Les paramètres x,y sont optionnels et exprimés en pixels, à partir du coin supérieur gauche de l'écran.

Pour un exemple d'utilisation et l'image de prévisualisation, voir CreatePopupMenu().


FreeMenu()

Syntaxe

FreeMenu(#Menu)
Description
Supprime le #Menu et libère sa mémoire. Si un menu était affiché dans une fenêtre, il est automatiquement enlevé.

Si #PB_All est spécifié, tous les autres menus sont libérés.

Note: tous les menus restants sont automatiquement supprimés quand le programme se termine.


GetMenuItemState()

Syntaxe

Resultat = GetMenuItemState(#Menu, Element)
Description
Renvoie l'état actuel de l'élément du #Menu spécifié. C'est seulement utile dans le cas d'un élément de type 'CheckBox'. Si l'élément est checké alors 'Resultat' = 1 sinon 'Resultat' = 0. La 'CheckBox' peut être affiché ou enlevée grâce à la commande SetMenuItemState().

Exemple

  If OpenWindow(0, 200, 200, 220, 100, "Exemple GetMenuItemState")
    If CreateMenu(0, WindowID(0))
      MenuTitle("Projet")
        MenuItem(1, "Changé")
        SetMenuItemState(0,1,1)    ; Affiche l'élément du menu comme étant coché.
    EndIf
    Repeat
      Evenement = WaitWindowEvent()          ; Attente d'un évenement
      If Evenement = #PB_Event_Menu          ; Evenement de type 'Menu'
        If EventMenu() = 1             ; Le premier élément du menu a été sélectionné
          If GetMenuItemState(0,1) = 1   ; Etat actuel de l'élément = coché
            SetMenuItemState(0,1,0)      ; On le décoche
          Else                           ; Etat actuel de l'élément = décoché
            SetMenuItemState(0,1,1)      ; On le coche
          EndIf
        EndIf
      EndIf
    Until Evenement = #PB_Event_CloseWindow
  EndIf


GetMenuItemText()

Syntaxe

Texte$ = GetMenuItemText(#Menu, Element)
Description
Renvoie le texte de l'élément dans le #Menu spécifié.


GetMenuTitleText()

Syntaxe

Texte$ = GetMenuTitleText(#Menu, Titre)
Description
Renvoie le texte du titre dans le #Menu spécifié.


HideMenu()

Syntaxe

HideMenu(#Menu, Etat)
Description
Cache ou affiche le #Menu. Si 'Etat=1', alors le menu est caché, sinon il est affiché.


IsMenu()

Syntaxe

Resultat = IsMenu(#Menu)
Description
Teste si le #Menu est correctement initialisé. Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. Si le 'Résultat' est différent de zéro, alors cet objet est valide. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.


MenuBar()

Syntaxe

MenuBar()
Description
Crée une barre de séparation horizontale dans le menu en cours de construction.

Exemple

  If OpenWindow(0, 200, 200, 200, 100, "Exemple MenuBar")
    If CreateMenu(0, WindowID(0))  ; la création du menu commence ici....
      MenuTitle("Projet")
        MenuItem(1, "Ouvrir")
        MenuBar()                 ; la barre de séparation sera insérée ici
        MenuItem(4, "Fermer")
    EndIf
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf


MenuHeight()

Syntaxe

MenuHeight()
Description
Renvoie la hauteur (en pixels) de la barre de menu. Utile pour calculer correctement la hauteur d'une fenêtre quand un menu est utilisé.

Remarques

MacOS X: Cette commande renverra toujours 0, car la barre de menu ne fait pas partie intégrante de la fenêtre (elle est toujours située dans la barre principale tout en haut de l'écran). Ainsi MenuHeight() peut être utilisé sous tous les OS pour ajuster la taille de la fenêtre en fonction de la hauteur de son menu.


MenuID()

Syntaxe

MenuID = MenuID(#Menu)
Description
Renvoie l'identifiant système du #Menu.

Note: Cet identifiant est parfois connu sous le nom de 'Handle'.


MenuItem()

Syntaxe

MenuItem(Element, Texte$ [, ImageID])
Description
Crée une nouvelle entrée dans le menu en cours de construction. 'Element' est un numéro qui sera retourné par la commande EventMenu() si cet élément venait à être sélectionné. Dans la chaîne Texte$, vous pouvez utiliser le caractère & pour souligner une lettre spécifique :

"&Fichier" s'affichera ainsi : Fichier.

Si vous désirez associer un raccourci clavier (qui sera créé avec la commande AddKeyboardShortcut(), sauf sous OS X) aligné sur le côté droit du menu (par exemple, "Save Ctrl+S") alors vous pouvez utiliser le caractère 'tabulation' pour donner l'espacement correct. Le caractère 'Tabulation' a le code ASCII 9, donc il faudra utiliser la commande Chr() avec le nombre 9 comme indiqué ci-dessous:
  MenuItem(1, "&Open" + Chr(9) + "Ctrl+O")
Les accélarateurs supportés sont:
  - "Ctrl"  : touche 'Contrôle'
  - "Shift" : touche 'Majuscule'
  - "Alt"   : touche 'Alt'
  - "Cmd"   : touche 'Commande/Pomme' (OS X seulement)
Ils peuvent être combinés entre eux à l'aide du caractère "+": "Enregistrer sous" + Chr(9) + "Ctrl+Shift+S". Sous OS X, quand un raccourci est défini dans le menu, il n'est pas nécessaire de le redéclarer à l'aide de la fonction AddKeyboardShortcut().

'ImageID' est facultatif et spécifie l'image qui sera affiché pour cet élément. Le menu doit avoir été créé avec CreateImageMenu() ou CreatePopupImageMenu(). 'ImageID' peut être facilement obtenu avec ImageID() de la bibliothèque Image.

Exemple

  ;Note : Sous Windows XP, pour que le trait souligné apparaisse en permanence,
  ;décochez l'option : 'Masquer les lettres soulignées pour la navigation au clavier jusqu'à ce que j'appuie sur la touche Alt'
  ;dans les propriétés du bureau puis affichage / Apparence / Effets.

  If OpenWindow(0, 200, 200, 200, 100, "Exemple MenuItem")
    If CreateMenu(0, WindowID(0))
      MenuTitle("Projet")
        MenuItem(1, "Ouvrir")        ; Elément normal
        MenuItem(2, "&Enregistrer")  ; Elément avec une lettre soulignée.
                                     ; Le trait souligné n'apparaîtra que si le menu est appelé avec F10 ou ALT.
        MenuItem(3, "Quitter"+Chr(9)+"ECHAP")  ; Elément avec un raccourci clavier affiché sur la droite.
    EndIf
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf
MacOS X : les éléments 'Quitter', 'Préférences' et 'A propos' sont considérés comme spéciaux et doivent être placés dans le menu 'Application' pour avoir l'apparence et le comportement des applications OS X. PureBasic fournit les constantes #PB_Menu_Quit, #PB_Menu_Preferences et #PB_Menu_About pour gérer ce genre d'éléments de menu. Lorsqu'une de ces constantes est détectée, l'élément n'est pas inséré à la place courante, mais dans le menu 'Application'. Si un raccourci a été associé, il est simplement ignoré et remplacé par le raccourci standard. Ces 3 constantes ne sont pas définies sur les autres systèmes d'exploitation, afin de permettre une numérotation flexible sur ces OS.


MenuTitle()

Syntaxe

MenuTitle(Titre$)
Description
Crée un nouveau titre de menu dans la barre horizontale du menu en cours de construction. Dans la chaîne Titre$, vous pouvez utiliser le caractère & pour souligner une lettre spécifique, ainsi :

"&Fichier" affichera une ligne de menu Fichier avec le F souligné.

Exemple

  If OpenWindow(0, 200, 200, 200, 100, "Exemple MenuTitle")
    If CreateMenu(0, WindowID(0))
      MenuTitle("Projet")     ; Titre normal
        MenuItem(1, "Ouvrir")
        MenuItem(2, "Fermer")
      MenuTitle("&Edition")       ; Titre avec une lettre soulignée. Le trait souligné n'apparaîtra que
                                  ; si le menu est appelé avec F10 ou ALT.
        MenuItem(3, "Défaire")
        MenuItem(4, "Refaire")
      MenuTitle("About")       ; Titre seul
    EndIf
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf


OpenSubMenu()

Syntaxe

OpenSubMenu(Texte$ [, ImageID])
Description
Crée une nouvelle ligne de menu donnant accès à un sous-menu (vide, pour l'instant). Dans la chaîne Texte$, vous pouvez utiliser le caractère & pour souligner une lettre spécifique, ainsi :

"&Fichier" affichera une ligne de menu Fichier avec le F souligné.

Le paramètre optionel 'ImageID' permet d'ajouter une image à afficher à coté du texte du menu. Ce paramètre n'aura d'effet que si le menu a été créé avec CreateImageMenu() ou CreatePopupImageMenu().

Exemple

  If OpenWindow(0, 200, 200, 220, 100, "Exemple SubMenu")
    If CreateMenu(0, WindowID(0))
      MenuTitle("Projet")
        MenuItem(1, "Ouvrir")
        MenuItem(2, "Fermer")
        MenuBar()
        OpenSubMenu("Fichiers Récents...") ; Crée un sous-menu
          MenuItem( 3, "C:\Autoexec.bat")
          MenuItem( 4, "D:\Teste.txt")
        CloseSubMenu()                     ; Termine la création du sous-menu
    EndIf
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf


SetMenuItemState()

Syntaxe

Result = SetMenuItemState(#Menu, Element, Etat)
Description
Change l'état actuel de l'élément du #Menu spécifié. C'est utile pour afficher ou non une 'CheckBox' à la gauche du text. Si 'Etat' = 1 alors la 'CheckBox' est affichée, sinon elle est cachée.

GetMenuItemState() peut être utilisé pour récupérer l'état actuel de l'élément du menu.

Exemple

  If OpenWindow(0, 200, 200, 200, 100, "Exemple SetMenuItemState")
    If CreateMenu(0, WindowID(0))
      MenuTitle("Projet")
        MenuItem(1, "Changé")
        SetMenuItemState(0,1,1)    ; Coche l'élément 1 du menu.
    EndIf
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf


SetMenuItemText()

Syntaxe

SetMenuItemText(#Menu, Element, Texte$)
Description
Change le texte de l'élément dans le #Menu spécifié.


SetMenuTitleText()

Syntaxe

SetMenuTitleText(#Menu, Titre, Texte$)
Description
Change le texte du titre dans le #Menu spécifié.


Mesh

PureBasic - Mesh

Généralités

Les Meshs (maillages en 3D) sont des objets 3D composés de triangles qui sont reliés entre eux pour donner une forme finale, toujours en 3D. Un Mesh peut posséder un squelette s'il est animé, permettant des animations réalistes et de qualité. Un Mesh ne peut pas être affiché directement dans le monde 3D, il doit être encapsulé dans une entity.

InitEngine3D() doit être appelé avec succès avant de pouvoir utiliser les commandes relatives aux Meshs.

Sommaire des commandes

AddSubMesh
BuildMeshShadowVolume
CopyMesh
CreateCube
CreateCylinder
CreateLine3D
CreateMesh
CreatePlane
CreateSphere
FinishMesh
FreeMesh
IsMesh
LoadMesh
MeshFace
MeshID
MeshIndex
MeshRadius
MeshVertexColor
MeshVertexCount
MeshVertexNormal
MeshVertexPosition
MeshVertexTextureCoordinate
NormalizeMesh
SaveMesh
SetMeshMaterial
SubMeshCount
TransformMesh
UpdateMesh
UpdateMeshBoundingBox

Exemple

Mesh.pb
CreateLine3D.pb
MeshManual.pb
MeshManual2.pb
MeshManualCube.pb
SetMeshMaterial.pb

OS Supportés

Tous

Guide de référence - Index


AddSubMesh()

Syntaxe

AddSubMesh([Type])
Description
Ajoute un nouveau sous-mesh dans le mesh courant déjà créé avec CreateMesh(). Un mesh peut avoir n'importe quel nombre de sous-meshes. La position d'un sous-mesh est relative à la position du mesh. Une fois qu'un sous-mesh est créé, utilisez les commandes suivantes pour le construire: MeshVertexPosition(), MeshFace() et MeshIndex().

Arguments

Type (optionnel) Le type du nouveau sous-mesh. Il peut être une des valeurs suivantes:
  #PB_Mesh_TriangleList : Le sous-mesh sera composé d'une liste de triangles (par défaut).
  #PB_Mesh_TriangleStrip: Le sous-mesh sera composé d'une liste de triangles connectés (Les sommets sont partagés).
  #PB_Mesh_TriangleFan  : Le sous-mesh sera composé d'une liste de triangles qui partagent le même sommet central .
  #PB_Mesh_PointList    : Le sous-mesh sera composé d'une liste de points.
  #PB_Mesh_LineList     : Le sous-mesh sera composé d'une liste de lignes.
  #PB_Mesh_LineStrip    : Le sous-mesh sera composé d'une liste de lignes connectées (Les sommets sont partagés).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

FreeMesh(), CreateMesh(), MeshVertexPosition(), MeshFace()


BuildMeshShadowVolume()

Syntaxe

BuildMeshShadowVolume(#Mesh)
Description
Crée le volume d'ombre du #Mesh. Nécessaire si le mesh doit jeter des ombres. Cela doit être fait une fois la création du mesh complètement terminée, ou l'ombre ne correspondra pas au mesh.

Arguments

#Mesh Le mesh à utiliser.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateMesh()


CopyMesh()

Syntaxe

Resultat = CopyMesh(#Mesh, #NouveauMesh)
Description
Crée un #NouveauMesh qui est l'exact copie de #Mesh.

Arguments

#Mesh | Le numéro d'identification du mesh à copier.
#NouveauMesh | Le numéro d'identification du nouveau mesh. Si #PB_Any est utilisé à la place de '#NouveauMesh' alors le numéro du nouveau mesh sera renvoyé dans 'Resultat'.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Remarques

Si le #NouveauMesh était déjà créé, il est automatiquement supprimé et remplacé par le nouveau.

Voir aussi

CreateMesh()


CreateCube()

Syntaxe

Resultat = CreateCube(#Mesh, Taille)
Description
Crée un nouveau cube.

Arguments

#Mesh | Le numéro d'identification du nouveau mesh. Si #PB_Any est utilisé à la place de '#Mesh' alors le numéro du nouveau mesh sera renvoyé dans 'Resultat'.
Taille | Taille du cube dans l'unité du monde.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec. Si #PB_Any a été utilisé pour le paramètre #Mesh alors la valeur de retour est le numéro d'identification, généré automatiquement.

Voir aussi

FreeMesh(), CreateSphere(), CreateMesh(), CreateCylinder(), CreatePlane(), CreateLine3D()


CreateCylinder()

Syntaxe

Resultat = CreateCylinder(#Mesh, Rayon, Longueur [, Tesselisation, Fermé, DecalageVertical])
Description
Crée un nouveau cylindre.

Arguments

#Mesh | Le numéro d'identification du nouveau mesh. Si #PB_Any est utilisé à la place de '#Mesh' alors le numéro du nouveau mesh sera renvoyé dans 'Resultat'.
Rayon | Rayon du cylindre dans l'unité du monde.
Longueur (optionnel) | Longueur du cylindre dans l'unité du monde.
Tesselisation (optionnel) | Le facteur de Tesselisation du cylindre. La valeur minimale est de 2. Plus le facteur est grand et plus le cylindre sera précis mais cela affectera la vitesse de rendu, si le facteur est trop élevé. La valeur par défaut est 8.
Fermé (optionnel) | Spécifie si le nouveau cylindre doit être fermé en haut et en bas ou s'il doit être laissé ouvert (comme un tuyau). Réglez-le à 1 pour créer un cylindre fermé ou à 0 pour un cylindre ouvert. La valeur par défaut est 1.
DecalageVertical (optionnel) | Spécifie le décalage, dans l'unité du monde, à appliquer entre le fond et le dessus du cylindre. La valeur par défaut est 0.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec. Si #PB_Any a été utilisé pour le paramètre #Mesh alors la valeur de retour est le numéro d'identification, généré automatiquement.

Voir aussi

FreeMesh(), CreateSphere(), CreateMesh(), CreateCube(), CreatePlane(), CreateLine3D()


CreateLine3D()

Syntaxe

Resultat = CreateLine3D(#Mesh, x, y, z, Couleur, x2, y2, z2, Couleur2)
Description
Crée une nouvelle ligne 3D. La ligne est un objet fil de fer qui peut être utilisé pour faciliter le débogage. Pour changer la position de la ligne, il suffit de la créer à nouveau.

Arguments

#Mesh Le numéro d'identification du nouveau mesh. Si #PB_Any est utilisé à la place de '#Mesh' alors le numéro du nouveau mesh sera renvoyé dans 'Resultat'.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec. Si #PB_Any a été utilisé pour le paramètre #Mesh alors la valeur de retour est le numéro d'identification, généré automatiquement.

Voir aussi

FreeMesh(), CreateSphere(), CreateMesh(), CreateCube(), CreatePlane(), CreateCylinder()


CreateMesh()

Syntaxe

Resultat = CreateMesh(#Mesh [, Type [, Mode])
Description
Créé un nouveau #Mesh, complètement vide. Après création, des commandes supplémentaires de cette bibliothèque comme MeshVertexPosition() ou MeshFace() peuvent être utilisés pour le construire.

Arguments

#Mesh Le numéro d'identification du nouveau mesh.

Si #PB_Any est utilisé à la place de '#Mesh', alors le numéro du nouveau mesh sera renvoyé dans 'Resultat'.
Type (optionnel) Le type du nouveau mesh. Il peut être une des valeurs suivantes:
  #PB_Mesh_TriangleList : Le mesh est composé d'une liste de triangles (par défaut).
  #PB_Mesh_TriangleStrip: Le mesh est composé d'une liste de triangles connectés (Les sommets sont partagés).
  #PB_Mesh_TriangleFan  : Le mesh est composé d'une liste de triangles qui partagent le même sommet central .
  #PB_Mesh_PointList    : Le mesh est composé d'une liste de points.
  #PB_Mesh_LineList     : Le mesh est composé d'une liste de lignes.
  #PB_Mesh_LineStrip    : Le mesh est composé d'une liste de lignes connectées (Les sommets sont partagés).
Mode (optionnel) Le mode du nouveau mesh. Il peut être une des valeurs suivantes:
  #PB_Mesh_Static : Une fois créé, le mesh ne peut plus être modifié avec les fonctions de mise à jour de mesh (par défaut).
  #PB_Mesh_Dynamic: Une fois créé, le mesh peut être modifié avec les fonctions de mise à jour de mesh.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Mesh, alors la valeur de retour est le numéro d'identification, généré automatiquement.

Remarques

Si le #Mesh était déjà créé, il est automatiquement supprimé et remplacé par le nouveau.


CreatePlane()

Syntaxe

Resultat = CreatePlane(#Mesh, TailleCarreauX, TailleCarreauZ, NbCarreauX, NbCarreauZ, NbRepetitionTextureX, NbRepetitionTextureZ)
Description
Crée un nouveau plan.

Arguments

#Mesh | Le numéro d'identification du nouveau mesh. Si #PB_Any est utilisé à la place de '#Mesh' alors le numéro du nouveau mesh sera renvoyé dans 'Resultat'.
TailleCarreauX | Taille en 'X' d'un carreau du plan, dans l'unité monde. Le carreau est le composant de base d'un plan. Un plan peut être composé de nombreux carreaux pour le rendre plus grand et permettre une déformation.
TailleCarreauZ | Taille en 'Z' d'un carreau du plan, dans l'unité monde. Le carreau est le composant de base d'un plan. Un plan peut être composé de nombreux carreaux pour le rendre plus grand et permettre une déformation.
NbCarreauX | Nombre de carreau utilisés dans l'axe X du plan.
NbCarreauZ | Nombre de carreau utilisés dans l'axe Z du plan.
NbRepetitionTextureX | Nombre de fois que la texture sera répétée sur l'axe X. Pour appliquer la texture entière sur tout l'axe X, il suffit d'utiliser 1.
NbRepetitionTextureZ | Nombre de fois que la texture sera répétée sur l'axe Z. Pour appliquer la texture entière sur tout l'axe Z, il suffit d'utiliser 1.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec. Si #PB_Any a été utilisé pour le paramètre #Mesh alors la valeur de retour est le numéro d'identification, généré automatiquement.

Voir aussi

FreeMesh(), CreateSphere(), CreateMesh(), CreateCube(), CreatePlane(), CreateLine3D()


CreateSphere()

Syntaxe

Resultat = CreateSphere(#Mesh, Rayon [Segments, Anneaux])
Description
Crée une nouvelle sphère.

Arguments

#Mesh | Le numéro d'identification du nouveau mesh. Si #PB_Any est utilisé à la place de '#Mesh' alors le numéro du nouveau mesh sera renvoyé dans 'Resultat'.
Rayon | Rayon de la sphère dans l'unité du monde.
Segments (optionnel) | Nombre de segments de la sphère. Les segments sont les lignes verticales de la sphère. Plus le nombre de segments est grand et plus la sphère sera réaliste mais la vitesse de rendu en sera affectée s'ils sont en trop grand nombre.
Anneaux (optionnel) | Nombre d'anneaux de la sphère. Les anneaux sont des lignes horizontales de la sphère. Plus le nombre d' anneaux est grand et plus la sphère sera réaliste mais la vitesse de rendu en sera affectée s'ils sont en trop grand nombre.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec. Si #PB_Any a été utilisé pour le paramètre #Mesh alors la valeur de retour est le numéro d'identification, généré automatiquement.

Voir aussi

FreeMesh(), CreateCylinder(), CreateMesh(), CreateCube(), CreatePlane(), CreateLine3D()


FinishMesh()

Syntaxe

FinishMesh(Mode)
Description
Termine la création du mesh courant précédemment créé avec CreateMesh().

Arguments

Mode
  - #True : Le mesh est converti en un mesh statique et ne sera plus modifiable.
  - #False: Le mesh sera toujours modifiable avec UpdateMesh().
            Les meshes statiques sont plus rapides que les meshes dynamiques.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateMesh()


FreeMesh()

Syntaxe

FreeMesh(#Mesh)
Description
Supprime le #Mesh précédemment créé à l'aide de la commande CreateMesh() ou LoadMesh(). Ce #Mesh ne peut plus être utilisé.

Arguments

Mesh Le mesh à utiliser.

Si #PB_All est spécifié, tous les meshes restants sont libérés.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Tous les meshes restants sont automatiquement supprimés quand le programme se termine.


IsMesh()

Syntaxe

Resultat = IsMesh(#Mesh)
Description
Teste si le #Mesh est correctement initialisé.

Arguments

Mesh Le mesh à utiliser.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Remarques

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

CreateMesh()


LoadMesh()

Syntaxe

Resultat = LoadMesh(#Mesh, NomFichier$)
Description
Charge un #Mesh à partir du fichier 'NomFichier$' au format '.mesh'.

Arguments

#Mesh Le numéro d'identification du nouveau mesh. Si #PB_Any est utilisé à la place de '#Mesh', alors le numéro du nouveau mesh sera renvoyé dans 'Resultat'.
NomFichier$ Nom du fichier contenant le mesh.
'NomFichier$' doit être accessible dans le chemin géré par Add3DArchive().

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec. Si #PB_Any a été utilisé pour le paramètre #Mesh, alors la valeur de retour est le numéro d'identification généré automatiquement.

Remarques

Avant de charger un mesh, une archive doit être spécifiée à l'aide de la commande Add3DArchive().

Actuellement différents "exporters" permettent de créer des fichiers dans ce format (Milkshape, 3DS Max, Lightwave - Plus d'informations sur le site d'OGRE).
Le mesh doit nécessairement être au format OGRE '.mesh'. Un outil en ligne de commande est disponible à cette adresse assimp pour convertir de nombreux formats 3D dans le format OGRE, y compris les matériaux et les animations. Il peut être téléchargé ici: OgreAssimpConverter.zip (Windows uniquement). Certains problèmes ont été signalés avec l'ombre de meshes convertis, si cela arrive, utilisez OgreMeshUpdater.exe sur le mesh nouvellement converti et ça devrait le réparer.

Si le #Mesh était déjà créé, il est automatiquement supprimé et remplacé par le nouveau.

Voir aussi

CreateMesh()


MeshFace()

Syntaxe

MeshFace(Sommet1, Sommet2, Sommet3)
Description
Ajoute ou met à jour une nouvelle face du mesh courant précédemment créé avec CreateMesh(). Les sommets spécifiés doivent exister. Le premier indice de sommet débute à 0. La face créée est un triangle. MeshIndex() peut être utilisé si le nombre de sommets n'est pas trois.

Arguments

Sommet1 | Le premier indice de sommet utilisé pour créer la face.
Sommet2 | Le deuxième indice de sommet utilisé pour créer la face.
Sommet3 | Le troisième indice de sommet utilisé pour créer la face.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateMesh(), MeshVertexPosition()


MeshID()

Syntaxe

Resultat = MeshID(#Mesh)
Description
Renvoie l'identifiant du #Mesh.

Arguments

#Mesh Le numéro d'identification du nouveau mesh. Si #PB_Any est utilisé à la place de '#Mesh' alors le numéro du nouveau mesh sera renvoyé dans 'Resultat'.

Valeur de retour

Renvoie le numéro d'identification unique du #Mesh.

Remarques

Cet identifiant est notamment nécessaire pour la commande CreateEntity().

Voir aussi

CreateMesh()


MeshIndex()

Syntaxe

MeshIndex(Index)
Description
Ajoute ou met à jour un seul sommet du mesh en cours de création avec CreateMesh() ou mis à jour avec UpdateMesh().

Se comporte comme la commande MeshFace(), mais avec un nombre arbitraire de sommets. Lorsque vous utilisez le mode de #PB_Mesh_LineList ou #PB_Mesh_LineStrip, il y a seulement deux sommets par lignes, donc MeshIndex() doit être utilisé dans ce cas.

Arguments

Index L'index du sommet.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

UpdateMesh(), MeshIndex(), MeshFace(), MeshVertexPosition(), MeshVertexNormal(), MeshVertexColor() MeshVertexTextureCoordinate()


MeshRadius()

Syntaxe

Resultat = MeshRadius(#Mesh)
Description
Renvoie le rayon de la plus petite sphère capable de contenir le mesh.

Arguments

Mesh Le mesh à utiliser.

Valeur de retour

Renvoie le rayon du mesh.

Voir aussi

CreateMesh()


MeshVertexColor()

Syntaxe

MeshVertexColor(Couleur)
Description
Ajoute des informations de couleur pour le nouveau sommet précédemment ajouté avec MeshVertexPosition().

Arguments

Couleur Couleur du sommet. Cette couleur peut être au format RGB ou RGBA.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateMesh(), MeshVertexPosition(), MeshVertexNormal(), MeshVertexTextureCoordinate()


MeshVertexCount()

Syntaxe

Resultat = MeshVertexCount(#Mesh [, SousMesh])
Description
Renvoie le nombre de sommets du mesh.

Arguments

Mesh | Le mesh à utiliser.
SousMesh (optionnel) | S'il est spécifié, renvoie le nombre de sommets du sous-mesh spécifié. L'indice du premier submesh est 0 (mesh principal).

Valeur de retour

Renvoie le nombre de sommets du mesh ou 0 si le mesh, ou le sous-mesh, n'existe pas.

Voir aussi

CreateMesh(), LoadMesh()


MeshVertexNormal()

Syntaxe

MeshVertexNormal(x, y, z)
Description
Ajoute l'information concernant la 'normale' du nouveau sommet précédemment ajouté avec MeshVertexPosition(). Le vecteur 'normale' (perpendiculaire au plan) est utilisé pour calculer l'éclairage sur un objet. Pour calculer automatiquement le vecteur 'normale' une fois que le mesh est créé, utilisez NormalizeMesh().

Arguments

x | La valeur x du vecteur normale.
y | La valeur y du vecteur normale.
z | La valeur z du vecteur normale.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateMesh(), MeshVertexPosition(), MeshVertexColor(), MeshVertexTextureCoordinate(), NormalizeMesh()


MeshVertexPosition()

Syntaxe

MeshVertexPosition(x, y, z)
Description
Ajoute ou met à jour un sommet du mesh courant précédemment créé avec CreateMesh(). Pour ajouter des attributs spécifiques au sommet nouvellement créé, utilisez les commandes suivantes: MeshVertexNormal(), MeshVertexColor() et MeshVertexTextureCoordinate(). Pour créer une nouvelle face, utilisez MeshFace().

Arguments

x | La position x du nouveau sommet.
y | La position y du nouveau sommet.
z | La position z du nouveau sommet.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateMesh(), MeshFace(), MeshVertexNormal(), MeshVertexColor(), MeshVertexTextureCoordinate()


MeshVertexTextureCoordinate()

Syntaxe

MeshVertexTextureCoordinate(u, v)
Description
Ajoute l'information UV pour le nouveau sommet précédemment ajouté avec MeshVertexPosition(). Les coordonnées UV sont utilisées pour appliquer la texture sur le mesh.

Arguments

u | La valeur u. Cette valeur est la position X dans la texture où le sommet devrait être. Cette valeur est généralement comprise entre 0 et 1, où 0 est l'origine et 1 est la fin.
v | La valeur v. Cette valeur est la position Y dans la texture où le sommet devrait être. Cette valeur est généralement comprise entre 0 et 1, où 0 est l'origine et 1 est la fin.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateMesh(), MeshVertexPosition(), MeshVertexNormal(), MeshVertexColor()


NormalizeMesh()

Syntaxe

NormalizeMesh(#Mesh [, SousMesh])
Description
Normalise le mesh ou le sous-mesh. Il calcule automatiquement le vecteur 'normale' pour tous les sommets du mesh ou du sous-mesh spécifié.

Arguments

Mesh | Le mesh à utiliser.
SousMesh (optionnel) | S'il est spécifié, il normalise le sous-mesh. Le premier indice de sous-mesh est 0 (mesh principal).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateMesh(), MeshVertexNormal()


SaveMesh()

Syntaxe

SaveMesh(#Mesh, NomFichier$)
Description
Enregistre le mesh. Le mesh sauvegardé peut être rechargé avec la commande LoadMesh().

Arguments

Mesh | Le mesh à sauvegarder.
NomFichier$ | Spécifie le nom de fichier et le chemin d'accès au nouveau fichier de mesh. Si le nom de fichier ne comporte pas de chemin d'accès complet, il est interprété par rapport au dossier courant.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateMesh(), LoadMesh()


SetMeshMaterial()

Syntaxe

SetMeshMaterial(#Mesh, MateriauID [, SousMesh])
Description
Définit le matériau par défaut du mesh.

Arguments

Mesh | Le mesh à utiliser.
MateriauID | Spécifie le matériau à utiliser par défaut pour le mesh. Pour obtenir un 'MateriauID' valide, utilisez MaterialID().
SousMesh (optionnel) | S'il est spécifié, le matériau ne sera appliqué que sur le sous-mesh. Le premier indice de sous-mesh est 0 (mesh principal).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateMesh(), LoadMesh()


SubMeshCount()

Syntaxe

Resultat = SubMeshCount(#Mesh)
Description
Renvoie le nombre de sous-mesh du mesh.

Valeur de retour

Renvoie le nombre de sous-mesh du mesh.

Voir aussi

CreateMesh(), LoadMesh(), AddSubMesh()


TransformMesh()

Syntaxe

TransformMesh(#Mesh, x, y, z, EchelleX, EchelleY, EchelleZ, RotationX, RotationY, RotationZ [, SousMesh])
Description
Transforme le mesh en fonction des paramètres indiqués.

Arguments

Mesh | Le mesh à utiliser.
x | Nouvelle position 'x' du mesh, par rapport à son noeud. Si le paramètre 'SousMesh' est spécifié, il indique la nouvelle position 'x' du sous-mesh par rapport à son parent.
y | Nouvelle position 'y' du mesh, par rapport à son noeud. Si le paramètre 'SousMesh' est spécifié, il indique la nouvelle position 'y' du sous-mesh par rapport à son parent.
z | Nouvelle position 'z' du mesh, par rapport à son noeud. Si le paramètre 'SousMesh' est spécifié, il indique la nouvelle position 'z' du sous-mesh par rapport à son parent.
EchelleX | Applique un facteur d'échelle sur l'axe X du mesh. Si le paramètre 'SousMesh' est spécifié, le facteur d'échelle est appliqué au sous-mesh.
EchelleY | Applique un facteur d'échelle sur l'axe Y du mesh. Si le paramètre 'SousMesh' est spécifié, le facteur d'échelle est appliqué au sous-mesh.
EchelleZ | Applique un facteur d'échelle sur l'axe Z du mesh. Si le paramètre 'SousMesh' est spécifié, le facteur d'échelle est appliqué au sous-mesh.
RotationX | Applique une rotation, en degrés, sur l'axe X du mesh. Si le paramètre 'SousMesh' est spécifié, la rotation est appliquée au sous-mesh.
RotationY | Applique une rotation, en degrés, sur l'axe Y du mesh. Si le paramètre 'SousMesh' est spécifié, la rotation est appliquée au sous-mesh.
RotationZ | Applique une rotation, en degrés, sur l'axe Z du mesh. Si le paramètre 'SousMesh' est spécifié, la rotation est appliquée au sous-mesh.
SousMesh (optionnel) | S'il est spécifié, la transformation ne sera appliquée que sur le sous-mesh. Le premier indice de sous-mesh est 0 (mesh principal).

Valeur de retour

Renvoie le nombre de sous-mesh du mesh.

Voir aussi

CreateMesh(), LoadMesh()


UpdateMesh()

Syntaxe

UpdateMesh(#Mesh, SousMesh)
Description
Démarre la mise à jour du mesh, pour modifier en temps réel ses sommets et d'autres valeurs. Le mesh doit être créé avec l'option #PB_Mesh_Dynamic. Une fois les modifications terminée, FinishMesh() doit être appelé. Le mesh peut utiliser les commandes suivantes pour modifier ses propriétés: MeshIndex(), MeshFace(), MeshVertexPosition(), MeshVertexNormal(), MeshVertexColor() et MeshVertexTextureCoordinate().

Arguments

Mesh | Le mesh à utiliser.
SousMesh | L'indice du sous-mesh à modifier. Le premier indice est 0 (mesh principal).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateMesh(), MeshIndex(), MeshFace(), MeshVertexPosition(), MeshVertexNormal(), MeshVertexColor() MeshVertexTextureCoordinate()


UpdateMeshBoundingBox()

Syntaxe

UpdateMeshBoundingBox(#Mesh)
Description
Met à jour la boîte englobante du mesh. Si un mesh a été modifié manuellement, sa boîte englobante doit être recalculée, en particulier si le mesh est utilisé pour les collisions. Le cadre de sélection est la plus petite boîte possible capable de contenir tout le mesh.

Arguments

Mesh Le mesh à utiliser.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateMesh()


Misc

PureBasic - Misc

Généralités

Cette bibliothèque regroupe diverses fonctions qui ne peuvent être classées ailleurs.

Sommaire des commandes

Alpha
AlphaBlend
Blue
CocoaMessage
Delay
DoubleClickTime
ElapsedMilliseconds
Green
OSVersion
RGB
RGBA
Random
RandomData
RandomSeed
Red

Exemple

Misc.pb

OS Supportés

Tous

Guide de référence - Index


Alpha()

Syntaxe

Resultat = Alpha(Couleur)
Description
Renvoie la valeur de la composante alpha (transparence) d'une couleur.

Arguments

Couleur La valeur de la couleur.

Cela ne peut être qu'une valeur RGBA 32-bit.

Valeur de retour

Renvoie la valeur de la composante alpha.
Une valeur de 0 signifie une complète transparence et une valeur de 255 signifie opacité totale.
Le résultat sera compris entre 0 et 255.

Remarques

RGBA() permet de combiner les valeurs rouge, verte, bleue et alpha en une couleur 32-bit.
Ces fonctions sont utiles lors des opérations de dessin 2D.

Voir aussi

Red(), Green(), Blue(), RGBA()


AlphaBlend()

Syntaxe

Couleur = AlphaBlend(Couleur1, Couleur2)
Description
Renvoie une Couleur 32-bit qui est le résultat du mélange de deux autres couleurs 32-bit.

Arguments

Couleur1 | La couleur d'avant-plan qui sera mélangée à 'Couleur2'.
Couleur2 | La couleur d'arrière-plan.

Valeur de retour

Renvoie la couleur mélangée.

Remarques

RGBA() peut être utilisé pour créer des couleurs 32-bit avec transparence alpha.

Ces fonctions sont utiles lors des opérations de dessin 2D.

Voir aussi

RGBA()


Blue()

Syntaxe

Resultat = Blue(Couleur)
Description
Renvoie la valeur de la composante bleue d'une couleur.

Arguments

Couleur La valeur de la couleur.

Cela peut être une valeur RGB 24-bit ou une valeur RGBA 32-bit.

Valeur de retour

Renvoie la valeur de la composante bleue.
Le résultat sera compris entre 0 et 255.

Remarques

RGB() permet de combiner les valeurs rouge, verte et bleue en une couleur 24-bit.
RGBA() permet de combiner les valeurs rouge, verte, bleue et alpha en une couleur 32-bit.
Ces fonctions sont utiles lors des opérations de dessin 2D.

Voir aussi

Red(), Green(), Alpha(), RGB(), RGBA()


CocoaMessage()

Syntaxe

Resultat = CocoaMessage(AddresseValeurDeRetour, Objet, Methode$ [, ValeurParametre [, Parametre$, [, ValeurParametre, ...]]])
Description
Pour les utilisateurs avancés. Disponible sur Mac OS X uniquement, elle permet d'envoyer facilement un message Objective-C au framework OS X et d'accéder à toute l'API. Habituellement Objective-C utilise des parenthèses pour avoir une syntaxe claire pour les messages. Comme PureBasic ne supporte pas Objective-C en natif, il doit l'émuler, alors la syntaxe est un peu différente. Une fois apprise, il est facile d'appeler une API. Pour plus d'exemples, n'hésitez pas à lire le thread suivant sur le forum.

Arguments

AddresseValeurDeRetour | Si l'appel de l'API renvoie une structure ou un type différent d'entier 'integer', ce champ est utilisé pour définir le résultat du retour. Une adresse vers la structure ou la variable doit être spécifiée. Si zéro est spécifié, le résultat sera ignoré.
Objet | L'objet sur lequel les méthodes Objective-C sera appelé. Il peut être égal à zéro si la méthode est une méthode statique (c'est le cas la plupart du temps lors de la création d'un objet).
Methode$ | La méthode de l'objet à appeler, suivi d'un ';' comme d'habitude. Si la méthode a besoin d'une structure comme paramètre, '@' doit être ajouté après le point-virgule. Si la méthode s'attend à une chaîne comme paramètre, '$' peut être ajouté après le point-virgule, de sorte que la chaîne sera automatiquement convertie dans un NSString temporaire. Ce n'est pas requis, mais il peut être utile et ça facilite le codage. Si la méthode n'est pas prise en charge par l'objet, un message du débogueur sera levé lors de l'exécution.
ValeurParametre (optionnel) | La valeur du paramètre associé à la méthode précédente.
Parameter$ (optionnel) | Le paramètre de la méthode suivante. PureBasic supporte jusqu'à 7 paramètres par méthode.

Valeur de retour

Valeur de retour Integer. Utile pour la création d'identifiant d'objets.

Remarques

PureBasic a déjà configuré un pool de mémoire temporaire qui est vidé à chaque fois que WindowEvent() ou WaitWindowEvent() est appelé. Si vous avez besoin de libérer immédiatement les gros objets, vous devrez créer un pool de mémoire locale pour chacun de vos appels.

Exemple: avec une chaîne

  ; Objective-C:
  ;   ColorList = [NSColorList colorListNamed:@"Crayons"];
  ;
  ColorList = CocoaMessage(0, 0, "NSColorList colorListNamed:$", @"Crayons") ; Créera un NSString pour "Crayons" (en respectant le mode ascii/unicode du programme)

Exemple: avec un type complexe

  ; Objective-C:
  ;   Transform = [NSAffineTransform transform];
  ;
  Transform = CocoaMessage(0, 0, "NSAffineTransform transform") ; Obtenir une 'identity transform'

  ; Objective-C:
  ;   [TransForm scaleXBy:sx yBy:sy];
  ;
  sx.CGFloat = 5.5
  sy.CGFloat = 20
  CocoaMessage(0, TransForm, "scaleXBy:@", @sx, "yBy:@", @sy) ; Agrandi x par 5.5, y par 20. comme sx n'est pas un 'integer', '@' doit être utilisé.

  ; Objective-C:
  ;   NSAffineTransform TransformStruct = [TransForm transformStruct];
  ;
  CocoaMessage(@TransformStruct.NSAffineTransform, TransForm, "transformStruct") ; Obtenir une structure transform

  Debug TransformStruct\m11 ; debug affiche 5.5

OS Supportés

MacOS X


Delay()

Syntaxe

Delay(Temps)
Description
Suspend totalement l'exécution du programme pendant une durée spécifiée.

Arguments

Temps Le délai en millisecondes.

Attention, le délai réel peut être plus long que le temps spécifié.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette fonction est particulièrement utile dans les boucles d'évènements utilisant WindowEvent() ou ExamineKeyboard(), pour éviter qu'elles ne monopolisent tout le temps processeur.

Voir aussi

ElapsedMilliseconds()


DoubleClickTime()

Syntaxe

Resultat = DoubleClickTime()
Description
Renvoie le réglage système de la durée du double-clic.

Si deux clics de souris se produisent dans cette durée, ils sont considérés comme un double-clic.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la durée du double-clic en millisecondes.

Remarques

Cette fonction peut être utilisée avec Openscreen ou CanvasGadget().

Voir aussi

OpenScreen(), OpenWindowedScreen(), CanvasGadget()


ElapsedMilliseconds()

Syntaxe

Resultat = ElapsedMilliseconds()
Description
Renvoie le nombre de millisecondes qui se sont écoulées depuis le démarrage de l'ordinateur.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le temps écoulé en millisecondes.

Remarques

La valeur absolue qui est retournée n'est d'aucune utilité, car elle varie en fonction du système d'exploitation. Au lieu de cela, cette fonction doit être utilisée pour calculer les différences de temps entre plusieurs appels à ElapsedMilliseconds() .

Cette fonction est relativement précise: il peut y avoir de légères différences en fonction de l'OS sur lequel le programme s'exécute. cela est dû au fait que certains systèmes ont une minuterie avec une résolution inférieure à d'autres.

Exemple

  ;
  ; exemple d'utilisation comme chronomètre
  ;
  TempsDepart = ElapsedMilliseconds()  ; Récupère la valeur actuelle
  Delay(1000)  ; Attend 1000 millisecondes
  TempsEcoule = ElapsedMilliseconds()-TempsDepart  ; La valeur 'TempsEcoule' devrait être d'environ 1000 millisecondes

  Debug "Temps écoulé : "+Str(TempsEcoule)+" millisecondes"

Voir aussi

Delay()


Green()

Syntaxe

Resultat = Green(Couleur)
Description
Renvoie la valeur de la composante verte d'une couleur.

Arguments

Couleur La valeur de la couleur.

Cela peut être une valeur RGB 24-bit ou une valeur RGBA 32-bit.

Valeur de retour

Renvoie la valeur de la composante verte.
Le résultat sera compris entre 0 et 255.

Remarques

RGB() permet de combiner les valeurs rouge, verte et bleue en une couleur 24-bit.
RGBA() permet de combiner les valeurs rouge, verte, bleue et alpha en une couleur 32-bit.
Ces fonctions sont utiles lors des opérations de dessin 2D.

Voir aussi

Red(), Blue(), Alpha(), RGB(), RGBA()


OSVersion()

Syntaxe

Resultat = OSVersion()
Description
Renvoie la version du système d'exploitation sur lequel le programme s'exécute.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie l'une des valeurs suivantes, selon le système d'exploitation:

Windows
  #PB_OS_Windows_NT3_51
  #PB_OS_Windows_95
  #PB_OS_Windows_NT_4
  #PB_OS_Windows_98
  #PB_OS_Windows_ME
  #PB_OS_Windows_2000
  #PB_OS_Windows_XP
  #PB_OS_Windows_Server_2003
  #PB_OS_Windows_Vista
  #PB_OS_Windows_Server_2008
  #PB_OS_Windows_7
  #PB_OS_Windows_Future  ; Nouvelle version de Windows (n'existant pas lorsque le programme a été écrit)
Linux
  #PB_OS_Linux_2_2
  #PB_OS_Linux_2_4
  #PB_OS_Linux_2_6
  #PB_OS_Linux_Future ; Nouvelle version de Linux (n'existant pas lorsque le programme a été écrit)
Mac OSX
  #PB_OS_MacOSX_10_0
  #PB_OS_MacOSX_10_1
  #PB_OS_MacOSX_10_2
  #PB_OS_MacOSX_10_3
  #PB_OS_MacOSX_10_4
  #PB_OS_MacOSX_10_5
  #PB_OS_MacOSX_10_6
  #PB_OS_MacOSX_Future  ; Nouvelle version de MacOS X (n'existant pas lorsque le programme a été écrit)

Exemple

  Select OSVersion()
    Case #PB_OS_Windows_98
      MessageRequester("Info", "Windows 98")

    Case #PB_OS_Windows_2000
      MessageRequester("Info", "Windows 2000")

    Case #PB_OS_Windows_XP
      MessageRequester("Info", "Windows XP")

    Default
      MessageRequester("Info", "version de Windows inconnue")
  EndSelect
Note : La valeur des constantes respecte l'ordre chronologique de sortie des différentes versions, ce qui permet de déterminer rapidement si une version est plus ancienne ou plus récente qu'une version donnée :
  If OsVersion() < #PB_OS_Windows_2000
    ;
    ; Toutes les versions plus anciennes que Windows 2000
    ;
  EndIf


RGB()

Syntaxe

Couleur = RGB(Rouge, Vert, Bleu)
Description
Renvoie la valeur de la couleur 24-bit correspondant aux valeurs Rouge, Verte et Bleue.

Arguments

Rouge, Vert, Bleu La valeur des composantes rouge, vert et bleu de la couleur.

Chaque valeur doit être comprise entre 0 et 255.

Valeur de retour

Renvoie la valeur de la couleur.

Remarques

Pour extraire la valeur d'une des composantes 'Rouge', 'Verte' ou 'Bleue' à partir de la valeur d'une couleur 24 Bits, utilisez les commandes suivantes Red(), Green() et Blue().

Ces fonctions sont utiles pour effectuer des opérations de dessin.

Un tableau représentant les couleurs les plus communes est disponible ici.

Voir aussi

Red(), Green(), Blue(), RGBA()


RGBA()

Syntaxe

Couleur = RGBA(Rouge, Vert, Bleu, Alpha)
Description
Renvoie la valeur de la couleur 32-bit correspondant aux valeurs Rouge, Verte, Bleue et Alpha.

Arguments

Rouge, Vert, Bleu La valeur des composantes rouge, verte et bleue de la couleur.

Chaque valeur doit être comprise entre 0 et 255.
Alpha La composante alpha (transparence) de la couleur.

La valeur doit être comprise entre 0 et 255.

Une valeur de 0 signifie une transparence complète et une valeur de 255 signifie une opacité totale.

Valeur de retour

Renvoie la valeur de la couleur.

Remarques

Chaque composante 'Rouge', 'Verte', 'Bleue' et 'Alpha' est une valeur comprise entre 0 et 255, ce qui fait un nombre total de 16.7 millions de couleurs différentes, avec 256 niveaux de transparence.

Pour extraire la valeur d'une des composantes 'Rouge', 'Verte', 'Bleue' ou 'Alpha' à partir de la valeur d'une couleur 32 Bits, utilisez les commandes suivantes Red(), Green(), Blue() et Alpha().

Un tableau représentant les couleurs les plus communes est disponible ici. Ces fonctions sont utiles lors des opérations de dessin 2D.

Voir aussi

Red(), Green(), Blue(), Alpha(), RGB()


Random()

Syntaxe

Resultat = Random(Maximum [, Minimum])
Description
Renvoie un nombre aléatoire compris entre zéro et la valeur 'Maximum'.

Arguments

Maximum La valeur maximale.

Ne peut excéder le maximum positif de integer.
Minimum (optionnel) La valeur minimale.

Ne peut pas dépasser la valeur maximale. Si elle est spécifiée, le résultat se situe entre la valeur minimale et la valeur maximale (les deux valeurs incluses).

Valeur de retour

Renvoie une valeur entre zéro à la valeur maximale (toutes deux incluses), à moins qu'une valeur minimale soit spécifiée.

Remarques

RandomSeed() peut être utilisé pour régénérer la table des nombres aléatoires. Cela peut être utile quand un programmeur veut toujours avoir la même table de nombres aléatoires dans le même ordre.
RandomData() peut être utilisé pour remplir une mémoire tampon avec des nombres aléatoires.
RandomizeArray() ou RandomizeList() peut être utilisée, pour rendre aléatoire les éléments d'un tableau ou d'une liste chaînée.

Note: Cette commande utilise un générateur de nombre aléatoire conçu pour être très rapide, au détriment de la robustesse. Il convient parfaitement pour une utilisation générale, mais si les nombres générés sont utilisés à des fins de chiffrement, il est fortement conseillé d'utiliser CryptRandom().

Exemple

  Repeat
    DeAJouer = Random(6)  ; Renvoie une valeur entre 1 et 6, incluant 1 et 6
    Choix = MessageRequester("Lancer le dé", "Vous avez eu un "+Str(DeAJouer)+", Relancer le dé ?", #PB_MessageRequester_YesNo)
  Until Choix = #PB_MessageRequester_No

Voir aussi

RandomSeed(), RandomData(), CryptRandom(), RandomizeArray(), RandomizeList()


RandomData()

Syntaxe

RandomData(*Memoire, Longueur)
Description
Remplit une zone de mémoire avec des données aléatoires.

Arguments

*Memoire | L'adresse de la mémoire tampon à remplir.
Longueur | La taille de la mémoire tampon à remplir.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette commande utilise la même racine que la commande Random().
RandomSeed() peut être utilisé pour régénérer la table des nombres aléatoires.

Note: Cette commande utilise un générateur de nombre aléatoire conçu pour être très rapide, au détriment de la robustesse. Il convient parfaitement pour une utilisation générale, mais si les nombres générés sont utilisés à des fins de chiffrement, il est fortement conseillé d'utiliser CryptRandomData().

Exemple

  ; Crée une image avec un contenu aléatoire
  ;
  CreateImage(0, 200, 200)
  If StartDrawing(ImageOutput(0))
    *Buffer = DrawingBuffer()
    Pitch   = DrawingBufferPitch()

    RandomData(*Buffer, Pitch*200)

    StopDrawing()
  EndIf

  OpenWindow(0, 0, 0, 200, 200, "Image aléatoire ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ImageGadget(0, 0, 0, 200, 200, ImageID(0))

  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow

Voir aussi

RandomSeed(), Random(), CryptRandomData()


RandomSeed()

Syntaxe

RandomSeed(Valeur)
Description
Change la table des nombres aléatoires renvoyée par Random() ou RandomData() par celle spécifiée.

Arguments

Valeur La nouvelle table pour le générateur de nombres aléatoires.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Note: A chaque fois qu'un programme PureBasic se lance, sa table est régénérée, ce qui assure d'avoir des nombres aléatoires totalement différents à chaque exécution. Ainsi RandomSeed() n'est utile que lorsque l'objectif est de générer des nombres aléatoires dans le même ordre à chaque fois que le programme est exécuté.

Voir aussi

Random(), RandomData(), RandomizeArray(), RandomizeList()


Red()

Syntaxe

Resultat = Red(Couleur)
Description
Renvoie la valeur de la composante rouge d'une couleur.

Arguments

Couleur La valeur de la couleur.

Cela peut être une valeur RGB 24-bit ou une valeur RGBA 32-bit.

Valeur de retour

Renvoie la valeur de la composante rouge.
Le résultat sera compris entre 0 et 255.

Remarques

RGB() permet de combiner les valeurs rouge, verte et bleue en une couleur 24-bit.
RGBA() permet de combiner les valeurs rouge, verte, bleue et alpha en une couleur 32-bit.
Ces fonctions sont utiles lors des opérations de dessin 2D.

Voir aussi

Green(), Blue(), Alpha(), RGB(), RGBA()


Module

PureBasic - Module

Généralités

PureBasic peut jouer des morceaux de musique sous forme de fichiers Modules (.mod) pour ajouter un fond sonore à vos jeux ou applications. Les modules sont bien connus des demomakers car c'est un moyen simple et efficace de créer un environnement sonore. Les outils utilisés pour créer des modules s'appellent des 'trackers' (ProTracker, FastTracker, Impulse Tracker...). Par rapport aux fichiers .wav et mp3, les fichiers Module (.mod) ont l'avantage d'être très compacts et d'une longueur illimitée tout en consommant très peu de ressources processeur. Il est aussi possible de sélectionner en temps réel différentes parties du morceau pour s'adapter, par exemple, à chaque phase d'un jeu. Il est bien entendu possible de mixer un son classique et un module et de les jouer simultanément.

La bibliothèque ModPlug est utilisée et permet une reproduction sonore très fidèle tout en supportant de nombreux formats différents (XM, S3M, ...).

Avant de pouvoir utiliser les commandes relatives aux Modules, il est nécessaire d'appeler avec succès la commande InitSound().

Sommaire des commandes

CatchModule
FreeModule
GetModulePosition
GetModuleRow
IsModule
LoadModule
ModuleVolume
PlayModule
SetModulePosition
StopModule

Exemple

Module.pb

OS Supportés

Tous

Guide de référence - Index


CatchModule()

Syntaxe

Resultat = CatchModule(#Module, *AdresseMemoire, Longueur)
Description
Charge le #Module situé à l'adresse mémoire spécifiée. Si #PB_Any est utilisé pour le paramètre '#Module', le numéro du nouveau module sera renvoyé dans 'Resultat'. Si 'Resultat' est 0 alors le chargement a échoué, sinon le module est prêt à être joué avec la commande PlayModule(). Si le #Module était déjà créé, il est automatiquement supprimé et remplacé par le nouveau.

ModPlug supporte de nombreux formats de modules, parmi lesquels: Protracker (4 canaux), FastTracker (plus de 32 canaux, qualité 16-bit), Impulse Tracker, etc.

Cette commande est utile pour inclure des modules directement dans l'exécutable avec la commande IncludeBinary. Néanmoins, n'abusez pas de cette fonctionnalité car un module inclus dans un exécutable consomme automatiquement de la mémoire supplémentaire (car tout l'exécutable, y compris les modules, sont chargés en mémoire).

Exemple

  CatchModule(0, ?Module, ?ModuleEnd-?Module)
  End

  DataSection
    Module:
      IncludeBinary "Module.xm"
    ModuleEnd:
  EndDataSection


FreeModule()

Syntaxe

FreeModule(#Module)
Description
Arrête l'exécution et efface le module #Module précédemment chargé par la fonction LoadModule(). Quand le module a été effacé, la mémoire qu'il occupait a été libérée donc il ne peut plus être rejoué.

Si #PB_All est spécifié, tous les modules restants sont libérés.

Note: tous les modules restants sont automatiquement supprimés quand le programme se termine.


GetModulePosition()

Syntaxe

Position = GetModulePosition(#Module)
Description
Renvoie la position de la plage dans le #Module en cours de lecture. La première plage commence à 0.


GetModuleRow()

Syntaxe

Ligne = GetModuleRow(#Module)
Description
Renvoie la ligne de la plage dans le #Module en cours de lecture. La première ligne commence à 0.


IsModule()

Syntaxe

Resultat = IsModule(#Module)
Description
Teste si le #Module est correctement initialisé. Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. Si le 'Résultat' est différent de zéro, alors cet objet est valide. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.


LoadModule()

Syntaxe

Resultat = LoadModule(#Module, NomFichier$)
Description
Charge en mémoire le module spécifié dans NomFichier$. Si #PB_Any est utilisé pour le paramètre '#Module', le numéro du nouveau module sera renvoyé dans 'Resultat'. Si Resultat est différent de 0, le module a été correctement chargé et est prêt à être joué avec la fonction PlayModule(), sinon, le chargement du module a échoué.

ModPlug supporte beaucoup de modules dont les plus courants sont: Protracker (4 canaux), FastTracker (jusqu'à 32 canaux, qualité 16-bit), Impulse Tracker, etc.


ModuleVolume()

Syntaxe

Resultat = ModuleVolume(#Module, Volume)
Description
Change le volume général du module spécifié en temps réel. La valeur du volume est comprise entre 0 et 100. Pratique pour des montées / descentes en douceur.


PlayModule()

Syntaxe

PlayModule(#Module)
Description
Joue le #Module précédemment chargé par la fonction LoadModule().


SetModulePosition()

Syntaxe

SetModulePosition(#Module, Position)
Description
Change la plage du #Module par la plage spécifiée. La première plage commence à 0, en millisecondes.


StopModule()

Syntaxe

StopModule(#Module)
Description
Arrête la lecture du #Module spécifié.


Mouse

PureBasic - Mouse

Généralités

PureBasic permet un plein accès aux souris connectées à l'ordinateur. Les souris standards sont supportées jusqu'à trois boutons. Cette bibliothèque est optimisée et utilise des fonctions de très bas niveau spécialement efficaces pour le développement de jeux.

N'utilisez pas cette bibliothèque pour des applications classiques. La technologie DirectX est utilisée.

Sommaire des commandes

ExamineMouse
InitMouse
MouseButton
MouseDeltaX
MouseDeltaY
MouseLocate
MouseWheel
MouseX
MouseY
ReleaseMouse

Exemple

Mouse.pb

OS Supportés

Tous

Guide de référence - Index


ExamineMouse()

Syntaxe

Resultat = ExamineMouse()
Description
Met à jour l'état de la souris.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Si zéro est retourné, la souris ne peut pas être utilisée.

Remarques

Cette commande doit être utilisée avant MouseDeltaX(), MouseDeltaY(), MouseX(), MouseY() ou MouseButton(). Actuellement, seule la souris par défaut est supportée.

Voir aussi

InitMouse()


InitMouse()

Syntaxe

Resultat = InitMouse()
Description
Initialise l'environnement Mouse pour un usage futur.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Si le résultat est nul, il n'y a pas de souris disponible.

Remarques

Vous devez appeler cette fonction avant tout usage des autres commandes de la bibliothèque. Cette commande tente d'ouvrir DirectX (v3.0 pour la compatibilité NT4.0 ou v7.0 sinon), donc si il y a échec cela est probablement dû à une version DirectX trop ancienne ou absente.

Voir aussi

ExamineMouse()


MouseButton()

Syntaxe

Resultat = MouseButton(Bouton)
Description
Teste si un bouton est enfoncé.

Arguments

Bouton
  #PB_MouseButton_Left  : Teste si le bouton gauche de la souris est enfoncé
  #PB_MouseButton_Right : Teste si le bouton droit de la souris est enfoncé
  #PB_MouseButton_Middle: Teste si le bouton du milieu de la souris est enfoncé

Valeur de retour

Renvoie zéro si le bouton spécifié n'est pas appuyé, sinon le bouton est effectivement appuyé.

Remarques

On peut appuyer n'importe quel nombre de boutons simultanément.

ExamineMouse() doit être appelé avant cette fonction pour mettre l'état des boutons à jour.

Voir aussi

ExamineMouse()


MouseDeltaX()

Syntaxe

Resultat = MouseDeltaX()
Description
Teste le déplacement horizontal de la souris.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le déplacement horizontal (en pixels) de la souris depuis le dernier appel de cette fonction.

Remarques

Cela signifie que le résultat peut être positif ou négatif selon que le déplacement s'est effectué vers la droite ou vers la gauche depuis le dernier appel.

ExamineMouse() doit être appelé avant cette fonction pour mettre la position courante de la souris à jour.

Voir aussi

MouseDeltaY()


MouseDeltaY()

Syntaxe

Resultat = MouseDeltaY()
Description
Teste le déplacement vertical de la souris.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le déplacement vertical (en pixels) de la souris depuis le dernier appel de cette fonction.

Remarques

Cela signifie que le résultat peut être positif ou négatif selon que le déplacement s'est effectué vers le haut ou vers le bas depuis le dernier appel.

ExamineMouse() doit être appelé avant cette fonction pour mettre la position courante de la souris à jour.

Voir aussi

MouseDeltaX()


MouseLocate()

Syntaxe

Resultat = MouseLocate(x, y)
Description
Change la position absolue (en pixels) de la souris dans l'écran courant.

Arguments

x, y La nouvelle position du curseur.

Valeur de retour

Renvoie une valeur non nulle en cas de succès.

Remarques

C'est principalement utilisé en conjonction avec les commandes suivantes: MouseX() et MouseY().

Voir aussi

ExamineMouse()


MouseWheel()

Syntaxe

Resultat = MouseWheel()
Description
Teste la molette de la souris depuis le dernier appel.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le nombre de ticks (unité du système pas à pas) réalisés par la molette de la souris depuis le dernier appel.

Remarques

La valeur est positive si la molette a été déplacée vers l'avant et négative si la molette a été déplacée vers l'arrière.

ExamineMouse() doit être appelé avant cette fonction pour mettre les informations sur la souris à jour.

Voir aussi

ExamineMouse()

OS Supportés

Windows


MouseX()

Syntaxe

Resultat = MouseX()
Description
Teste la position horizontale de la souris.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la position horizontale actuelle (en pixels) de la souris sur l'écran actif.

Remarques

ExamineMouse() doit être appelé avant cette fonction pour mettre la position courante de la souris à jour.

Voir aussi

MouseY()


MouseY()

Syntaxe

Resultat = MouseY()
Description
Teste la position verticale de la souris.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la position verticale actuelle (en pixels) de la souris sur l'écran actif.

Remarques

ExamineMouse() doit être appelé avant cette fonction pour mettre la position courante de la souris à jour.

Voir aussi

MouseX()


ReleaseMouse()

Syntaxe

Resultat = ReleaseMouse(Etat)
Description
Capture ou libère la souris pour rendre son usage possible dans le système d'exploitation.

Arguments

Etat Posé à 1, la souris est libérée, sinon la souris est capturée par le programme PureBasic.

Valeur de retour

Renvoie une valeur non nulle en cas de succès.

Remarques

On utilise typiquement cette fonction après avoir vérifié le résultat de la commande IsScreenActive().

Voir aussi

ExamineMouse()


Movie

PureBasic - Movie

Généralités

PureBasic propose des commandes simples mais très efficaces pour intégrer la diffusion d'un film dans une application ou un jeu.

Dans la mesure où la technologie DirectX est utilisée, tous types de films (ou même de médias) peuvent être diffusés à partir de cette bibliothèque: AVI, MPG, DivX, Mp3 etc..

Sommaire des commandes

FreeMovie
InitMovie
IsMovie
LoadMovie
MovieAudio
MovieHeight
MovieInfo
MovieLength
MovieSeek
MovieStatus
MovieWidth
PauseMovie
PlayMovie
RenderMovieFrame
ResizeMovie
ResumeMovie
StopMovie

Exemple

Movie.pb
MovieSprite.pb

OS Supportés

Tous

Guide de référence - Index


FreeMovie()

Syntaxe

FreeMovie(#Film)
Description
Libère le #Film spécifié et l'efface de la mémoire. Ce film n'est alors plus accessible.

Si #PB_All est spécifié, tous les films restants sont libérés.

Note: tous les films restants sont automatiquement libérés quand le programme se termine.


InitMovie()

Syntaxe

Resultat = InitMovie()
Description
Initialise l'environnement Film pour un usage futur. Cette fonction doit être exécutée avant tout autre commande de cette bibliothèque. Cette commande tente d'ouvrir DirectX (v3.0 pour la compatibilité NT4.0 ou v7.0 sinon). Si la commande échoue DirectX est probablement d'une version trop ancienne ou indisponible.


IsMovie()

Syntaxe

Resultat = IsMovie(#Film)
Description
Teste si le #Film est correctement initialisé. Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. Si le 'Résultat' est différent de zéro, alors cet objet est valide. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.


LoadMovie()

Syntaxe

Resultat = LoadMovie(#Film, NomFichier$)
Description
Tente d'ouvrir et prépare un film pour une diffusion ultérieure. Si #PB_Any est utilisé pour le paramètre '#Film', le numéro du nouveau film sera renvoyé dans 'Resultat'. Si le résultat est 0, le film ne peut pas être ouvert (format non supporté ou fichier non trouvé). PlayMovie() peut être utilisé pour démarrer la projection.


MovieAudio()

Syntaxe

MovieAudio(#Film, Volume, Balance)
Description
Contrôle le flux audio du #Film. Volume et Balance peuvent être modifiés pendant l'exécution du film. Les changements sont instantanés. L'amplitude de Volume va de 0 à 100 (100 étant le volume le plus élevé). Balance peut avoir une amplitude de -100 à 100 (-100 étant le plus à gauche et 100 le plus à droite).

OS Supportés

Windows, MacOS X


MovieHeight()

Syntaxe

Hauteur = MovieHeight(#Film)
Description
Renvoie la hauteur (en pixels) du #Film. Si le résultat est -1, alors aucun flux vidéo n'a été identifié ou le flux est incompatible. Le flux audio peut continuer à être joué. Cette commande est particulièrement utile pour exécuter des fichiers MP3 en utilisant les commandes de la bibliothèque Movie (!).


MovieInfo()

Syntaxe

Resultat = MovieInfo(#Film, Flags)
Description
Renvoie des informations additionnelles concernant le #Film.

Valeurs supportée actuellement:
  0: Renvoie le nombre de trames par seconde (*1000).
Note: Cette commande ne fonctionne qu'avec les vrais films, car le nombre d'images par seconde ne peut pas être récupéré sur un fichier son (MP3, WAV, Ogg Vorbis etc..).

OS Supportés

Windows, MacOS X


MovieLength()

Syntaxe

Longueur = MovieLength(#Film)
Description
Renvoie la longueur (en trames) du #Film.

Note: Cette commande ne fonctionne qu'avec les vrais films, car le nombre de trames ne peut pas être récupéré sur un fichier son (MP3, WAV, Ogg Vorbis etc..).

OS Supportés

Windows, MacOS X


MovieSeek()

Syntaxe

Resultat = MovieSeek(#Film, Trame.q)
Description
Déplace la position courante du #Film à la trame spécifiée.

OS Supportés

Windows, MacOS X


MovieStatus()

Syntaxe

Resultat.q = MovieStatus(#Film)
Description
Obtient le status du #Film.

'Resultat' peut être une des valeurs suivantes:
   -1: Le film est en pause.
    0: Le film est stoppé
  > 0: Le film est en cours d'exécution. La valeur retournée est le numéro de trame en cours d'affichage.


MovieWidth()

Syntaxe

Largeur = MovieWidth(#Film)
Description
Renvoie la largeur (en pixels) du #Film. Si le résultat est -1 , aucun flux vidéo n'a été trouvé (ou n'est compatible). Le flux audio peut continuer à être joué.

Ceci est particulièrement utile pour jouer des fichiers MP3 en utilisant les commandes de la bibliothèque Movie. (!).


PauseMovie()

Syntaxe

PauseMovie(#Film)
Description
Interrompt la projection du #Film. L'exécution peut être reprise en utilisant la commande ResumeMovie().


PlayMovie()

Syntaxe

PlayMovie(#Film, FenetreID)
Description
Démarre l'exécution, dans la fenêtre spécifiée, d'un film préalablement chargé avec la commande LoadMovie(). La valeur FenetreID est facilement obtenue en utilisant la commande WindowID() de la bibliothèque Window.

La commande ResizeMovie() peut être utilisée pour dimensionner et déplacer le film dans cette fenêtre (pour ne pas utiliser la fenêtre entière par exemple).

Si le film est destiné à être rendu directement sur un sprite à l'aide de RenderMovieFrame() alors le paramètre 'FenetreID' doit prendre la valeur #PB_Movie_Rendered.

Il est aussi possible de jouer un film en plein écran, il suffit d'utiliser le résultat de la commande ScreenID() comme 'WindowID'.


RenderMovieFrame()

Syntaxe

RenderMovieFrame(#Film, SpriteID)
Description
Joue le film directement sur un sprite, au lieu de le jouer sur une zone vidéo dédiée. Cette commande très puissante permet d'effectuer des effets spéciaux en temps réel (tel que jouer un film en plein écran en plusieurs niveaux de transparence grâce aux Sprite3D, rotation, zoom etc...). Malheureusement, tous les formats vidéos ne sont pas compatibles avec ce mode et pour l'instant seuls les MPEG semblent fonctionner parfaitement. Un 'SpriteID' valide peut être facilement obtenu en récupérant le résultat de la commande SpriteID() ou CreateSprite(). Avant d'utiliser cette commande, PlayMovie() doit être lancé avec l'option #PB_Movie_Rendered.

OS Supportés

Windows


ResizeMovie()

Syntaxe

ResizeMovie(#Film, x, y, Largeur, Hauteur)
Description
Redimensionne et déplace la zone d'affichage du #Film dans la fenêtre allouée. Ceci est particulièrement utile avant de démarrer l'exécution avec PlayMovie().


ResumeMovie()

Syntaxe

ResumeMovie(#Film)
Description
Reprend l'exécution du #Film après un appel à la commande PauseMovie().


StopMovie()

Syntaxe

StopMovie(#Film)
Description
Cesse la projection du #Film spécifié. Si le film est relancé, il sera repris depuis le début.


Network

PureBasic - Network

Généralités

Les réseaux sont utilisés dans le monde entier pour faciliter la communication et le transfert d'informations entre ordinateurs. PureBasic supporte le protocole d'échange de données officiel d'Internet appelé TCP/IP. Cela vous permet d'écrire des applications ou des jeux basés sur ce protocole et le modèle 'client-serveur'. Avec les fonctions de cette bibliothèque, il vous est possible de créer toutes sortes d'applications de type Internet (navigateurs, serveur Web, client FTP...) ou des jeux multijoueurs.

Sommaire des commandes

CloseNetworkConnection
CloseNetworkServer
ConnectionID
CreateNetworkServer
EventClient
EventServer
ExamineIPAddresses
FreeIP
GetClientIP
GetClientPort
HostName
IPAddressField
IPString
InitNetwork
MakeIPAddress
NetworkClientEvent
NetworkServerEvent
NextIPAddress
OpenNetworkConnection
ReceiveNetworkData
SendNetworkData
SendNetworkString
ServerID

Exemple

NetworkClient.pb
NetworkServer.pb

OS Supportés

Tous

Guide de référence - Index


CloseNetworkConnection()

Syntaxe

CloseNetworkConnection(Connexion)
Description
Ferme une connexion.

Arguments

Connexion La connexion à fermer.

Ceci est le résultat soit d'un appel à OpenNetworkConnection() ou à EventClient().

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Si cette commande est utilisée en mode client, le serveur recevra un événement #PB_NetworkEvent_Disconnect" (utilisateur déconnecté). Si cette commande est utilisée en mode serveur, la connexion sera fermée sans aucune notification pour le client. Quand un serveur reçoit un événement #PB_NetworkEvent_Disconnect, la connexion client associée est automatiquement fermée. CloseNetworkConnection() ne doit pas être appelé dans ce cas.

Toutes les connexions restant ouvertes sont automatiquement fermées quand le programme se termine.

Voir aussi

OpenNetworkConnection(), EventClient(), CloseNetworkServer()


CloseNetworkServer()

Syntaxe

CloseNetworkServer(#Serveur)
Description
Ferme un serveur.

Arguments

#Server Le serveur à fermer.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Tous les clients connectés à ce serveur sont automatiquement déconnectés. Le port est libéré et peut être réutilisé par une autre application ou par un autre serveur.

Voir aussi

CreateNetworkServer(), CloseNetworkConnection()


ConnectionID()

Syntaxe

Resultat = ConnectionID(Connexion)
Description
Renvoie l'identifiant système unique d'une connexion.

Arguments

Connexion La connexion à tester.

Ceci est le résultat soit d'un appel à OpenNetworkConnection() ou à EventClient().

Valeur de retour

Renvoie l'identifiant système.
Ce résultat est parfois aussi appelé 'Handle'. Regardez le chapitre Numéros et Identifiants (Handles) pour plus d'informations.

Voir aussi

ServerID()


CreateNetworkServer()

Syntaxe

Resultat = CreateNetworkServer(#Serveur, Port [, Mode [, IPLocale$]])
Description
Crée un nouveau serveur réseau sur l'ordinateur local sur le port spécifié.

Arguments

#Serveur Le numéro par lequel le nouveau serveur sera identifié.

#PB_Any peut être utilisé pour générer automatiquement ce numéro.
Port Le port à utiliser par le serveur.

Les valeurs du port peuvent aller de 6000 à 7000 (ce sont les valeurs recommandées, mais elles peuvent aller en réalité de 0 à 65000).
Mode (optionnel) Peut être l'une des valeurs suivantes:
  #PB_Network_TCP: Le serveur utilisera le protocole TCP (mode par défaut).
  #PB_Network_UDP: Le serveur utilisera le protocole UDP.
Combiné à l'une des valeurs suivantes (en utilisant le symbole |):
  #PB_Network_IPv4: Crée un serveur en utilisant IPv4 (par défaut).
  #PB_Network_IPv6: Crée un serveur en utilisant IPv6.
IPLocale$ (optionnel) L'adresse IP locale à lier au serveur.
Par défaut, le serveur fonctionne sur toutes les interfaces locales disponibles, et accepte toutes leurs connexions. Il peut être utile de restreindre le serveur à une seule interface (par exemple, "127.0.0.1") pour éviter les tentatives de connexion à partir d'autres interfaces. Sous Windows, la liaison à l'hôte local permet d'éviter de déclencher le pare-feu intégré.

Valeur de retour

Renvoie une valeur non nulle si le serveur a été créé avec succès ou zéro si la création a échoué (par exemple parce que le port est en cours d'utilisation).
Si #PB_Any a été utilisé comme paramètre #Serveur alors le nombre généré est renvoyé en cas de succès.

Remarques

Un nombre quelconque de serveurs peuvent tourner simultanément sur la même machine, mais jamais avec le même numéro de port et le même protocole (#PB_Network_TCP et #PB_Network_UDP).

NetworkServerEvent() peut être utilisé pour surveiller les nouveaux événements serveur.

Note: InitNetwork() doit être appelée avant d'utiliser d'autres commandes de la bibliothèque réseau.

Voir aussi

OpenNetworkConnection(), CloseNetworkServer(), NetworkServerEvent(), InitNetwork()


EventClient()

Syntaxe

Client = EventClient()
Description
Cette fonction n'est nécessaire que côté serveur. Elle permet de savoir quel est le client qui a envoyé les données.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la connexion du client qui a provoqué l'événement.

Remarques

Les commandes GetClientIP() et GetClientPort() peuvent servir à collecter plus d'informations à propos du client qui a émis les données.

Voir aussi

NetworkServerEvent(), GetClientIP(), GetClientPort()


EventServer()

Syntaxe

Serveur = EventServer()
Description
Cette fonction n'est nécessaire que côté serveur. Elle permet de savoir sur quel serveur les données ont été reçues et ainsi de pouvoir gérer plusieurs serveurs simultanément dans le même programme.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le numéro du serveur qui a provoqué l'événement.

Voir aussi

NetworkServerEvent(), EventClient()


ExamineIPAddresses()

Syntaxe

Resultat = ExamineIPAddresses([Format])
Description
Démarre l'examen des adresses IP valables sur l'ordinateur local. NextIPAddress() sera utilisé pour retrouver chaque adresse.

Arguments

Format (optionnel) Le format de l'adresse IP à examiner. Il peut être une des valeurs suivantes:
  #PB_Network_IPv4: Examine les adresses IPv4 (par défaut).
  #PB_Network_IPv6: Examine les adresses IPv6.
                    Les adresses renvoyées doivent être libérées avec FreeIP() après utilisation.

Valeur de retour

Renvoie une valeur non nulle si l'examen a réussi ou zéro s'il a échoué.

Voir aussi

NextIPAddress()


FreeIP()

Syntaxe

FreeIP(AdresseIP)
Description
Libére une adresse IPv6.

Arguments

AdresseIP : L'adresse IPv6 à libérer.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette fonction fonctionne uniquement avec des adresses IPv6 renvoyées par MakeIPAddress(), NextIPAddress() et GetClientIP(). Elle ne doit pas être utilisée avec des adresses IPv4.

Voir aussi

NextIPAddress(), MakeIPAddress(), GetClientIP()


GetClientIP()

Syntaxe

IP = GetClientIP(Client)
Description
Cette commande doit être appelée après EventClient() et renvoie l'adresse IP du client.

Arguments

Client Le client pour lequel vous souhaitez obtenir l'adresse IP.

Valeur de retour

Renvoie l'adresse IP du client.

Remarques

La commande GetClientPort() est aussi disponible pour connaître le port du client.

IPString() peut être utilisé pour convertir l'adresse IP dans une chaîne.

Si la connexion est une connexion IPv6, l'adresse renvoyée doit être libérée avec FreeIP() après utilisation.

Voir aussi

GetClientPort(), IPString(), EventClient()


GetClientPort()

Syntaxe

Port = GetClientPort(Client)
Description
Cette commande doit être appelée après EventClient() et renvoie le port du client.

Arguments

Client Le client pour lequel vous souhaitez obtenir le port.

Valeur de retour

Renvoie le port du client.

Voir aussi

GetClientIP(), EventClient()


HostName()

Syntaxe

Chaine$ = HostName()
Description
Renvoie le nom de l'ordinateur local.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le nom d'hôte.


IPAddressField()

Syntaxe

Resultat = IPAddressField(AdresseIP, Champ)
Description
Renvoie la valeur du champs de l'adresse IP spécifiée.

Arguments

AdresseIP L'adresse IP.

Pour IPv6, cette adresse doit être créé avec MakeIPAddress().
Champ Le champ à renvoyer.

Cette valeur peut être une valeur comprise entre 0 et 3.
(0 étant la valeur la plus à gauche, 3 étant la plus à droite) pour IPv4 et de 0 à 7 pour IPv6.

Valeur de retour

Renvoie la valeur du champ spécifié, dans la plage de 0 à 255.

Remarques

Cette commande est utile quand elle est utilisée en conjonction avec:

- IPAddressGadget()
- MakeIPAddress()

Voir aussi

MakeIPAddress(), IPString(), IPAddressGadget()


IPString()

Syntaxe

Chaine$ = IPString(AdresseIP [, Format])
Description
Renvoie la représentation chaîne d'une adresse IP.

Arguments

AdresseIP L'adresse IP.

Pour IPv6, cette adresse doit être le résultat de MakeIPAddress(), NextIPAddress() ou GetClientIP().
Format (optionnel) Le format de l'adresse IP à convertir. Elle peut être une des valeurs suivantes:
  #PB_Network_IPv4: Converti une adresse IPv4 (par défaut).
  #PB_Network_IPv6: Converti une adresse IPv6.

Valeur de retour

Renvoie l'adresse IP en tant que chaîne.
Sous la forme "127.0.0.1" pour IPv4 ou "::1" pour IPv6.

Voir aussi

MakeIPAddress(), IPAddressField()


InitNetwork()

Syntaxe

Resultat = InitNetwork()
Description
Cette fonction doit être appelée avant toute autre fonction de la bibliothèque Network.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie une valeur non nulle si le réseau a été initialisé correctement ou zéro sinon.


MakeIPAddress()

Syntaxe

Resultat = MakeIPAddress(Champ0, Champ1, Champ2, Champ3 [, Champ4, Champ5, Champ6, Champ7])
Description
Renvoie la valeur numérique équivalente à une adresse IP.

Arguments

Champ0, Champ1, Champ2, Champ3 Les différents champs de l'adresse.
Chaque champ a une valeur comprise entre 0 et 255.
Champ4, Champ5, Champ6, Champ7 (optionnel) Les autres champs pour l'adresse IPv6.
Chaque champ a une valeur comprise entre 0 et 255.
Lorsque ces champs sont spécifiés, une adresse IPv6 est créé. Lorsque l'adresse n'est plus nécessaire, elle doit être libérée manuellement avec FreeIP(). Une adresse IPv4 ne doit pas être libérée avec FreeIP().

Valeur de retour

Renvoie l'adresse IP.

Remarques

Cette commande est utile quand elle est utilisée en conjonction avec:

- IPAddressGadget()

Voir aussi

IPString(), IPAddressField()


NetworkClientEvent()

Syntaxe

Resultat = NetworkClientEvent(Connexion)
Description
Vérifie si un événement s'est produite sur une connexion réseau créée par OpenNetworkConnection().

Arguments

Connexion La connexion à tester.

Valeur de retour

Renvoie une des valeurs suivantes:
  #PB_NetworkEvent_None      : Il ne s'est rien passé.
  #PB_NetworkEvent_Data      : Des données ont été reçues (à lire avec ReceiveNetworkData())
  #PB_NetworkEvent_Disconnect: Le client a été déconnecté (la connexion est fermée).

Voir aussi

ReceiveNetworkData(), NetworkServerEvent()


NetworkServerEvent()

Syntaxe

Resultat = NetworkServerEvent()
Description
Vérifie si un événement s'est produit sur l'un des serveurs du réseau.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie une des valeurs suivantes:
  #PB_NetworkEvent_None      : Il ne s'est rien passé.
  #PB_NetworkEvent_Connect   : Un nouveau client s'est connecté au serveur.
  #PB_NetworkEvent_Data      : Des données ont été reçues (à lire avec ReceiveNetworkData()).
  #PB_NetworkEvent_Disconnect: Un client s'est déconnecté du serveur. Sa connexion associée est automatiquement fermée,
                               CloseNetworkConnection() ne doit pas être appelée pour ce client.

Remarques

Le serveur qui a reçu l'événement peut être déterminé avec EventServer(). Le client qui a provoqué l'événement peut être déterminé avec EventClient().

Voir aussi

ReceiveNetworkData(), EventServer(), EventClient(), CreateNetworkServer()


NextIPAddress()

Syntaxe

Resultat = NextIPAddress()
Description
Pendant un examen, renvoie l'adresse IP suivante de la machine locale. ExamineIPAddresses() doit être appelé avant cette commande.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie l'adresse IP suivante sous forme numérique. Si le résultat est 0, alors il n'y a pas d'autres adresses IP à examiner. Si ExamineIPAddresses() est appelé avec le format #PB_Network_IPv6, les adresses IP renvoyées doivent être libérées avec FreeIP() après utilisation.

Voir aussi

ExamineIPAddresses(), IPString()


OpenNetworkConnection()

Syntaxe

Connexion = OpenNetworkConnection(NomServeur$, Port [, Mode [, TempsMax [, IPLocal$ [, PortLocal]]]])
Description
Ouvre une connexion réseau sur le serveur spécifié.

Arguments

NomServeur$ Le serveur.
Cela peut être une adresse IP ou un nom complet (ex: "127.0.0.1" ou "ftp.home.net").
Port | Le port du serveur.
Mode (optionnel) Ce peut être une des valeurs suivantes:
  #PB_Network_TCP: La connexion utilisera le protocole réseau TCP (default)
  #PB_Network_UDP: La connexion utilisera le protocole réseau UDP.
                   La connexion ne sera pas explicitement créé, car UDP
                   est un protocole sans connexion, mais il faudra ajouter
                   une entrée dans la pile de gestion PureBasic pour lui
                   permettre d'envoyer des données via UDP en utilisant
                   les fonctions régulières SendNetworkData() (et connexes) .
Combinée à l'une des valeurs suivantes (en utilisant le symbole | ):
  #PB_Network_IPv4: Ouvre la connexion en utilisant IPv4 (par défaut).
  #PB_Network_IPv6: Ouvre la connexion en utilisant IPv6.
TempsMax (optionnel) | Le temps maximal (en millisecondes) avant d'abandonner la tentative de connexion. Il ne devrait pas être réglé sur une valeur trop faible (inférieur à 5000 millisecondes), car l'initialisation d'une connexion sur le réseau peut prendre un certain temps.
IPLocal$ (optionnel) | L'adresse IP locale liée à la connexion.
PortLocal (optionnel) Le port local lié à la connexion.
Par défaut, un port local aléatoire est automatiquement choisi pour la nouvelle connexion, mais il peut être remplacé par ce paramètre.

Valeur de retour

Renvoie un identifiant de connexion pour la connexion ouverte si la connexion a été établie correctement ou zéro sinon.

Voir aussi

NetworkClientEvent(), SendNetworkData(), ReceiveNetworkData(), CloseNetworkConnection()


ReceiveNetworkData()

Syntaxe

Resultat = ReceiveNetworkData(Connexion, *MemoireTampon, LongueurMemoireTampon)
Description
Reçoit une donnée brute du client spécifié. Cette fonction peut être utilisée par une application Serveur ou Client:

Arguments

Connexion La connexion.

Du côté serveur, 'Connexion' est le client qui a envoyé les données (ClientID peut être facilement obtenue avec EventClient()).
Du côté client, 'Connexion' est renvoyé par OpenNetworkConnection().
*MemoireTampon | L'adresse de la mémoire tampon qui réceptionne les données.
LongueurMemoireTampon | La taille de la mémoire tampon qui réceptionne les données.

Valeur de retour

Renvoie le nombre d'octets reçus.
Si 'Resultat' est égal à 'LongueurMemoireTampon', alors il reste des données en attente à lire.
Si une erreur s'est produite pendant la connexion (lien mort, connexion fermée par le serveur, etc), 'Resultat' sera égal à -1.

Remarques

Elle doit être appelée uniquement après avoir reçu un événement #PB_NetworkEvent_Data.
Avec les connexions UDP, le maximum pour 'LongueurMemoireTampon' est 2048.
Avec les connexions TCP, le maximum pour 'LongueurMemoireTampon' est 65536.

Voir aussi

NetworkClientEvent(), NetworkServerEvent(), SendNetworkData()


SendNetworkData()

Syntaxe

Resultat = SendNetworkData(Connexion, *MemoireTampon, LongueurMemoireTampon)
Description
Envoie des données brutes au client spécifié. Cette fonction peut être utilisée par une application Serveur ou Client:

Arguments

Connexion La connexion.

Du côté serveur, 'Connexion' est le client qui a reçu les données.
Du côté client, 'Connexion' est renvoyé par OpenNetworkConnection().
*MemoireTampon | L'adresse de la mémoire tampon d'envoie des données.
LongueurMemoireTampon | La taille de la mémoire tampon d'envoie des données.

Valeur de retour

Renvoie le nombre d'octets qui a été effectivement envoyés.
S'il n'est pas égale à 'LongueurMemoireTampon', la mémoire tampon de réception de l'utilisateur est probablement plein.
Si rien n'a pu être envoyé alors 'Resultat' sera égal à -1.

Remarques

Avec les connexions UDP, le maximum pour 'LongueurMemoireTampon' est 2048.
Avec les connexions TCP, le maximum pour 'LongueurMemoireTampon' est 65536.

Voir aussi

SendNetworkString()


SendNetworkString()

Syntaxe

Resultat = SendNetworkString(Connexion, ChaineDeCaractere$ [, Format])
Description
Envoie une chaîne de caractères au client spécifié. Cette fonction peut être utilisée par une application Serveur ou Client:

Arguments

Connexion La connexion.

Du côté serveur, 'Connexion' est le client qui a reçu les données.
Du côté client, 'Connexion' est renvoyé par OpenNetworkConnection().
ChaineDeCaractere$ La chaîne à envoyer.
Format (optionnel) Le format de chaîne à utiliser lors de l'envoi. Ce peut être une des valeurs suivantes:
  #PB_Ascii  : Envoie les chaînes au format ASCII
  #PB_UTF8   : Envoie les chaînes au format UTF8
  #PB_Unicode: Envoie les chaînes au format unicode
Si ce paramètre n'est pas spécifié, la chaîne sera écrite au format UTF8, si le programme est compilé en unicode ou au format ASCII sinon.

Valeur de retour

Renvoie le nombre d'octets qui a été envoyé.

Remarques

Il n'existe pas de ReceiveNetworkString(). SendNetworkString() fournit une solution rapide pour envoyer rapidement des chaînes de caractères.
La chaîne sera envoyée en tant que donnée brute (sans le caractère NULL de terminaison), aussi peut-elle être reçue en utilisant ReceiveNetworkData(), après que NetworkServerEvent() / NetworkClientEvent() ait renvoyé #PB_NetworkEvent_Data).
En mode unicode la chaîne est envoyée en UTF-8, qui est indépendant du processeur (contrairement à UTF-16).

Voir aussi

SendNetworkData(), ReceiveNetworkData()


ServerID()

Syntaxe

Resultat = ServerID(#Serveur)
Description
Renvoie l'identifiant système unique d'un serveur.

Arguments

#Serveur Le serveur à tester.

Valeur de retour

Renvoie l'identifiant système. Ce résultat est parfois aussi appelé 'Handle'. Regardez le chapitre Numéros et Identifiants (Handles) pour plus d'informations.

Voir aussi

ConnectionID()


Node

PureBasic - Node

Généralités

Les noeuds sont des conteneurs qui peuvent être utilisés pour grouper des objets comme : des entités, des sons 3D, des caméras, des billboards, des émetteurs de particules et également d'autres noeuds.

Une fois qu'un objet est attaché à un noeud, sa position et ses mouvements sont relatifs à la position du noeud.

Les noeuds permettent une gestion hiérarchique des objets.

InitEngine3D() doit être appelé avec succès avant de pouvoir utiliser les commandes relatives aux Noeuds.

Sommaire des commandes

AttachNodeObject
CreateNode
DetachNodeObject
FreeNode
IsNode
MoveNode
NodeFixedYawAxis
NodeID
NodeLookAt
NodePitch
NodeRoll
NodeX
NodeY
NodeYaw
NodeZ
RotateNode
ScaleNode

Exemple

Node.pb
AttachNodeObject.pb

OS Supportés

Tous

Guide de référence - Index


AttachNodeObject()

Syntaxe

AttachNodeObject(#Noeud, ObjetID)
Description
Attache un objet à un noeud.

Arguments

#Noeud Le noeud à utiliser.
ObjetID Le numéro de l'objet.

Cet objet peut être :
  - Une entité : Utiliser EntityID() à la place de 'ObjetID'
  - Un son 3D  : Utiliser SoundID3D() à la place de 'ObjetID'
  - Une camera : Utiliser CameraID() à la place de 'ObjetID'
  - Une lumière: Utiliser LightID() à la place de 'ObjectID'.
  - Un noeud   : Utiliser NodeID() à la place de 'ObjetID'.
  - Un groupe de billboards : BillboardGroupID() à la place de 'ObjetID'
  - Un émetteur de particules: ParticleEmitterID() à la place de 'ObjetID'.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

DetachNodeObject()


CreateNode()

Syntaxe

Resultat = CreateNode(#Noeud [, x, y, z])
Description
Crée un nouveau noeud.

Arguments

#Noeud Le noeud à créer.

Si #PB_Any est utilisé pour le paramètre '#Noeud', le numéro du nouveau noeud sera renvoyé dans 'Resultat'.
x, y, z (optionnel) Les coordonnées du nouveau noeud.

Valeur de retour

Si le 'Resultat' est zéro alors la création du #Noeud a échouée.

Si le noeud était déjà créé alors il sera automatiquement supprimé et remplacé par le nouveau.

Voir aussi

IsNode(), NodeID()


DetachNodeObject()

Syntaxe

DetachNodeObject(#Noeud, ObjetID)
Description
Détache un objet précédemment attaché à un noeud.

Arguments

#Noeud Le noeud à utiliser.
ObjetID Le numéro de l'objet.

Cet objet peut être :
  - Une entité : Utiliser EntityID() à la place de 'ObjetID'
  - Un son 3D  : Utiliser SoundID3D() à la place de 'ObjetID'
  - Une camera : Utiliser CameraID() à la place de 'ObjetID'
  - Une lumière: Utiliser LightID() à la place de 'ObjectID'.
  - Un noeud   : Utiliser NodeID() à la place de 'ObjetID'.
  - Un groupe de billboards : BillboardGroupID() à la place de 'ObjetID'
  - Un émetteur de particules: ParticleEmitterID() à la place de 'ObjetID'.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

AttachNodeObject()


FreeNode()

Syntaxe

FreeNode(#Noeud)
Description
Supprime un noeud.

Arguments

#Noeud Le noeud à utiliser.

Si #PB_All est spécifié, tous les nœuds restants sont libérés..

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

La mémoire qui lui était associée est libérée et le noeud ne peut plus être utilisé.
Par contre les objets qui lui étaient attachés ne sont pas supprimés et peuvent être réutilisés.

Tous les noeuds restants sont automatiquement supprimés quand le programme se termine.

Voir aussi

CreateNode(), NodeID(), IsNode() CreateNode()


IsNode()

Syntaxe

Resultat = IsNode(#Noeud)
Description
Teste si un noeud est correctement initialisé.

Arguments

#Noeud Le noeud à utiliser.

Valeur de retour

Si le 'Résultat' est différent de zéro alors cet objet est valide.

Remarques

C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.

Voir aussi

CreateNode(), NodeID(), FreeNode()


MoveNode()

Syntaxe

MoveNode(#Noeud, x, y, z [, Mode])
Description
Déplace un noeud dans le monde 3D.

Arguments

#Noeud | Le noeud à utiliser.
x, y, z | Nouvelles coordonnées du noeud.
Mode (optionnel) Peut être une des valeurs suivantes:
  #PB_Relative: Déplacement relatif, à partir de la position actuelle du noeud (par défaut).
  #PB_Absolute: Déplacement absolu à la position spécifiée.
combinée avec l'une des valeurs suivantes:
  #PB_Local : Déplacement local.
  #PB_Parent: Déplacement par rapport à la position du parent.
  #PB_World : Déplacement par rapport au monde.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le déplacement est relatif à la position actuelle d'un noeud.

Voir aussi

NodeX(), NodeY(), NodeZ(), RotateNode()


NodeFixedYawAxis()

Syntaxe

NodeFixedYawAxis(#Noeud, Activer [, VecteurX, VecteurY, VecteurZ])
Description
Changer l'axe de lacet du nœud.

Arguments

#Noeud | Le noeud à utiliser.
#Noeud | Le noeud à utiliser.
Activer Active ou désactive l'utilisation d'un axe de lacet personnalisé.
  #True : Un nouvel axe vecteur doit être spécifié.
  #False: La caméra fera un lacet autour de son propre axe Y.
VecteurX, VecteurY, VecteurZ (optionnel) Direction du vecteur du nouvel axe de lacet (valeur comprise entre -1.0 et 1.0).

Le paramètre "Activer" doit être réglé sur #True pour avoir un effet.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le comportement par défaut d'un noeud est un lacet autour de son propre axe Y.

Voir aussi

NodeYaw()


NodeID()

Syntaxe

NoeudID = NodeID(#Noeud)
Description
Renvoie l'identifiant unique d'un noeud.

Arguments

#Noeud Le noeud à utiliser.

Valeur de retour

Renvoie le numéro du noeud.

Remarques

Cette fonction est très utile quand une fonction d'une autre bibliothèque nécessite l'identifiant d'un noeud.

Voir aussi

CreateNode(), IsNode()


NodeLookAt()

Syntaxe

NodeLookAt(#Noeud, x, y, z [, DirectionX, DirectionY, DirectionZ])
Description
Change l'orientation d'un noeud dans le monde.

Arguments

#Noeud | Le noeud à utiliser.
x, y, z | Le noeud pointe vers la nouvelle position 'x, y, z' (dans l'unité du monde).
DirectionX, DirectionY, DirectionZ (optionnel) | La direction en x, y et z du vecteur du noeud (valeur comprise entre -1.0 et 1.0).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

La position du noeud n'est pas modifiée.


NodePitch()

Syntaxe

Resultat = NodePitch(#Noeud[, Mode])
Description
Renvoie le tangage d'un noeud.

Arguments

#Noeud Le noeud à utiliser.
Mode (optionnel) Peut être une des valeurs suivantes:
  #True : La valeur brute, mais elle ne peut pas être utilisée avec RotateNode() pour récupérer la même orientation (par défaut).
  #False: Le tangage est ajusté, de sorte qu'il peut être réutiliser avec RotateNode() pour récupérer la même orientation.

Valeur de retour

La valeur courante du tangage du noeud.

Valeur toujours comprise entre -180.0 et 180.0 degrés.

Voir aussi

NodeYaw(), NodeRoll()


NodeRoll()

Syntaxe

Resultat = NodeRoll(#Noeud [, Mode])
Description
Renvoie le roulis d'un noeud.

Arguments

#Noeud Le noeud à utiliser.
Mode (optionnel) Peut être une des valeurs suivantes:
  #True : La valeur brute, mais elle ne peut pas être utilisée avec RotateNode() pour récupérer la même orientation (par défaut).
  #False: Le roulis est ajusté, de sorte qu'il peut être réutiliser avec RotateNode() pour récupérer la même orientation.

Valeur de retour

La valeur courante du roulis du noeud.

Valeur toujours comprise entre -180.0 et 180.0 degrés.

Voir aussi

NodeYaw(), NodePitch()


NodeX()

Syntaxe

Resultat = NodeX(#Noeud)
Description
Renvoie la position relative en 'x' d'un noeud par rapport à son noeud parent.

Arguments

#Noeud Le noeud à utiliser.

Valeur de retour

Renvoie la position relative en 'x' d'un noeud par rapport à son noeud parent.

Remarques

Si le noeud n'a pas de noeud parent, c'est sa position 'x' dans le monde 3D qui est renvoyée.

Voir aussi

NodeY(), NodeZ(), MoveNode()


NodeY()

Syntaxe

Resultat = NodeY(#Noeud)
Description
Renvoie la position relative en 'y' d'un noeud par rapport à son noeud parent.

Arguments

#Noeud Le noeud à utiliser.

Valeur de retour

Renvoie la position relative en 'y' d'un noeud par rapport à son noeud parent.

Remarques

Si le noeud n'a pas de noeud parent, c'est sa position 'y' dans le monde 3D qui est renvoyée.

Voir aussi

NodeX(), NodeZ(), MoveNode()


NodeYaw()

Syntaxe

Resultat = NodeYaw(#Noeud [, Mode])
Description
Renvoie le lacet d'un noeud.

Arguments

#Noeud Le noeud à utiliser.
Mode (optionnel) Peut être une des valeurs suivantes:
  #True : La valeur brute, mais elle ne peut pas être utilisée avec RotateNode() pour récupérer la même orientation (par défaut).
  #False: Le lacet est ajusté, de sorte qu'il peut être réutiliser avec RotateNode() pour récupérer la même orientation.

Valeur de retour

La valeur courante du lacet du noeud.

Valeur toujours comprise entre -180.0 et 180.0 degrés.

Voir aussi

NodePitch(), NodeRoll()


NodeZ()

Syntaxe

Resultat = NodeZ(#Noeud)
Description
Renvoie la position relative en 'z' d'un noeud par rapport à son noeud parent.

Arguments

#Noeud Le noeud à utiliser.

Valeur de retour

Renvoie la position relative en 'z' d'un noeud par rapport à son noeud parent.

Remarques

Si le noeud n'a pas de noeud parent, c'est sa position 'z' dans le monde 3D qui est renvoyée.

Voir aussi

NodeX(), NodeY(), MoveNode()


RotateNode()

Syntaxe

RotateNode(#Noeud, x, y, z [, Mode])
Description
Effectue une rotation d'un noeud en fonction de la valeur des angles x,y,z.

Arguments

#Noeud Le noeud à utiliser.
x, y, z Angles de rotation en x, y et z.

Tous les angles sont en degrés.
Mode (optionnel)
  PB_Absolute: Rotation absolue (par défaut).
  PB_Relative: Rotation relative basée sur la rotation précédente de l'entité.
En combinaison avec l'une de ces constantes :
  PB_Local   : Rotation par rapport à l'espace local.
  PB_Parent  : Rotation par rapport à l'espace de son parent.
  PB_World   : Rotation par rapport à l'espace du monde (Par défaut).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

NodePitch(), NodeRoll(), NodeYaw(), MoveNode()


ScaleNode()

Syntaxe

ScaleNode(#Noeud, x, y, z [, Mode])
Description
Change la taille d'un noeud.

Arguments

#Noeud | Le noeud à utiliser.
x, y, z | Les facteurs d'échelle sur les trois axes.
Mode (optionnel) Peut être une des valeurs suivantes:
  #PB_Relative: Facteur d'échelle relatif, sur la base de la taille initiale (par défaut).
                L'utilisation de 1.0 pour facteur d'échelle conservera la taille inchangée.
  #PB_Absolute: Facteur d'échelle absolue, dans l'unité du monde.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Lorsque vous utilisez le mode #PB_Relative, alors la taille du noeud sera multiplié par la valeur donnée pour obtenir la nouvelle taille.


NodeAnimation

PureBasic - NodeAnimation

Généralités

Cette bibliothèque d'animation des noeuds permet de définir un chemin à suivre pour un nœud, avec une image-clé (key frame) prédéfinie et l'exécution d'une interpolation avec lissage.

En conséquence, un objet comme une caméra peut être fixée à ce noeud et être déplacée facilement le long du chemin. (effet de travelling)

InitEngine3D() doit être appelé avec succès avant d'utiliser les fonctions d'animation des noeuds.

Sommaire des commandes

AddNodeAnimationTime
CreateNodeAnimation
CreateNodeAnimationKeyFrame
FreeNodeAnimation
GetNodeAnimationKeyFrameTime
GetNodeAnimationLength
GetNodeAnimationTime
GetNodeAnimationWeight
NodeAnimationKeyFramePitch
NodeAnimationKeyFramePosition
NodeAnimationKeyFrameRoll
NodeAnimationKeyFrameRotation
NodeAnimationKeyFrameScale
NodeAnimationKeyFrameX
NodeAnimationKeyFrameY
NodeAnimationKeyFrameYaw
NodeAnimationKeyFrameZ
NodeAnimationStatus
SetNodeAnimationLength
SetNodeAnimationTime
SetNodeAnimationWeight
StartNodeAnimation
StopNodeAnimation

Exemple

NodeAnimation.pb
NodeAnimation2.pb

OS Supportés

Tous

Guide de référence - Index


AddNodeAnimationTime()

Syntaxe

AddNodeAnimationTime(#NodeAnimation, Temps)
Description
Ajouter du temps à une animation.

Arguments

#NodeAnimation | L'animation à utiliser.
Temps | Le temps à ajouter (en millisecondes) à l'animation.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

StartNodeAnimation()


CreateNodeAnimation()

Syntaxe

Resultat = CreateNodeAnimation(#NodeAnimation, Duree, Interpolation, RotationInterpolation)
Description
Crée une nouvelle animation.

Arguments

#NodeAnimation Le numéro d'identification de l'animation du noeud.

#PB_Any peut être utilisé pour générer automatiquement ce numéro.
Duree La durée de la nouvelle animation (en millisecondes).
Interpolation Le type d'interpolation à appliquer entre les points:
  #PB_NodeAnimation_Linear: Chacun des points sera relié entre eux à l'aide d'une ligne droite,
                            ce qui peut entraîner un brusque changement de direction.
  #PB_NodeAnimation_Spline: Chacun des points sera relié entre eux à l'aide d'une courbe (spline),
                            ce qui conduit un changement de direction en douceur.
RotationInterpolation Le type d'interpolation à appliquer entre les points:
  #PB_NodeAnimation_LinearRotation   : Interpolation linéaire.
  #PB_NodeAnimation_SphericalRotation: Interpolation Sphérique.

Valeur de retour

Renvoie zéro si l'animation ne peut pas être créé.

Si #PB_Any est utilisé pour le paramètre '#NodeAnimation', le nouveau numéro sera renvoyé dans 'Resultat'.

Remarques

Une animation d'un noeud n'existe pas physiquement dans le Monde 3D, il s'agit d'un chemin (piste ou track) virtuel sur lequel se déplace un noeud et son objet attaché à lui.

Voir aussi

FreeNodeAnimation()


CreateNodeAnimationKeyFrame()

Syntaxe

CreateNodeAnimationKeyFrame(#NodeAnimation, Temps, x, y, z)
Description
Crée une nouvelle image-clé dans une animation.

Arguments

#NodeAnimation | L'animation à utiliser.
Temps Le temps dans l'animation où l'on choisit l'image-clé (en millisecondes).

Cette valeur doit être comprise entre zéro et la 'Durée' définie dans CreateNodeAnimation().
x, y, z | La nouvelle position de l'image-clé dans le monde.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Une image-clé est un point dans le monde à un moment précis.

Lorsque l'animation sera jouée, elle suivra chaque image-clé et donc le déplacement de points en points. Le déplacement sera interpolé pour respecter la contrainte de temps.

Par exemple, si la première image-clé est définie au temps 0, la seconde au temps 1000 millisecondes, et la troisième à 3000, le passage de la première à la seconde durera 1000 millisecondes, et le passage de la seconde à la troisième durera 2000 millisecondes. L'animation globale durera 3000 millisecondes.

Voir aussi

CreateNodeAnimation()


FreeNodeAnimation()

Syntaxe

FreeNodeAnimation(#NodeAnimation)
Description
Libère une animation et toute la mémoire associée.

Arguments

#NodeAnimation L'animation à libérer.

Si #PB_All est spécifié, toutes les animations restantes sont libérées.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Toutes les animations restantes sont automatiquement libérées lorsque le programme se termine.

Remarques

Son numéro ne doit pas être utilisé avec les autres fonctions de cette bibliothèque après l'appel de cette fonction, à moins de la créer à nouveau.

Voir aussi

CreateNodeAnimation()


GetNodeAnimationKeyFrameTime()

Syntaxe

Resultat = GetNodeAnimationKeyFrameTime(#NodeAnimation, ImageCle)
Description
Renvoie le temps d'un image-clé.

Arguments

#NodeAnimation L'animation à utiliser.
#ImageCle L'indice de l'image-clé.

L'indice de la première image-clé est égale à zéro.

Valeur de retour

Renvoie le temps de l'image-clé (en millisecondes) de l'animation, ou zéro si l'image-clé n'existe pas.

Voir aussi

CreateNodeAnimationKeyFrame()


GetNodeAnimationLength()

Syntaxe

Duree = GetNodeAnimationLength(#NodeAnimation)
Description
Renvoie la durée d'une animation.

Arguments

#NodeAnimation L'animation à utiliser.

Valeur de retour

Renvoie la durée de l'animation (en millisecondes).

Voir aussi

StartNodeAnimation(), SetNodeAnimationLength()


GetNodeAnimationTime()

Syntaxe

Resultat = GetNodeAnimationTime(#NodeAnimation)
Description
Renvoie le temps courant d'une animation.

Arguments

#NodeAnimation L'animation à utiliser.

Valeur de retour

Le temps actuel de l'animation (en millisecondes) ou zéro si l'animation ne fonctionne pas.

Voir aussi

StartNodeAnimation(), AddNodeAnimationTime(), SetNodeAnimationTime()


GetNodeAnimationWeight()

Syntaxe

Resultat = GetNodeAnimationWeight(#NodeAnimation)
Description
Renvoie le poids d'une animation.

Arguments

#NodeAnimation L'animation à utiliser.

Valeur de retour

Le poids actuel de l'animation (valeur comprise entre 0.0 et 1.0).
  0 : L'animation est sans effet.
  1 : L'animation joue pleinement.

Remarques

Le poids est utile lorsque vous jouez plusieurs animations à la fois.

Par exemple, pour faire une transition en douceur d'une animation à l'autre, il est possible de réduire progressivement le poids de la première animation et d'augmenter le poids de la deuxième animation.

Voir aussi

StartNodeAnimation()


NodeAnimationKeyFramePitch()

Syntaxe

Resultat = NodeAnimationKeyFramePitch(#NodeAnimation, ImageCle)
Description
Renvoie le tangage de l'image-clé d'une animation.

Arguments

#NodeAnimation L'animation à utiliser.
#ImageCle L'indice de l'image-clé.

L'indice de la première image-clé est égale à zéro.

Valeur de retour

Renvoie le tangage actuel de l'image-clé ou zéro si l'image clé n'existe pas.

Voir aussi

CreateNodeAnimationKeyFrame(), NodeAnimationKeyFrameYaw(), NodeAnimationKeyFrameRoll()


NodeAnimationKeyFramePosition()

Syntaxe

NodeAnimationKeyFramePosition(#NodeAnimation, ImageCle, x, y, z)
Description
Modifie la position de l'image-clé d'une animation.

Arguments

#NodeAnimation | L'animation à utiliser.
#ImageCle L'indice de l'image-clé.

L'indice de la première image-clé est égale à zéro.

Si l'image-clé n'existe pas, cette fonction n'a aucun effet.
x, y, z | La nouvelle position de l'image-clé dans le monde.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateNodeAnimationKeyFrame()


NodeAnimationKeyFrameRoll()

Syntaxe

Resultat = NodeAnimationKeyFrameRoll(#NodeAnimation, ImageCle)
Description
Renvoie le roulis de l'image-clé d'une animation.

Arguments

#NodeAnimation L'animation à utiliser.
#ImageCle L'indice de l'image-clé.

L'indice de la première image-clé est égale à zéro.

Valeur de retour

Renvoie le roulis actuel de l'image-clé ou zéro si l'image clé n'existe pas.

Voir aussi

CreateNodeAnimationKeyFrame(), NodeAnimationKeyFramePitch(), NodeAnimationKeyFrameYaw()


NodeAnimationKeyFrameRotation()

Syntaxe

NodeAnimationKeyFrameRotation(#NodeAnimation, ImageCle, x, y, z)
Description
Modifie la rotation de l'image-clé d'une animation.

Arguments

#NodeAnimation L'animation à utiliser.
#ImageCle L'indice de l'image-clé.

L'indice de la première image-clé est égale à zéro.

Si l'image-clé n'existe pas, cette fonction n'a aucun effet.
x, y, z Rotation en 'x' de l'image-clé dans le monde (tangage).
Rotation en 'y' de l'image-clé dans le monde (lacet).
Rotation en 'z' de l'image-clé dans le monde (roulis).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateNodeAnimationKeyFrame(), NodeAnimationKeyFramePitch(), NodeAnimationKeyFrameYaw(), NodeAnimationKeyFrameRoll()


NodeAnimationKeyFrameScale()

Syntaxe

NodeAnimationKeyFrameScale(#NodeAnimation, ImageCle, x, y, z)
Description
Modifie le facteur d'échelle de l'image-clé d'une animation.

Arguments

#NodeAnimation L'animation à utiliser.
#ImageCle L'indice de l'image-clé.

L'indice de la première image-clé est égale à zéro.

Si l'image-clé n'existe pas alors cette fonction n'a pas d'effet.
x, y, z Le nouveau facteur d'échelle de l'image-clé.

Avec une valeur de 1.0, aucune mise à l'échelle ne sera appliquée sur l'axe concerné.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le facteur d'échelle est appliqué au noeud associé à l'animation.

Le facteur d'échelle va redimensionner le noeud en multipliant sa taille par le facteur donné:
- Un facteur d'échelle de 1.0 n'affectera pas la taille du noeud
- Un facteur d'échelle de 2.0 permettra de doubler la taille du noeud
- Un facteur d'échelle de 0,5 permettra la rédction de moitié du noeud

Voir aussi

CreateNodeAnimationKeyFrame(), NodeAnimationKeyFramePitch(), NodeAnimationKeyFrameYaw(), NodeAnimationKeyFrameRoll()


NodeAnimationKeyFrameX()

Syntaxe

Resultat = NodeAnimationKeyFrameX(#NodeAnimation, ImageCle)
Description
Renvoie la position en 'x' de l'image-clé d'une animation.

Arguments

#NodeAnimation L'animation à utiliser.
#ImageCle L'indice de l'image-clé.

L'indice de la première image-clé est égale à zéro.

Valeur de retour

Renvoie la position en 'x' de l'image-clé dans le monde ou zéro si l'image-clé n'existe pas.

Voir aussi

CreateNodeAnimationKeyFrame(), NodeAnimationKeyFrameY(), NodeAnimationKeyFrameZ()


NodeAnimationKeyFrameY()

Syntaxe

Resultat = NodeAnimationKeyFrameY(#NodeAnimation, ImageCle)
Description
Renvoie la position en 'y' de l'image-clé d'une animation.

Arguments

#NodeAnimation L'animation à utiliser.
#ImageCle L'indice de l'image-clé.

L'indice de la première image-clé est égale à zéro.

Valeur de retour

Renvoie la position en 'y' de l'image-clé dans le monde ou zéro si l'image-clé n'existe pas.

Voir aussi

CreateNodeAnimationKeyFrame(), NodeAnimationKeyFrameX(), NodeAnimationKeyFrameZ()


NodeAnimationKeyFrameYaw()

Syntaxe

Resultat = NodeAnimationKeyFrameYaw(#NodeAnimation, ImageCle)
Description
Renvoie le lacet de l'image-clé d'une animation.

Arguments

#NodeAnimation L'animation à utiliser.
#ImageCle L'indice de l'image-clé.

L'indice de la première image-clé est égale à zéro.

Valeur de retour

Renvoie le lacet actuel de l'image-clé ou zéro si l'image clé n'existe pas.

Voir aussi

CreateNodeAnimationKeyFrame(), NodeAnimationKeyFramePitch(), NodeAnimationKeyFrameRoll()


NodeAnimationKeyFrameZ()

Syntaxe

Result = NodeAnimationKeyFrameZ(#NodeAnimation, ImageCle)
Description
Renvoie la position en 'z' de l'image-clé d'une animation.

Arguments

#NodeAnimation L'animation à utiliser.
#ImageCle L'indice de l'image-clé.

L'indice de la première image-clé est égale à zéro.

Valeur de retour

Renvoie la position en 'z' de l'image-clé dans le monde ou zéro si l'image-clé n'existe pas.

Voir aussi

CreateNodeAnimationKeyFrame(), NodeAnimationKeyFrameX(), NodeAnimationKeyFrameY()


NodeAnimationStatus()

Syntaxe

Resultat = NodeAnimationStatus(#NodeAnimation)
Description
Renvoie le status d'une animation.

Arguments

#NodeAnimation L'animation à utiliser.

Valeur de retour

  #PB_NodeAnimation_Stopped: L'animation est à l'arrêt (ou a pris fin).
  #PB_NodeAnimation_Started: L'animation est en cours d'exécution.

Voir aussi

StartNodeAnimation(), StopNodeAnimation()


SetNodeAnimationLength()

Syntaxe

SetNodeAnimationLength(#NodeAnimation, Duree)
Description
Change la durée d'une animation.

Arguments

#NodeAnimation | L'animation à utiliser.
Animation$ Le nom de l'animation.

Les animations sont stockées dans l'objet mesh de manière sensible à la casse (ex: "Marche" sera une animation différente de "marche").

Si l'animation n'est pas trouvée ou le mesh n'a pas de squelette alors la fonction n'aura aucun effet.
Duree | La nouvelle durée de l'animation (en millisecondes).

Voir aussi

StartNodeAnimation(), GetNodeAnimationLength()


SetNodeAnimationTime()

Syntaxe

SetNodeAnimationTime(#NodeAnimation, Temps)
Description
Modifie le temps courant d'une animation .

Arguments

#NodeAnimation | L'animation à utiliser.
Temps | Le temps absolu (en millisecondes).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Il s'agit d'une position temporelle absolue.
Pour changer le temps, utilisez AddNodeAnimationTime().

Voir aussi

StartNodeAnimation(), AddNodeAnimationTime(), GetNodeAnimationTime()


SetNodeAnimationWeight()

Syntaxe

SetNodeAnimationWeight(#NodeAnimation, Poids)
Description
Modifie le poids d'une animation.

Arguments

#NodeAnimation L'animation à utiliser.
Poids Le nouveau poids de l'animation (valeur comprise entre 0.0 et 1.0).
  0 : L'animation est sans effet.
  1 : L'animation joue pleinement.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le poids est utile lorsque vous jouez plusieurs animations à la fois.

Par exemple, pour faire une transition en douceur d'une animation à l'autre, il est possible de réduire progressivement le poids de la première animation et d'augmenter le poids de la deuxième animation.

Voir aussi

StartNodeAnimation()


StartNodeAnimation()

Syntaxe

StartNodeAnimation(#NodeAnimation [, Options])
Description
Lance une animation.

Arguments

#NodeAnimation L'animation à utiliser.
Options
  #PB_NodeAnimation_Once: Joue l'animation qu'une seule fois.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

L'animation est toujours recommencer depuis le début.

Par défaut, l'animation boucle automatiquement lorsque son extrémité est atteinte.

NodeAnimationStatus() peut être utilisé pour détecter la fin de l'animation.

Voir aussi

StopNodeAnimation(), NodeAnimationStatus(), AddNodeAnimationTime()


StopNodeAnimation()

Syntaxe

StopNodeAnimation(#NodeAnimation)
Description
Arrête une animation.

Arguments

#NodeAnimation L'animation à stopper.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

StartNodeAnimation()


OnError

PureBasic - OnError

Généralités

Cette bibliothèque permet de détecter les erreurs d'exécution (crashs de programmes) de manière similaire au débogueur PureBasic, mais sans le désavantage de la taille plus importante et de la vitesse d'exécution réduite inhérente à l'utilisation du débogueur. Cela permet aux programmes livrés à l'utilisateur final de collecter des informations importantes lors de dysfonctionnements et de les renvoyer au développeur.

Le débogueur PureBasic est quand même le meilleur outil pour trouver les bugs lors de la phase de développement, car il fournit des informations bien plus détaillées sur le programme (comme la valeur des variables) ainsi que des outils visuels pour trouver rapidement l'origine des bugs.

Note: Si cette bibliothèque et le débogueur PureBasic sont activés en même temps, toutes les erreurs ne seront pas détectées par la bibliothèque OnError, car des vérifications sont effectuées par le débogueur avant même que le code soit exécuté.

Cette bibliothèque fournit des informations sur le nom du code source et la ligne à laquelle l'erreur est survenue à l'aide des commandes ErrorFile() et ErrorLine(), seulement si cette fonctionnalité a été activée lors de la compilation du programme (car elle induit une légère pénalité dans la vitesse d'exécution du programme pour retenir le numéro de la ligne en cours d'exécution). Pour l'activer, il faut cocher "Activer le numéro de ligne pour OnError" dans les options de compilation ou spécifier /LINENUMBERING (Windows) ou --linenumbering (Linux, MacOS X) en ligne de commande.

Sommaire des commandes

ErrorAddress
ErrorCode
ErrorFile
ErrorLine
ErrorMessage
ErrorRegister
ErrorTargetAddress
ExamineAssembly
InstructionAddress
InstructionString
NextInstruction
OnErrorCall
OnErrorDefault
OnErrorExit
OnErrorGoto
RaiseError

Exemple

OnError.pb

OS Supportés

Tous

Guide de référence - Index


ErrorAddress()

Syntaxe

Resultat = ErrorAddress()
Description
Renvoie l'adresse mémoire de l'instruction assembleur qui a causé l'erreur. Cette commande renvoie une valeur valide uniquement si l'erreur est gérée par OnErrorCall() ou OnErrorGoto().


ErrorCode()

Syntaxe

Resultat = ErrorCode()
Description
Renvoie le type de l'erreur qui est survenue. Cette commande renvoie une valeur valide uniquement si l'erreur est gérée par OnErrorCall() ou OnErrorGoto().

Valeur de retour

Renvoie une des valeurs suivantes:
  #PB_OnError_InvalidMemory         : Lecture ou écriture dans une zone protégée.
  #PB_OnError_Floatingpoint         : Erreur de calcul flottant.
  #PB_OnError_Breakpoint            : Point d'arrêt débogueur atteint (autres que ceux du PureBasic).
  #PB_OnError_IllegalInstruction    : Exécution d'une instruction invalide.
  #PB_OnError_PriviledgedInstruction: Exécution d'une instruction privilégiée (system-) non autorisée.
  #PB_OnError_DivideByZero          : Division par zéro (Windows seulement).
Linux et MacOS X génèrent #PB_OnError_Floatingpoint pour les erreurs de division par zéro.

De plus, chaque OS peut avoir plus de valeurs possibles. Sous Windows, des erreurs personnalisées peuvent être génèrées avec RaiseError().


ErrorFile()

Syntaxe

Resultat$ = ErrorFile()
Description
Renvoie le nom du code source où l'erreur est survenue. Cette commande renvoie une valeur valide uniquement si l'erreur est gérée par OnErrorCall() ou OnErrorGoto().

Le suivi des lignes en temps réel a besoin d'être activé à la compilation pour que cette fonction renvoie la ligne actuelle. Pour l'activer, il faut cocher "Activer le numéro de ligne pour OnError" dans les options de compilation ou spécifier /LINENUMBERING (Windows) ou --linenumbering (Linux, MacOS X) en ligne de commande. Si ce support est désactivé, cette fonction renverra "OnError line support disabled".


ErrorLine()

Syntaxe

Result = ErrorLine()
Description
Renvoie le numéro de ligne dans le code source où l'erreur est survenue. Cette commande renvoie une valeur valide uniquement si l'erreur est gérée par OnErrorCall() ou OnErrorGoto().

Le suivi des lignes en temps réel a besoin d'être activé à la compilation pour que cette fonction renvoie la ligne actuelle. Pour l'activer, il faut cocher "Activer le numéro de ligne pour OnError" dans les options de compilation ou spécifier /LINENUMBERING (Windows) ou --linenumbering (Linux, MacOS X) en ligne de commande. Si ce support est désactivé, cette fonction renverra -1.


ErrorMessage()

Syntaxe

Resultat$ = ErrorMessage([CodeErreur])
Description
Renvoie un message d'erreur en anglais correspondant au code erreur specifié. Si le paramètre est omis, la fonction renvoie le message de l'erreur qui est survenue.


ErrorRegister()

Syntaxe

Resultat = ErrorRegister(Registre)
Description
Renvoie le contenu du registre spécifié lorsque l'erreur est survenue. Cette commande renvoie une valeur valide uniquement si l'erreur est gérée par OnErrorCall() ou OnErrorGoto().

Arguments

Les registres disponibles dépendent du CPU pour lequel le programme est compilé. Les valeurs suivantes sont disponibles:

x86:
  #PB_OnError_EAX
  #PB_OnError_EBX
  #PB_OnError_ECX
  #PB_OnError_EDX
  #PB_OnError_EBP
  #PB_OnError_ESI
  #PB_OnError_EDI
  #PB_OnError_ESP
  #PB_OnError_Flags
x64:
  #PB_OnError_RAX
  #PB_OnError_RCX
  #PB_OnError_RDX
  #PB_OnError_RBX
  #PB_OnError_RSP
  #PB_OnError_RBP
  #PB_OnError_RSI
  #PB_OnError_RDI
  #PB_OnError_R8
  #PB_OnError_R9
  ...
  #PB_OnError_R15
  #PB_OnError_Flags
PowerPC:
  #PB_OnError_r0
  #PB_OnError_r1
  #PB_OnError_r2
  ...
  #PB_OnError_r31
  #PB_OnError_cr
  #PB_OnError_xer
  #PB_OnError_lr
  #PB_OnError_ctx


ErrorTargetAddress()

Syntaxe

Resultat = ErrorTargetAddress()
Description
Après une erreur de type #PB_OnError_InvalidMemory, cette commande renvoie l'adresse mémoire qui a été lue/ecrite quand l'erreur est survenue. Cette commande n'a pas d'utilité pour les autres types d'erreur.


ExamineAssembly()

Syntaxe

Resultat = ExamineAssembly(*Adresse [, *AdresseFin])
Description
Initialise le désassemblage des instructions à l'adresse spécifiée.

Important: Les commandes de désassemblage utilisent la bibliothèque Udis86 disassembler pour décoder les instructions. Elle est disponible sous license BSD qui peut être consultée ici. Si ExamineAssembly() et ses autres commandes relatives sont utilisées dans un programme, le texte de licence ci-dessus devra être inclu avec le logiciel.

Arguments

'*Adresse' indique l'adresse de la première instruction à désassembler. Si '*AdresseFin' est spécifiée, le désassemblage se terminera dès que '*AdresseFin' sera atteinte (et NextInstruction() reverra 0).

Valeur de retour

Renvoie une valeur différente de zéro si le désassemblage est possible.

Exemple

  DisableDebugger ; Désactive le Debugger

  Code_Start:
    ; Placer le code à désassembler ici
    a = (Random(100) * 5) + 2000
  Code_End:

  Texte$ = "Code désassemblé: " + Chr(13)
  If ExamineAssembly(?Code_Start, ?Code_End)
    While NextInstruction()
      Texte$ + RSet(Hex(InstructionAddress()), SizeOf(Integer)*2, "0")
      Texte$ + " " + InstructionString() + Chr(13)
    Wend
  EndIf

  MessageRequester("Resultat", Texte$)

OS Supportés

Windows, Linux, MacOS X (x86)


InstructionAddress()

Syntaxe

Resultat = InstructionAddress()
Description
Renvoie l'adresse de l'instruction qui a été désassemblée avec NextInstruction().

OS Supportés

Windows, Linux, MacOS X (x86)


InstructionString()

Syntaxe

Resultat$ = InstructionString()
Description
Renvoie la representation sous forme de texte de l'instruction qui a été désassemblée avec NextInstruction().

OS Supportés

Windows, Linux, MacOS X (x86)


NextInstruction()

Syntaxe

Resultat = NextInstruction()
Description
Désassemble l'instruction suivante, après avoir appelé ExamineAssembly(). Les informations à propos de l'instruction décodée sont disponibles à l'aide des commandes InstructionString() et InstructionAddress().

Valeur de retour

Renvoie une valeur différente de zéro si l'instruction a pu être désassemblée correctement. Renvoie zéro si il n'y a plus d'instruction à décoder ('*AdresseFin' spécifiée à ExamineAssembly() a été atteinte).

OS Supportés

Windows, Linux, MacOS X (x86)


OnErrorCall()

Syntaxe

OnErrorCall(@ErrorHandler())
Description
Spécifie une procédure à exécuter si une erreur survient. La procédure peut afficher des informations à propos de l'erreur en utilisant les commandes de cette bibliothèque. Le programme se terminera automatiquement dès que la procédure quittera.

Arguments

Adresse d'une procédure sous la forme:
  Procedure ErrorHandler()

  EndProcedure

Exemple

  Procedure ErrorHandler()
    MessageRequester("Test OnError", "L'erreur suivante est arrivée: " + ErrorMessage())
  EndProcedure

  MessageRequester("Test OnError", "Début Test.")

  OnErrorCall(@ErrorHandler())
  Pokes(10, "Salut le Monde.") ; Cause a #PB_OnError_InvalidMemory error

  MessageRequester("Test OnError", "Ceci ne devrait jamais être affiché.")


OnErrorDefault()

Syntaxe

OnErrorDefault()
Description
Réinitialise l'action à exécuter lors d'une erreur en utilisant celle par défaut du système. En principe, cela implique l'affichage d'une fenêtre d'erreur et la fin du programme, mais pas toujours (certaines erreurs peuvent être ignorées). Pour être sûr de quitter le programme sur chaque erreur, utilisez OnErrorExit().

Note: Si la bibliothèque OnError est utilisée dans une dll, la meilleure approche est d'initialiser la gestion d'erreur au début de chaque fonction publique de la dll, et de la réinitialiser avec cette commande à la fin de la fonction (pour éviter les interférences entre la bibliothèque OnError et la gestion d'erreur du programme utilisant la dll).

Exemple

  Procedure ErrorHandler()
    MessageRequester("Test OnError", "L'erreur suivante est arrivée: " + ErrorMessage())
  EndProcedure

  MessageRequester("Test OnError", "Début Test.")

  OnErrorCall(@ErrorHandler())
  OnErrorDefault()             ; Commenter cet appel pour obtenir le gestionnaire à la place de l'erreur envoyée par le système
  Pokes(10, "Salut le Monde.") ; Cause une erreur #PB_OnError_InvalidMemory

  MessageRequester("Test OnError", "Ceci ne devrait jamais être affiché.")


OnErrorExit()

Syntaxe

OnErrorExit()
Description
Termine l'exécution du programme sur n'importe quelle erreur gérée par OnError, même si en principe le programme ne se termine pas sur ce type d'erreur. Le système peut afficher une fenêtre d'erreur ou un message dans la console avant de quitter.

Pour quitter un programme de manière silencieuse (sans message système), utiliser OnErrorCall() et terminer le programme à partir du handler.

Exemple

  MessageRequester("Test OnError", "Début Test.")

  OnErrorExit()
  Pokes(10, "Salut le Monde.") ; Déclenche une erreur de type #PB_OnError_InvalidMemory

  MessageRequester("Test OnError", "Ceci ne devrait jamais être affiché.")


OnErrorGoto()

Syntaxe

OnErrorGoto(?Etiquette)
Description
Spécifie un label à exécuter si une erreur survient. Une fois dans le label, des informations à propos de l'erreur pourront être affichées en utilisant les commandes de cette bibliothèque.

Note: La pile du programme ne sera pas ajustée avant le saut vers le label, donc les variables locales ne seront plus accessibles. Il n'est pas recommandé de vouloir continuer l'exécution d'un programme après une erreur, car le contexte ne sera plus correct. La meilleure pratique est de rassembler un maximum d'informations à propos de l'erreur et de quitter le programme.

Arguments

L'adresse d'une étiquette.

Exemple

  MessageRequester("Test OnError", "Début Test.")

  OnErrorGoto(?ErrorHandler)
  Pokes(10, "Salut le Monde.") ; Cause a #PB_OnError_InvalidMemory error

  MessageRequester("Test OnError", "Ceci ne devrait jamais être affiché.")
  End

  ErrorHandler:
  MessageRequester("Test OnError", "L'erreur suivante est arrivée: " + ErrorMessage())
  End


RaiseError()

Syntaxe

RaiseError(CodeErreur)
Description
Génère artificiellement une erreur de type spéficié. Le 'CodeErreur' pourra être récupéré dans le handler de l'erreur avec la commande ErrorCode().

Arguments

Sous Windows, n'importe quel numéro d'erreur peut être utilisé (y compris ceux définis par l'utilisateur). Sous Linux ou MacOS X, seuls les numéros d'erreur suivants sont acceptés:
  #PB_OnError_InvalidMemory         : Lecture ou écriture dans une zone protégée.
  #PB_OnError_Floatingpoint         : Erreur de calcul flottant.
  #PB_OnError_Breakpoint            : Point d'arrêt débogueur atteint (autres que ceux du PureBasic).
  #PB_OnError_IllegalInstruction    : Exécution d'une instruction invalide.
  #PB_OnError_PriviledgedInstruction: Exécution d'une instruction privilégiée (system-) non autorisée.

Exemple

  Procedure ErrorHandler()
    MessageRequester("Test OnError", "L'erreur suivante est arrivée: " + ErrorMessage())
  EndProcedure

  MessageRequester("OnError test", "Début Test.")

  OnErrorCall(@ErrorHandler())
  RaiseError(#PB_OnError_InvalidMemory)

  MessageRequester("Test OnError", "Ceci ne devrait jamais être affiché.")


Packer

PureBasic - Packer

Généralités

La bibliothèque Packer propose un ensemble de fonctions efficaces pour compresser / décompresser des données et gérer les archives compressées.
Plusieurs formats de compressions sont pris en charge, de ZIP à LZMA.

Sommaire des commandes

AddPackFile
AddPackMemory
ClosePack
CompressMemory
CreatePack
ExaminePack
NextPackEntry
OpenPack
PackEntryName
PackEntrySize
PackEntryType
RemovePackFile
UncompressMemory
UncompressPackFile
UncompressPackMemory
UseBriefLZPacker
UseJCALG1Packer
UseLZMAPacker
UseZipPacker

Exemple

Packer.pb

OS Supportés

Tous

Guide de référence - Index


AddPackFile()

Syntaxe

Resultat = AddPackFile(#Archive, NomFichier$, NomFichierCompresser$)
Description
Ajoute et compresse un fichier dans une archive préalablement créée avec CreatePack().

Arguments

#Archive | L'archive à utiliser.
NomFichier$ | Le fichier à ajouter à l'archive.
NomFichierCompresser$ | Le nom de fichier à utiliser dans l'archive.

Valeur de retour

Renvoie une valeur non nulle si le fichier a été ajouté avec succès à l'archive.
Si le fichier ne peut pas être compressé, il sera stocké tel quel dans l'archive.

Remarques

L'ajout d'un grand fichier peut prendre un temps assez long.

Voir aussi

CreatePack()


AddPackMemory()

Syntaxe

Resultat = AddPackMemory(#Archive, *MemoireTampon, Longueur , NomFichierCompresser$)
Description
Ajoute et compresse une zone mémoire tampon dans une archive préalablement créée avec la commande CreatePack().

Arguments

#Archive | L'archive à utiliser.
*MemoireTampon | L'adresse de la mémoire tampon dont le contenu sera ajouté à l'archive.
Longueur | La taille de la mémoire à ajouter à l'archive.
NomFichierCompresser$ | Le nom de fichier à utiliser dans l'archive.

Valeur de retour

Renvoie une valeur non nulle si le contenu de la mémoire tampon a été ajouté avec succès à l'archive.
Si le contenu de la mémoire tampon ne peut pas être compressé, il sera stocké tel quel dans l'archive.

Voir aussi

CreatePack()


ClosePack()

Syntaxe

Resultat = ClosePack(#Archive)
Description
Ferme un fichier archive.

Arguments

#Archive L'archive à fermer.

Si #PB_All est spécifié, toutes les archives restantes sont fermées.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Tous les fichiers archives ouverts sont automatiquement fermés quand le programme se termine.

Voir aussi

CreatePack()


CompressMemory()

Syntaxe

Resultat = CompressMemory(*MemoireTampon, Taille, *Sortie, SortieTaille [, PluginID])
Description
Compresse le contenu d'une mémoire tampon dans une mémoire tampon de sortie.

Arguments

*MemoireTampon | L'adresse de la mémoire tampon de compression.
Taille | La taille de la mémoire à compresser.
*Sortie | L'adresse de la mémoire tampon qui contiendra les données compressées.
SortieTaille | La taille de la mémoire tampon qui contiendra les données compressées.
PluginID (optionnel) Le plug-in à utiliser, si plus d'un plug-in a été enregistré. Il peut être une des valeurs suivantes:
  #PB_Packer_BriefLZ: Utilisation de BriefLZ. UseBriefLZPacker() doit être appelé auparavant.
  #PB_Packer_Zip    : Utilisation de Zip.     UseZipPacker() doit être appelé auparavant.
  #PB_Packer_LZMA   : Utilisation de LZMA.    UseLZMAPacker() doit être appelé auparavant.

Valeur de retour

Renvoie la taille compréssée si le contenu de la mémoire tampon a été correctement compressé, zéro sinon.
Si les données du tampon ne peuvent pas être compressées, il renverra zéro (ex: les données déjà compressées ne peuvent généralement pas être compressée plus).

Remarques

La longueur du tampon de sortie doit être au moins aussi grande que celle du tampon de compression.

Voir aussi

UncompressMemory()


CreatePack()

Syntaxe

Resultat = CreatePack(#Archive, NomFichier$ [, PluginID])
Description
Créé un nouveau fichier archive vide.

Arguments

#Archive Un numéro pour identifier le nouveau fichier archive.

#PB_Any peut être utilisé en tant que paramètre pour générer automatiquement ce numéro.
NomFichier$ Le nom du nouveau fichier archive.
PluginID (optionnel) Le plug-in à utiliser, si plus d'un plug-in a été enregistré. Il peut être une des valeurs suivantes:
  #PB_Packer_BriefLZ: Utilisation de BriefLZ. UseBriefLZPacker() doit être appelé auparavant.
  #PB_Packer_LZMA   : Utilisation de LZMA.    UseLZMAPacker() doit être appelé auparavant.

Valeur de retour

Renvoie une valeur non nulle si le fichier archive a été créé avec succès, ou zéro sinon.
Si #PB_Any a été utilisé comme paramètre #Archive alors c'est le numéro de l'archive généré est renvoyé.
  UseZipPacker()

  ; Créer le fichier compressé
  If CreatePack(0, "MesFichiersCompresser.zip")

    ; Ajouter vos fichiers
    AddPackFile(0, "Image1.bmp", "Image1.bmp")
    AddPackFile(0, "Image2.bmp", "Image2.bmp")
    AddPackFile(0, "mywave1.wav", "mywave1.wav")
    AddPackFile(0, "mywave2.wav", "mywave2.wav")
    ClosePack(0)
  EndIf

Voir aussi

ClosePack()


ExaminePack()

Syntaxe

Resultat = ExaminePack(#Archive)
Description
Commence l'examen du contenu d'une archive.

Arguments

#Archive L'archive à utiliser.

Valeur de retour

Renvoie une valeur non nulle si l'archive peut être examinée, zéro sinon.

Remarques

NextPackEntry() doit être appelé pour lister les entrées dans le fichier archive.
L'archive doit être préalablement ouverte avec OpenPack().
Les archives créées avec CreatePack() ne peuvent pas être examinées.

Exemple

  UseZipPacker()

  ; Ouvre le fichier compressé
  If OpenPack(0, "Mesfichierscompresses.zip")

    ; Liste toutes les entrées
    If ExaminePack(0)
      While NextPackEntry(0)
        Debug "Nom: " + PackEntryName(0) + ", Taille: " + PackEntrySize(0)
      Wend
    EndIf

    ClosePack(0)
  EndIf

Voir aussi

OpenPack(), NextPackEntry()


NextPackEntry()

Syntaxe

Resultat = NextPackEntry(#Archive)
Description
Va à l'entrée suivante dans le fichier archive.

Arguments

#Archive L'archive à utiliser.

Valeur de retour

Renvoie une valeur non nulle si l'archive contient une autre entrée, zéro sinon.

Remarques

ExaminePack() doit être appelé auparavant.
Pour obtenir plus d'informations sur l'entrée en cours, voir PackEntrySize(), PackEntryType() et PackEntryName().
Pour décompresser l'entrée courante, voir UncompressPackMemory() ou UncompressPackFile().

Voir aussi

OpenPack(), PackEntrySize(), PackEntryType(), PackEntryName(), UncompressPackMemory(), UncompressPackFile()


OpenPack()

Syntaxe

Resultat = OpenPack(#Archive, NomFichier$ [, PluginID])
Description
Ouvre un fichier Archive.

Arguments

#Archive Un numéro pour identifier le fichier archive.

#PB_Any peut être utilisé en tant que paramètre pour générer automatiquement ce numéro.
Filename$ Le nom du fichier archive à ouvrir.
PluginID (optionnel) Le plug-in à utiliser, si plus d'un plug-in a été enregistré. Il peut être une des valeurs suivantes:
  #PB_Packer_BriefLZ: Utilisation de BriefLZ. UseBriefLZPacker() doit être appelé auparavant.
  #PB_Packer_Zip    : Utilisation de Zip.     UseZipPacker() doit être appelé auparavant.
  #PB_Packer_LZMA   : Utilisation de LZMA.    UseLZMAPacker() doit être appelé auparavant.

Valeur de retour

Renvoie une valeur non nulle si le fichier archive a été ouvert avec succès, ou zéro sinon. Si #PB_Any a été utilisé comme paramètre #Archive alors c'est le numéro de l'archive généré qui est renvoyé.

Remarques

Avant d'ouvrir un fichier archive, au moins un Plug-in doit être enregistré avec l'une des commandes suivantes: UseZipPacker(), UseLZMAPacker(), UseBriefLZPacker(). Une fois ouvert, le contenu de l'archive peut être listé avec ExaminePack().
  UseZipPacker()

  ; Ouvre le fichier compressé
  If OpenPack(0, "MesFichiersCompresser.zip")

    ; Liste toutes les entrées
    If ExaminePack(0)
      While NextPackEntry(0)
        Debug "Nom: " + PackEntryName(0) + ", Taille: " + PackEntrySize(0)
      Wend
    EndIf

    ClosePack(0)
  EndIf

Voir aussi

ClosePack(), ExaminePack()


PackEntryName()

Syntaxe

Resultat$ = PackEntryName(#Archive)
Description
Renvoie le nom de l'entrée courante trouvée avec NextPackEntry().

Arguments

#Archive L'archive à utiliser.

Valeur de retour

Renvoie le nom de l'entrée courante.

Voir aussi

OpenPack(), NextPackEntry(), PackEntryType(), PackEntrySize().


PackEntrySize()

Syntaxe

Resultat = PackEntrySize(#Archive [, Mode])
Description
Renvoie la taille de l'entrée courante trouvée avec NextPackEntry().

Arguments

#Archive L'archive à utiliser.
Mode (optionnel) Le type de taille à obtenir. il peut être une des valeurs suivantes:
  #PB_Packer_UncompressedSize: Renvoie la taille non compressée de l'entrée courante (par défaut).
  #PB_Packer_CompressedSize  : Renvoie la taille compressée de l'entrée courante.

Valeur de retour

Renvoie la taille de l'entrée courante.

Voir aussi

OpenPack(), NextPackEntry(), PackEntryType(), PackEntryName().


PackEntryType()

Syntaxe

Resultat = PackEntryType(#Archive)
Description
Renvoie le type de l'entrée courante trouvée avec NextPackEntry().

Arguments

#Archive L'archive à utiliser.

Valeur de retour

Renvoie une des valeurs suivantes:
  #PB_Packer_File     : L'entrée courante est un fichier.
  #PB_Packer_Directory: L'entrée courante est un répertoire.

Voir aussi

OpenPack(), NextPackEntry(), PackEntrySize(), PackEntryName().


RemovePackFile()

Syntaxe

Resultat = RemovePackFile(#Archive, NomFichier$)
Description
Supprime un fichier d'une archive.

Arguments

#Archive | L'archive à utiliser.
NomFichier$ | Le nom du fichier à supprimer.

Valeur de retour

Renvoie une valeur non nulle si le fichier de l'archive a été supprimé avec succès, ou zéro sinon.

Voir aussi

OpenPack(), CreatePack()


UncompressMemory()

Syntaxe

Resultat = UncompressMemory(*MemoireTampon, Taille, *Sortie, SortieTaille [, PluginID])
Description
Décompresse le contenu de la mémoire tampon dans la mémoire tampon de sortie.

Arguments

*MemoireTampon | L'adresse de la mémoire tampon à décompresser.
Taille | La taille de la mémoire à décompresser.
*Sortie | L'adresse de la mémoire tampon qui contiendra les données non compressées.
SortieTaille La taille de la mémoire tampon qui contiendra les données non compressées.
Elle doit être au moins aussi grande que la taille des données non compressées.
PluginID (optionnel) Le plug-in à utiliser, si plus d'un plug-in a été enregistré. Il peut être une des valeurs suivantes:
  #PB_Packer_Zip    : Utilisation de Zip.     UseZipPacker() doit être appelé auparavant.
  #PB_Packer_LZMA   : Utilisation de LZMA.    UseLZMAPacker() doit être appelé auparavant.
  #PB_Packer_JCALG1 : Utilisation de JCALG1.  UseJCALG1Packer() doit être appelé auparavant.
  #PB_Packer_BriefLZ: Utilisation de BriefLZ. UseBriefLZPacker() doit être appelé auparavant.

Valeur de retour

Renvoie la taille décompréssée si le tampon a été correctement décompressé, ou zéro sinon.

Remarques

La longueur du tampon de sortie doit être au moins aussi grande que celle de la mémoire tampon à décompresser.

Voir aussi

CompressMemory()


UncompressPackFile()

Syntaxe

Resultat = UncompressPackFile(#Archive, NomFichier$ [, NomFichierCompresser$])
Description
Décompresse dans le nom de fichier spécifié, l'entrée courante de l'archive en cours d'examen avec ExaminePack() et NextPackEntry().

Arguments

#Archive | L'archive à utiliser.
NomFichier$ | Le nom de fichier de décompression de l'entrée courante de l'archive.
NomFichierCompresser$ (optionnel) L'entrée à décompresser.

Si ce paramètre n'est pas spécifié, l'entrée courante examinée avec ExaminePack() et NextPackEntry() est décompressée.

Valeur de retour

Renvoie la taille décompréssée si l'entrée de l'archive a bien été décompressée dans le nom du fichier, ou zéro sinon.

Remarques

Si le nom de fichier existe déjà, il sera effacé et remplacé par les nouvelles données non compressées.

Voir aussi

OpenPack(), ExaminePack(), NextPackEntry()


UncompressPackMemory()

Syntaxe

Resultat = UncompressPackMemory(#Archive, *MemoireTampon, Taille [, NomFichierCompresser$])
Description
Décompresse dans une mémoire tampon, l'entrée courante en cours d'examen avec ExaminePack() et NextPackEntry().

Arguments

#Archive | L'archive à utiliser.
*MemoireTampon | L'adresse de la mémoire tampon pour décompresser une entrée de l'archive.
Taille | La taille de la mémoire pour décompresser une entrée de l'archive.
NomFichierCompresser$ (optionnel) L'entrée à décompresser.

Si ce paramètre n'est pas spécifié, l'entrée courante en cours d'examen avec ExaminePack() et NextPackEntry() est décompressée.

Valeur de retour

Renvoie la taille décompréssée si l'entrée de l'archive a bien été décompressée dans la mémoire tampon, ou zéro sinon.

Voir aussi

OpenPack(), ExaminePack(), NextPackEntry()


UseBriefLZPacker()

Syntaxe

UseBriefLZPacker()
Description
Active le compresseur, le décompresseur et le support des archives BriefLZ.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Les archives créées sont un format personnalisé créé pour PureBasic.
La compression BriefLZ est très rapide et le fichier produit est très petit, il pourrait être le bon choix pour un programme qui a besoin d'une petite taille de l'exécutable.
La décompression est également très rapide, mais le rapport compression/vitesse n'est pas aussi bon qu'avec Zip ou LZMA.

Voir aussi

OpenPack(), CreatePack(), CompressMemory(), UncompressMemory()


UseJCALG1Packer()

Syntaxe

UseJCALG1Packer()
Description
Active le décompresseur JCALG1.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Il s'agit d'un ancien algorithme qui a été utilisé dans les versions précédentes de PureBasic, il est toujours disponible pour permettre la compatibilité avec les anciens fichiers compressés.
La compression et l'archivage ne sont plus disponible.
Il est disponible uniquement sous Windows x86 (32-bit).
Il est obsolète et n'est plus pris en charge.

Voir aussi

UncompressMemory()


UseLZMAPacker()

Syntaxe

UseLZMAPacker()
Description
Active le compresseur, le décompresseur LZMA et le support des archives 7z (la lecture seulement, la création d'archive n'est pas encore pris en charge).

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

La compression LZMA est considérée comme l'un des meilleurs algorithme de compression disponible et polyvalent.
Il offre un très bon rapport compression/vitesse.
La compression peut être lente.

Pour plus d'information: Wikipedia - LZMA.

Voir aussi

OpenPack(), CompressMemory(), UncompressMemory()


UseZipPacker()

Syntaxe

UseZipPacker()
Description
Active le compresseur, le décompresseur et le support des archives Zip.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

L'archive créé sera compatible avec d'autres archives Zip au format 2.0.
La taille de l'archive créée peut aller jusqu'à 2GB.

Pour plus d'information: Wikipedia - Zip.

Voir aussi

OpenPack(), CreatePack(), CompressMemory(), UncompressMemory()


Palette

PureBasic - Palette

Généralités

Les palettes ne peuvent être utilisées qu'avec des écrans de 256 couleurs (ou moins). Elles permettent de modifier chacune des couleurs affichées. Chaque couleur (numérotée de 0 à 255) peut ainsi se voir attribuer une nouvelle couleur RVB dans une palette de 16 millions de couleurs codées sur 24-bit. C'est un avantage considérable dans les applications ou jeux graphiques, où chaque point affiché peut se voir attribuer une nouvelle couleur en changeant simplement sa couleur associée. Cela permet des changements d'effets très rapides, des fondus et beaucoup d'autres prouesses graphiques.

Sommaire des commandes

CreatePalette
DisplayPalette
FreePalette
GetPaletteColor
InitPalette
IsPalette
LoadPalette
SetPaletteColor

Exemple

Palette.pb

OS Supportés

Windows, Linux

Guide de référence - Index


CreatePalette()

Syntaxe

Resultat = CreatePalette(#Palette)
Description
Crée une nouvelle palette vide de 256 couleurs.

Arguments

#Palette Le numéro de la palette.

Si #PB_Any est utilisé pour le paramètre '#Palette', le numéro de la nouvelle palette sera renvoyé dans 'Resultat'.

Valeur de retour

Si le 'Resultat' est 0 alors la création de la palette a échouée.

Remarques

La palette est entièrement initialisée avec la couleur noire (0,0,0).

Si une palette était déjà créée avec le même numéro, alors elle est détruite automatiquement.

Voir aussi

FreePalette()

OS Supportés

Windows, Linux


DisplayPalette()

Syntaxe

DisplayPalette(#Palette)
Description
Affiche une palette précédemment créée à l'aide de CreatePalette() ou LoadPalette() sur l'écran actuel.

Arguments

#Palette Le numéro de la palette.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

L'écran doit être en mode 256 couleurs.

Voir aussi

CreatePalette()

OS Supportés

Windows, Linux


FreePalette()

Syntaxe

FreePalette(#Palette)
Description
Libère la mémoire allouée à une palette.

Arguments

#Palette Le numéro de la palette.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Toutes les palettes restantes sont automatiquement libérées quand le programme se termine.

Voir aussi

CreatePalette()

OS Supportés

Windows, Linux


GetPaletteColor()

Syntaxe

Couleur = GetPaletteColor(#Palette, Index)
Description
Renvoie la couleur située à l'index indiqué.

Arguments

#Palette Le numéro de la palette.

Valeur de retour

Renvoie la valeur RVB de la couleur située à l'index indiqué dans #Palette.

Remarques

Pour récupérer les composantes rouge, vert et bleu de la couleur les commandes suivantes peuvent être utilisées: Red(), Green() et Blue().

Voir aussi

SetPaletteColor()

OS Supportés

Windows, Linux


InitPalette()

Syntaxe

Resultat = InitPalette()
Description
Initialise l'environnement nécessaire à la gestion des palettes de couleur.

Arguments

#Palette Le numéro de la palette.

Valeur de retour

Si Resultat = 0, l'initialisation a échoué et aucune fonction de la librarie ne pourra être utilisée.

Remarques

Vous devez placer cette fonction au début de votre code source si vous souhaitez utiliser les fonctions de cette librarie. Sous Windows, l'échec se produit le plus souvent parce que DirectX 7 (ou DirectX 3 si compatibilité NT4.0) n'a pas été trouvé.

OS Supportés

Windows, Linux


IsPalette()

Syntaxe

Resultat = IsPalette(#Palette)
Description
Teste si une palette est correctement initialisée.

Arguments

#Palette Le numéro de la palette.

Valeur de retour

Si le 'Résultat' est différent de zéro, alors cet objet est valide.

Remarques

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.

C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

CreatePalette()

OS Supportés

Windows, Linux


LoadPalette()

Syntaxe

Resultat = LoadPalette(#Palette, NomFichier$)
Description
Charge une palette d'après un fichier BMP standard (Images 256 couleurs seulement).

Arguments

#Palette Le numéro de la palette.

Si #PB_Any est utilisé pour le paramètre '#Palette', le numéro de la nouvelle palette sera renvoyé dans 'Resultat'.
NomFichier$ La palette est initialisée avec les valeurs trouvées dans ce fichier.

Valeur de retour

Si la palette a été correctement chargée, Resultat est non nul, sinon, il s'est produit une erreur.

OS Supportés

Windows, Linux


SetPaletteColor()

Syntaxe

SetPaletteColor(#Palette, Index, Couleur)
Description
Change la valeur RVB de la couleur située à l'index spécifié dans une palette.

Arguments

#Palette | Le numéro de la palette.
Index | Index couleur.
Couleur | Nouvelle couleur

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Pour avoir facilement une couleur RVB à partir des composantes rouge, vert et bleu la commande RGB() peut être utilisée.

La formule suivante (plus rapide) peut aussi être utilisée:
Couleur = Rouge + Vert<<8 + Bleu<<16

Voir aussi

GetPaletteColor()

OS Supportés

Windows, Linux


Particle

PureBasic - Particle

Généralités

Les systèmes de particules sont largement utilisés dans les scènes 3D pour simuler des objets aux comportements non prédictibles tels que la pluie, le feu, des explosions etc.

PureBasic permet de créer un nombre quelconque d'émetteurs de particules fonctionnant de manière autonome. Chaque émetteur a sa forme propre et ses propriétés propres comme la vélocité, la vitesse, le taux d'émission et plus encore.

Les particules sont des plans en 2D (Billboards) qui font toujours face à la caméra et qui ont toutes la même taille.

InitEngine3D() doit être appelé avec succès avant l'utilisation des commandes Particle.

Sommaire des commandes

CreateParticleEmitter
FreeParticleEmitter
GetScriptParticleEmitter
HideParticleEmitter
IsParticleEmitter
MoveParticleEmitter
ParticleColorFader
ParticleColorRange
ParticleEmissionRate
ParticleEmitterDirection
ParticleEmitterID
ParticleEmitterX
ParticleEmitterY
ParticleEmitterZ
ParticleMaterial
ParticleSize
ParticleTimeToLive
ParticleVelocity
ResizeParticleEmitter

Exemple

Particle.pb
GetScriptParticle.pb

OS Supportés

Tous

Guide de référence - Index


CreateParticleEmitter()

Syntaxe

Resultat = CreateParticleEmitter(#EmetteurParticule, Largeur, Hauteur, Profondeur, Type, [, x, y, z])
Description
Crée un émetteur de particules.

Arguments

#EmetteurParticule | L'émetteur de particules à utiliser.
Le nouvel émetteur de particules.

Si #PB_Any est utilisé pour le paramètre '#EmetteurParticule', le numéro du nouvel émetteur sera renvoyé dans 'Resultat'.
Largeur, Hauteur, Profondeur Dimensions du nouvel émetteur de particules.

La taille par défaut des futures particules peuvent être spécifiées avec la commande ParticleSize().
Type
  #PB_Particle_Point: L'émetteur est un point unique
  #PB_Particle_Box  : L'émetteur est une boîte, avec une largeur, une hauteur et une profondeur
x,y,z (optionnel) | Position du nouvel émetteur de particules.

Valeur de retour

Si le 'Resultat' est zéro alors l' émetteur de particules n'a pas pu être créé.

Remarques

Si #EmetteurParticule a déjà été créé, sa place mémoire est automatiquement libérée et il est remplacé par le nouvel émetteur de particules.

Voir aussi

FreeParticleEmitter(), IsParticleEmitter(), ParticleEmitterID()


FreeParticleEmitter()

Syntaxe

FreeParticleEmitter(#EmetteurParticule)
Description
Supprime un émetteur de particules.

Arguments

#EmetteurParticule L'émetteur de particules à supprimer.

Si #PB_All est spécifié, tous les émetteur de particules restants sont libérés.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Supprime et libère la mémoire associée à l'émetteur.

Cet objet ne peut plus désormais être utilisé.

Tous les émetteurs de particules restants sont automatiquement supprimés quand le programme se termine.

Voir aussi

CreateParticleEmitter()


GetScriptParticleEmitter()

Syntaxe

Resultat = GetScriptParticleEmitter(#EmetteurParticule, Nom$)
Description
Obtenir un émetteur de particules défini dans un fichier de script OGRE.

Arguments

#EmetteurParticule Le numéro du nouvel émetteur de particules à trouver.

PB_Any # peut être utilisé pour générer automatiquement ce numéro.
Nom$ Le nom de l'émetteur de particules dans le fichier de script OGRE.
Ce nom est sensible à la casse.

Valeur de retour

Renvoie zéro si l'émetteur de particules est introuvable ou ne peut pas être chargé à partir des fichiers de script.

Si #PB_Any est utilisé à la place de '#EmetteurParticule' alors 'Resultat' contient le numéro du nouvel émetteur.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateParticleEmitter()


HideParticleEmitter()

Syntaxe

HideParticleEmitter(#EmetteurParticule, Etat)
Description
Cache ou affiche l'émetteur de particules.

Arguments

#EmetteurParticule L'émetteur de particules à utiliser.
Etat
  1: L'émetteur est caché
  0: L'émetteur est affiché

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateParticleEmitter()


IsParticleEmitter()

Syntaxe

Resultat = IsParticleEmitter(#EmetteurParticule)
Description
Teste si l'émetteur de particules est correctement initialisé.

Arguments

#EmetteurParticule L'émetteur de particules à utiliser.

Valeur de retour

Si le 'Résultat' est différent de zéro alors cet objet est valide.

Remarques

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.

C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

CreateParticleEmitter(), ParticleEmitterID()


MoveParticleEmitter()

Syntaxe

MoveParticleEmitter(#EmetteurParticule, x, y, z [, Mode])
Description
Déplace un émetteur de particules dans le monde 3D.

Arguments

#EmetteurParticule L'émetteur de particules à déplacer.
x, y, z Valeur du déplacement.

La nouvelle position de l'émetteur de particules.
Mode (optionnel) Peut être une des valeurs suivantes:
  #PB_Relative: Déplacement relatif, à partir de la position actuelle de l'émetteur (par défaut).
  #PB_Absolute: Déplacement absolu à la position spécifiée.
combinée avec l'une des valeurs suivantes:
  #PB_Local : Déplacement local.
  #PB_Parent: Déplacement par rapport à la position du parent.
  #PB_World : Déplacement par rapport au monde.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

ParticleEmitterX(), ParticleEmitterY(), ParticleEmitterZ()


ParticleColorFader()

Syntaxe

ParticleColorFader(#EmetteurParticule, TauxRouge, TauxVert, TauxBleu)
Description
Change le niveau d'intensité des couleurs des particules (fader) dans l'unité de temps du monde 3D.

Arguments

#EmetteurParticule | L'émetteur de particules à utiliser.
TauxRouge, TauxVert, TauxBleu | Taux de chacune des couleurs Rouge, Vert, Bleu.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

ParticleColorRange()


ParticleColorRange()

Syntaxe

ParticleColorRange(#EmetteurParticule, PremiereCouleur, DerniereCouleur)
Description
Change la plage de couleurs des particules d'un émetteur de particules.

Arguments

#EmetteurParticule L'émetteur de particules à utiliser.
PremiereCouleur, DerniereCouleur Chaque particules émise obtiendra une valeur aléatoire dans la plage située entre 'PremiereCouleur' et 'DerniereCouleur'.

La commande RGB() peut être utilisée pour obtenir rapidement une couleur.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

ParticleColorFader()


ParticleEmissionRate()

Syntaxe

ParticleEmissionRate(#EmetteurParticule, Taux)
Description
Change le taux d'émission de l'émetteur de particules.

Arguments

#EmetteurParticule | L'émetteur de particules à utiliser.
Taux | Nouveau taux d'émission, en particules par seconde.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

ParticleEmitterDirection(), ParticleSize(), ParticleTimeToLive()


ParticleEmitterDirection()

Syntaxe

ParticleEmitterDirection(#EmetteurParticule, x, y, z)
Description
Change la direction d'un émetteur de particules.

Arguments

#EmetteurParticule | L'émetteur de particules à utiliser.
x, y, z | L'émetteur pointera vers le point désigné par les coordonnées x,y et z.

Valeur de retour

Cette fonction n'a pas de valeur de retour.


ParticleEmitterID()

Syntaxe

EmetteurParticuleID = ParticleEmitterID(#EmetteurParticule)
Description
Renvoie l'identifiant unique de l'émetteur de particules.

Arguments

#EmetteurParticule L'émetteur de particules à utiliser.

Valeur de retour

Renvoie le numéro de l'émetteur.

Remarques

Cette fonction est très utile quand une fonction d'une autre bibliothèque nécessite l'identifiant d'un émetteur de particules.

Voir aussi

CreateParticleEmitter(), IsParticleEmitter()


ParticleEmitterX()

Syntaxe

Resultat = ParticleEmitterX(#EmetteurParticule)
Description
Renvoie la position absolue en X dans le monde 3D de l'émetteur de particules.

Arguments

#EmetteurParticule L'émetteur de particules à utiliser.

Valeur de retour

Renvoie la position absolue en X de l'émetteur.

Voir aussi

ParticleEmitterY(), ParticleEmitterZ()


ParticleEmitterY()

Syntaxe

Resultat = ParticleEmitterY(#EmetteurParticule)
Description
Renvoie la position absolue en Y dans le monde 3D de l'émetteur de particules.

Arguments

#EmetteurParticule L'émetteur de particules à utiliser.

Valeur de retour

Renvoie la position absolue en Y de l'émetteur.

Voir aussi

ParticleEmitterX(), ParticleEmitterZ()


ParticleEmitterZ()

Syntaxe

Resultat = ParticleEmitterZ(#EmetteurParticule)
Description
Renvoie la position absolue en Z dans le monde 3D de l'émetteur de particules.

Arguments

#EmetteurParticule L'émetteur de particules à utiliser.

Valeur de retour

Renvoie la position absolue en Z de l'émetteur.

Voir aussi

ParticleEmitterX(), ParticleEmitterY()


ParticleMaterial()

Syntaxe

ParticleMaterial(#EmetteurParticule, MatiereID)
Description
Assigne une matière à un émetteur de particules.

Arguments

#EmetteurParticule L'émetteur de particules à utiliser.
MatiereID Le numéro de la matière.

Peut être facilement obtenu avec la commande MaterialID().

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette matière sera utilisée par toutes les particules de cet émetteur.

Un émetteur peut seulement avoir une matière assignée à la fois.

Voir aussi

GetScriptParticleEmitter()


ParticleSize()

Syntaxe

ParticleSize(#EmetteurParticule, Largeur, Hauteur)
Description
Change les dimensions des particules.

Arguments

#EmetteurParticule | L'émetteur de particules à utiliser.
Largeur, Hauteur | Nouvelles dimensions des particules.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Les particules sont des plans en 2D(Billboards) qui font toujours face à la Caméra.

Toutes les particules d'un même émetteur ont toujours la même taille.

Voir aussi

ParticleEmissionRate(), ParticleEmitterDirection()


ParticleTimeToLive()

Syntaxe

ParticleTimeToLive(#EmetteurParticule, TempsMininum, TempsMaximum)
Description
Change la durée de vie des particules d'un émetteur de particules.

Arguments

#EmetteurParticule L'émetteur de particules à utiliser.
TempsMininum, TempsMaximum Durée de vie minimum et maximum de chaque particules dans l'unité de temps du monde 3D.

La durée de vie des particules est une valeur aléatoire à l'intérieur de cette plage.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

ParticleVelocity()


ParticleVelocity()

Syntaxe

ParticleVelocity(#EmetteurParticule, Minimum, Maximum)
Description
Change la vitesse des particules.

Arguments

#EmetteurParticule | L'émetteur de particules à utiliser.
Minimum, Maximum | Une valeur aléatoire de vélocité choisie dans la plage 'Minimum' et 'Maximum' sera utilisée par chaque particules émise.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

ParticleTimeToLive(), ParticleEmissionRate()


ResizeParticleEmitter()

Syntaxe

ResizeParticleEmitter(#Particle, #EmetteurParticule, Largeur, Hauteur, Profondeur)
Description
Redimensionne un émetteur de particules

Arguments

#EmetteurParticule | L'émetteur de particules à utiliser.
Largeur, Hauteur, Profondeur | Nouvelles dimensions de l'émetteur.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

MoveParticleEmitter(), ParticleSize()


Preference

PureBasic - Preference

Généralités

Un fichier Preference contient des paramètres définis pour le programme par l'utilisateur. Il est stocké sur le disque et est chargé à chaque lancement de ce programme (comme les fichiers '.INI' sous Windows par exemple). PureBasic offre la possibilité de créer un fichier hiérarchisé de préférences facilement utilisable sur différentes plate-formes. Le format du fichier est en ASCII avec une préférence par ligne, utilisant une syntaxe 'Clef=Valeur'. Des groupes peuvent être créés pour une lecture plus simple.

Compiler avec le mode unicode force PureBasic à sauver les chaînes de caractères du fichier preference dans le format UTF-8.

Sommaire des commandes

ClosePreferences
CreatePreferences
ExaminePreferenceGroups
ExaminePreferenceKeys
NextPreferenceGroup
NextPreferenceKey
OpenPreferences
PreferenceComment
PreferenceGroup
PreferenceGroupName
PreferenceKeyName
PreferenceKeyValue
ReadPreferenceDouble
ReadPreferenceFloat
ReadPreferenceInteger
ReadPreferenceLong
ReadPreferenceQuad
ReadPreferenceString
RemovePreferenceGroup
RemovePreferenceKey
WritePreferenceDouble
WritePreferenceFloat
WritePreferenceInteger
WritePreferenceLong
WritePreferenceQuad
WritePreferenceString

Exemple

Preference.pb

OS Supportés

Tous

Guide de référence - Index


ClosePreferences()

Syntaxe

ClosePreferences()
Description
Ferme un fichier de préférences préalablement ouvert avec la commande OpenPreferences() ou créé avec CreatePreferences().


CreatePreferences()

Syntaxe

Resultat = CreatePreferences(NomFichier$ [, Options])
Description
Crée un nouveau fichier vide de préférences. Si le fichier existe déjà, il est écrasé.

Arguments

NomFichier$ Le nom du nouveau fichier de préférences.
Options (optionnel) Peut être une combinaison des valeurs suivantes:
  #PB_Preference_NoSpace       : Pas d'espaces autour du signe égal.
                                 Utile quand il s'agit de fichiers de préférences externes qui
                                 n'accepte pas les espaces autour de signe égal.
  #PB_Preference_GroupSeparator: Ajoute une ligne vide entre les groupes pour faciliter la
                                 lisibilité.

Valeur de retour

Renvoie une valeur non nulle si le fichier a été créé avec succès, ou zéro si la création du fichier a échoué.

Remarques

Une fois le fichier créé, les commandes telles que WritePreferenceString() permettent d'écrire des informations. Une fois les valeurs écrites, il est possible de les relire avec ReadPreferenceString() ou une commande similaire.

Pour effacer une clef ou un groupe, RemovePreferenceKey() et RemovePreferenceGroup() sont disponibles. PreferenceGroup() permet de créer ou changer le groupe courant.

Une fois les opérations sur le fichier terminées, il faut utiliser ClosePreferences() pour fermer et écrire définitivement le fichier préférences sur le disque.


ExaminePreferenceGroups()

Syntaxe

Resultat = ExaminePreferenceGroups()
Description
Commence l'énumération de tous les groupes trouvés dans le fichier de préférence courant. La commande NextPreferenceGroup() permet de passer au groupe suivant de la liste. Si l'énumération ne peut pas être initialisée, 'Resultat' sera égal à 0.


ExaminePreferenceKeys()

Syntaxe

Resultat = ExaminePreferenceKeys()
Description
Commence l'énumération de toutes les clefs trouvés dans le fichier de préférence courant. La commande NextPreferenceKey() permet de passer à la clef suivante de la liste. Si l'énumération ne peut pas être initialisée, 'Resultat' sera égal à 0.


NextPreferenceGroup()

Syntaxe

Resultat = NextPreferenceGroup()
Description
Récupère les informations concernant le groupe suivant de l'énumération commencée ExaminePreferenceGroups(). Pour savoir le nom du groupe, utiliser PreferenceGroupName(). Si 'Resultat' est égal à 0, alors il n'y a plus de groupe dans l'énumération.


NextPreferenceKey()

Syntaxe

Result = NextPreferenceKey()
Description
Récupère les informations concernant la clef suivante de l'énumération commencée avec ExaminePreferenceKeys(). Pour savoir le nom et la valeur de la clef, utiliser PreferenceKeyName() et PreferenceKeyValue(). Si 'Resultat' est égal à 0, alors il n'y a plus de clef dans l'énumération.


OpenPreferences()

Syntaxe

Resultat = OpenPreferences(NomFichier$ [, Options])
Description
Ouvre un fichier préférences existant.

Arguments

NomFichier$ Le nom du fichier de préférences.
Options (optionnel) Peut être une combinaison des valeurs suivantes:
  #PB_Preference_NoSpace       : Pas d'espaces autour du signe égal.
                                 Utile quand il s'agit de fichiers de préférences externes qui
                                 n'accepte pas les espaces autour de signe égal.
  #PB_Preference_GroupSeparator: Ajoute une ligne vide entre les groupes pour faciliter la
                                 lisibilité.

Valeur de retour

Renvoie une valeur non nulle si le fichier a été ouvert avec succès, ou zéro si l'ouverture du fichier a échoué.

Remarques

Si le fichier ne peut être ouvert, le programmeur peut malgré tout utiliser la commande de lecture, celle-ci retournant alors la valeur par défaut spécifiée. Ceci est très pratique pour initialiser en une fois les variables du programme. Les fonctions comme ReadPreferenceString() peuvent être utilisées pour lire les valeurs de préférence stockées dans le fichier.

Pour effacer une clef ou un groupe, RemovePreferenceKey() et RemovePreferenceGroup() sont disponibles. PreferenceGroup() permet de créer ou changer le groupe courant.

Il est possible de modifier les valeurs existantes avec WritePreferenceString() ou une commande similaire.

Une fois les opérations sur le fichier terminées, il faut utiliser ClosePreferences() pour fermer et écrire définitivement le fichier préférences sur le disque.


PreferenceComment()

Syntaxe

PreferenceComment(Texte$)
Description
Ecrit une ligne de commentaire dans le fichier préférences en cours de création.


PreferenceGroup()

Syntaxe

Resultat = PreferenceGroup(Nom$)
Description
Si le fichier de préférences est en mode création (après une commande CreatePreferences()) alors un nouveau groupe est créé sous la forme: [NomGroupe$]. Toutes les opérations qui suivent sont alors situées dans ce groupe. Si des préférences sont stockées en dehors d'un groupe, il est possible de revenir dans cet espace en specifiant un 'Nom$' vide. 'Resultat' sera egal à 1 si le groupe existe déjà, ou 0 sinon.

Si le groupe n'existe pas, il ne sera pas immédiatement créé. Il sera créé uniquement lorsqu'au moins une clef sera écrite dans ce groupe. Ceci permet d'utiliser PreferenceGroup() pour tester si un groupe existe sans créé plein de groupes vides.


PreferenceGroupName()

Syntaxe

Groupe$ = PreferenceGroupName()
Description
Renvoie le nom du groupe courant de l'énumération commencée avec ExaminePreferenceGroups().


PreferenceKeyName()

Syntaxe

Clef$ = PreferenceKeyName()
Description
Renvoie le nom de la clef courante de l'énumération commencée avec ExaminePreferenceKeys(). La commande PreferenceKeyValue() permet de récupérer la valeur de la clef.


PreferenceKeyValue()

Syntaxe

Valeur$ = PreferenceKeyValue()
Description
Renvoie la valeur de la clef courante de l'énumération commencée avec ExaminePreferenceKeys(). La commande PreferenceKeyName() permet de récupérer le nom de la clef.


ReadPreferenceDouble()

Syntaxe

Resultat.d = ReadPreferenceDouble(Clef$, ValeurParDefaut)
Description
Essaye de lire la paire Clef$, ValeurParDefaut. Si la commande PreferenceGroup() a été utilisée alors la recherche est limitée au groupe courant. Si Clef$ n'a pas été trouvé ou que le fichier préférences n'a pas été ouvert correctement (fichier absent par exemple), la valeur par défaut spécifiée est utilisée comme résultat.


ReadPreferenceFloat()

Syntaxe

Resultat.f = ReadPreferenceFloat(Clef$, ValeurParDefaut)
Description
Essaye de lire la paire Clef$, ValeurParDefaut. Si la commande PreferenceGroup() a été utilisée alors la recherche est limitée au groupe courant. Si Clef$ n'a pas été trouvé ou que le fichier préférences n'a pas été ouvert correctement (fichier absent par exemple), la valeur par défaut spécifiée est utilisée comme résultat.


ReadPreferenceInteger()

Syntaxe

Resultat = ReadPreferenceInteger(Clef$, ValeurParDefaut)
Description
Essaye de lire la paire Clef$, ValeurParDefaut. Si la commande PreferenceGroup() a été utilisée alors la recherche est limitée au groupe courant. Si Clef$ n'a pas été trouvé ou que le fichier préférences n'a pas été ouvert correctement (fichier absent par exemple), la valeur par défaut spécifiée est utilisée comme résultat.


ReadPreferenceLong()

Syntaxe

Resultat.l = ReadPreferenceLong(Clef$, ValeurParDefaut)
Description
Essaye de lire la paire Clef$, ValeurParDefaut. Si la commande PreferenceGroup() a été utilisée alors la recherche est limitée au groupe courant. Si Clef$ n'a pas été trouvé ou que le fichier préférences n'a pas été ouvert correctement (fichier absent par exemple), la valeur par défaut spécifiée est utilisée comme résultat.


ReadPreferenceQuad()

Syntaxe

Resultat.q = ReadPreferenceQuad(Clef$, ValeurParDefaut)
Description
Essaye de lire la paire Clef$, ValeurParDefaut. Si la commande PreferenceGroup() a été utilisée alors la recherche est limitée au groupe courant. Si Clef$ n'a pas été trouvé ou que le fichier préférences n'a pas été ouvert correctement (fichier absent par exemple), la valeur par défaut spécifiée est utilisée comme résultat.


ReadPreferenceString()

Syntaxe

Resultat$ = ReadPreferenceString(Clef$, ValeurParDefaut)
Description
Essaye de lire la paire Clef$, ValeurParDefaut. Si la commande PreferenceGroup() a été utilisée alors la recherche est limitée au groupe courant. Si Clef$ n'a pas été trouvé ou que le fichier préférences n'a pas été ouvert correctement (fichier absent par exemple), la valeur par défaut spécifiée est utilisée comme résultat.

Pour lire une valeur dans un type particulier, les commandes suivantes peuvent être utilisées:

ReadPreferenceDouble()
ReadPreferenceFloat()
ReadPreferenceLong()
ReadPreferenceQuad()


RemovePreferenceGroup()

Syntaxe

RemovePreferenceGroup(Groupe$)
Description
Supprime le 'Groupe$' spécifié et toutes ses clefs.


RemovePreferenceKey()

Syntaxe

RemovePreferenceKey(Clef$)
Description
Supprime la 'Clef$' specifiée et sa valeur associée.


WritePreferenceDouble()

Syntaxe

WritePreferenceDouble(Clef$, Valeur.d)
Description
Ecrit la paire Clef$, Valeur sous la forme : 'Clef$ = Valeur' dans le fichier préférences préalablement créé avec CreatePreferences() ou ouvert avec OpenPreferences(). Si la 'Clef$' existe déjà, alors sa valeur est remplacée.


WritePreferenceFloat()

Syntaxe

WritePreferenceFloat(Clef$, Valeur.f)
Description
Ecrit la paire Clef$, Valeur sous la forme : 'Clef$ = Valeur' dans le fichier préférences préalablement créé avec CreatePreferences() ou ouvert avec OpenPreferences(). Si la 'Clef$' existe déjà, alors sa valeur est remplacée.


WritePreferenceInteger()

Syntaxe

WritePreferenceInteger(Clef$, Valeur)
Description
Ecrit la paire Clef$, Valeur sous la forme : 'Clef$ = Valeur' dans le fichier préférences préalablement créé avec CreatePreferences() ou ouvert avec OpenPreferences(). Si la 'Clef$' existe déjà, alors sa valeur est remplacée.


WritePreferenceLong()

Syntaxe

WritePreferenceLong(Clef$, Valeur)
Description
Ecrit la paire Clef$, Valeur sous la forme : 'Clef$ = Valeur' dans le fichier préférences préalablement créé avec CreatePreferences() ou ouvert avec OpenPreferences(). Si la 'Clef$' existe déjà, alors sa valeur est remplacée.


WritePreferenceQuad()

Syntaxe

WritePreferenceQuad(Clef$, Valeur.q)
Description
Ecrit la paire Clef$, Valeur sous la forme : 'Clef$ = Valeur' dans le fichier préférences préalablement créé avec CreatePreferences() ou ouvert avec OpenPreferences(). Si la 'Clef$' existe déjà, alors sa valeur est remplacée.


WritePreferenceString()

Syntaxe

WritePreferenceString(Clef$, Valeur$)
Description
Ecrit la paire Clef$, Valeur sous la forme : 'Clef$ = Valeur' dans le fichier préférences préalablement créé
avec CreatePreferences() ou ouvert avec  OpenPreferences().
Si la 'Clef$' existe déjà, alors sa valeur est remplacée.

Pour écrire une valeur dans un type particulier, les commandes suivantes peuvent être utilisées:

WritePreferenceDouble()
WritePreferenceFloat()
WritePreferenceLong()
WritePreferenceQuad()


Printer

PureBasic - Printer

Généralités

Les imprimantes sont des périphériques essentiels pour transformer les informations numériques virtuelles en informations écrites. La plupart des logiciels nécessitent l'impression des informations sur papier pour être pleinement efficaces. PureBasic permet d'imprimer tous types de données depuis le texte de base jusqu'aux images dans toutes les résolutions.

Sommaire des commandes

DefaultPrinter
NewPrinterPage
PrintRequester
PrinterOutput
PrinterPageHeight
PrinterPageWidth
StartPrinting
StopPrinting

Exemple

Printer.pb

OS Supportés

Tous

Guide de référence - Index


DefaultPrinter()

Syntaxe

Resultat = DefaultPrinter()
Description
Sélectionne l'imprimante par défaut pour les opérations d'impression.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Si 'Resultat' est égal à zéro alors aucune imprimante par défaut n'est disponible.

Remarques

Cette fonction doit être utilisée avant toute autre de la bibliothèque Printer.

Une fois la commande DefaultPrinter() terminée avec succès la commande StartPrinting() est utilisée pour démarrer l'impression.

Voir aussi

StartPrinting(), PrinterOutput()


NewPrinterPage()

Syntaxe

NewPrinterPage()
Description
Créé une nouvelle page vide.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

La page précédente est envoyée à l'imprimante et ne peut plus être modifiée.

Cette commande doit être appelée à l'intérieur d'un bloc StartDrawing()/StopDrawing().

Exemple

  If PrintRequester()
    If StartPrinting("Deux feuilles")
      If StartDrawing(PrinterOutput())
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(10, 10, "Première page !", RGB(0, 0, 0))

        ; Informe l'imprimante qu'elle doit commencer une nouvelle page
        NewPrinterPage()

        DrawText(10, 10, "Deuxième page !", RGB(0, 0, 0))

        StopDrawing()
      EndIf

      StopPrinting()
    EndIf
  EndIf

Voir aussi

StartDrawing(), StopDrawing()


PrintRequester()

Syntaxe

Resultat = PrintRequester()
Description
Ouvre une boîte de dialogue pour sélectionner l'imprimante et ajuster les paramètres.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Si 'Resultat' est égal à zéro alors aucune imprimante n'est disponible ou bien l'utilisateur a interrompu la sélection avec la boîte de dialogue.

Remarques

Cette fonction doit être utilisée avant toute autre de la bibliothèque Printer.

Une fois la commande PrintRequester() terminée avec succès la commande StartPrinting() est utilisée pour démarrer l'impression.

Voir aussi

StartPrinting()


PrinterOutput()

Syntaxe

OutputID = PrinterOutput()
Description
Renvoie l'identifiant OutputID de l'imprimante courante.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le numéro de l'imprimante en cours.

Remarques

A utiliser avec la commande StartDrawing().

Toutes les commandes de la bibliothèque 2DDrawing sont disponibles et peuvent être utilisées pour l'impression.

L'imprimante est vue comme une page vide exactement comme une fenêtre ou une image.

Exemple

  StartDrawing(PrinterOutput())
    ; faire des trucs de dessin ici ...
  StopDrawing()

Voir aussi

StartDrawing()


PrinterPageHeight()

Syntaxe

Resultat = PrinterPageHeight()
Description
Renvoie la hauteur de la zone de tracé.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la hauteur de la zone d'impression en pixels.

Ce nombre change en fonction de la valeur DPI de l'imprimante.
Cela signifie qu'un document imprimé en 75 DPI aura une hauteur de zone d'impression 4 fois plus petite qu'un document imprimé en 150 DPI.

Note: La valeur renvoyée représente la hauteur disponible pour imprimer, sans compter les marges 'hardware' (qu'on ne peux pas changer) des imprimantes.

Voir aussi

PrinterPageWidth()


PrinterPageWidth()

Syntaxe

Resultat = PrinterPageWidth()
Description
Renvoie la largeur de la zone de tracé.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie la largeur de la zone d'impression en pixels.

Ce nombre change en fonction de la valeur DPI de l'imprimante.
Cela signifie qu'un document imprimé en 75 DPI aura une largeur de zone d'impression 4 fois plus petite qu'un document imprimé en 150 DPI.

Note: La valeur renvoyée représente la largeur disponible pour imprimer, sans compter les marges 'hardware' (qu'on ne peux pas changer) des imprimantes.

Voir aussi

PrinterPageHeight()


StartPrinting()

Syntaxe

Resultat = StartPrinting(NomJob$)
Description
Initialise l'imprimante et démarre l'impression.

Arguments

NomJob$ Le nom qui apparaîtra dans la file d'attente et qui identifie la tâche d'impression.

Valeur de retour

Si 'Resultat' est égal à zéro alors l'impression n'a pas pu aboutir.

Voir aussi

StopPrinting()


StopPrinting()

Syntaxe

StopPrinting()
Description
Arrête toutes les opérations d'impression et envoie les données à l'imprimante.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

StartPrinting()


Process

PureBasic - Process

Généralités

Cette bibliothèque permet de récupérer des informations sur le programme, ainsi que d'exécuter d'autres programmes et communiquer avec eux.

Sommaire des commandes

AvailableProgramOutput
CloseProgram
CountProgramParameters
EnvironmentVariableName
EnvironmentVariableValue
ExamineEnvironmentVariables
GetEnvironmentVariable
IsProgram
KillProgram
NextEnvironmentVariable
ProgramExitCode
ProgramFilename
ProgramID
ProgramParameter
ProgramRunning
ReadProgramData
ReadProgramError
ReadProgramString
RemoveEnvironmentVariable
RunProgram
SetEnvironmentVariable
WaitProgram
WriteProgramData
WriteProgramString
WriteProgramStringN

OS Supportés

Tous

Guide de référence - Index


AvailableProgramOutput()

Syntaxe

Resultat = AvailableProgramOutput(Programme)
Description
Renvoie le nombre d'octets qui sont disponibles pour la lecture à partir de la sortie du 'Programme'. Le programme doit avoir été lancé avec RunProgram() en spécifiant l'option #PB_Program_Read.

La sortie peut être effectivement lue soit avec ReadProgramString() ou avec ReadProgramData().


CloseProgram()

Syntaxe

CloseProgram(Programme)
Description
Termine toutes les connexions avec le 'Programme' spécifié (lancé avec RunProgram()) et libère toutes ses ressources associées.

Note: cette commande ne force pas le 'Programme' à se terminer, seules les connexions avec lui sont fermées. Pour forcer le 'Programme' à quitter, la commande KillProgram() est disponible. De plus, même si le 'Programme' se termine de façon normale, il est important d'appeler CloseProgram() pour libérer toutes les ressources.

Si le 'Programme' a été lancé avec l'option #PB_Program_Write, CloseProgram() enverra un signal EOF (fin de fichier) sur l'entrée standard du 'Programme'. Ce signal peut aussi être artificiellement provoqué sans fermer les connexions avec le 'Programme' en appelant WriteProgramData() avec la valeur spéciale #PB_Program_Eof.


CountProgramParameters()

Syntaxe

Resultat = CountProgramParameters()
Description
Renvoie le nombre de paramètres qui ont été passés au programme PureBasic via la ligne de commande (ou avec RunProgram()).

ProgramParameter() peut être utilisé pour lire chaque paramètre.


EnvironmentVariableName()

Syntaxe

Resultat$ = EnvironmentVariableName()
Description
Renvoie le nom de la variable d'environnement en cours d'énumération. Cette commande doit être appelée après ExamineEnvironmentVariables() et NextEnvironmentVariable().

Pour récupérer la valeur de cette variable d'environnement, utiliser EnvironmentVariableValue().


EnvironmentVariableValue()

Syntaxe

Resultat$ = EnvironmentVariableValue()
Description
Renvoie la valeur de la variable d'environnement en cours d'énumération. Cette commande doit être appelée après ExamineEnvironmentVariables() et NextEnvironmentVariable().

Pour récupérer le nom de cette variable d'environnement, utiliser EnvironmentVariableName().


ExamineEnvironmentVariables()

Syntaxe

Resultat = ExamineEnvironmentVariables()
Description
Initialise l'énumération des variables d'environnement disponibles à partir du programme PureBasic. Si cet examen n'est pas possible, 'Resultat' sera 0.

Les commandes NextEnvironmentVariable(), EnvironmentVariableName() et EnvironmentVariableValue() sont disponibles pour récupérer les informations concernant chaque variable d'environnement.

Exemple

  ; énumère toutes les variables d'environnement disponibles pour le programme
  ;
  OpenConsole()
  If ExamineEnvironmentVariables()
    While NextEnvironmentVariable()
      PrintN(EnvironmentVariableName() + " = " + EnvironmentVariableValue())
    Wend
  EndIf
  PrintN("")
  PrintN("Appuyez sur [Entree] pour quitter.")
  Input()


GetEnvironmentVariable()

Syntaxe

Resultat$ = GetEnvironmentVariable(Variable$)
Description
Renvoie le contenu de la 'Variable$' d'environnement spécifiée. Si la variable d'environnement n'existe pas, une chaîne de caractère vide sera renvoyée.

Exemple

  ; Affiche le contenu de la variable d'environnement "PATH"
  ;
  OpenConsole()
  PrintN(GetEnvironmentVariable("PATH"))
  PrintN("")
  PrintN("Appuyez sur [Entree] pour quitter.")
  Input()


IsProgram()

Syntaxe

Resultat = IsProgram(Programme)
Description
Teste si le 'Programme' préalablement lancé avec RunProgram() est correctement initialisé. Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. Si le 'Résultat' est différent de zéro, alors cet objet est valide. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.


KillProgram()

Syntaxe

KillProgram(Programme)
Description
Termine immédiatement l'exécution du programme spécifié (préalablement lancé avec RunProgram()).

Note: cette commande termine l'exécution du programme, mais elle ne ferme pas les connexions avec le programme. CloseProgram() doit toujours être appelé pour libérer les ressources associées avec le programme.


NextEnvironmentVariable()

Syntaxe

Resultat = NextEnvironmentVariable()
Description
Passe à la variable d'environnement suivante dans l'énumération commencée avec ExamineEnvironmentVariables(). Si il n'y a plus de variables d'environnement disponibles (fin de l'énumération), le 'Resultat' sera nul.

Les commandes EnvironmentVariableName() et EnvironmentVariableValue() sont disponibles pour récupérer le nom et la valeur de la variable d'environnement courante.


ProgramExitCode()

Syntaxe

Resultat = ProgramExitCode(Programme)
Description
Renvoie le code de retour du 'Programme' quand il s'est terminé. Le 'Programme' doit avoir été lancé avec la commande RunProgram().

Cette commande doit seulement être utilisée après que l'exécution du 'Programme' se soit réellement terminée. Les commandes ProgramRunning() ou WaitProgram() permettent de faire cette vérification.

Le code de retour permet de renvoyer une valeur numérique au programme qui l'a exécuté. C'est souvent utilisé pour signaler si une erreur est survenue dans le programme lancé.

Pour renvoyer un code de retour à partir d'un programme PureBasic, il faut utiliser le paramètre optionnel du mot-clef End:
  End 1   ; renvoie le code de retour 1


ProgramFilename()

Syntaxe

Resultat$ = ProgramFilename()
Description
Renvoie le chemin complet et le nom du programme PureBasic. Il est peut être utile pour savoir où le programme a été installé ou savoir le nom de l'exécutable. GetPathPart() et GetFilePart() permettent d'isoler respectivement le chemin et le nom du fichier à partir du 'Resultat$'.

Si cette commande est utilisée dans une DLL, cette commande renvoie le chemin et le nom de fichier de la DLL, pas celui du programme qui a chargé la DLL.


ProgramID()

Syntaxe

Resultat = ProgramID(Programme)
Description
Renvoie l'identifiant système unique du 'Programme' préalablement lancé avec RunProgram().

Note: la valeur renvoyée ici n'est pas un 'handle' (comme la plupart des autres commandes ...ID()). C'est le "Process ID", qui peut être lu dans le 'Gestionnaire des tâches'. Pour obtenir un 'Process handle', utiliser l'API OpenProcess_().


ProgramParameter()

Syntaxe

Resultat$ = ProgramParameter([Index])
Description
Renvoie le paramètre suivant qui a été passé à l'exécutable PureBasic quand il a été lancé. Si le paramètre facultatif 'Index' (commence par 0) est spécifié, alors le paramètre à cet index est renvoyé. Quand il n'y a plus de paramètres disponibles, 'Resultat$' sera une chaîne de caractères vide.

Cette commande est particulièrement utile avec les programmes en mode console, où l'utilisateur passe un ou plusieurs paramètres au démarrage du programme.

Note: se baser sur le renvoi d'une chaîne vide pour détecter le dernier paramètre n'est pas forcément idéal car la commande renverra aussi une chaîne vide si "" est passé sur la ligne de commande. La manière recommandée est d'utiliser CountProgramParameters() et d'appeler ProgramParameter() autant de fois que nécessaire.

Exemple

  MonProgramme.exe MonTexte.txt /RAPIDE "Mode Special"
La première fois que ProgramParameter() est appelé, la commande va renvoyer "MonTexte.txt", la seconde fois "/RAPIDE" et la troisième fois "Mode Special".


ProgramRunning()

Syntaxe

Resultat = ProgramRunning(Programme)
Description
Teste si le 'Programme' préalablement lancé avec RunProgram() est toujours en cours d'exécution. Le Resultat sera non nul si l'exécution du programme n'est pas encore terminé. Si le programme a été lancé avec l'option #PB_Program_Read, il retournera différent de zéro aussi longtemps qu'il y a quelque chose à lire, même si le programme a vraiment quitté.


ReadProgramData()

Syntaxe

Resultat = ReadProgramData(Programme, *Buffer, Taille)
Description
Lit les données binaires provenant de la sortie standard (stdout) du 'Programme' dans le *Buffer spécifié. Le programme doit avoir été lancé avec RunProgram() en spécifiant l'option #PB_Program_Read.

La commande lit un nombre d'octet jusqu'à la valeur 'Taille', ou moins si il n'y a pas assez de données à lire (par contre cette commande attendra toujours qu'il y ait au moins un octet avant de quitter, donc la valeur 0 pour 'Resultat' n'est pas possible). Le nombre d'octet effectivement lus est renvoyé dans 'Resultat'.

Note: cette commande bloque jusqu'à ce qu'il y ait des données à lire. Pour éviter ce blocage, la commande AvailableProgramOutput() peut être utilisée pour vérifier si il y a bien des données en attente.


ReadProgramError()

Syntaxe

Resultat$ = ReadProgramError(Programme)
Description
Lit une ligne texte provenant de la sortie erreur (stderr) du 'Programme'. Le programme doit avoir été lancé avec RunProgram() en spécifiant l'option #PB_Program_Error.

Cette commande n'est pas bloquante, si aucune donnée n'est disponible (une chaîne de caractères vide sera renvoyée).


ReadProgramString()

Syntaxe

Resultat$ = ReadProgramString(Programme)
Description
Lit une ligne texte provenant de la sortie standard (stdout) du 'Programme'. Le programme doit avoir été lancé avec RunProgram() en spécifiant l'option #PB_Program_Read.

Note: cette commande bloque jusqu'à ce qu'il y ait des données à lire. Pour éviter ce blocage, la commande AvailableProgramOutput() peut être utilisée pour vérifier si il y a bien des données en attente. Cette commande attend également qu'une ligne complète soit reçue. Si une lecture binaire est nécessaire, la commande ReadProgramData() peut être utilisée.


RemoveEnvironmentVariable()

Syntaxe

RemoveEnvironmentVariable(Variable$)
Description
Supprime la 'Variable$' d'environnement spécifié du bloc d'environnement du programme PureBasic.


RunProgram()

Syntaxe

Resultat = RunProgram(NomFichier$ [, Parametres$, RepertoireCourant$ [, Options [, ProgrammeEmetteur]]])
Description
Lance un programme externe. Le 'NomFichier$' contient le nom et le chemin de l'exécutable à lancer. 'Parametres$' représente les paramètres à passer au programme lors de son lancement. Le 'RepertoireCourant$' permet de définir le répertoire courant pour le nouveau programme. Si le programme ne peut pas être exécuté, la valeur de 'Resultat' sera 0, sinon 'Resultat' sera différent de zéro.

Le paramètre facultatif 'Options' peut être l'une des combinaisons suivantes:
  #PB_Program_Wait   : Attends jusqu'à ce que le programme lancé se termine.
  #PB_Program_Hide   : Lance le programme en mode invisible.
  #PB_Program_Open   : Ouvre des canaux de communication entre le programme lancé et le programme PureBasic.
  #PB_Program_Read   : Lecture possible sur la sortie standard (stdout).
  #PB_Program_Write  : Ecriture possible sur l'entrée standard (stdin).
  #PB_Program_Error  : Lecture possible sur la sortie d'erreur(stderr).
  #PB_Program_Connect: Connecte la sortie d'un autre programme à l'entrée du programme PureBasic.
Un programme exécuté avec l'option #PB_Program_Open doit toujours être fermé avec la commande CloseProgram(). Les options 'Read', 'Write', 'Error' et 'Connect' nécessitent aussi l'option #PB_Program_Open.

Quand l'option #PB_Program_Connect est utilisée, un autre programme doit avoir été préalablement lancé avec les options #PB_Program_Open et #PB_Program_Read. Le numéro renvoyé par RunProgram() doit être passé dans le paramètre 'ProgrammeEmetteur'. Toute la sortie du programme émetteur sera envoyée directement dans l'entrée du programme exécuté. Il est possible de chaîner plusieurs programmes de cette manière.

Les commandes suivantes peuvent être utilisées lorsque l'option #PB_Program_Open est spécifiée:

- IsProgram(): teste si le numéro réprésente un programme lancé avec RunProgram().
- ProgramID(): renvoie l'identifiant système du programme.
- ProgramRunning(): teste si le programme est toujours en cours d'exécution.
- WaitProgram(): attend la fin du programme.
- KillProgram(): force le programme à quitter.
- ProgramExitCode(): renvoie le code de retour du programme.
- CloseProgram(): ferme les connexions du programme et libère les ressources.

Les commandes suivantes peuvent être utilisées par les programmes lancés avec les options 'Read', 'Write' ou 'Error':

- AvailableProgramOutput(): teste si des données sont disponibles.
- ReadProgramString(): lit une ligne à partir de la sortie standard du programme exécuté.
- ReadProgramData(): lit des données binaires à partir de la sortie standard du programme exécuté.
- ReadProgramError(): lit une ligne à partir de la sortie erreur du programme exécuté.
- WriteProgramString(): écrit une ligne sur l'entrée standard du programme exécuté.
- WriteProgramData(): écrit des données binaires sur l'entrée standard du programme exécuté.

Si l'option #PB_Program_Open est utilisée, 'Resultat' contient le numéro qui identifie le nouveau programme lancé qui peut être utilisé par les commandes mentionnées ci-dessus.

Exemple

  ; Execute le compilateur PureBasic avec l'option /? et affiche la sortie (version Windows)
  ; Pour Linux/MacOS changez le paramètre "/?" en "-h".
  ;
  Compilateur = RunProgram(#PB_Compiler_Home+"/Compilers/pbcompiler", "/?", "", #PB_Program_Open | #PB_Program_Read)
  Sortie$ = ""
  If Compilateur
    While ProgramRunning(Compilateur)
      If AvailableProgramOutput(Compilateur)
        Sortie$ + ReadProgramString(Compilateur) + Chr(13)
      EndIf
    Wend
    Sortie$ + Chr(13) + Chr(13)
    Sortie$ + "Code de retour : " + Str(ProgramExitCode(Compilateur))

    CloseProgram(Compilateur) ; Ferme la connection vers le programme
  EndIf

  MessageRequester("Sortie", Sortie$)
Sous Windows RunProgram() utilise l'application par défaut associée à un type de fichier. Par exemple: RunProgram("Test.html") ouvrira le navigateur configuré sur votre système.


SetEnvironmentVariable()

Syntaxe

SetEnvironmentVariable(Nom$, Valeur$)
Description
Crée une nouvelle variable d'environnement avec le 'Nom$' et la 'Valeur$' specifiés. Si la variable d'environnement existait déjà, sa valeur est automatiquement remplacée.

Les variables d'environnements sont automatiquement héritées par les programmes lancés avec RunProgram(), donc il est possible de passer un grand nombre d'informations au nouveau programme en utilisant cette méthode (le programme exécuté pourra utiliser GetEnvironmentVariable() pour lire le contenu des variables).


WaitProgram()

Syntaxe

Resultat = WaitProgram(Programme [, Minuteur])
Description
Arrête l'exécution du code jusqu'à ce que le 'Programme' spécifié (préalablement lancé avec RunProgram()) se termine, ou que le minuteur (en millisecondes) expire. Si le programme s'est terminé correctement le 'Résultat' sera différent de 0, si le minuteur a expiré le 'Resultat' sera égal à 0.


WriteProgramData()

Syntaxe

Resultat = WriteProgramData(Programme, *Buffer, Taille)
Description
Ecrit les données contenues dans le '*Buffer' dans l'entrée standard (stdin) du 'Programme'. Le 'Programme' doit avoir été lancé avec RunProgram() et l'option #PB_Program_Write. Le nombre d'octet effectivement écrit sera renvoyé dans 'Resultat'.

La valeur spéciale #PB_Program_Eof peut être passée dans le paramètre '*Buffer' pour que le programme reçoive un signal EOF (fin de fichier). Le paramètre 'Taille' est ignoré dans ce cas. Après avoir appelé WriteProgramData() avec cette valeur spéciale, plus rien ne peut être écrit dans l'entrée standard du programme.


WriteProgramString()

Syntaxe

Resultat = WriteProgramString(Programme, Texte$)
Description
Ecrit le Texte$ dans l'entrée standard (stdin) du 'Programme'. Le 'Programme' doit avoir été lancé avec RunProgram() et l'option #PB_Program_Write. Le nombre d'octet effectivement écrit sera renvoyé dans 'Resultat'.

Il n'y a pas de caractère de retour à la ligne écrit après le string. Pour inclure automatiquement un caractère de retour à la ligne, la commande WriteProgramStringN() est disponible. Pour écrire autre chose que du texte dans l'entrée standard, la commande WriteProgramData() est disponible (elle permet entre autre d'envoyer le signal #PB_Program_Eof).


WriteProgramStringN()

Syntaxe

Resultat = WriteProgramStringN(Programme, Texte$)
Description
Ecrit le Texte$ dans l'entrée standard (stdin) du 'Programme' en ajoutant automatiquement un retour à la ligne. Le 'Programme' doit avoir été lancé avec RunProgram() et l'option #PB_Program_Write. Le nombre d'octet effectivement écrit sera renvoyé dans 'Resultat'.

Pour écrire un texte sans retour à la ligne, la commande WriteProgramString() est disponible. Pour écrire autre chose que du texte dans l'entrée standard, la commande WriteProgramData() est disponible (elle permet entre autre d'envoyer le signal #PB_Program_Eof).


RegularExpression

PureBasic - RegularExpression

Généralités

Les expressions régulières permettent de rechercher, extraire ou remplacer n'importe quel texte dans une chaîne de caractères qui correspond à un motif (pattern) donné. Ces motifs sont souvent assez difficiles à écrire et à appréhender, mais quand ils sont correctement utilisés ils rendent beaucoup de manipulations autour des chaînes de caractères plus aisées. De fait, cette bibliothèque n'est pas pour les néophytes et il est conseillé d'avoir de solides bases en PureBasic et en programmation en général pour l'utiliser.

Cette bibliothèque utilise PCRE, qui est une implémentation OpenSource des expressions régulières de Perl. Toutes les expressions régulières supportées par PCRE seront reconnues dans PureBasic. Pour avoir une liste complète des motifs et des arguments disponibles, se rendre sur la page internet de PCRE: http://www.pcre.org/pcre.txt

La license PCRE est consultable ici.

Important: La licence de PCRE est très permissive, et permet son utilisation gratuite dans n'importe quel type de projet (commercial ou non) à partir du moment ou le texte de la licence est fourni avec l'application lors de sa distribution. Donc si vous utilisez cette bibliothèque, vous devez inclure un fichier contenant la licence mentionnée ci-dessus.

Sommaire des commandes

CreateRegularExpression
ExtractRegularExpression
FreeRegularExpression
IsRegularExpression
MatchRegularExpression
RegularExpressionError
ReplaceRegularExpression

Exemple

RegularExpression.pb

OS Supportés

Tous

Guide de référence - Index


CreateRegularExpression()

Syntaxe

Resultat = CreateRegularExpression(#ExpressionReguliere, Motif$ [, Options])
Description
Crée une nouvelle expression régulière. Si #PB_Any est utilisé pour le paramètre '#ExpressionReguliere', le numéro de la nouvelle expression régulière sera renvoyé dans 'Resultat'. 'Motif$' sera la règle qui sera appliquée à la chaîne de caractères pour chercher, extraire ou remplacer le texte. Si une erreur a été détectée dans la définition du motif, 'Resultat' sera 0. Pour avoir plus d'informations à propos de l'erreur, voir RegularExpressionError().

FreeRegularExpression() permet de libérer une expression régulière préalablement créée.

Le paramètre 'Options' est facultatif et peut prendre une des valeurs suivantes:
  #PB_RegularExpression_DotAll    : '.' prend tout en compte, y compris les retours à la ligne.
  #PB_RegularExpression_Extended  : Les espaces et les commentaires commençant par '#' sont ignorés.
  #PB_RegularExpression_MultiLine : '^' et '$' prennent en compte les retours à la ligne dans les données.
  #PB_RegularExpression_AnyNewLine: 'CR', 'LF', et 'CRLF' sont considérés comme des retours à la ligne.
  #PB_RegularExpression_NoCase    : Insensible à la casse.
Exemple:
  ; Cette expression repérera chaque mot de 3 lettres qui commencent par une minuscule,
  ; suivi du caractère 'b' et qui se termine par une majuscule. ex: abC
  ;
  If CreateRegularExpression(0, "[a-z]b[A-Z]")
    Debug MatchRegularExpression(0, "abC") ; Donnera 1
    Debug MatchRegularExpression(0, "abc") ; Donnera 0
  Else
    Debug RegularExpressionError()
  EndIf


ExtractRegularExpression()

Syntaxe

Resultat = ExtractRegularExpression(#ExpressionReguliere, Texte$, Tableau$())
Description
Extrait toutes les parties de la chaîne de caractères correspondant à l'#ExpressionReguliere. Le 'Tableau$()' est automatiquement redimensionné pour contenir les éléments trouvés dans le 'Texte$'. Le nombre d'éléments trouvés est renvoyé dans 'Resultat'.

Exemple:
  ; Cette expression repérera chaque mot de 3 lettres qui commencent par une minuscule,
  ; suivi du caractère 'b' et qui se termine par une majuscule. ex: abC
  ;
  If CreateRegularExpression(0, "[a-z]b[A-Z]")
    Dim Resultat$(0)
    Nb = ExtractRegularExpression(0, "abC ABc zbA abc", Resultat$())
    For k = 0 To Nb-1
      Debug Resultat$(k)
    Next
  Else
    Debug RegularExpressionError()
  EndIf


FreeRegularExpression()

Syntaxe

FreeRegularExpression(#ExpressionReguliere)
Description
Libère une #ExpressionReguliere et libère la mémoire associée.

Arguments

#ExpressionReguliere L'expression régulière à supprimer.

Si #PB_All est spécifié, toutes les expressions régulières restantes sont libérées.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Toutes les expressions régulières restantes sont automatiquement libérées quand le programme se termine.


IsRegularExpression()

Syntaxe

Resultat = IsRegularExpression(#ExpressionReguliere)
Description
Teste si l'#ExpressionReguliere est correctement initialisée. Cette fonction a été conçue pour accepter n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. Si le 'Résultat' est différent de zéro, alors cet objet est valide. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.


MatchRegularExpression()

Syntaxe

Resultat = MatchRegularExpression(#ExpressionReguliere, Texte$)
Description
Teste si le 'Texte$' ou une partie du 'Texte$' correspond à l'#ExpressionReguliere. 'Resultat' sera 1 si il y a une ou plusieurs correspondances, ou 0 sinon.

Exemple:
  ; Cette expression repérera chaque mot de 3 lettres qui commencent par une minuscule,
  ; suivi du caractère 'b' et qui se termine par une majuscule. ex: abC
  ;
  If CreateRegularExpression(0, "[a-z]b[A-Z]")
    If MatchRegularExpression(0, "abC ABc zbA abc")
      Debug "Le texte correspond !"
    Else
      Debug "Aucun motif trouvé dans le texte"
    EndIf
  Else
    Debug RegularExpressionError()
  EndIf


RegularExpressionError()

Syntaxe

Resultat$ = RegularExpressionError()
Description
Renvoie sous forme textuelle (en anglais) l'erreur survenue lors du dernier appel à CreateRegularExpression().

Exemple:
  ; Un crochet '[' supplémentaire a été ajouté, donc il y a une erreur de syntaxe dans
  ; l'expression régulière
  ;
  If CreateRegularExpression(0, "[a-z]b[[A-Z][]")
    Debug "Succès"
  Else
    Debug RegularExpressionError()
  EndIf


ReplaceRegularExpression()

Syntaxe

Resultat$ = ReplaceRegularExpression(#RegularExpression, Texte$, TexteRemplace$)
Description
Remplace les parties du 'Texte$' correspondant à l'#ExpressionReguliere par 'TexteRemplace$'. La nouvelle chaîne de caractères est renvoyée dans 'Resultat$'.

Note: Les références arrières (généralement décrites comme \ 1, \ 2, etc) ne sont pas prises en charge. ExtractRegularExpression() combinée à ReplaceString() devrait obtenir le comportement demandé.

Exemple

  ; Cette expression repérera chaque mot de 3 lettres qui commencent par une minuscule,
  ; suivi du caractère 'b' et qui se termine par une majuscule. ex: abC
  ;
  If CreateRegularExpression(0, "[a-z]b[A-Z]")
    Resultat$ = ReplaceRegularExpression(0, "abC ABc zbA abc", "---")
    Debug Resultat$ ; Will print "--- ABc --- abc"
  Else
    Debug RegularExpressionError()
  EndIf


Requester

PureBasic - Requester

Généralités

Les Requesters sont ces 'boîtes de dialogue' que l'on trouve dans pratiquement toutes les applications avec interface graphique. Elles sont très pratiques pour effectuer simplement des tâches de base parfois complexes (ouvrir un fichier, choisir une couleur ou une police ...) qui ont chacune leur boîte de dialogue spécialisée.

Sommaire des commandes

ColorRequester
FontRequester
InputRequester
MessageRequester
NextSelectedFileName
OpenFileRequester
PathRequester
SaveFileRequester
SelectedFilePattern
SelectedFontColor
SelectedFontName
SelectedFontSize
SelectedFontStyle

Exemple

Requester.pb

OS Supportés

Tous

Guide de référence - Index


ColorRequester()

Syntaxe

Couleur = ColorRequester([CouleurActuelle])
Description
Ouvre une boîte de dialogue standard pour choisir une couleur. La couleur sélectionnée est renvoyée dans Couleur sous la forme d'une valeur 24-bit (3 octets) dont chaque octet contient la valeur de chacune des composantes Rouge, Vert et Bleu. Pour récupérer facilement la valeur de chacune des composantes, les commandes Red(), Green() et Blue() sont diponibles. Si l'utilisateur choisit le bouton <Annuler> de la boîte de dialogue, la valeur retournée est -1. Le paramètre optionnel 'CouleurActuelle' peut être utilisé pour indiquer la couleur par défaut lors de l'ouverture de la boîte.

Exemple

  Couleur.l = ColorRequester()
  If Couleur > -1
    a$ = "Vous avez sélectionné la couleur suivante:" + Chr(10)  ; Chr(10) est seulement nécessaire
    a$ + "Valeur 24 Bits: " + Str(Couleur)              + Chr(10)  ; pour les retours à la ligne
    a$ + "Composante rouge:    " + Str(Red(Couleur))    + Chr(10)
    a$ + "Composante verte:  " + Str(Green(Couleur))    + Chr(10)
    a$ + "Composante bleue:   " + Str(Blue(Couleur))
  Else
    a$ = "La sélection a été annulée."
  EndIf
  MessageRequester("Information",a$,0)
  End


FontRequester()

Syntaxe

Resultat = FontRequester(NomPolice$, TaillePolice, Options [, Couleur [, Style]])
Description
Ouvre une boîte de dialogue standard pour choisir une police de caractères. Si l'utilisateur annule la sélection, la valeur retournée dans Resultat est 0, sinon, la valeur est 1. 'NomPolice$' et 'TaillePolice' sont utilisés pour initialiser la police de caractères par défaut lors de l'ouverture de la boîte de dialogue. Les fonctions SelectedFontColor(), SelectedFontName(), SelectedFontSize() et SelectedFontStyle() peuvent être utilisées après un appel réussi à cette fonction pour obtenir les informations sur la police sélectionnée.

Le paramètre optionnel 'Couleur' peut être utilisé pour indiquer la couleur par défaut lors de l'ouverture de la boîte. Vous pouvez utiliser la commande RGB() pour définir une couleur.

Le paramètre optionnel 'Style' peut être utilisé pour indiquer le style par défaut lors de l'ouverture de la boîte. Reportez vous à la commande SelectedFontStyle() pour connaitre les styles disponibles.

'Options' peut prendre une des valeurs suivantes (Mettre zéro pour ne pas afficher les effets):
  #PB_FontRequester_Effects : Active les effets (y compris le sélectionneur de couleur).

Exemple

  Police$ = "Arial"   ; Police initiale (peut aussi être nulle)
  TaillePolice  = 14  ; Taille initiale (peut aussi être nulle)
  Resultat = FontRequester(Police$, TaillePolice, #PB_FontRequester_Effects)
  If Resultat
    Message$ = "Vous avez sélectionné la police suivante :"  + #LF$
    Message$ + "Nom :  " + SelectedFontName()       + #LF$
    Message$ + "Taille :  " + Str(SelectedFontSize())  + #LF$
    Message$ + "Couleur : " + Str(SelectedFontColor()) + #LF$
    If SelectedFontStyle() & #PB_Font_Bold
      Message$ + "Gras" + #LF$
    EndIf
    If SelectedFontStyle() & #PB_Font_StrikeOut
      Message$ + "Barré" + #LF$
    EndIf
    If SelectedFontStyle() & #PB_Font_Underline
      Message$ + "Souligné" + #LF$
    EndIf
  Else
    Message$ = "La sélection a été annulée."
  EndIf

  MessageRequester("FontRequester", Message$, #PB_MessageRequester_Ok)


InputRequester()

Syntaxe

Texte$ = InputRequester(Titre$, Message$, TexteParDefaut$ [, Option])
Description
Ouvre une boîte de dialogue permettant la saisie de texte.

Arguments

Titre$ | Titre de la boîte de dialogue.
Message$ | Message affiché avant le champ de saisie.
TexteParDefaut$ | Texte par défaut du champ de saisie.
Option (optionnel)
  #PB_InputRequester_Password: Définir le champ en type 'mot de passe'.
                               Le texte affiché sera caché.

Valeur de retour

Renvoie le texte du champ de saisie, ou une chaîne vide si la boîte de dialogue a été fermée sans cliquer sur le bouton "OK".

Exemple

  Saisie$ = InputRequester("InputRequester","Saisissez un texte :","Texte par défaut.")

  If Saisie$ > ""
    a$ = "Vous avez écrit le texte suivant :" + Chr(10)  ; Chr(10) nécessaire seulement
    a$ + Saisie$                                         ; pour faire un saut de ligne
  Else
    a$ = "La saisie a été annulée ou il n'y a pas de texte saisi."
  EndIf
  MessageRequester("Information",a$,0)
  End


MessageRequester()

Syntaxe

Resultat = MessageRequester(Titre$, Message$, Options)
Description
Ouvre une boîte de dialogue permettant d'afficher un message destiné à fournir des informations à l'utilisateur. L'exécution du programme est interrompue tant que l'utilisateur n'a pas refermé la boîte. Les options possibles sont les suivantes :
  #PB_MessageRequester_YesNo       : Pour afficher les boutons 'Oui' et 'Non'
  #PB_MessageRequester_YesNoCancel : Pour afficher les boutons 'Oui', 'Non' et 'Annuler'
  #PB_MessageRequester_Ok          : Pour afficher seulement le bouton 'OK'
Les valeurs de retour sont les suivantes:
  #PB_MessageRequester_Yes    : Le bouton 'Oui' a été pressé
  #PB_MessageRequester_No     : Le bouton 'Non' a été pressé
  #PB_MessageRequester_Cancel : Le bouton 'Annuler' a été pressé

Exemple

  ; MessageRequester simple (normalement utilisé uniquement pour afficher des informations)
  ; (le résultat sera toujours identique, donc nous ne le vérifions pas ici)
  MessageRequester("MessageRequester Simple","Juste un petit texte d'information.",#PB_MessageRequester_Ok)

  ; MessageRequester avec boutons Oui / Non (normalement utilisé pour les questions)
  ; (le résulat sera affiché dans la fenêtre d'information suivante)
  Resultat = MessageRequester("MessageRequester avec boutons Oui/Non ","Veuillez faire votre choix :",#PB_MessageRequester_YesNo)
  a$ = "Le résultat du MessageRequester précédent était : "
  If Resultat = 6     ; le bouton Oui a été choisi (Resultat = 6)
    a$ + "Oui"
  Else                ; le bouton Non a été choisi (Resultat = 7)
    a$ + "Non"
  EndIf
  MessageRequester("Information",a$,#PB_MessageRequester_Ok)

  ; MessageRequester avec boutons Oui / Non / Annuler (normalement utilisé pour les questions)
  ; (le résulat sera affiché dans la fenêtre d'information suivante)
  Resultat = MessageRequester("MessageRequester avec boutons Oui / Non / Annuler","Veuillez faire votre choix :",#PB_MessageRequester_YesNoCancel)
  a$ = "Le résultat du MessageRequester précédent était : "
  If Result = 6        ; le bouton Oui a été choisi (Resultat = 6)
    a$ + "Oui"
  ElseIf Result = 7    ; le bouton Non a été choisi (Resultat = 7)
    a$ + "Non"
  Else                 ; le bouton Annuler a été choisi ou la touche Echap a été appuyée (Resultat = 2)
    a$ + "Annuler"
  EndIf
  MessageRequester("Information",a$,#PB_MessageRequester_Ok)


NextSelectedFileName()

Syntaxe

NomFichier$ = NextSelectedFileName()
Description
Après un OpenFileRequester() utilisant la constante #PB_Requester_MultiSelection, cette instruction renvoie le fichier sélectionné suivant si il existe. Si la valeur NomFichier$ retournée est vide, alors il n'y a plus de fichier sélectionné dans la liste.

Exemple

  NomFichier$ = OpenFileRequester("Choisissez quelques fichiers","","",0, #PB_Requester_MultiSelection)

  While NomFichier$
    Debug NomFichier$
    NomFichier$ = NextSelectedFileName()
  Wend


OpenFileRequester()

Syntaxe

NomFichier$ = OpenFileRequester(Titre$, FichierParDefaut$, Filtre$, FiltrePosition [, Options])
Description
Ouvre une boîte de dialogue standard pour choisir un fichier. Titre$ remplace le titre de la boîte par défaut. FichierParDefaut$ permet d'initialiser la boîte avec un répertoire et un fichier choisis.

Filtre$ permet de n'afficher que les fichiers dont le nom et/ou l'extension de fin correspond au filtre. Il doit avoir la forme des exemples suivants : '*.txt' pour des fichiers texte, '*.mus;*.mod' pour des fichiers musique ayant l'extension '.mus' ou '.mod'. Chaque filtre est en fait une paire composée du label qui sera visible dans le requester et du filtre proprement dit. Le séparateur est le caractère '|' (Pipe).

Note: Les paramètres 'Filtre$' et 'FiltrePosition' n'ont aucun effet sur Mac OSX (tous les fichiers seront toujours affichés).

Exemple

  "Fichiers Textes|*.txt"            ; Un seul filtre avec comme label 'Fichiers Textes'
  "Fichiers Textes|*.txt;*.doc"      ; Un seul filtre avec *.txt et *.doc accepté
  "Musiques|*.mp3|Video|*.avi;*.asf" ; 2 filtres (Musique et video)
Enfin, 'FiltrePosition' précise quel filtre est celui par défaut, depuis 0 jusqu'au nombre total de filtres. Une fois la boîte fermée, SelectedFilePattern() permet de récupérer la position du filtre choisi.

Le 'NomFichier$' renvoyé peut être découpé facilement en chemin, nom ou extension à l'aide des commandes suivantes: GetFilePart(), GetPathPart() et GetExtensionPart().

'Options' est un paramètre facultatif et peut être une combinaison des valeurs suivantes:
  #PB_Requester_MultiSelection : Active la multi-sélection. (voir NextSelectedFileName())

Exemple

  FichierParDefaut$ = "C:\autoexec.bat"   ; Répertoire et fichier par défaut qui seront affichés
  ;  Avec la chaîne suivante nous allons définir les filtres ("|" comme séparateur) pour l'affichage de fichier :
  ;  1er  : "Texte (*.txt)" comme nom, ".txt" et ".bat" comme extension autorisée
  ;  2ème : "PureBasic (*.pb)" comme nom, ".pb" comme extension autorisée
  ;  3ème : "Tous les fichiers (*.*)" comme nom, "*.*" comme extension autorisée, valide pour tous les fichiers
  Filtre$ = "Texte (*.txt)|*.txt;*.bat|PureBasic (*.pb)|*.pb|Tous les fichiers (*.*)|*.*"
  Filtre  = 0    ; utiliser  par défaut le premier des trois filtres possibles
  Fichier$ = OpenFileRequester("Choisissez un fichier à charger", FichierParDefaut$, Filtre$, Filtre)
  If Fichier$
    MessageRequester("Information", "Vous avez choisi le fichier suivant :"+Chr(10)+Fichier$, 0)
  Else
    MessageRequester("Information", "La sélection a été annulée.", 0)
  EndIf


PathRequester()

Syntaxe

Chemin$ = PathRequester(Titre$, CheminInitial$)
Description
Ouvre une boîte de dialogue listant l'arborescence des unités de stockages attachées au système pour choisir un Chemin$. Titre$ remplace le titre de la boîte par défaut. CheminInitial$ permet d'initialiser la boîte sur le chemin spécifié. Le chemin est renvoyé dans Chemin$ avec un '\' de fin.

Exemple

  CheminInitial$ = "C:\"   ; Répertoire par défaut qui sera affiché (une chaîne vide est aussi possible)
  Chemin$ = PathRequester("Choisissez un répertoire", CheminInitial$)
  If Chemin$
    MessageRequester("Information", "Vous avez choisi le répertoire suivant :"+Chr(10)+Chemin$, 0)
  Else
    MessageRequester("Information", "La sélection a été annulée.", 0)
  EndIf


SaveFileRequester()

Syntaxe

NomFichier$ = SaveFileRequester(Titre$, FichierParDefaut$, Filtre$, FiltrePosition)
Description
Ouvre une boîte de dialogue standard pour enregistrer un fichier. Titre$ remplace le titre de la boîte par défaut. FichierParDefaut$ permet d'initialiser la boîte avec un répertoire et un fichier choisis.

Filtre$ permet de n'afficher que les fichiers dont le nom et/ou l'extension de fin correspond au filtre. Il doit avoir la forme des exemples suivants : '*.txt' pour des fichiers texte, '*.mus;*.mod' pour des fichiers musique ayant l'extension '.mus' ou '.mod'. Chaque filtre est en fait une paire composée du label qui sera visible dans le requester et du filtre proprement dit. Le séparateur est le caractère '|' (Pipe).

Note: Les paramètres 'Filtre$' et 'FiltrePosition' n'ont aucun effet sur Mac OSX (tous les fichiers seront toujours affichés).

Exemple

  "Fichiers Textes|*.txt"            ; Un seul filtre avec comme label 'Fichiers Textes'
  "Fichiers Textes|*.txt;*.doc"      ; Un seul filtre avec *.txt et *.doc accepté
  "Musiques|*.mp3|Video|*.avi;*.asf" ; 2 filtres (Musique et video)
Enfin, FiltrePosition précise quel filtre est celui par défaut, depuis 0 jusqu'au nombre total de filtres. Une fois la fenêtre fermée, SelectedFilePattern() permet de récupérer la position du filtre choisi.

Le 'NomFichier$' renvoyé peut être découpé facilement en chemin, nom ou extension à l'aide des commandes suivantes: GetFilePart(), GetPathPart() et GetExtensionPart().

Exemple

  FichierParDefaut$ = "C:\autoexec.bat"   ; Répertoire et fichier par défaut qui seront affichés
  ;  Avec la chaîne suivante nous allons définir les filtres ("|" comme séparateur) pour l'affichage de fichier :
  ;  1er  : "Texte (*.txt)" comme nom, ".txt" et ".bat" comme extension autorisée
  ;  2ème : "PureBasic (*.pb)" comme nom, ".pb" comme extension autorisée
  ;  3ème : "Tous les fichiers (*.*)" comme nom, "*.*" comme extension autorisée, valide pour tous les fichiers
  Filtre$ = "Texte (*.txt)|*.txt;*.bat|PureBasic (*.pb)|*.pb|Tous les fichiers (*.*)|*.*"
  Filtre = 0    ; utiliser  par défaut le premier des trois filtres possibles
  Fichier$ = SaveFileRequester("Choisissez un fichier à sauvegarder", FichierParDefaut$, Filtre$, Filtre)
  If Fichier$
    MessageRequester("Information", "Vous avez choisi ce fichier :"+Chr(10)+Fichier$, 0)
  Else
    MessageRequester("Information", "La sélection a été annulée.", 0)
  EndIf


SelectedFilePattern()

Syntaxe

Index = SelectedFilePattern()
Description
Renvoie l'index du filtre (*.bmp, *.gif etc...) sélectionné lors de l'utilisation de la commande OpenFileRequester() ou SaveFileRequester(). L'index du premier filtre est 0.

Exemple

  FichierParDefaut$ = "C:\autoexec.bat"    ; Répertoire et fichier par défaut
  Filtre$ = "Texte (*.txt)|*.txt;*.bat|"   ; Premier filtre   (index = 0)
  Filtre$ + "PureBasic (*.pb)|*.pb|"       ; Deuxième filtre  (index = 1)
  Filtre$ + "Bmp (*.bmp)|*.bmp|"           ; Troisième filtre (index = 2)
  Filtre$ + "Jpeg (*.jpg)|*.jpg|"          ; Quatrième filtre (index = 3)
  Filtre$ + "Tous les fichiers (*.*)|*.*"  ; Cinquième filtre (index = 4)
  Filtre = 1  ; Le deuxième filtre sera utilisé par défaut.

  ; Ouvre une boîte de dialogue pour choisir un fichier, vous pouvez changer de filtre et obtenir son index après validation
  Fichier$ = OpenFileRequester("Choisissez un fichier", FichierParDefaut$, Filtre$, Filtre)
  Index = SelectedFilePattern()
  If Index > -1
    MessageRequester("Information", "L'index du filtre sélectionné est le suivant : "+Str(Index), 0)
  Else
    MessageRequester("Information", "La sélection a été annulée.", 0)
  EndIf


SelectedFontColor()

Syntaxe

Couleur = SelectedFontColor()
Description
Renvoie la couleur sélectionnée par l'utilisateur avec la fonction FontRequester(). Couleur est une valeur 24-bit (3 octets) dont chaque octet contient la valeur de chacune des composantes Rouge, Vert et Bleu. Pour récupérer facilement la valeur de chacune des composantes, les commandes Red(), Green() et Blue() sont diponibles.

OS Supportés

Windows


SelectedFontName()

Syntaxe

NomPolice$ = SelectedFontName()
Description
Renvoie dans NomPolice$ la police sélectionnée par l'utilisateur avec la fonction FontRequester(). Ce nom peut être utilisé directement par la fonction LoadFont().


SelectedFontSize()

Syntaxe

Taille = SelectedFontSize()
Description
Renvoie la taille de la police sélectionnée par l'utilisateur avec FontRequester().


SelectedFontStyle()

Syntaxe

Style = SelectedFontStyle()
Description
Renvoie le style de la police de caractères sélectionnée par l'utilisateur avec la fonction FontRequester(). 'Style' peut contenir une ou plusieurs des valeurs suivantes:
  #PB_Font_Bold       : Le style de la police est en 'Gras'.
  #PB_Font_Italic     : Le style de la police est en 'Italique'.
  #PB_Font_StrikeOut  : Le style de la police est en 'Barré'.
  #PB_Font_Underline  : Le style de la police est en 'Souligné'.
Pour tester si une valeur est présente, il suffit d'utiliser l'opérateur '&' (And):
  If SelectedFontStyle() & #PB_Font_Bold
    ; La police est en 'Gras'
  EndIf


Scintilla

PureBasic - Scintilla

Généralités

Scintilla est un composant libre d'édition de code source. Il est livré avec son propre code source et une licence autorisant son utilisation dans tout projet libre ou commercial. La licence peut être consultée ici. Le code source, ainsi que la documentation peuvent être trouvés sur le site de Scintilla.

Extrait du site de Scintilla: En plus des fonctionnalités classiques des composants d'édition de texte basique, Scintilla inclut des fonctionnalités particulièrement utiles lors de l'édition et du débogage de code source. Cela inclut la stylisation syntaxique, des indicateurs d'erreurs, l'auto-complétion et des indications sur les appels de fonctions. La marge de sélection peut contenir des marques similaires à celles utilisées dans les débogueurs pour indiquer les points d'arrêt et la ligne courante. Les choix stylistiques sont plus ouverts que la plupart des éditeurs, et permettent l'utilisation de différentes tailles de polices, les polices grasses et italiques, plusieurs couleurs de texte et de fond, et différentes polices.

Important: La licence de Scintilla requiert qu'une indication relative au droit d'auteur soit incluse dans tout logiciel utilisant Scintilla et que le texte de la licence soit fourni dans la documentation du logiciel.

PureBasic intègre la bibliothèque Scintilla avec la bibliothèque gadget, si bien que des commandes telles que ResizeGadget() ou HideGadget() peuvent être utilisées avec un contrôle scintilla. De plus elle fournit la fonction ScintillaSendMessage() pour communiquer avec le contrôle pour l'exploiter à son plein potentiel. Toutes les structures et constantes sont définies de base dans PureBasic.

Sommaire des commandes

InitScintilla
ScintillaGadget
ScintillaSendMessage

OS Supportés

Tous

Guide de référence - Index


InitScintilla()

Syntaxe

Resultat = InitScintilla([NomBibliotheque$])
Description
Charge la dll Scintilla qui est nécessaire pour utiliser les commandes de cette bibliothèque.
Le paramètre optionnel 'NomBibliotheque$' permet d'indiquer le chemin et le nom du fichier de la dll ('scintilla.dll' par défaut). La dll scintilla est incluse dans le répertoire "Compilers" du dossier PureBasic.

Note: Cette commande n'est présente que sur Windows, car sur les autres OS, la bibliothèque Scintilla est liée statiquement avec l'exécutable et n'a donc pas besoin d'être chargée ou distribuée avec le programme.

Valeur de retour

Renvoie une valeur différente de zéro si la bibliothèque s'est chargée avec succès, ou zéro dans le cas contraire. Sous OS X et Linux, la valeur de retour est toujours #True car la bibliothèque est lié statiquement.

OS Supportés

Windows


ScintillaGadget()

Syntaxe

Resultat = ScintillaGadget(#Gadget, x, y, Largeur, Hauteur, @Callback())
Description
Crée un nouveau contrôle d'édition scintilla dans la 'GadgetList' actuelle. Si #PB_Any est utilisé à la place du paramètre '#Gadget', alors le nouveau numéro du gadget sera renvoyé dans 'Resultat'. InitScintilla() doit être appelé avec succès avant d'utiliser cette commande.

'@callback()' correspond à l'adresse de la procédure qui recevra les évènements émis par le contrôle. Elle doit être définie de la façon suivante, avec 'Gadget' qui est le numéro du contrôle et *scinotify qui pointe vers une structure comportant les informations sur l'évènement:

Les événements suivants sont pris en charge par EventType():
  #PB_EventType_RightClick

  ProcedureDLL ScintillaCallBack(Gadget, *scinotify.SCNotification)
    ;
    ; L'utilisation de ProcedureDLL est importante pour que la callback fonctionne correctement sous MacOSX,
    ; sur les autres OS c'est sans effet.
    ;
  EndProcedure
Après la création, les commandes spécifiques de Scintilla peuvent être envoyées au contrôle avec la commande ScintillaSendMessage() . En outre les commandes de gadgets communes comme ResizeGadget() ou HideGadget() peuvent aussi bien être utilisées par le contrôle.

Exemple

  Procedure MakeScintillaText(texte.s)
   Static sciTexte.s
   CompilerIf #PB_Compiler_Unicode
     sciTexte = Space(StringByteLength(texte, #PB_UTF8))
     PokeS(@sciTexte, texte, -1, #PB_UTF8)
   CompilerElse
     sciTexte = texte
   CompilerEndIf
   ProcedureReturn @sciTexte
  EndProcedure

  If OpenWindow(0, 0, 0, 360, 90, "ScintillaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

     If InitScintilla()
        ScintillaGadget(0, 10, 10, 340, 70, 0)

        ; Texte en rouge
        ScintillaSendMessage(0, #SCI_STYLESETFORE, 0, RGB(255, 0, 0))

        ; Définit le texte initial du ScintillaGadget
        ScintillaSendMessage(0, #SCI_SETTEXT, 0, MakeScintillaText("Voici un simple ScintillaGadget avec du texte..."))

        ; Ajout d'une deuxième ligne de texte précédée d'un saut de ligne
        Texte$ = Chr(10) + "Seconde ligne."
        ScintillaSendMessage(0, #SCI_APPENDTEXT, Len(Texte$), MakeScintillaText(Texte$))
     EndIf

     Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


ScintillaSendMessage()

Syntaxe

Resultat = ScintillaSendMessage(#Gadget, Message [, Param [, lParam]])
Description
Envoie un message au contrôle scintilla pour exécuter une tâche spécifique. Vous trouverez plus d'informations sur les messages possibles sur le site Scintilla. Les constantes #SCI_[...] représentant les valeurs possibles pour le 'Message' sont déjà définies dans PB. Les valeurs pour 'Param' et 'lParam' dépendent du message. Si elles sont omises, la valeur 0 sera utilisée.

Valeur de retour

Renvoie le résultat du message envoyé.


SerialPort

PureBasic - SerialPort

Généralités

Le port série (aussi connu sous le nom de port RS-232) est toujours largement utilisé dans l'industrie, et ce en dépit de son âge: il a été créé en 1969. Sa simplicité permet de réaliser facilement des prototypes contrôlés par ordinateur. Cette bibliothèque offre un accès complet aux ports séries disponibles. Il est conseillé de connaître la définition des termes relatifs aux ports séries, pour plus d'informations: Wikipedia - RS232.

Sommaire des commandes

AvailableSerialPortInput
AvailableSerialPortOutput
CloseSerialPort
GetSerialPortStatus
IsSerialPort
OpenSerialPort
ReadSerialPortData
SerialPortError
SerialPortID
SerialPortTimeouts
SetSerialPortStatus
WriteSerialPortData
WriteSerialPortString

Exemple

SerialPort.pb

OS Supportés

Tous

Guide de référence - Index


AvailableSerialPortInput()

Syntaxe

Resultat = AvailableSerialPortInput(#PortSerie)
Description
Renvoie le nombre d'octets restants dans le tampon d'entrée du #PortSerie.


AvailableSerialPortOutput()

Syntaxe

Resultat = AvailableSerialPortOutput(#PortSerie)
Description
Renvoie le nombre d'octets restants dans le tampon de sortie du #PortSerie.


CloseSerialPort()

Syntaxe

CloseSerialPort(#PortSerie)
Description
Ferme le #PortSerie spécifié précédemment ouvert avec OpenSerialPort().

Arguments

#PortSerie Le port série à utiliser.

Si #PB_All est spécifié, tous les autres ports série sont libérés.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Tous les ports séries ouverts sont fermés automatiquement quand le programme se termine.


GetSerialPortStatus()

Syntaxe

Resultat = GetSerialPortStatus(#PortSerie, Attribut)
Description
Renvoie le status du #PortSerie spécifié. 'Attribut' peut prendre une des valeurs suivantes:
  #PB_SerialPort_RI : Renvoie le status du signal RI (0 ou 1)
  #PB_SerialPort_DCD: Renvoie le status du signal DCD (0 ou 1)
  #PB_SerialPort_DSR: Renvoie le status du signal DSR (0 ou 1)
  #PB_SerialPort_CTS: Renvoie le status du signal CTS (0 ou 1)
  #PB_SerialPort_XonCharacter : Caractère 'Xon' utilisé pour le mode Xon/Xoff (entre 1 et 255)
  #PB_SerialPort_XoffCharacter: Caractère 'Xoff' utilisé pour le mode Xon/Xoff (entre 1 et 255)


IsSerialPort()

Syntaxe

Resultat = IsSerialPort(#PortSerie)
Description
Teste si le #PortSerie est correctement initialisé. Cette fonction a été conçue pour accepter n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. Si le 'Résultat' est différent de zéro, alors cet objet est valide. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.


OpenSerialPort()

Syntaxe

Resultat = OpenSerialPort(#PortSerie, NomPortSerie$, Bauds, Parite, Data, Stop.f, HandshakeMode, TailleTamponEntree, TailleTamponSortie)
Description
Ouvre un #PortSerie. Si #PB_Any est utilisé pour le paramètre '#PortSerie', le numéro du #PortSerie sera renvoyé dans 'Resultat'.

'NomPortSerie$' est l'indentifiant du port série, par exemple "COM1" sous Windows ou "/dev/ttyS0" sous Linux.
'Bauds' détermine la vitesse de la connexion série et peut prendre une des valeurs suivantes:
    50, 75, 110, 150, 300, 600, 1200, 1800, 2400
    4800, 9600, 19200, 38400, 57600 or 115200
'Parite' définit la gestion de la parité pendant la communication. Cela peut être une des valeurs suivantes:
  #PB_SerialPort_NoParity   : Aucune parité
  #PB_SerialPort_EvenParity : Pair
  #PB_SerialPort_MarkParity : Mark
  #PB_SerialPort_OddParity  : Impair
  #PB_SerialPort_SpaceParity: Espace
'Data' indique la longueur de chaque donnée en bits (en principe 7 ou 8).
'Stop' indique le nombre bits d'arrêts (1, 1.5 ou 2).
'HandshakeMode' peut prendre une des valeurs suivantes:
  #PB_SerialPort_NoHandshake     : Pas de protocole d'initialisation
  #PB_SerialPort_RtsHandshake    : Pas de protocole d'initialisation mais RTS est mis à 1
  #PB_SerialPort_RtsCtsHandshake : Protocole RTS/CTS
  #PB_SerialPort_XonXoffHandshake: Protocoal Xon/Xoff
'TailleTamponEntree' définit la taille du tampon d'entrée (en octet).
'OutputBufferSize' définit la taille du tampon de sortie (en octet).

Si le port série ne peut pas être ouvert (il peut être déjà en cours d'utilisation, ou les paramètres ne sont pas corrects), le 'Resultat' sera 0.

Exemple

  If OpenSerialPort(0, "COM1", 300, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
    Debug "Succes"
  Else
    Debug "Echec"
  EndIf


ReadSerialPortData()

Syntaxe

Resultat = ReadSerialPortData(#PortSerie, *ZoneMemoire, Taille)
Description
Lit des données à partir du #PortSerie et les écrit dans *ZoneMemoire. Le nombre d'octets réellement lus est renvoyé dans 'Resultat'. Si le tampon d'entrée était vide, cette fonction bloquera l'éxécution du programme jusqu'à l'arrivée des données. Pour vérifier que des données sont disponibles dans le port série, utiliser AvailableSerialPortInput().


SerialPortError()

Syntaxe

Resultat = SerialPortError(#PortSerie)
Description
Renvoie l'erreur qui est survenue sur le #PortSerie après ReadSerialPortData(), WriteSerialPortData() ou WriteSerialPortString().

'Resultat' peut être une combinaison des valeurs suivantes:
  #PB_SerialPort_RxOver: Un dépassement est survenu dans le tampon d'entrée (Il n'y a plus de
                          place dans le tampon d'entrée ou un caractère a été reçu apres un 'fin-de-fichier'
                          (EOF)).
  #PB_SerialPort_OverRun: Un dépassement est survenu dans le tampon des caractères. Le prochain
                          caractère est perdu.
  #PB_SerialPort_RxParity : Le système a détecté une erreur de parité.
  #PB_SerialPort_Frame    : Le système a détecté une erreur d'encapsulation des données.
  #PB_SerialPort_Break    : Le système a détecté une condition d'arrêt.
  #PB_SerialPort_TxFull   : L'application a essayé d'envoyer un caractère mais le tampon de sortie est plein.
  #PB_SerialPort_IOE      :  Une erreur d'Entrée/Sortie est survenue.
  #PB_SerialPort_WaitingCTS  : Indique que le système attend le signal CTS (clear-to-send) avant d'émettre.
  #PB_SerialPort_WaitingDSR  : Indique que le système attend le signal DSR (data-set-ready) avant d'émettre.
  #PB_SerialPort_WaitingRLSD : Indique que le système attend le signal RLSD (receive-line-signal-detect) avant d'émettre.
  #PB_SerialPort_XoffReceived: Indique que le système est en attente car le caractère XOFF a été reçu.
  #PB_SerialPort_XoffSent    : Indique que le système est en attente car le caractère XOFF a été transmis.
                               La transmission s'arrête quand le caractère XOFF est émis à un système qui attend le caractère XON.
  #PB_SerialPort_EOFSent: Indique que le caractère 'fin-de-fichier' (EOF) a été reçu.


SerialPortID()

Syntaxe

SerialPortID = SerialPortID(#PortSerie)
Description
Renvoie l'identifiant système unique du #PortSerie. Cette commande est utile quand une autre bibliothèque a besoin d'accéder au port série.


SerialPortTimeouts()

Syntaxe

SerialPortTimeouts(#PortSerie, RIT, RTTC, RTTM, WTTC, WTTM)
Description
Change les temps d'attentes par défaut du #PortSerie.

Arguments

#PortSerie | Le port série à utiliser.
RIT | 'RIT' (Read Interval Timeout): Indique le temps d'attente maximum, en millisecondes, entre l'arrivée de deux caractères sur la ligne de communication. La valeur par défaut est 100.
RTTC | 'RTTC' (Read Total Timeout Constant): Indique la constante, en millisecondes, utilisée pour calculer le temps d'attente maximum pour les opérations de lecture. Pour chaque opération de lecture, cette valeur est ajoutée au produit de 'RTTM' (Read Total Timeout Multiplier) et le nombre d'octets demandés. La valeur par défaut est 100.
RTTM | 'RTTM' (Read Total Timeout Multiplier): Détermine le multiplicateur, en millisecondes, utilisé pour calculer le temps d'attente total pour les opérations de lecture. Pour chaque opération de lecture, cette valeur est multipliée par le nombre d'octets demandés. La valeur par défaut est 10.
WTTC | 'WTTC' (WriteTotalTimeoutConstant): Indique la constante, en millisecondes, utilisée pour calculer le temps d'attente maximum pour les opérations d'écriture. Pour chaque opération d'écriture, cette valeur est ajoutée au produit de 'WTTM' (Write Total Timeout Multiplier) et le nombre d'octets devant être écrits. La valeur par défaut est 10.
WTTM | 'WTTM' (Write Total Timeout Multiplier): Détermine le multiplicateur, en millisecondes, utilisé pour calculer le temps d'attente total pour les opérations d'écriture. Pour chaque opération d'écriture, cette valeur est multipliée par le nombre d'octets devant être écrits. La valeur par défaut est 100.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

OpenSerialPort()


SetSerialPortStatus()

Syntaxe

SetSerialPortStatus(#PortSerie, Attribut, Valeur)
Description
Change le status du #PortSerie.

Arguments

#PortSerie Le port série à utiliser.
Attribut Peut être une des valeurs suivantes:
  #PB_SerialPort_DTR: Change le status du signal DTR (0 ou 1)
  #PB_SerialPort_RTS: Change le status du signal RTS (0 ou 1)
  #PB_SerialPort_TXD: Change le status du signal TXD (0 ou 1)
  #PB_SerialPort_XonCharacter : Caractère 'Xon' utilisé pour le mode Xon/Xoff (entre 1 et 255). La valeur par défaut est $11.
  #PB_SerialPort_XoffCharacter: Caractère 'Xoff' utilisé pour le mode Xon/Xoff (entre 1 et 255). La valeur par défaut est $13.
Valeur La valeur de l'attribut.
Voir la description 'attribut' pour voir quelle valeur est applicable.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Exemple

  If OpenSerialPort(0, "COM1", 300, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_XonXoffHandshake, 1024, 1024)
    SetSerialPortStatus(0, #PB_SerialPort_XonCharacter, 8)
    SetSerialPortStatus(0, #PB_SerialPort_XoffCharacter, 9)
    Debug "Succès"
  Else
    Debug "Echec"
  EndIf

Voir aussi

OpenSerialPort()


WriteSerialPortData()

Syntaxe

Resultat = WriteSerialPortData(#PortSerie, *MemoireTampon, Taille)
Description
Envoie des données sur le port #PortSerie.

Arguments

#PortSerie | Le port série à utiliser.
*MemoireTampon | Le tampon à écrire.
Taille | La taille du tampon.

Valeur de retour

Renvoie le nombre d'octets écrits sur le port série, ou zéro si l'opération a échoué.

Remarques

Pour connaître le nombre d'octets disponibles dans le tampon de sortie, utilisez AvailableSerialPortOutput().

Voir aussi

OpenSerialPort(), WriteSerialPortString()


WriteSerialPortString()

Syntaxe

Resultat = WriteSerialPortString(#PortSerie, Texte$ [, Format])
Description
Ecrit le 'Texte$' sur le #SerialPort.

Arguments

#PortSerie | Le port série à utiliser.
Texte$ | Le texte à écrire.
Format (optionnel) Le format de chaîne à utiliser. Elle peut être une des valeurs suivantes:
  #PB_Ascii : La chaîne sera écrite dans le format ASCII.
              (par défaut, même avec le mode unicode).
  #PB_UTF8  : La chaîne sera écrite dans le format UTF8.
  #PB_UTF16 : La chaîne sera écrite dans le format UTF16.

Valeur de retour

Renvoie le nombre d'octets écrits sur le port série, ou zéro si l'opération a échoué.

Remarques

Pour connaître le nombre d'octets disponibles dans le tampon de sortie, utilisez AvailableSerialPortOutput().

Voir aussi

OpenSerialPort(), WriteSerialPortData()


Sort

PureBasic - Sort

Généralités

Souvent, les données doivent être triées pour être utilisées. PureBasic propose des commandes très optimisées pour trier les tableaux et les listes chainées aussi bien en ordre ascendant que descendant.

Sommaire des commandes

RandomizeArray
RandomizeList
SortArray
SortList
SortStructuredArray
SortStructuredList

Exemple

Sort_(Numeric).pb
Sort_(String).pb

OS Supportés

Tous

Guide de référence - Index


RandomizeArray()

Syntaxe

RandomizeArray(Tableau() [, Debut, Fin])
Description
Réordonne les éléments du tableau dans un ordre aléatoire.

Arguments

Tableau() | Le tableau à mettre dans un ordre aléatoire.
Debut, Fin (optionnel) | L'index du premier et du dernier élément du tableau qui doivent être mis dans un ordre aléatoire. Si ces paramètres ne sont pas spécifiés alors la totalité du tableau sera mis dans un ordre aléatoire.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette fonction utilise le générateur de nombres pseudo-aléatoire de la fonction Random() pour déterminer le nouvel ordre des éléments du tableau. C'est donc dépendant du RandomSeed() courant.

Voir aussi

SortArray(), SortStructuredArray(), RandomizeList(), Random(), RandomSeed()


RandomizeList()

Syntaxe

RandomizeList(Liste() [, Debut, Fin])
Description
Réordonne les éléments de la liste dans un ordre aléatoire.

Arguments

Liste() | La liste à mettre dans un ordre aléatoire.
Debut, Fin (optionnel) | L'index du premier et du dernier élément de la Liste qui doivent être dans mis un ordre aléatoire. Si ces paramètres ne sont pas spécifiés alors la totalité du tableau sera mis dans un ordre aléatoire.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette fonction utilise le générateur de nombres pseudo-aléatoire de la fonction Random() pour déterminer le nouvel ordre des éléments de la liste. C'est donc dépendant du RandomSeed() courant.

Voir aussi

SortList(), SortStructuredList(), RandomizeArray(), Random(), RandomSeed()


SortArray()

Syntaxe

SortArray(Tableau(), Options [, Debut, Fin])
Description
Trie le tableau spécifié selon les options souhaitées.

Arguments

Tableau() | Le tableau à trier.
Options Peut être une combinaison des constantes suivantes:

#PB_Sort_Ascending : Trie le tableau par ordre croissant (les plus petites valeurs en tête)
#PB_Sort_Descending: Trie le tableau par ordre décroissant (les plus grandes valeurs en tête)

et la constante suivante :
#PB_Sort_NoCase : Trie un tableau de chaînes de caractères en ne tenant pas compte de la casse (a=A, b=B etc..).
Par défaut le tri est sensible à la casse.

Debut, Fin (optionnel) | Ne trie que la plage de 'Debut' à 'Fin'

Remarques

Le tableau doit être de l'un des types suivants:
byte, word, long, string ou float.
Les tableaux multi-dimensionnel ne sont pas supportés.

Note: Si un tableau n'est pas totalement plein les éléments vides seront placés en tête dans l'ordre croissant et en fin dans l'ordre décroissant.

Voir aussi

SortList(), SortStructuredArray(), SortStructuredList(), RandomizeArray(), RandomizeList(), Random(), RandomSeed()


SortList()

Syntaxe

SortList(Liste(), Options [, Debut, Fin])
Description
Trie la liste spécifiée selon les options souhaitées.

Arguments

Liste() | La liste à trier.
Options Peut être une combinaison des constantes suivantes:

#PB_Sort_Ascending : Trie la liste par ordre croissant (les plus petites valeurs en tête)
#PB_Sort_Descending: Trie la liste par ordre décroissant (les plus grandes valeurs en tête)

et la constante suivante :
#PB_Sort_NoCase : Trie la liste de chaînes de caractères en ne tenant pas compte de la casse (a=A, b=B etc..).
Par défaut le tri est sensible à la casse.

Debut, Fin (optionnel) | Ne trie que la plage de 'Debut' à 'Fin'

Remarques

La liste peut être de l'un des types suivants : byte, word, long, string ou float.

Voir aussi

SortArray(), SortStructuredArray(), SortStructuredList() , RandomizeArray(), RandomizeList(), Random(), RandomSeed()


SortStructuredArray()

Syntaxe

SortStructuredArray(Tableau(), Options, OffsetOf(Structure\Champs), Type [, Debut, Fin])
Description
Trie le tableau de structures selon les options souhaitées.

Arguments

Tableau() Le tableau de structures à trier.
Le tableau doit avoir une structure associée.
Options Peut être une combinaison des constantes suivantes:

#PB_Sort_Ascending : Trie le tableau par ordre croissant (les plus petites valeurs en tête)
#PB_Sort_Descending: Trie le tableau par ordre décroissant (les plus grandes valeurs en tête)

et la constante suivante :
#PB_Sort_NoCase : Trie le tableau de chaînes de caractères en ne tenant pas compte de la casse (a=A, b=B etc..).
Par défaut le tri est sensible à la casse.

OffsetOf(Structure\Champs) | OffsetOf() peut être utilisé pour obtenir l'offset du champ dans la structure associée au tableau.
Type Définit le type du champ de la structure qui sert pour le tri. Les types disponibles sont:
  #PB_Sort_Byte     : Le champ de la structure est un octet (.b)
  #PB_Sort_Word     : Le champ de la structure est un word (.w)
  #PB_Sort_Long     : Le champ de la structure est un long (.l)
  #PB_Sort_String   : Le champ de la structure est un string (.s or $, les fixed strings ne sont pas supportés)
  #PB_Sort_Float    : Le champ de la structure est un flottant (.f)
  #PB_Sort_Double   : Le champ de la structure est un double (.d)
  #PB_Sort_Quad     : Le champ de la structure est un quad (.q)
  #PB_Sort_Character: Le champ de la structure est un caractère (.c)
  #PB_Integer       : Le champ de la structure est un integer (.i)
  #PB_Sort_Ascii    : Le champ de la structure est un caractère ascii (.a)
  #PB_Sort_Unicode  : Le champ de la structure est un caractère unicode (.u)
Debut, Fin (optionnel) | Ne trie que la plage de 'Debut' à 'Fin'

Remarques

Notes: Si un tableau n'est pas totalement plein, les éléments vides seront placés en tête dans l'ordre croissant et en fin dans l'ordre décroissant.
Les chaînes fixes ne sont pas supportées dans les commandes de tri.

Exemple

  Structure Animal
    Nom$
    Vitesse.l
  EndStructure

  Dim Animaux.Animal(2)

  Animaux(0)\Nom$ = "Tigre"
  Animaux(0)\Vitesse = 10

  Animaux(1)\Nom$ = "Jaguar"
  Animaux(1)\Vitesse = 40

  Animaux(2)\Nom$ = "Zèbre"
  Animaux(2)\Vitesse = 30

  ; Trie le tableau en fonction du champ 'Nom$'qui est une chaîne de caractères (String)
  ;
  SortStructuredArray(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Nom$), #PB_String)

  For k=0 To 2
    Debug Animaux(k)\Nom$+" - Vitesse : "+Str(Animaux(k)\Vitesse)
  Next

  ; Trie le tableau en fonction du champ 'Vitesse' qui est un long
  ;
  SortStructuredArray(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Vitesse), #PB_Long)

  For k=0 To 2
    Debug Animaux(k)\Nom$+" - Vitesse : "+Str(Animaux(k)\Vitesse)
  Next

Voir aussi

SortArray(), SortList(), SortStructuredList() , RandomizeArray(), RandomizeList(), Random(), RandomSeed()


SortStructuredList()

Syntaxe

SortStructuredList(Liste(), Options, OffsetOf(Structure\Champs), Type [, Debut, Fin])
Description
Trie la liste de structures selon les options souhaitées.

Arguments

Liste() La liste de structures à trier.
La liste doit avoir une structure associée.
Options Peut être une combinaison des constantes suivantes:

#PB_Sort_Ascending : Trie la liste par ordre croissant (les plus petites valeurs en tête)
#PB_Sort_Descending: Trie la liste par ordre décroissant (les plus grandes valeurs en tête)

et la constante suivante :
#PB_Sort_NoCase : Trie la liste de chaînes de caractères en ne tenant pas compte de la casse (a=A, b=B etc..).
Par défaut le tri est sensible à la casse.

OffsetOf(Structure\Champs) | OffsetOf() peut être utilisé pour obtenir l'offset du champ dans la structure associée à la liste.
Type Définit le type du champ de la structure qui sert pour le tri. Les types disponibles sont:
  #PB_Sort_Byte     : Le champ de la structure est un octet (.b)
  #PB_Sort_Word     : Le champ de la structure est un word (.w)
  #PB_Sort_Long     : Le champ de la structure est un long (.l)
  #PB_Sort_String   : Le champ de la structure est un string (.s or $, les 'fixed strings' ne sont pas supportés)
  #PB_Sort_Float    : Le champ de la structure est un flottant (.f)
  #PB_Sort_Double   : Le champ de la structure est un double (.d)
  #PB_Sort_Quad     : Le champ de la structure est un quad (.q)
  #PB_Sort_Character: Le champ de la structure est un caractère (.c)
  #PB_Integer       : Le champ de la structure est un integer (.i)
  #PB_Sort_Ascii    : Le champ de la structure est un caractère ascii (.a)
  #PB_Sort_Unicode  : Le champ de la structure est un caractère unicode (.u)
Debut, Fin (optionnel) | Ne trie que la plage de 'Debut' à 'Fin'

Remarques

Notes: Les chaînes fixes ne sont pas supportées dans les commandes de tri.

Exemple

  Structure Animal
    Nom$
    Vitesse.l
  EndStructure

  NewList Animaux.Animal()

  AddElement(Animaux())
  Animaux()\Nom$ = "Tigre"
  Animaux()\Vitesse = 10

  AddElement(Animaux())
  Animaux()\Nom$ = "Jaguar"
  Animaux()\Vitesse = 40

  AddElement(Animaux())
  Animaux()\Nom$ = "Zèbre"
  Animaux()\Vitesse = 30

  ; Trie la liste en fonction du champ 'Nom$'qui est une chaîne de caractères (String)
  ;
  SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Nom$), #PB_String)

  ForEach Animaux()
    Debug Animaux()\Nom$+" - Vitesse : "+Str(Animaux()\Vitesse)
  Next

  ; Trie la liste en fonction du champ 'Vitesse' qui est un long
  ;
  SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Vitesse), #PB_Long)

  ForEach Animaux()
    Debug Animaux()\Nom$+" - Vitesse : "+Str(Animaux()\Vitesse)
  Next

Voir aussi

SortArray(), SortList(), SortStructuredArray(), RandomizeArray(), RandomizeList(), Random(), RandomSeed()


Sound

PureBasic - Sound

Généralités

La bibliothèque sonore du PureBasic permet d'ajouter simplement du son à une application ou à un jeu. Les commandes disponibles sont spécialement optimisées pour tirer le maximum du hardware disponible. Sous Windows 9x/2000/XP, DirectX 7 ou supérieur est nécessaire. Il est néanmoins possible d'utiliser DirectX 3 si l'on utilise le mode de compatibilité Windows NT4.0.

Sommaire des commandes

CatchSound
FreeSound
GetSoundFrequency
GetSoundPosition
InitSound
IsSound
LoadSound
PauseSound
PlaySound
ResumeSound
SetSoundFrequency
SetSoundPosition
SoundLength
SoundPan
SoundStatus
SoundVolume
StopSound

Exemple

Sound.pb

OS Supportés

Tous

Guide de référence - Index


CatchSound()

Syntaxe

Resultat = CatchSound(#Son, AdresseMemoire [, Longueur [, Options]])
Description
Charge le son WAV (au format PCM, le format ADPCM n'est pas supporté) ou n'importe quel son supporté par la bibliothèque SoundPlugin contenu à l'adresse mémoire spécifiée. Si #PB_Any est utilisé pour le paramètre '#Son', le numéro du nouveau son sera renvoyé dans 'Resultat'. Si Resultat = 0, le chargement a échoué, sinon, le fichier a été correctement chargé et il peut être joué avec la fonction PlaySound(). Avec les fichiers WAV, le paramètre 'Longueur' n'a pas besoin d'être spécifié. Les commandes suivantes permettent d'ajouter le support d'autres formats en plus des sons WAV:

UseFLACSoundDecoder(): Le paramètre 'Longueur' est obligatoire
UseOGGSoundDecoder(): Le paramètre 'Longueur' est obligatoire

'Options' est facultatif est peut être une combinaison des valeurs suivantes:
  #PB_Sound_Streaming: Active le support du streaming pour jouer le son (seulement pour les formats FLAC et OGG))

Exemple

  CatchSound(0, ?Music)
  End

  DataSection
    Music: IncludeBinary "Sound.wav"
Note: Le "?" est un pointeur sur une étiquette (label). Plus d'informations sur les pointeurs et les accès mémoire peuvent être trouvées dans le chapitre ici.


FreeSound()

Syntaxe

FreeSound(#Son)
Description
Arrête et supprime de la mémoire le fichier #Son précédemment chargé avec la fonction LoadSound() ou CatchSound(). Lorsqu'un son est supprimé, il ne peut plus être joué.

Note: tous les sons restants sont automatiquement libérés quand le programme se termine.


GetSoundFrequency()

Syntaxe

GetSoundFrequency(#Son, [, Canal])
Description
Renvoie la fréquence d'un son.

Arguments

#Son Le son à utiliser.
Canal (optionnel) Le canal à utiliser.

C'est la valeur retournée par PlaySound() avec l'option #PB_Sound_MultiChannel.

Valeur de retour

Renvoie la fréquence courante (en Hz) du son.

Voir aussi

SetSoundFrequency()


GetSoundPosition()

Syntaxe

Resultat = GetSoundPosition(#Son [, Mode [, Canal]])
Description
Renvoie la position courante d'un son.

Arguments

#Son Le son à utiliser.
Mode (optionnel) Peut être une des valeurs suivantes:
  #PB_Sound_Frame      : La position est renvoyée en 'frame' (par défaut).
  #PB_Sound_Millisecond: La position est renvoyée en millisecondes.
Canal (optionnel) Le canal à utiliser.

C'est la valeur retournée par PlaySound() avec l'option #PB_Sound_MultiChannel.

Valeur de retour

Renvoie la position courante du son ou -1 si une erreur s'est produite.

Remarques

Les sons chargés avec l'option #PB_Sound_Streaming ne sont pas pris en charge.


InitSound()

Syntaxe

Resultat = InitSound()
Description
Initialise l'environnement sonore. Si Resultat = 0, aucun son ne peut être joué sur cet ordinateur (carte son occupée, pas de carte son, etc...). Cette fonction doit toujours être appelée avant toute autre fonction de la bibliothèque Sound. Si l'initialisation échoue, il n'est pas nécessaire de désactiver manuellement les fonctions à l'aide d'un test (If ... EndIf), elles seront inactives. Le débogueur quand à lui, suppose que le son est disponible pour le développement et génerera une erreur si InitSound() a echoué et qu'une commande son est utilisée.

Les principales causes d'échec sous Windows sont: DirectX 7 non trouvé ou carte son non détectée. Si le programme doit tourner sous NT4.0, assurez-vous que vous avez coché 'Exécutable compatible NT4.0' dans les options de compilation. Dans ce cas, DirectX 3 est utilisé.


IsSound()

Syntaxe

Resultat = IsSound(#Son)
Description
Teste si le #Son est correctement initialisé. Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. Si le 'Résultat' est différent de zéro, alors cet objet est valide. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.


LoadSound()

Syntaxe

Resultat = LoadSound(#Son, NomFichier$ [, Options])
Description
Charge le son WAV (au format PCM, le format ADPCM n'est pas supporté) ou n'importe quel son supporté par la bibliothèque SoundPlugin en mémoire. Si #PB_Any est utilisé pour le paramètre '#Son', le numéro du nouveau son sera renvoyé dans 'Resultat'. Si Resultat = 0, le chargement a échoué, sinon, le fichier a été correctement chargé et il peut être joué avec la fonction PlaySound(). Les commandes suivantes permettent d'ajouter automatiquement plus de format de sons:

UseFLACSoundDecoder()
UseOGGSoundDecoder()

'Options' est facultatif est peut être une combinaison des valeurs suivantes:
  #PB_Sound_Streaming: Active le support du streaming pour jouer le son (seulement pour les formats FLAC et OGG))


PauseSound()

Syntaxe

PauseSound(#Son [, Canal])
Description
Met un son en pause.

Arguments

#Son Le son à utiliser.

Si #PB_All est spécifié, tous les sons (et tous les canaux) sont mis en pause.
Canal (optionnel) Le canal à utiliser.

C'est la valeur retournée par PlaySound() avec l'option #PB_Sound_MultiChannel.

Si #PB_All est spécifié, tous les canaux sont mis en pause.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Les sons chargés avec l'option #PB_Sound_Streaming ne sont pas pris en charge.

Voir aussi

LoadSound(), ResumeSound()


PlaySound()

Syntaxe

Resultat = PlaySound(#Son [, Mode [, Volume]])
Description
Joue le #Son spécifié. 'Mode' est facultatif et peut être la combinaison des valeurs suivantes:
  #PB_Sound_Loop        : joue le son en boucle (infini)
  #PB_Sound_MultiChannel: joue le son en utilisant un nouveau canal au lieu
        de stopper le son précédent. Ceci permet d'utiliser le même son et de le jouer
        plusieurs fois sur differents canaux. 'Resultat' sera le nouveau canal alloué, et pourra être
        spécifié avec SoundVolume(), etc...
'Volume' est optionnel et permet de régler le volume initial du #Son. Les valeurs valides vont de 0 (aucun volume) à 100 (volume maximum). La valeur par défaut est 100.

Voir aussi

StopSound(), FreeSound(), PauseSound(), ResumeSound()


ResumeSound()

Syntaxe

ResumeSound(#Son [, Canal])
Description
Reprend la lecture d'un son.

Arguments

#Son Le son à utiliser.

Si #PB_All est spécifié, tous les sons (et tous les canaux) reprennent la lecture.
Canal (optionnel) Le canal à utiliser.

C'est la valeur retournée par PlaySound() avec l'option #PB_Sound_MultiChannel.

Si #PB_All est spécifié, tous les canaux reprennent la lecture.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Les sons chargés avec l'option #PB_Sound_Streaming ne sont pas pris en charge.

Voir aussi

LoadSound(), PauseSound()


SetSoundFrequency()

Syntaxe

SetSoundFrequency(#Son, Frequence [, Canal])
Description
Régle la nouvelle fréquence, en temps réel, pour un son.

Arguments

#Son Le son à utiliser.
Frequence La nouvelle fréquence.

Les valeurs valides sont comprises entre 1 000 Hz à 100 000 Hz.
Canal (optionnel) Le canal à utiliser.

C'est la valeur retournée par PlaySound() avec l'option #PB_Sound_MultiChannel.

Si #PB_All est spécifié, tous les canaux sont affectés.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

La nouvelle valeur de la fréquence est enregistrée pour le son, il n'est donc pas nécessaire de l'appeler à chaque fois.

Voir aussi

GetSoundFrequency()


SetSoundPosition()

Syntaxe

SetSoundPosition(#Son, Position, [, Mode [, Canal]])
Description
Régle la position courante d'un son .

Arguments

#Sond | Le son à utiliser.
Position | La nouvelle position.
Mode (optionnel) Peut être une des valeurs suivantes:
  #PB_Sound_Frame      : La position est spécifiée en 'frame' (default).
  #PB_Sound_Millisecond: La position est spécifiée en millisecondes.
Canal (optionnel) Le canal à utiliser.
C'est la valeur retournée par PlaySound() avec l'option #PB_Sound_MultiChannel.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Les sons chargés avec l'option #PB_Sound_Streaming ne sont pas pris en charge.


SoundLength()

Syntaxe

SoundLength(#Son [, Mode])
Description
Renvoie la longueur du son.

Arguments

#Son Le son à utiliser.
Mode (optionnel) Peut être une des valeurs suivantes:
  #PB_Sound_Frame      : La longueur est renvoyée en 'frame' (par défaut).
  #PB_Sound_Millisecond: La longueur est renvoyée en millisecondes.

Valeur de retour

Renvoie la longueur du son, ou -1 si une erreur s'est produite.

Remarques

Les sons chargés avec l'option #PB_Sound_Streaming ne sont pas pris en charge.


SoundPan()

Syntaxe

SoundPan(#Son, Stereo [, Canal])
Description
Change la stéréo du #Son en temps réel. La nouvelle valeur stéréo devient la valeur par défaut pour ce #Son. Les valeurs disponibles vont de -100 (tout le son à gauche) à 100 (tout le son à droite). Si la stéréo est 0, alors le son est joué sur les deux haut-parleurs.

'Canal' est facultatif et spécifie sur quel canal la balance doit être modifiée. Un 'Canal' indépendant est créé quand PlaySound() est utilisé en conjonction avec #PB_Sound_MultiChannel.

OS Supportés

Windows, MacOS X


SoundStatus()

Syntaxe

Resultat = SoundStatus(#Son [, Canal])
Description
Renvoie l'état d'un son.

Arguments

#Son Le son à utiliser.
Canal (optionnel) Le canal à utiliser.

C'est la valeur retournée par PlaySound() avec l'option #PB_Sound_MultiChannel.

Valeur de retour

Peut être une des valeurs suivantes:
  #PB_Sound_Stopped: Le son est arrêté.
  #PB_Sound_Playing: Le son est joué.
  #PB_Sound_Paused : Le son est en pause.
  #PB_Sound_Unknown: Le son est dans un état inconnu
                     (une erreur s'est produite lors
                     de l'obtention de l'état).


SoundVolume()

Syntaxe

SoundVolume(#Son, Volume [, Canal])
Description
Change le volume d'un son en temps réel.

Arguments

#Son Le son à utiliser.

Si #PB_All est spécifié, tous les sons (et tous les canaux) reprennent la lecture.
Volume Le nouveau volume.

Les valeurs valides sont comprises entre 0 (pas de volume) à 100 (volume maximal).
Channel (optionnel) Le canal à utiliser.

C'est la valeur retournée par PlaySound() avec l'option #PB_Sound_MultiChannel.

Si #PB_All est spécifié, tous les canaux sont affectés.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

LoadSound()


StopSound()

Syntaxe

StopSound(#Son, [, Canal])
Description
Arrête l'exécution du #Son (s'il etait en cours de lecture).

'Canal' est facultatif et spécifie sur quel canal le son doit être arrété. Un 'Canal' indépendant est créé quand PlaySound() est utilisé en conjonction avec #PB_Sound_MultiChannel.


Sound3D

PureBasic - Sound3D

Généralités

Cette bibliothèque permet d'ajouter des sons avec un effet 3D dans un monde en 3D.

Un exemple simple est un son qui sera automatiquement atténué en fonction de la distance.

La syntaxe est similaire à la bibliothèque Sound.

La commande InitEngine3D() doit être appelée avec succès avant de pouvoir utiliser les commandes relatives aux sons 3D.

Sommaire des commandes

FreeSound3D
IsSound3D
LoadSound3D
PlaySound3D
SoundCone3D
SoundID3D
SoundListenerLocate
SoundRange3D
SoundVolume3D
StopSound3D

Exemple

Sound3D.pb

OS Supportés

Tous

Guide de référence - Index


FreeSound3D()

Syntaxe

FreeSound3D(#Son3D)
Description
Arrête et supprime de la mémoire un son 3D.

Arguments

#Son3D Le son 3D à supprimer.

Si #PB_All est spécifié, tous les sons 3D restants sont libérés.

Remarques

Tous les sons restants sont automatiquement libérés quand le programme se termine.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

LoadSound3D()


IsSound3D()

Syntaxe

Resultat = IsSound3D(#Son3D)
Description
Teste si un son 3D est correctement initialisé.

Arguments

#Son3D Le son 3D à utiliser.

Valeur de retour

Si le 'Résultat' est différent de zéro alors cet objet est valide.

Remarques

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.

C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

LoadSound3D()


LoadSound3D()

Syntaxe

Resultat = LoadSound3D(#Son3D, NomFichier$ [, Option])
Description
Charge en mémoire un fichier son.

Arguments

#Son3D Le numéro de son 3D attribué.

Si #PB_Any est utilisé pour le paramètre '#Son3D', le numéro du nouveau son sera renvoyé dans 'Resultat'.
NomFichier$ Le nom du fichier sonore, de type WAV ou OGG.
Option (optionnel)
  #PB_Sound_Streaming: Active le support du streaming pour jouer le son.

Remarques

Le son doit être mono, car il n'est pas possible de positionner dans l'espace un son stéréo.

Un son n'a pas de position.
Il peut être attaché à un noeud pour avoir sa propre position.

Valeur de retour

Renvoie zéro si le chargement du fichier a échoué, sinon le fichier a été correctement chargé et il peut être joué avec la fonction PlaySound3D().

Voir aussi

FreeSound3D(), IsSound3D()


PlaySound3D()

Syntaxe

Resultat = PlaySound3D(#Son3D [, Mode])
Description
Joue le un son 3D.

Arguments

#Son3D Le son 3D à utiliser.
Mode (optionnel)
  #PB_Sound3D_Loop : Joue le son en boucle (infini).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

StopSound3D(), LoadSound3D()


SoundCone3D()

Syntaxe

SoundCone3D(#Son3D, ConeInterieur.f, ConeExterieur.f, VolumeConeExterieur)
Description
Change l'angle du cône sonore pour créer un son 3D directionnel.

Arguments

#Son3D Le son 3D à utiliser.
ConeInterieur, ConeExterieur Angles intérieur et extérieur du cône.

Valeurs allant de 0 à 360°.
VolumeConeExterieur Correspond au volume du son en dehors du cône.

Valeur entre 0 et 100.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

SoundRange3D()


SoundID3D()

Syntaxe

Son3DID = SoundID3D(#Son3D)
Description
Renvoie l'identifiant unique d'un son 3D.

Arguments

#Son3D Le son 3D à utiliser.

Remarques

Cette fonction est très utile quand une fonction d'une autre bibliothèque nécessite l'identifiant du son.

Valeur de retour

Renvoie le numéro du son 3D.

Voir aussi

IsSound3D()


SoundListenerLocate()

Syntaxe

SoundListenerLocate(x, y, z)
Description
Change l'emplacement de l'auditeur (l'oreille) dans le monde.

Arguments

x, y, z Nouvelle position de l'auditeur.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

SoundCone3D(), SoundVolume3D()


SoundRange3D()

Syntaxe

SoundRange3D(#Son3D, Minimum, Maximum)
Description
Modifie le champ d'émission d'un son 3D, en unité du monde 3D.

Arguments

#Son3D Le son 3D à utiliser.
Minimum, Maximum Le paramètre 'Minimum' indique la distance la plus proche à partir de laquelle le son sera entendu par l'auditeur.

Le paramètre 'Maximum' indique la distance limite jusqu'à laquelle le son sera entendu.

Au delà de cette distance le son ne sera plus joué.

Entre ces deux valeurs, le son est atténué en fonction de la position de l'auditeur.

Remarques

La première caméra donne la position de l'auditeur.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

SoundCone3D(), SoundVolume3D()


SoundVolume3D()

Syntaxe

SoundVolume3D(#Son3D, Volume)
Description
Change le volume d'un son 3D en temps réel.

Arguments

#Son3D Le son 3D à utiliser.
Volume Le nouveau volume devient la valeur par défaut pour ce #Son3D.

Les valeurs valides vont de 0 (muet) à 100 (volume maximum).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

SoundCone3D(), SoundRange3D()


StopSound3D()

Syntaxe

StopSound3D(#Son3D)
Description
Arrête l'éxécution d'un son 3D (s'il était en cours de lecture).

Arguments

#Son3D Le son 3D à utiliser.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Si la valeur de #Son3D est -1 alors tous les sons en cours de lecture sont arrêtés.

Voir aussi

PlaySound3D(), LoadSound3D()


SoundPlugin

PureBasic - SoundPlugin

Généralités

PureBasic supporte différents formats de fichiers sons grâce à un système de plugins dynamiques.

Seul l'encodeur ou le décodeur nécessaire sera intégré au fichier exécutable, réduisant ainsi considérablement sa taille.
Par exemple, si vous avez seulement besoin du format OGG, seule la routine concernant ce format sera utilisée.

Une autre caractéristique intéressante est l'auto-détection du format de fichier, si plusieurs décodeurs sont utilisés.

Les commandes suivantes supportent les plugins sonores: LoadSound() et CatchSound().

Sommaire des commandes

UseFLACSoundDecoder
UseOGGSoundDecoder

Exemple

SoundPlugin.pb

OS Supportés

Tous

Guide de référence - Index


UseFLACSoundDecoder()

Syntaxe

UseFLACSoundDecoder()
Description
Active le support du format FLAC (Free Lossless Audio Codec) pour les commandes CatchSound() et LoadSound().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Comme le format FLAC est dit 'non-destructif', la taille du fichier restera assez conséquente, surtout comparée au format OGG. Il permet tout de même de réduire considérablement la taille des fichiers tout en gardant l'intégralité des informations du fichier.

Pour plus d'informations: Wikipedia - FLAC.

Le streaming du son est supporté pour ce plugin.

Voir aussi

UseOGGSoundDecoder()


UseOGGSoundDecoder()

Syntaxe

UseOGGSoundDecoder()
Description
Active le support du format OGG (OGG Vorbis) pour les commandes CatchSound() et LoadSound().

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le format de compression OGG est dit 'destructif', ce qui veut dire que de l'information (non essentielle) est perdue lors du processus de compression, permettant par la même occasion de diminuer considérablement la taille du fichier. C'est actuellement l'un des meilleurs formats de compression de sa catégorie, surpassant de loin le format MP3 classique que ce soit au niveau de la qualité ou de la taille.

Pour plus d'informations: Wikipedia - OGG.

Le streaming du son est supporté pour ce plugin.

Voir aussi

UseFLACSoundDecoder()


SpecialEffect

PureBasic - SpecialEffect

Généralités

La bibliothèque d'effets spéciaux permet d'appliquer facilement plusieurs effets en temps réel dans le monde 3D, comme le post-traitement, les effets de traînée que l'on appelle aussi 'rubans', les lensflares (torches), etc.

Sommaire des commandes

AttachRibbonEffect
CompositorEffectParameter
CreateCompositorEffect
CreateLensFlareEffect
CreateRibbonEffect
DetachRibbonEffect
FreeEffect
HideEffect
IsEffect
LensFlareEffectColor
RibbonEffectColor
RibbonEffectWidth

Exemple

Ribbon.pb

OS Supportés

Tous

Guide de référence - Index


AttachRibbonEffect()

Syntaxe

AttachRibbonEffect(#Effet, NoeudID)
Description
Attache un ruban au noeud donné.

Arguments

#Effet L'effet à utiliser.

Cet effet doit être créée avec CreateRibbonEffect().
NoeudID Le noeud attaché au ruban.

Un seul ruban peut être fixé à plusieurs noeuds.

Pour obtenir un ID de noeud valide, utilisez NodeID()

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateRibbonEffect(), DetachRibbonEffect()


CompositorEffectParameter()

Syntaxe

CompositorEffectParameter(#Effet, TechniqueID, PassID, NomEffet$, DataType, *Data)
Description
Régle en temps réel les paramètres d'un effet.

Arguments

#Effet L'effet à utiliser.

L'effet doit être un effet compositeur créé par CreateCompositorEffect().
TechniqueID | Le TechniqueID de l'effet.
PassID | Le PassID de l'effet.
NomEffet$ | Le nom de l'effet.
DataType | Le type de données du paramètre.
Data Les données du paramètre.

Cela dépend du type de données spécifié.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateCompositorEffect()


CreateCompositorEffect()

Syntaxe

Resultat = CreateCompositorEffect(#Effet, CameraID, NomEffet$)
Description
Créer un nouvel effet compositeur (compositor).

Arguments

#Effet Spécifie le numéro d'identification du nouvel effet.

PB_Any # peut être utilisé pour générer automatiquement ce numéro.
CameraID La caméra qui applique l'effet.

Cet effet n'affecte que cette caméra.

Pour obtenir un numéro 'CameraID' valide, utilisez CameraID().
NomEffet$ Nom de l'effet comme décrit dans le fichier compositeur OGRE (généralement un fichier '.compositor').

Valeur de retour

Renvoie une valeur non nulle si l'effet a été créé avec succès et zéro s'il y avait une erreur.

Si #PB_Any a été utilisé comme paramètre #Effet alors le nouveau numéro généré est retourné en cas de succès.

Remarques

Une fois créé, l'effet est immédiatement appliqué au rendu.

Il est possible de masquer l'effet avec HideEffect().

Voir aussi

FreeEffect(), HideEffect()


CreateLensFlareEffect()

Syntaxe

CreateLensFlareEffect(#Effet, CameraID, NoeudID, TailleBurst, TailleHalo, HaloMatiereID, CercleMatiereID, BurstMatiereID)
Description
Crée un nouvel effet de lensflare (flamme ou flamboiement) pour la caméra donnée.

Arguments

#Effet Spécifie le numéro d'identification du nouvel effet.

PB_Any # peut être utilisé pour générer automatiquement ce numéro.
CameraID La caméra qui utilise le lensflare.

Cela n'affectera que cette caméra.

Pour obtenir un 'CameraID' valide, utilisez CameraID().
NoeudID Le nœud parent qui gére le lensflare.

Pour obtenir un 'NoeudID' valide , utilisez NodeID().
TailleBurst | Taille du Burst du lensflare, dans l'unité du monde.
TailleHalo | La taille du halo, dans l'unité du monde.
HaloMatiereID Le matériau du halo.

Pour obtenir un ID de matériau valide, utilisez MaterialID().
CercleMatiereID Le matériau du cercle.

Pour obtenir un ID de matériau valide, utilisez MaterialID().
BurstMatiereID Le matériau de salve.

Pour obtenir un ID de matériau valide, utilisez MaterialID().

Valeur de retour

Renvoie une valeur non nulle si l'effet a été créé avec succès et zéro s'il y avait une erreur.

Si #PB_Any a été utilisé comme paramètre #Effet alors le nouveau numéro généré est retourné en cas de succès.

Remarques

Un lensflare est toujours attaché à un noeud, et sera affiché automatiquement en fonction de la position du nœud relativement à la vue de la caméra.

Voir aussi

FreeEffect(), LensFlareEffectColor()


CreateRibbonEffect()

Syntaxe

Resultat = CreateRibbonEffect(#Effet, MatiereID, NbChaines, NbElements, Longueur)
Description
Crée un nouvel effet de traînée (ruban).

Arguments

#Effet Spécifie le numéro d'identification du nouvel effet.

PB_Any # peut être utilisé pour générer automatiquement ce numéro.
MatiereID Le matériau à appliquer sur le ruban.

Pour obtenir un 'MatiereID' valide, utilisez MaterialID().
NbChaines Nombre de chaînes composant le ruban.

Plus il y a de chaînes et plus le ruban sera précis.
NbElements Nombre d'éléments par chaînes.

Plus il y a d'éléments et plus le ruban sera précis.
Longueur Longueur maximale, en unités du monde, du ruban.

Une fois la longueur atteinte, le ruban disparaît complètement.

Valeur de retour

Renvoie une valeur non nulle si l'effet a été créé avec succès et zéro s'il y avait une erreur.

Si #PB_Any a été utilisé comme paramètre #Effet alors le nouveau numéro généré est retourné en cas de succès.

Remarques

Une fois créé, l'effet est immédiatement appliquée au rendu.

Il est possible de masquer l'effet avec HideEffect().

Voir aussi

FreeEffect(), HideEffect()


DetachRibbonEffect()

Syntaxe

DetachRibbonEffect(#Effet, NoeudID)
Description
Détache le ruban du noeud donné.

Arguments

#Effet L'effet à utiliser.

Cet effet a été créé avec CreateRibbonEffect().
NoeudID Le nœud à détacher du ruban.

Si le ruban n'a pas été attaché au nœud, la fonction n'a aucun effet.

Pour obtenir un ID de noeud valide, utilisez NodeID().

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateRibbonEffect(), AttachRibbonEffect()


FreeEffect()

Syntaxe

FreeEffect(#Effet)
Description
Supprime un effet.

Arguments

#Effet L'effet à supprimer.

Si #PB_All est spécifié, tous les effets restants sont libérés.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Une fois l'effet libéré, il ne peut plus être utilisé.

Tous les effets restants sont automatiquement libérés lorsque le programme se termine.

Voir aussi

CreateRibbonEffect(), CreateCompositorEffect()


HideEffect()

Syntaxe

HideEffect(#Effet, Etat)
Description
Masque ou affiche un effet.

Arguments

#Effet L'effet à utiliser.
Etat
  Etat = 1: L'effet sera caché.
  État = 0: L'effet sera affiché.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateRibbonEffect(), CreateCompositorEffect()


IsEffect()

Syntaxe

Resultat = IsEffect(#Effet)
Description
Teste si un effet est un effet valide et correctement initialisé.

Arguments

#Effet L'effet à utiliser.

Valeur de retour

Renvoie une valeur non nulle si l'effet est un effet valide et zéro sinon.

Remarques

Cette fonction peut être utilisée avec n'importe quelle valeur.

C'est une bonne façon de s'assurer qu'un effet est prêt à l'emploi.

Voir aussi

CreateRibbonEffect(), CreateCompositorEffect()


LensFlareEffectColor()

Syntaxe

LensFlareEffectColor(#Effet, TypeCouleur, Couleur)
Description
Change la couleur d'un effet lensflare.

Arguments

#Effet L'effet à utiliser.

Cet effet a été créé avec CreateLensFlareEffect().
TypeCouleur
  #PB_LensFlare_HaloColor  : Change la couleur du halo.
  #PB_LensFlare_CircleColor: Change la couleur du cercle.
  #PB_LensFlare_BurstColor : Change la couleur du burst.
Couleur La nouvelle couleur du lensflare.

Une couleur valide peut être obtenue par RGB().

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateLensFlareEffect()


RibbonEffectColor()

Syntaxe

RibbonEffectColor(#Effet, Couleur, CouleurFondu)
Description
Définit les couleurs du ruban.

Arguments

#Effet L'effet à utiliser.

Il doit y avoir un tracé de ruban crée avec CreateRibbonEffect().
Couleur La couleur du ruban.

Cette couleur peut être au format RGB ou RGBA.
CouleurFondu La couleur de fondu du ruban est la couleur finale lorsque le ruban s'estompe.

Cette couleur peut être au format RGB ou RGBA.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateRibbonEffect()


RibbonEffectWidth()

Syntaxe

RibbonEffectWidth(#Effet, IndexChaine, Largeur, LargeurFondu))
Description
Modifie la largeur de la chaîne d'un ruban.

Arguments

#Effet L'effet à utiliser.

Cet effet doit être créé avec CreateRibbonEffect().
IndexChaine L'indice de la chaîne.

Le premier indice commence à zéro.

Ce numéro d'index doit être inférieur au nombre de chaînes créées par CreateRibbonEffect().
Largeur La nouvelle largeur de la chaîne, dans l'unité du monde.
LargeurFondu La largeur du fondu par seconde.

Chaque seconde, la largeur de la chaîne du ruban sera diminuée de cette valeur jusqu'à zéro.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateRibbonEffect()


Spline

PureBasic - Spline

Généralités

Un ou une spline est une courbe qui contient un certain nombre de points qui sont interpolés de façon à donner une courbe très lisse.

Le temps qu'il faut pour aller d'un point à un autre est toujours le même, indépendamment de la distance.

Une spline n'existe pas physiquement dans le monde 3D, c'est un objet virtuel qui peut être utilisé à des fins diverses, comme la création d'un chemin de poursuite (path-finding), le lissage du mouvement d'un noeud (n'oubliez pas de consulter la bibliothèque NodeAnimation pour cela.) et plus encore.

InitEngine3D() doit être appelé avec succès avant d'utiliser les fonctions splines.

Sommaire des commandes

AddSplinePoint
ClearSpline
ComputeSpline
CountSplinePoints
CreateSpline
FreeSpline
SplinePointX
SplinePointY
SplinePointZ
SplineX
SplineY
SplineZ
UpdateSplinePoint

Exemple

Spline.pb

OS Supportés

Tous

Guide de référence - Index


AddSplinePoint()

Syntaxe

AddSplinePoint(#Spline, x, y, z)
Description
Ajoute un nouveau point à une spline.

Arguments

#Spline | La spline à utiliser.
x, y, z | La position du nouveau point dans le monde.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le temps qu'il faut pour aller d'un point à un autre est toujours le même, indépendamment de la distance.

Voir aussi

CreateSpline(), ComputeSpline()


ClearSpline()

Syntaxe

ClearSpline(#Spline)
Description
Efface une spline.

Arguments

#Spline La spline à effacer.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Tous les points seront retirés de la spline.

Voir aussi

CreateSpline(), AddSplinePoint()


ComputeSpline()

Syntaxe

ComputeSpline(#Spline, Deplacement)
Description
Calcule la position du point de déplacement (offset) spécifié.

Arguments

#Spline La spline à utiliser.
Deplacement Le déplacement (décalage) dans la spline.

La valeur de décalage varie de 0.0 (début de la spline) à 1.0 (fin de la spline).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Une fois que le point a été calculé, sa position est disponible avec SplineX(), SplineY() et SplineZ().

Voir aussi

CreateSpline(), SplineX(), SplineY() et SplineZ()


CountSplinePoints()

Syntaxe

CountSplinePoints(#Spline)
Description
Renvoie le nombre de points de la spline.

Arguments

#Spline La spline à utiliser.

Valeur de retour

Renvoie le nombre de points de la spline.

Voir aussi

CreateSpline(), AddSplinePoint()


CreateSpline()

Syntaxe

Resultat = CreateSpline(#Spline)
Description
Crée une nouvelle courbe spline.

Arguments

#Spline Le numéro d'identification de la nouvelle spline.

PB_Any # peut être utilisé pour générer automatiquement ce numéro.

Valeur de retour

Renvoie zéro si la spline a été créée.

Si # PB_Any est utilisé pour le paramètre '#Spline' alors son numéro est retourné.

Remarques

Une spline n'existe pas physiquement dans le monde 3D, il s'agit d'un objet virtuel qui peut être utilisé à des différentes fins, la création d'un chemin de poursuite (path-finding), le lissage du mouvement d'un noeud (n'oubliez pas de consulter NodeAnimation) et plus encore.

Pour calculer la position d'un point intermédiaire, voir ComputeSpline().

Voir aussi

FreeSpline(), ComputeSpline()


FreeSpline()

Syntaxe

FreeSpline(#Spline)
Description
Libère une spline et toute la mémoire associée.

Arguments

#Spline La spline à utiliser.

Si #PB_All est spécifié, toutes les splines restantes sont libérées.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

La spline ne doit pas être utilisée après l'appel de cette fonction, (en utilisant son numéro, avec les autres fonctions de cette bibliothèque) à moins que de la créer à nouveau.

Toutes les splines restantes sont automatiquement libérées lorsque le programme se termine.

Voir aussi

CreateSpline()


SplinePointX()

Syntaxe

Resultat = SplinePointX(#Spline, IndexPoint)
Description
Renvoie la position 'x' d'un point d'une spline.

Arguments

#Spline La spline à utiliser.
IndexPoint L'index du point.

Le premier point est égal à zéro.

L'index doit être inférieur au résultat de CountSplinePoints().

Valeur de retour

Renvoie la position 'x' du point de la spline.

Voir aussi

CreateSpline(), AddSplinePoint(), SplinePointY(), SplinePointZ()


SplinePointY()

Syntaxe

Resultat = SplinePointY(#Spline, IndexPoint)
Description
Renvoie la position 'y' d'un point d'une spline.

Arguments

#Spline La spline à utiliser.
IndexPoint L'index du point.

Le premier point est égal à zéro.

L'index doit être inférieur au résultat de CountSplinePoints().

Valeur de retour

Renvoie la position 'y' du point de la spline.

Voir aussi

CreateSpline(), AddSplinePoint(), SplinePointX(), SplinePointZ()


SplinePointZ()

Syntaxe

Resultat = SplinePointZ(#Spline, IndexPoint)
Description
Renvoie la position 'z' d'un point d'une spline.

Arguments

#Spline La spline à utiliser.
IndexPoint L'index du point.

Le premier point est égal à zéro.

L'index doit être inférieur au résultat de CountSplinePoints().

Valeur de retour

Renvoie la position 'z' du point de la spline.

Voir aussi

CreateSpline(), AddSplinePoint(), SplinePointX(), SplinePointY()


SplineX()

Syntaxe

Resultat = SplineX(#Spline)
Description
Renvoie la position 'x' de la spline dans le monde.

Arguments

#Spline La spline à utiliser.

Valeur de retour

Renvoie la position 'x' de la spline dans le monde après exécution de ComputeSpline().

Voir aussi

ComputeSpline(), SplineX(), SplineY()


SplineY()

Syntaxe

Resultat = SplineY(#Spline)
Description
Renvoie la position 'y' de la spline dans le monde.

Arguments

#Spline La spline à utiliser.

Valeur de retour

Renvoie la position 'y' de la spline dans le monde après exécution de ComputeSpline().

Voir aussi

ComputeSpline(), SplineX(), SplineY()


SplineZ()

Syntaxe

Resultat = SplineZ(#Spline)
Description
Renvoie la position 'z' de la spline dans le monde.

Arguments

#Spline La spline à utiliser.

Valeur de retour

Renvoie la position 'z' de la spline dans le monde après exécution de ComputeSpline().

Voir aussi

ComputeSpline(), SplineX(), SplineY()


UpdateSplinePoint()

Syntaxe

UpdateSplinePoint(#Spline, IndexPoint, x, y, z)
Description
Ajoute un nouveau point à la spline.

Arguments

#Spline | La spline à utiliser.
IndexPoint L'index du point.

Le premier point est égal à zéro.

L'index doit être inférieur au résultat de CountSplinePoints().

x, y, z | La nouvelle position du point dans le monde.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Chaque point sera également reparti autour de la spline, ce qui signifie que le temps est constant pour aller d'un point à un autre, indépendamment de la distance entre ces points.

Voir aussi

CreateSpline(), ComputeSpline()


Sprite

PureBasic - Sprite

Généralités

Les 'Sprites' sont bien connus des joueurs sur ordinateur, ce sont des petites images qui peuvent être affichées n'importe où sur l'écran. Les Sprites peuvent se déplacer au dessus d'un plan graphique en utilisant un mode transparent.
DirectX 7 est utilisé pour gérer les sprites. Cela permet d'utiliser l'accélération du processeur graphique si elle est disponible.

Sommaire des commandes

AvailableScreenMemory
CatchSprite
ChangeAlphaIntensity
ChangeGamma
ClearScreen
ClipSprite
CloseScreen
CopySprite
CreateSprite
DisplayAlphaSprite
DisplayRGBFilter
DisplayShadowSprite
DisplaySolidSprite
DisplaySprite
DisplayTranslucentSprite
DisplayTransparentSprite
ExamineScreenModes
FlipBuffers
FreeSprite
GrabSprite
InitSprite
IsScreenActive
IsSprite
LoadSprite
NextScreenMode
OpenScreen
OpenWindowedScreen
SaveSprite
ScreenDepth
ScreenHeight
ScreenID
ScreenModeDepth
ScreenModeHeight
ScreenModeRefreshRate
ScreenModeWidth
ScreenOutput
ScreenWidth
SetFrameRate
SpriteCollision
SpriteDepth
SpriteHeight
SpriteID
SpriteOutput
SpritePixelCollision
SpriteWidth
StartSpecialFX
StopSpecialFX
TransparentSpriteColor
UseBuffer

Exemple

Sprite.pb
WindowedScreen.pb
MovieSprite.pb
Sprite_SpecialFX.pb

OS Supportés

Tous

Guide de référence - Index


AvailableScreenMemory()

Syntaxe

Resultat = AvailableScreenMemory()
Description
Renvoie la quantité de mémoire vidéo disponible pour les sprites et les autres données graphiques (en octets). Cette commande doit être appelée après la commande OpenScreen() ou OpenWindowedScreen().

OS Supportés

Windows (DirectX), Linux (SDL)


CatchSprite()

Syntaxe

Resultat = CatchSprite(#Sprite, AddresseMemoire [, Mode])
Description
Charge le sprite situé à l'adresse mémoire spécifiée. Si #PB_Any est utilisé pour le paramètre '#Sprite', le numéro du nouveau sprite sera renvoyé dans 'Resultat'. Le sprite peut être au format BMP (non compressé) ou dans un des formats supportés par la bibliothèque ImagePlugin. Si Resultat = 0, le chargement a échoué.

Avant de charger un sprite, un écran doit être ouvert à l'aide de la commande OpenScreen() ou OpenWindowedScreen(). Un Sprite chargé peut être par la suite libéré par la fonction FreeSprite(). La commande 'CatchSprite' est utile quand il est nécessaire d'inclure directement les sprites dans l'exécutable (en utilisant IncludeBinary). Cette méthode n'est pas idéale et devrait être évitée au maximum car en faisant ceci, les sprites prennent deux fois plus de mémoire (une fois dans l'exécutable, et la deuxieme quand ils sont chargés). Une autre utilisation plus recommandée est d'utiliser cette commande pour récupérer un sprite dans une banque de données compressée, par exemple avec la bibliothèque Packer (fichiers .pak).

Les commandes suivantes peuvent être utilisées pour activer automatiquement davantage de formats d'images:

UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
UseTGAImageDecoder()

Le paramètre 'Mode' est facultatif et peut prendre une des valeurs suivantes:
  0                       : Mode par défaut (le sprite est chargé dans la mémoire video, si possible)
  #PB_Sprite_Memory       : Le sprite est chargé dans la mémoire principale du PC (plus lent sauf en mode SpecialFX())
  #PB_Sprite_Alpha        : Le sprite est au format 8-bit (256 couleurs) en niveau de gris utilisé par DisplayAlphaSprite(), DisplayShadowSprite() ou DisplaySolidSprite()
  #PB_Sprite_Texture      : Le sprite est créé avec le support 3D (texture) nécessaire à la fonction CreateSprite3D() de la bibliothèque Sprite3D.
  #PB_Sprite_AlphaBlending: Le sprite est créé avec le support de l'alpha-channel, le format d'image doit le gérer
                            (seul PNG et TIFF pour l'instant). Le mode #PB_Sprite_Texture doit être aussi spécifié, et le sprite
                            devra être affiché avec DisplaySprite3D().
Note: Pour les écrans en 256 couleurs (8-bit), seules les images BMP en 256 couleurs sont supportées.


ChangeAlphaIntensity()

Syntaxe

ChangeAlphaIntensity(Rouge, Vert, Bleu)
Description
Change l'intensité des canaux alpha RVB. Ces paramètres seront utilisés par la commande DisplayAlphaSprite(). L'avantage de cette commande est de permettre le rendu de n'importe quel filtre alpha en rouge, vert ou n'importe quelle couleur au lieu de l'effet de transparence gris. Utile pour des effets graphiques temps réel.


ChangeGamma()

Syntaxe

ChangeGamma(IntensiteRouge, IntensiteVert, IntensiteBleu)
Description
Change la valeur gamma de l'écran courant. L'intensité des canaux rouge, vert et bleu est modifiable séparement. Les valeurs pour chaque canaux sont comprises entre 0 et 255. Cette commande ne fonctionne qu'en mode plein écran OpenWindowedScreen() n'est pas supporté). Cette commande est utile pour effectuer des fondus d'écran. Si la commande ne fait rien, alors la carte vidéo n'a pas de régulateur gamma. Aucune émulation logicielle n'est prévue car les calculs à faire sont trop gourmand en temps machine.
  ChangeGamma(255, 255, 0)   ; Supprimera complètement le canal bleu de l'écran

OS Supportés

Windows (DirectX)


ClearScreen()

Syntaxe

ClearScreen(Couleur)
Description
Efface l'écran courant avec la 'Couleur' spécifiée.

Note: ne jamais appeler ClearScreen() à l'intérieur d'un block StartDrawing() : StopDrawing().


ClipSprite()

Syntaxe

ClipSprite(#Sprite, x, y, Largeur, Hauteur)
Description
Change la zone affichable du #Sprite par la nouvelle zone. Par exemple, si un sprite fait 100*100 pixels (largeur*Hauteur) et que l'on définit une zone de 'clipping' x=10, y=10, Largeur=20, Hauteur=20, alors seule la zone comprise entre ces coordonnées sera affichée. Le #Sprite se comporte alors exactement comme un nouveau sprite de 20*20. Pour enlever la zone de 'clipping' du #Sprite la constante #PB_Default doit être spécifiée pour 'x', 'y', 'Largeur' et 'Hauteur'.

Note: Sur certaines anciennes cartes graphiques, ClipSprite() ne fonctionne pas correctement si la taille du sprite dépasse la taille de l'écran. ClipSprite() n'a aucun effet quand il est utilisé en conjonction avec un Sprite3D.


CloseScreen()

Syntaxe

CloseScreen()
Description
Ferme l'écran courant. Ceci permet à une application de passer du mode plein écran au mode fenêtré dynamiquement. Après avoir changé d'écran, tous les sprites doivent être rechargés.


CopySprite()

Syntaxe

Resultat = CopySprite(#Sprite1, #Sprite2 [, Mode])
Description
Copie le #Sprite1 sur le #Sprite2. Si le #Sprite2 n'existe pas, il est créé, sinon il est écrasé. Si #PB_Any est utilisé pour le paramètre '#Sprite2', le numéro du nouveau sprite sera renvoyé dans 'Resultat'.

Le paramètre 'Mode' est facultatif et peut prendre une des valeurs suivantes:
  0                       : Mode par défaut (le sprite est chargé dans la mémoire video, si possible)
  #PB_Sprite_Memory       : Le sprite est chargé dans la mémoire principale du PC (plus lent sauf en mode SpecialFX())
  #PB_Sprite_Alpha        : Le sprite est au format 8-bit (256 couleurs) en niveau de gris utilisé par DisplayAlphaSprite(), DisplayShadowSprite() ou DisplaySolidSprite()
  #PB_Sprite_Texture      : Le sprite est créé avec le support 3D (texture) nécessaire à la fonction CreateSprite3D() de la bibliothèque Sprite3D.
  #PB_Sprite_AlphaBlending: Le sprite est créé avec le support de l'apha-channel, le format d'image doit le gérer
                            (seul PNG et TIFF pour l'instant). Le mode #PB_Sprite_Texture doit être aussi spécifié, et le sprite
                            devra être affiché avec DisplaySprite3D().


CreateSprite()

Syntaxe

Resultat = CreateSprite(#Sprite, Largeur, Hauteur [, Mode])
Description
Crée un nouveau #Sprite vide de dimension Largeur x Hauteur. Si #PB_Any est utilisé pour le paramètre '#Sprite', le numéro du nouveau sprite sera renvoyé dans 'Resultat'. Si Resultat = 0, la création a échouée. Avant de créer un sprite, un écran doit être ouvert à l'aide de la commande OpenScreen() ou OpenWindowedScreen(). Un Sprite ainsi créé peut être par la suite libéré par la fonction FreeSprite().

Le paramètre 'Mode' est facultatif et peut prendre une des valeurs suivantes:
  0                 : Mode par défaut (le sprite est chargé dans la mémoire video, si possible)
  #PB_Sprite_Memory : Le sprite est créé dans la mémoire principale du PC (plus lent sauf en mode SpecialFX())
  DisplayShadowSprite() ou DisplaySolidSprite()
  #PB_Sprite_Texture: Le sprite est créé avec le support 3D (texture) nécessaire à la fonction CreateSprite3D() de la bibliothèque Sprite3D.
  #PB_Sprite_AlphaBlending: Sprite is created with per pixel alpha-channel support, the image format has to support it (only
                            PNG and TIFF for now). The #PB_Sprite_Texture needs to be specified as well, and the sprite
                            has to be displayed with DisplaySprite3D().


DisplayAlphaSprite()

Syntaxe

DisplayAlphaSprite(#Sprite, x, y)
Description
Affiche le #Sprite à la position spécifiée sur l'écran courant. La couleur 128,128,128 (gris) est considéré comme transparente. Le sprite émule un canal alpha (AlphaChannel) ce qui permet beaucoup d'effets de transparence. Le sprite doit être au format 8-bit (256 couleurs) en niveau de gris. Chaque niveau de gris donnera une luminosité plus foncée ou plus claire à l'effet de transparence. ChangeAlphaIntensity() peut être utilisée pour contrôler les valeurs Rouge, Vert et Bleu du canal alpha. Le sprite doit être chargé avec LoadSprite() en utilisant l'option #PB_Sprite_Alpha sinon la commande échoue. Il est parfaitement autorisé d'afficher le sprite partiellement ou complètement hors de l'écran.

Cette commande est spécialement optimisée (et beaucoup plus rapide) pour une utilisation en conjonction avec la commande StartSpecialFX().


DisplayRGBFilter()

Syntaxe

DisplayRGBFilter(x, y, Largeur, Hauteur, Rouge, Vert, Bleu)
Description
Affiche un filtre (rectangle translucide) au dessus de l'écran. Cette commande est très rapide mais le degré de transparence n'est pas modifiable.

Cette commande est spécialement optimisée (et beaucoup plus rapide) pour une utilisation en conjonction avec la commande StartSpecialFX().


DisplayShadowSprite()

Syntaxe

DisplayShadowSprite(#Sprite, x, y)
Description
Affiche le #Sprite à la position spécifiée sur l'écran courant. La couleur 0,0,0 (noir) est toujours considérée comme transparente. Le sprite est affiché en mode translucide en utilisant un algorithme plus rapide que celui utilisé dans DisplayAlphaSprite(). L'inconvénient c'est de ne pas pouvoir régler le degré de transparence. Le sprite doit être chargé avec LoadSprite() en utilisant l'option #PB_Sprite_Alpha sinon la commande échoue. Il est parfaitement autorisé d'afficher le sprite partiellement ou complètement hors de l'écran.

Cette commande est spécialement optimisée (et beaucoup plus rapide) pour une utilisation en conjonction avec la commande StartSpecialFX().


DisplaySolidSprite()

Syntaxe

DisplaySolidSprite(#Sprite, x, y, Couleur)
Description
Affiche le #Sprite à la position spécifiée sur l'écran courant. La couleur 0,0,0 (noir) est toujours considérée comme transparente. Le sprite est affiché avec une 'Couleur' unie, RGB() peut être utilisé pour obtenir une couleur valide.Un tableau représentant les couleurs les plus communes est disponible ici. Le sprite doit être chargé avec LoadSprite() en utilisant l'option #PB_Sprite_Alpha sinon la commande échoue. Il est parfaitement autorisé d'afficher le sprite partiellement ou complètement hors de l'écran.

Cette commande est spécialement optimisée (et beaucoup plus rapide) pour une utilisation en conjonction avec la commande StartSpecialFX().


DisplaySprite()

Syntaxe

DisplaySprite(#Sprite, x, y)
Description
Affiche le #Sprite à la position spécifiée sur l'écran courant. Il n'y a pas de couleur transparente. Il est parfaitement autorisé d'afficher le sprite partiellement ou complètement hors de l'écran.


DisplayTranslucentSprite()

Syntaxe

DisplayTranslucentSprite(#Sprite, x, y, Intensité)
Description
Affiche le #Sprite à la position spécifiée sur l'écran courant. La couleur 0,0,0 (noir) est toujours considérée comme transparente. L'intensité contrôle le niveau de transparence du sprite sur le fond. Les valeurs pour l'intensité peuvent aller de 0 (totalement transparent) à 255 (opaque). Cet effet est aussi connu sous le nom 'AlphaBlending'. Il est parfaitement autorisé d'afficher le sprite partiellement ou complètement hors de l'écran.

Cette commande est spécialement optimisée (et beaucoup plus rapide) pour une utilisation en conjonction avec la commande StartSpecialFX().


DisplayTransparentSprite()

Syntaxe

DisplayTransparentSprite(#Sprite, x, y)
Description
Affiche le Sprite #Sprite à la position spécifiée sur l'écran courant. La couleur 0 est considérée comme la couleur transparente (cette couleur ne sera pas affichée). Elle peut être changée avec la commande TransparentSpriteColor(). Il est parfaitement autorisé d'afficher le sprite partiellement ou complètement hors de l'écran.


ExamineScreenModes()

Syntaxe

Resultat = ExamineScreenModes()
Description
Démarre l'examen des modes d'écrans disponibles sur l'ordinateur. La liste des modes d'écran peut être énumérée à l'aide de la commande NextScreenMode(). Si le résultat est 0, alors les modes d'écran ne peuvent pas être examinés.


FlipBuffers()

Syntaxe

FlipBuffers()
Description
Inverse le buffer d'arrière plan avec le buffer visible à l'écran. La partie invisible du buffer remplace alors complètement la partie visible. Cela permet, par exemple des déplacements fluides de sprites sans effets parasites.

L'écran doit avoir été préalablement ouvert avec la fonction OpenScreen() ou OpenWindowedScreen().


FreeSprite()

Syntaxe

FreeSprite(#Sprite)
Description
Supprime le Sprite spécifié de la mémoire. Il ne sera plus possible de l'utiliser.

Si @ # PB_All est spécifié, tous les sprites restants sont libérés.

Note: tous les sprites restants sont automatiquement libérés quand le programme se termine.


GrabSprite()

Syntaxe

Resultat = GrabSprite(#Sprite, x, y, Largeur, Hauteur [, Mode])
Description
Capture la zone de l'écran spécifiée et crée un nouveau #Sprite avec son contenu. Si #PB_Any est utilisé pour le paramètre '#Sprite', le numéro du nouveau sprite sera renvoyé dans 'Resultat'.

Le paramètre 'Mode' est facultatif et peut prendre une des valeurs suivantes:
  0                       : Mode par défaut (le sprite est chargé dans la mémoire video, si possible)
  #PB_Sprite_Memory       : Le sprite est chargé dans la mémoire principale du PC (plus lent sauf en mode SpecialFX())
  #PB_Sprite_Alpha        : Le sprite est au format 8-bit (256 couleurs) en niveau de gris utilisé par DisplayAlphaSprite(), DisplayShadowSprite() ou DisplaySolidSprite()
  #PB_Sprite_Texture      : Le sprite est créé avec le support 3D (texture) nécessaire à la fonction CreateSprite3D() de la bibliothèque Sprite3D.

Note: GrabSprite() doit toujours être appelé en dehors d'un bloc StartDrawing() : StopDrawing().


InitSprite()

Syntaxe

Resultat = InitSprite()
Description
Initialise l'environnement nécessaire au fonctionnement des sprites. Vous devez placer cette fonction au début de votre code source si vous souhaitez utiliser les fonctions de la bibliothèque Sprite. Si Resultat = 0, l'initialisation a échoué. Vous devez alors quitter le programme ou annuler tous les appels aux fonctions de la bibliothèque Sprite. Cette fonction tente d'initialiser DirectX 7 (ou +). Les causes probables d'un échec sont l'absence de DirectX ou une version trop ancienne. Si le mode de compatibilité NT4.0 est utilisé, DirectX 3 (ou +) est nécessaire.


IsScreenActive()

Syntaxe

Resultat = IsScreenActive()
Description
Les jeux et les applications en mode plein écran programmés en PureBasic fonctionnent toujours en mode multitâche, pour éviter de bloquer tout le système (que ce soit sur AmigaOS, Windows ou Linux). En d'autre termes, l'utilisateur peut à tout moment revenir sur son bureau pour faire autre chose. Si c'est le cas cette commande renverra 0, indiquant au programmeur de prendre les mesures nécessaires (libérer le clavier et la souris, arrêter les sons et les musiques, mettre le jeu en pause etc...) Cette commande doit être obligatoirement placée après FlipBuffers().


IsSprite()

Syntaxe

Resultat = IsSprite(#Sprite)
Description
Teste si le #Sprite est correctement initialisé. Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. Si le 'Résultat' est différent de zéro, alors cet objet est valide. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.


LoadSprite()

Syntaxe

Resultat = LoadSprite(#Sprite, NomFichier$ [, Mode])
Description
Charge en mémoire le #Sprite contenu dans NomFichier$. Si #PB_Any est utilisé pour le paramètre '#Sprite', le numéro du nouveau sprite sera renvoyé dans 'Resultat'. Le sprite peut être au format BMP (non compressé) ou dans un des formats supportés par la bibliothèque ImagePlugin. Avant de charger un sprite, un écran doit être ouvert à l'aide de la commande OpenScreen() ou OpenWindowedScreen(). Si Resultat = 0, le chargement a échoué. Un Sprite chargé peut être libéré par la fonction FreeSprite(). Les commandes suivantes peuvent être utilisées pour activer automatiquement davantage de formats d'images:

UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
UseTGAImageDecoder()

Le paramètre 'Mode' est facultatif et peut prendre une des valeurs suivantes:
  0                       : Mode par défaut (le sprite est chargé dans la mémoire video, si possible)
  #PB_Sprite_Memory       : Le sprite est chargé dans la mémoire principale du PC (plus lent sauf en mode SpecialFX())
  #PB_Sprite_Alpha        : Le sprite est au format 8-bit (256 couleurs) en niveau de gris utilisé par DisplayAlphaSprite(), DisplayShadowSprite() ou DisplaySolidSprite()
  #PB_Sprite_Texture      : Le sprite est créé avec le support 3D (texture) nécessaire à la fonction CreateSprite3D() de la biliothèque Sprite3D.
  #PB_Sprite_AlphaBlending: Le sprite est créé avec le support de l'alpha-channel, le format d'image doit le gérer
                            (seul PNG et TIFF pour l'instant). Le mode #PB_Sprite_Texture doit être aussi spécifié, et le sprite
                            devra être affiché avec DisplaySprite3D().
Note: Pour les écrans en 256 couleurs (8-bit), seules les images BMP en 256 couleurs sont supportées.


NextScreenMode()

Syntaxe

Resultat = NextScreenMode()
Description
Cette commande doit être appelée après ExamineScreenModes(). Elle permet de lister les modes d'écran disponible un par un. Les informations disponibles sur le mode d'écran en cours d'examen peuvent être récupérées à l'aide des commandes suivantes: ScreenModeWidth(), ScreenModeHeight(), ScreenModeDepth() et ScreenModeRefreshRate(). Si le 'Resultat' est 0, alors l'énumération est finie.

Exemple

  InitSprite()

  If ExamineScreenModes()
    While NextScreenMode()
      Debug Str(ScreenModeWidth())+"x"+Str(ScreenModeHeight())+"x"+Str(ScreenModeDepth())+"@"+Str(ScreenModeRefreshRate())+"Hz"
    Wend
  EndIf


OpenScreen()

Syntaxe

Resultat = OpenScreen(Largeur, Hauteur, Profondeur, Titre$ [, FlipMode [, TauxDeRafraichissement])
Description
Ouvre un nouvel écran avec les caractéristiques Largeur, Hauteur et Profondeur. L'écran est créé avec deux buffers vidéo, ce qui permet l'affichage successif des deux buffers avec la fonction FlipBuffers(), particulièrement utile pour les jeux. Si Resultat = 0, la création de l'écran a échoué.

Largeur et Hauteur doivent être une combinaison standard du type : 640*480, 800*600, 1024*768...

Profondeur peut prendre les valeurs suivantes :
   4:    16 couleurs, palettes indépendantes
   8:   256 couleurs, palettes indépendantes
  16: 65000 couleurs, palette fixe
  24: 16 Mo couleurs, palette fixe
  32: 16 Mo couleurs, plus rapide que le mode 24-bit
Le paramètre 'FlipMode' est facultatif et permet d'attendre ou non la synchronisation avec l'écran avant d'inverser les buffers avec FlipBuffers() (aussi connu sous le nom de 'Vertical blank synchronization'). Les valeurs possibles du paramètre 'Flipmode' sont:
   #PB_Screen_NoSynchronization   : désactive la synchronisation
   #PB_Screen_WaitSynchronization : active la synchronisation (mode par défaut)
   #PB_Screen_SmartSynchronization: active la synchronisation en essayant de préserver le temps processeur,
   lorsque le jeu est en mode plein écran.
Attendre la synchronisation permet d'avoir des inversions de buffers parfaites (sans 'tearing' (ancienne et nouvelle image à moitié visible) ou autres effets parasites) car l'inversion est effectuée lorsque que le faisceau lumineux est en dehors de la partie visible de l'écran. De plus, l'inversion se fait à un rythme régulier, en relation avec sa fréquence de rafraîchissement: par exemple, pour un écran en 60 Hz, l'inversion pourra se faire au maximum 60 fois par seconde (donc on aura un rythme régulier de 60 images/secondes).

Le paramètre optionnel 'TauxDeRafraichissement' Définit le taux de rafraîchissement (en Hz) auquel le prochain écran ouvert devra se conformer. Si l'écran ne supporte pas ce taux de rafraîchissement, alors OpenScreen() échouera. Il suffit de remettre le 'TauxDeRafraichissement' à 0 pour ouvrir l'écran avec son taux par défaut
Note: Sous Windows, le taux de rafraîchissement peut être bloqué par le système ou par les drivers vidéo. Le résultat de cette fonction n'est donc pas forcément fiable.

Note: Sous Windows, le paramètre 'Titre$' sera affiché dans la barre des tâches, il est conseillé de choisir un nom approprié à l'application.

Pour ouvrir un écran à l'intérieur d'une fenêtre, il convient d'utiliser la commande OpenWindowedScreen().

OS Supportés

Windows, Linux (OpenGl), MacOS X


OpenWindowedScreen()

Syntaxe

Resultat = OpenWindowedScreen(FenetreID, x, y, Largeur, Hauteur [, RedimensionnementAuto, OffsetDroit, OffsetBas [, FlipMode]])
Description
Ouvre un écran selon les paramètres spécifiés dans la fenêtre dont l'identifiant est 'FenetreID'. Cette fenêtre doit être ouverte au préalable en utilisant OpenWindow().
L'écran fenêtré emploie l'accélération matérielle de la même manière que le mode plein écran utilisant la commande OpenScreen().

Si 'RedimensionnementAuto' est #True, alors l'écran se redimensionnera automatiquement ainsi que son contenu quand la taille de la fenêtre changera.

'OffsetDroit' et 'OffsetBas' définissent les marges à droite et en bas de la fenêtre qui devront être respectées lors du redimensionnement (pour une barre d'état par exemple).

Le paramètre 'FlipMode' est facultatif et permet d'attendre ou non la synchronisation avec l'écran avant d'inverser les buffers avec FlipBuffers() (aussi connu sous le nom de 'Vertical blank synchronization'). Les valeurs possibles du paramètre 'Flipmode' sont:
   #PB_Screen_NoSynchronization   : désactive la synchronisation
   #PB_Screen_WaitSynchronization : active la synchronisation (mode par défaut)
   #PB_Screen_SmartSynchronization: active la synchronisation en essayant de préserver le temps processeur,
   lorsque le jeu est en mode plein écran.
Attendre la synchronisation permet d'avoir des inversions de buffers parfaites (sans 'tearing' (ancienne et nouvelle image à moitié visible) ou autres effets parasites) car l'inversion est effectuée lorsque que le faisceau lumineux est en dehors de la partie visible de l'écran. De plus, l'inversion se fait à un rythme régulier, en relation avec sa fréquence de rafraîchissement: par exemple, pour un écran en 60 Hz, l'inversion pourra se faire au maximum 60 fois par seconde (donc on aura un rythme régulier de 60 images/secondes).

L'écran est créé avec deux buffers vidéo, ce qui permet l'affichage successif des deux buffers avec la fonction FlipBuffers(), particulièrement utile pour les jeux.
Si Resultat = 0, la création de l'écran a échoué.

Note: Il n'est pas possible de créer plus d'un écran fenêtré à la fois.

Exemple

Example 1: Ecran fenêtré de taille fixe avec gadgets
  If InitSprite() = 0
    MessageRequester("Erreur", "Impossible d'ouvrir l'écran & l'environnement nécessaire aux sprites !", 0)
    End
  EndIf

  If OpenWindow(0, 0, 0, 220, 160, "Un écran dans une fenêtre...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0, 170, 135, 45, 20, "Quitter")

    If OpenWindowedScreen(WindowID(0), 0, 0, 160, 160)
      CreateSprite(0, 20, 20)
      If StartDrawing(SpriteOutput(0))
        Box(0, 0, 20, 20, RGB(255, 0, 155))
        Box(5, 5, 10, 10, RGB(155, 0, 255))
        StopDrawing()
      EndIf
    Else
      MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0)
      End
    EndIf
  EndIf

  direction = 2
  Repeat
    ; Il est très important de traiter tous les événements restants dans la file d'attente à chaque tour
    ;
    Repeat
      Event = WindowEvent()

      Select Event
        Case #PB_Event_Gadget
          If EventGadget() = 0
            End
          EndIf

        Case #PB_Event_CloseWindow
          End
      EndSelect
    Until Event = 0

    FlipBuffers()
    ClearScreen(RGB(0, 0, 0))
    DisplaySprite(0, x, x)
    x + direction
    If x > 140 : direction = -2 : EndIf
    If x < 0   : direction =  2 : EndIf
    Delay(1)
  ForEver

Exemple

Example 2: Avec redimensionnement automatique
  If InitSprite() = 0
    MessageRequester("Erreur", "Impossible d'ouvrir l'écran & l'environnement nécessaire aux sprites !", 0)
    End
  EndIf

  If OpenWindow(0, 0, 0, 320, 200, "Un écran dans une fenêtre...", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
    CreateStatusBar(0, WindowID(0))
      AddStatusBarField(320)

    StatusBarText(0, 0, "Zoom automatique lors du changement de taille de la fenêtre...")

  If OpenWindowedScreen(WindowID(0), 0, 0,320, 200, #True, 0, 20)

    CreateSprite(0, 50, 50) ; Crée un sprite vide qui sera tout noir

  Repeat
    ; Il est très important de traiter tous les événements restants dans la file d'attente à chaque tour
    ;
    Repeat
      Event = WaitWindowEvent(10)

      If Event = #PB_Event_CloseWindow
        End
      EndIf
    Until Event = 0

    FlipBuffers()
    ClearScreen(RGB(0, 0, 200)) ; Un fond bleu

    DisplaySprite(0, 10, 10)  ; Affichez notre boîte noire dans le coin en haut à gauche
    DisplaySprite(0, 260, 10) ; Affichez notre boîte noire dans le coin en haut à droite
  ForEver

    Else
      MessageRequester("Erreur", "Impossible d'ouvrir l'écran fenêtré !", 0)
    EndIf
  EndIf

Pour plus de détail, voir cet exemple

Exemple

WindowedScreen.pb


SaveSprite()

Syntaxe

Resultat = SaveSprite(#Sprite, NomFichier$ [, ImagePlugin [, Options]])
Description
Enregistre le #Sprite dans un fichier sur le disque. Par défaut, le format de sauvegarde est le BMP 24-bit. Très utile avec la fonction GrabSprite() pour faire des copies d'écrans par exemple. Si le 'Resultat' est 0, alors le sprite n'a pas pu être enregistré (disque plein, mauvais nom de fichier, etc.). Le paramètre 'ImagePlugin' est facultatif et peut prendre l'une des constantes suivantes:
  #PB_ImagePlugin_BMP : Enregistre l'image en BMP  (format par défaut)
  #PB_ImagePlugin_JPEG: Enregistre l'image en JPEG (la commande UseJPEGImageEncoder() doit être utilisée)
  #PB_ImagePlugin_JPEG2000: Enregistre l'image en JPEG2000 (la commande UseJPEG2000ImageEncoder() doit être utilisée)
  #PB_ImagePlugin_PNG : Enregistre l'image en PNG  (la commande UsePNGImageEncoder() doit être utilisée)
Le paramètre 'Options' est facultatif dont l'usage est dépendant du plugin choisi. Il est possible de régler la qualité d'une image à l'aide d'une valeur allant de 0 (plus mauvaise qualité) à 10 (qualité maximale). Seuls les plugins JPEG et JPEG2000 supportent cette option (la qualité par défaut est fixée à 7 si aucune option n'est spécifiée).


ScreenDepth()

Syntaxe

Resultat = ScreenDepth()
Description
Renvoie la profondeur de couleur de l'écran courant, précédemment ouvert avec OpenScreen() ou OpenWindowedScreen().

Valeur de retour

Renvoie la profondeur de couleur (entre 8 et 32) de l'écran en cours, ou zéro si aucun écran est ouvert.

Voir aussi

OpenScreen(), OpenWindowedScreen(), ScreenWidth(), ScreenHeight()


ScreenHeight()

Syntaxe

Resultat = ScreenHeight()
Description
Renvoie la hauteur de l'écran courant, précédemment ouvert avec OpenScreen() ou OpenWindowedScreen().

Valeur de retour

Renvoie la hauteur de l'écran en cours, ou zéro si aucun écran est ouvert.

Voir aussi

OpenScreen(), OpenWindowedScreen(), ScreenWidth(), ScreenDepth()


ScreenID()

Syntaxe

Resultat = ScreenID()
Description
Renvoie l'identifiant système de l'écran. Sous Windows, l'écran n'est autre qu'une fenêtre, donc n'importe quelle commande nécessitant un 'WindowID' peut être utilisée (comme PlayMovie()). Ce n'est pas compatible avec les autres OS.

OS Supportés

Windows (DirectX), Linux (SDL)


ScreenModeDepth()

Syntaxe

Profondeur = ScreenModeDepth()
Description
Renvoie la profondeur (en bits) du mode d'écran actuellement listé par NextScreenMode(). La profondeur peut être une des valeurs suivantes en fonction de la carte graphique: 8, 15, 16, 24 ou 32-bit.


ScreenModeHeight()

Syntaxe

Hauteur = ScreenModeHeight()
Description
Renvoie la hauteur (en pixels) du mode d'écran actuellement listé par NextScreenMode().


ScreenModeRefreshRate()

Syntaxe

TauxRafraichissement = ScreenModeRefreshRate()
Description
Renvoie le taux de rafraîchissement (en hertz) du mode d'écran actuellement listé par NextScreenMode().

Note: Sous Linux avec le sous-système SDL, cette commande renvoie toujours 0. Sous OS X de nombreux portables et écrans ne supportent pas cette commande, qui renvoie souvent 0.

OS Supportés

Windows, Linux (OpenGl), MacOS X


ScreenModeWidth()

Syntaxe

Largeur = ScreenModeWidth()
Description
Renvoie la largeur (en pixels) du mode d'écran actuellement listé par NextScreenMode().


ScreenOutput()

Syntaxe

OutputID = ScreenOutput()
Description
Renvoie l'OutputID de l'écran courant nécessaire à StartDrawing() pour effectuer les dessins 2D directement sur l'écran.

Exemple

  ...
  StartDrawing(TextureOutput(#Texture))
    ; faire des trucs de dessin ici ...
  StopDrawing()
Note: ScreenOutput() comme le dessin sur un écran est très lent sous Linux et OS X et devrait être évité.


ScreenWidth()

Syntaxe

Resultat = ScreenWidth()
Description
Renvoie la largeur de l'écran courant, précédemment ouvert avec OpenScreen() ou OpenWindowedScreen().

Valeur de retour

Renvoie la largeur de l'écran en cours, ou zéro si aucun écran est ouvert.

Voir aussi

OpenScreen(), OpenWindowedScreen(), ScreenHeight(), ScreenDepth()


SetFrameRate()

Syntaxe

SetFrameRate(ImagesParSeconde)
Description
Définit le nombre d'images par seconde du programme. C'est particulièrement utile en mode fenêtré.


SpriteCollision()

Syntaxe

Resultat = SpriteCollision(#Sprite1, x1, y1, #Sprite2, x2, y2)
Description
Teste si les deux Sprites se chevauchent. Si ce n'est pas le cas, Resultat = 0. La hauteur et la largeur des sprites sont déjà connues de Purebasic, seules les coordonnées x et y de chaque sprite sont nécessaires.

Cette fonction teste une zone rectangulaire, ce qui la rend rapide mais peu précise, mais cependant très utile dans des jeux d'arcade.

Utilisez SpritePixelCollision() pour un test de collision précis.


SpriteDepth()

Syntaxe

Resultat = SpriteDepth(#Sprite)
Description
Renvoie dans Resultat, la profondeur (en plans couleurs) du Sprite.


SpriteHeight()

Syntaxe

Resultat = SpriteHeight(#Sprite)
Description
Renvoie dans Resultat, la hauteur du Sprite.


SpriteID()

Syntaxe

SpriteID = SpriteID(#Sprite)
Description
Renvoie l'identifiant système du #Sprite.


SpriteOutput()

Syntaxe

OutputID = SpriteOutput(#Sprite)
Description
Renvoie l'OutputID du #Sprite nécessaire à StartDrawing() pour effectuer les dessins 2D directement sur le #Sprite.

Exemple

  ...
  StartDrawing(TextureOutput(#Texture))
    ; faire des trucs de dessin ici ...
  StopDrawing()
Note: Il n'est pas possible d'utiliser SpriteOutput() (et par conséquent les fonctions de dessin 2D) avec un sprite du type #PB_Sprite_Alpha.


SpritePixelCollision()

Syntaxe

Resultat = SpritePixelCollision(#Sprite1, x1, y1, #Sprite2, x2, y2)
Description
Teste si les deux Sprites se chevauchent. Si ce n'est pas le cas, Resultat = 0. La hauteur et la largeur des sprites sont déjà connues de Purebasic, seules les coordonnées x et y de chaque sprite sont nécessaires.

Cette fonction effectue une comparaison pixel par pixel sur les pixels transparents des deux sprites ce qui rend la routine très précise mais également relativement lente. Pour optimiser au maximum la comparaison, il convient d'enlever le plus possible la zone transparente autour du sprite, pour ne garder que sa dimension réelle.
Note : SpriteCollision() est testé en interne avant de lancer la comparaison.

Utilisez SpriteCollision() pour un test de collision moins précis mais plus rapide.

Note : SpritePixelCollision() ne prend pas en compte le canal alpha des sprites , il est ignoré.

OS Supportés

Windows (DirectX)


SpriteWidth()

Syntaxe

Resultat = SpriteWidth(#Sprite)
Description
Renvoie dans Resultat, la largeur du Sprite.


StartSpecialFX()

Syntaxe

StartSpecialFX()
Description
PureBasic permet d'effectuer des effets graphiques tels que les ombres réelles, l'AlphaBlending, filtres de couleurs etc... et ce sans accélération matérielle. C'est particulièrement adapté aux petites configurations. Néanmoins, si le matériel le permet, il est vivement conseillé d'utiliser la bibliothèque Sprite3D pour les effets d'ombre et de lumière en temps réel.

Etant donné que tout est logiciel, les commandes sont relativement gourmandes en temps CPU et doivent être manipulées intelligemment. Tout d'abord, il faut bien comprendre comment marche le mode SpecialFX. Lorsque StartSpecialFX() est appelé, les rendus se font sur un buffer vide, en mémoire centrale (et non sur la carte vidéo). Une fois que tous les rendus sont effectués StopSpecialFX() est appelé et le contenu du buffer mémoire est transféré dans la mémoire de la carte vidéo pour être affiché. Cela implique deux choses: les rendus doivent être tous fait au même moment, et les opérations d'affichage classique DisplaySprite() etc...) doivent être effectués après StopSpecialFX().

Comme toutes les opérations sont faites en mémoire centrale, il est vivement conseillé de charger les sprites qui seront utilisés dans le bloc StartSpecialFX() avec l'option #PB_Sprite_Memory pour accélérer la vitesse d'affichage.

Les commandes qui ont été conçues spécialement pour le mode 'SpecialFX' sont: DisplayAlphaSprite(), DisplaySolidSprite(), DisplayShadowSprite(), DisplayRGBFilter(), DisplayTranslucentSprite(). Les autres commandes sont bien sûr disponibles.

OS Supportés

Windows (DirectX), Linux (SDL)


StopSpecialFX()

Syntaxe

StopSpecialFX()
Description
Une fois tous les rendus terminés (voir StartSpecialFX()), cette commande copie le contenu du buffer 'SpecialFX' vers la mémoire vidéo. L'accélération matérielle est à nouveau disponible.

OS Supportés

Windows (DirectX), Linux (SDL)


TransparentSpriteColor()

Syntaxe

TransparentSpriteColor(#Sprite, Couleur)
Description
Change la couleur transparente du #Sprite (quand il est affiché avec DisplayTransparentSprite()). RGB() peut être utilisé pour définir la valeur de 'Couleur'. Un tableau représentant les couleurs les plus communes est disponible ici.

La couleur de transparence par défaut est noire (0,0,0), si #PB_Default est utilisé à la place de #Sprite, alors la couleur spécifiée devient la nouvelle couleur transparente par défaut.
Elle sera utilisée par tous les sprites qui seront ultérieurement créés (par LoadSprite(), CreateSprite(), etc...). Note: le changement de la couleur par défaut n'affecte pas la couleur de transparence des sprites dejà chargés ou déjà créés.


UseBuffer()

Syntaxe

UseBuffer(#Sprite)
Description
Change la surface de rendu par défaut (l'ecran) par le #Sprite. Ainsi, toutes les commandes du type DisplaySprite(), DisplayTransparentSprite() etc.. seront appliquées sur le #Sprite.

Pour revenir en mode normal (surface écran), il suffit de remplacer #Sprite par #PB_Default.

OS Supportés

Windows (DirectX), Linux (SDL)


Sprite3D

PureBasic - Sprite3D

Généralités

La bibliothèque Sprite3D est la base d'un moteur de traitement 3D utilisé pour afficher les sprites 2D en utilisant les nouvelles capacités matérielles 3D comme le zoom en temps-réel, les transformations, les fondus de couleurs (transparence) et plus encore. Pour en savoir plus sur les sprites, lisez la documentation Sprite. Une carte graphique récente est recommandée pour bénéficier de la pleine puissance de ces fonctions (avec accélération des fonctions 3D). Les sprites 3D sont proposés pour réaliser facilement des effets hors du commun, mais il ne faut pas oublier qu'ils sont moins rapides que les sprites classiques et plus restrictifs en termes de taille par exemple. Le support des sprites se fait à partir de DirectX7 ce qui permet d'utiliser le circuit spécialisé accélérateur s'il existe.

Sommaire des commandes

CreateSprite3D
DisplaySprite3D
FreeSprite3D
InitSprite3D
IsSprite3D
RotateSprite3D
Sprite3DBlendingMode
Sprite3DQuality
Start3D
Stop3D
TransformSprite3D
ZoomSprite3D

Exemple

Sprite3D.pb

OS Supportés

Windows, Linux (OpenGl), MacOS X

Guide de référence - Index


CreateSprite3D()

Syntaxe

Resultat = CreateSprite3D(#Sprite3D, #Sprite)
Description
Créé un sprite 3D à partir du sprite 2D spécifié. Si #PB_Any est utilisé pour le paramètre '#Sprite3D', le numéro du nouveau sprite3d sera renvoyé dans 'Resultat'. Un sprite 3D est un simple rectangle sur lequel on applique une texture. Vous ne pouvez pas dessiner directement sur un sprite 3D.

La texture est en fait un sprite classique chargé avec LoadSprite() ou CatchSprite() ou créé avec CreateSprite() en utilisant le mode #PB_Sprite_Texture. La texture doit être un carré de l'une des dimensions suivantes: 16*16, 32*32, 64*64, 128*128 ou 256*256. D'autres dimensions peuvent fonctionner selon les cartes graphiques utilisées, mais il y a des limitations.

Si 'Resultat' est à 0, alors le sprite 3D ne peut être créé, sinon la création a eu lieu.

Le sprite 2D utilisé pour créer un sprite 3D n'est pas détruit lorsqu'un sprite 3D l'utilise. Un seul sprite 2D peut donc être appelé par un nombre quelconque de sprites 3D.

OS Supportés

Windows, Linux (OpenGl), MacOS X


DisplaySprite3D()

Syntaxe

DisplaySprite3D(#Sprite3D, x, y [, Transparence])
Description
Affiche le sprite 3D spécifié à la position de coordonnées (x,y). Un paramètre de transparence est utilisé et peut prendre une valeur de la plage 0 à 255. 0 signifie invisible et 255 opaque. Toute valeur de cette plage peut être utilisée. Pour un meilleur rendu, un écran en mode 32-bit est fortement recommandé pour des effets de fondus réguliers.

Pour afficher un sprite avec le support de l'alpha-channel, le sprite qui a servi à la création du sprite 3D doit avoir l'option #PB_Sprite_AlphaBlending.

Start3D() doit être appelé avant cette fonction. Si plusieurs sprites 3D doivent être affichés, il est préférable de les afficher en une fois. Exemple:
  Start3D()
    DisplaySprite3D(1, 100, 100, 128)
    DisplaySprite3D(2, 100, 150, 100)
    ; ...
  Stop3D()

OS Supportés

Windows, Linux (OpenGl), MacOS X


FreeSprite3D()

Syntaxe

FreeSprite3D(#Sprite3D)
Description
Libère le sprite 3D spécifié de la mémoire. Le sprite 2D associé n'est pas libéré.

Note: tous les sprites 3D restants sont automatiquement libérés quand le programme se termine.

OS Supportés

Windows, Linux (OpenGl), MacOS X


InitSprite3D()

Syntaxe

Resultat = InitSprite3D()
Description
Tente d'initialiser l'environnement sprite 3D. Si 'Resultat' est à 0 aucune présence d'un matériel 3D ou d'une émulation n'a pu être trouvée. Il faut appeler InitSprite() avant cette fonction.

OS Supportés

Windows, Linux (OpenGl), MacOS X


IsSprite3D()

Syntaxe

Resultat = IsSprite3D(#Sprite3D)
Description
Teste si le #Sprite3D est correctement initialisé. Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. Si le 'Résultat' est différent de zéro, alors cet objet est valide. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

OS Supportés

Windows, Linux (OpenGl), MacOS X


RotateSprite3D()

Syntaxe

RotateSprite3D(#Sprite3D, Angle.f, Mode)
Description
Fait tourner #Sprite3D selon l'angle spécifié. La valeur 'Angle' est dans la plage 0 to 360. La valeur 'Mode' peut prendre l'une des valeurs suivantes:
  0: Toutes les dimensions sont remises aux valeurs d'origine (donc tout zoom ou rotation antérieur n'est pas
     pris en compte). Cela est utile par exemple lorsque l'on affiche plusieurs occurrences d'un même #Sprite3D.
     Chaque, sprite peut avoir son angle propre et s'affiche donc correctement.
  1: Les dimensions/transformations du sprite ne sont pas modifiées. Cela permet d'utiliser la commande
     ZoomSprite3D() avant la commande de rotation mais rend le partage de #Sprite3D plus délicat.

OS Supportés

Windows, Linux (OpenGl), MacOS X


Sprite3DBlendingMode()

Syntaxe

Sprite3DBlendingMode(ModeSource, ModeDestination)
Description
Modifie la manière dont un sprite 3D est mixé avec l'arrière plan (lors de l'utilisation de DisplaySprite3D() et du niveau de transparence). Les modes source et destination peuvent prendre une valeur de 1 à 13. Cette commande est à l'usage des programmeurs avancés. Voici la liste des valeurs DirectX correspondantes:
  #D3DBLEND_ZERO            = 1
  #D3DBLEND_ONE             = 2
  #D3DBLEND_SRCCOLOR        = 3
  #D3DBLEND_INVSRCCOLOR     = 4
  #D3DBLEND_SRCALPHA        = 5
  #D3DBLEND_INVSRCALPHA     = 6
  #D3DBLEND_DESTALPHA       = 7
  #D3DBLEND_INVDESTALPHA    = 8
  #D3DBLEND_DESTCOLOR       = 9
  #D3DBLEND_INVDESTCOLOR    = 10
  #D3DBLEND_SRCALPHASAT     = 11
  #D3DBLEND_BOTHSRCALPHA    = 12
  #D3DBLEND_BOTHINVSRCALPHA = 13
Note: la valeur par défaut est Sprite3DBlendingMode(#D3DBLEND_SRCALPHA, #D3DBLEND_INVSRCALPHA).

OS Supportés

Windows, Linux (OpenGl), MacOS X


Sprite3DQuality()

Syntaxe

Sprite3DQuality(Qualite)
Description
Modifie le rendu des sprites 3D. 'Qualite' peut avoir l'une des valeurs suivantes:
  #PB_Sprite3D_NoFiltering      : Aucun filtre (rapide mais médiocre lors des zooms/rotations), c'est la valeur par défaut.
  #PB_Sprite3D_BilinearFiltering: Filtrage bi-linéaire (plus lent mais très net lors des zooms/rotations)

OS Supportés

Windows, Linux (OpenGl), MacOS X


Start3D()

Syntaxe

Resultat = Start3D()
Description
Démarre le moteur de traitement 3D et prépare l'affichage des sprites 3D. Cette commande doit être appelée avant d'utiliser DisplaySprite3D() et Stop3D() doit être appelée dès que toutes les opérations de rendu sont terminées. Si 'Resultat' est à 0, l'initialisation a échoué et les commandes sprites 3D ne peuvent être utilisées.

OS Supportés

Windows, Linux (OpenGl), MacOS X


Stop3D()

Syntaxe

Stop3D()
Description
Arrête le moteur de traitement 3D. Cette fonction est typiquement appelée dès que le dernier sprite 3D a été traité. Start3D() doit avoir été exécuté avant l'appel de cette commande.

OS Supportés

Windows, Linux (OpenGl), MacOS X


TransformSprite3D()

Syntaxe

TransformSprite3D(#Sprite3D, x1, y1, [z1], x2, y2, [z2], x3, y3, [z3], x4, y4, [z4])
Description
Opère une transformation de #Sprite3D avec les nouvelles coordonnées. Cette commande est utilisée pour des transformations en temps réel. Attention, comme un Sprite3D est un double vertex (2 triangles), la transformation peut prendre des formes étranges... Si un des paramètres optionnels 'z' est spécifié, ils doivent être tous spécifiés.

  ;
  ; x1         x2
  ;   ---------
  ;   |      /|
  ;   |    /  |
  ;   |  /    |
  ;   |/      |
  ;   ---------
  ; x4         x3
  ;

OS Supportés

Windows, Linux (OpenGl), MacOS X


ZoomSprite3D()

Syntaxe

ZoomSprite3D(#Sprite3D, Largeur, Hauteur)
Description
Effectue un zoom de #Sprite3D aux dimensions indiquées. Si une rotation est requise RotateSprite3D() doit être appelée après ZoomSprite3D().

OS Supportés

Windows, Linux (OpenGl), MacOS X


StaticGeometry

PureBasic - StaticGeometry

Généralités

Une géométrie statique est une forme géométrique prédéfinie et pré-rendue, qui peut être très complexe et qui a toujours un rendu très rapide. Mais une fois créée, la forme géométrique ne peut plus être déplacée.

Elles peuvent être utilisées comme éléments de décors dans un paysage par exemple.

InitEngine3D() doit être appelé avec succès avant d'utiliser les fonctions géométriques statiques.

Sommaire des commandes

AddStaticGeometryEntity
BuildStaticGeometry
CreateStaticGeometry
FreeStaticGeometry
IsStaticGeometry

Exemple

StaticGeometry.pb

OS Supportés

Tous

Guide de référence - Index


AddStaticGeometryEntity()

Syntaxe

AddStaticGeometryEntity(#FormeGeometriqueStatique, EntityID, x, y, z [, EchelleX, EchelleY, EchelleZ [, RotationX, RotationY, RotationZ]])
Description
Ajoute une entité à une forme géométrique statique.

Arguments

#FormeGeometriqueStatique | La forme à utiliser.
EntityID | Le numéro d'identification EntityID de l'entité à ajouter à la forme géométrique statique.
x, y, z | La position de l'entité dans la forme géométrique statique.
EchelleX, EchelleY, EchelleZ (optionnel) | Le facteur d'échelle à appliquer à l'entité.
RotationX, RotationY, RotationZ (optionnel) | La rotation à appliquer à l'entité.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

L'entité d'origine n'est pas modifiée par cette fonction et peut être libérée après l'ajout.

La même entité peut être ajoutée plusieurs fois.

Attention: Une fois que toutes les entités ont été ajoutées, la commande BuildStaticGeometry() doit être appelée pour générer la forme géométrique statique.

Voir aussi

CreateStaticGeometry(), BuildStaticGeometry()


BuildStaticGeometry()

Syntaxe

BuildStaticGeometry(#FormeGeometriqueStatique)
Description
Construit une forme géométrique statique.

Arguments

#FormeGeometriqueStatique La forme à utiliser.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Une fois créée, une forme géométrique statique ne peut plus être modifiée.

Voir aussi

CreateStaticGeometry(), AddStaticGeometryEntity()


CreateStaticGeometry()

Syntaxe

Resultat = CreateStaticGeometry(#FormeGeometriqueStatique, Largeur, Hauteur, Longueur, ActiverOmbres)
Description
Crée une forme géométrique statique vide.

Arguments

#FormeGeometriqueStatique Le numéro d'identification de la nouvelle forme géométrique statique.

PB_Any # peut être utilisé pour générer automatiquement ce numéro.

Largeur, Hauteur, Longueur Dimensions (en unité monde) de la forme géométrique statique.
ActiverOmbres Active ou désactive les ombres dynamiques sur la forme.
  #True : Activer.
  #False: Désactiver.

Valeur de retour

Renvoie une valeur non nulle si la forme géométrique statique a été créée avec succès ou zéro sinon.

Si #PB_Any a été utilisé pour le paramètre #FormeGeometriqueStatique alors le nombre généré est retourné en cas de succès.

Remarques

Si la nouvelle forme géométrique statique '#FormeGeometriqueStatique' est chargée avec le même numéro, alors l'ancienne forme est automatiquement libérée lors de la création de la nouvelle.

Voir aussi

FreeStaticGeometry()


FreeStaticGeometry()

Syntaxe

FreeStaticGeometry(#FormeGeometriqueStatique)
Description
Libére une forme géométrique statique.

Arguments

#FormeGeometriqueStatique La forme à libérer.

Si #PB_All est spécifié, toutes les formes géométriqyes statiques restantes sont libérées.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Toutes les formes géométriques statiques restantes sont automatiquement libérées lorsque le programme se termine.

Voir aussi

CreateStaticGeometry()


IsStaticGeometry()

Syntaxe

Resultat = IsStaticGeometry(#FormeGeometriqueStatique)
Description
Teste si une forme géométrique statique est valide et correctement initialisée.

Arguments

#FormeGeometriqueStatique La forme à utiliser.

Valeur de retour

Renvoie une valeur non nulle si #FormeGeometriqueStatique est valide et initialisée ou zéro sinon.

Remarques

C'est un bon moyen de vérifier que la forme géométrique statique est prête à l'emploi.

Voir aussi

CreateStaticGeometry()


StatusBar

PureBasic - StatusBar

Généralités

Une 'StatusBar' est une barre d'informations horizontale (barre d'état) située en bas d'une fenêtre. Cette barre est toujours visible et peut être séparée en plusieurs champs.

Sommaire des commandes

AddStatusBarField
CreateStatusBar
FreeStatusBar
IsStatusBar
StatusBarHeight
StatusBarID
StatusBarImage
StatusBarProgress
StatusBarText

Exemple

StatusBar.pb

OS Supportés

Tous

Guide de référence - Index


AddStatusBarField()

Syntaxe

AddStatusBarField(Largeur)
Description
Ajoute un champ à la barre d'état précédemment créée par la fonction CreateStatusBar(). Chaque nouveau champ est créé à la suite du précédent.

Les commandes suivantes permettent d'agir sur le contenu d'un champ de la barre d'état:

- StatusBarText()
- StatusBarImage()
- StatusBarProgress()

Arguments

La 'Largeur' du nouveau champ est indiquée en pixels. Si 'Largeur' prend la valeur #PB_Ignore alors le champ sera dimensionné automatiquement afin de remplir l'espace libre de la barre d'état. Plusieurs champs peuvent avoir une 'Largeur' valant #PB_Ignore, dans ce cas l'espace libre sera partagé entre ces différents champs.

La fonction CreateStatusBar() contient un exemple montrant l'utilisation de AddStatusBarField().


CreateStatusBar()

Syntaxe

Resultat = CreateStatusBar(#BarreEtat, WindowID)
Description
Ajoute une barre d'état vide à la fenêtre spécifiée par WindowID. Si #PB_Any est utilisé pour le paramètre '#BarreEtat', le numéro de la barre d'état sera renvoyé dans 'Resultat'. Si le 'Resultat' = 0, la création a échoué.
Lorsque la barre est créée, utilisez la fonction AddStatusBarField() pour lui ajouter différents champs.

Exemple:
  If OpenWindow(0, 0, 0, 440, 50, "StatusBar", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
    If CreateStatusBar(0, WindowID(0))
      AddStatusBarField(90)
      AddStatusBarField(100)
      AddStatusBarField(#PB_Ignore) ; dimensionne automatiquement ce champ
      AddStatusBarField(100)
    EndIf

    StatusBarText(0, 0, "Area normal")
    StatusBarText(0, 1, "Area borderless", #PB_StatusBar_BorderLess)
    StatusBarText(0, 2, "Area right & raised", #PB_StatusBar_Right | #PB_StatusBar_Raised)
    StatusBarText(0, 3, "Area centered", #PB_StatusBar_Center)

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


FreeStatusBar()

Syntaxe

FreeStatusBar(#BarreEtat)
Description
Efface et libère la barre d'état #BarreEtat.

Si #PB_All est spécifié, toutes les barres d'état restantes sont libérées.

Note: toutes les barres d'état restantes sont automatiquement libérées quand le programme se termine.


IsStatusBar()

Syntaxe

Resultat = IsStatusBar(#BarreEtat)
Description
Teste si la #BarreEtat est correctement initialisée. Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. Si le 'Résultat' est différent de zéro, alors cet objet est valide. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.


StatusBarHeight()

Syntaxe

Resultat = StatusBarHeight(#BarreEtat)
Description
Renvoie la hauteur (en pixels) de la #BarreEtat. C'est utile pour pouvoir calculer avec précision la hauteur d'une fenêtre comportant une barre d'état.


StatusBarID()

Syntaxe

StatusBarID = StatusBarID(#BarreEtat)
Description
Renvoie l'identifiant (Handle) unique de la fenêtre dans le système d'exploitation. Lire la page Numéros et Identifiants (Handles) pour plus d'informations.


StatusBarImage()

Syntaxe

StatusBarImage(#BarreEtat, Champ, ImageID [, Apparence])
Description
Ajoute ou remplace une image au champ spécifié. 'ImageID' peut être obtenu par LoadImage() ou ImageID(). Le paramètre 'Apparence' est facultatif et peut prendre les valeurs suivantes:
  #PB_StatusBar_Raised    : Bordure en relief élevé
  #PB_StatusBar_BorderLess: Sans bordure
  #PB_StatusBar_Center    : Texte centré
  #PB_StatusBar_Right     : Texte aligné à droite
Les options peuvent être combinées avec l'opérateur '|' (OR).

Exemple

  If OpenWindow(0, 0, 0, 340, 50, "StatusBarImage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
    If CreateStatusBar(0, WindowID(0))
      AddStatusBarField(120)
      AddStatusBarField(170)
    EndIf

    If LoadImage(0, "cube16.ico")     ; Changer le Chemin/NomFichier vers votre propre icône de 16x16 pixels.
      StatusBarImage(0, 0, ImageID(0))
      StatusBarImage(0, 1, ImageID(0), #PB_StatusBar_Right | #PB_StatusBar_Raised)
    EndIf

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


StatusBarProgress()

Syntaxe

StatusBarProgress(#StatusBar, Champ, Valeur [, Apparence [, Min, Max]])
Description
Affiche une barre de progression dans le 'Champ' de la '#BarreEtat'. La 'Valeur' indique la progression actuelle de la barre (relative au minimum et maximum). Pour mettre à jour cette valeur, il suffit de rappeler cette fonction avec une valeur différente.

Le paramètre 'Apparence' est facultatif et peut prendre les valeurs suivantes:
  #PB_StatusBar_Raised    : Bordure en relief élevé
  #PB_StatusBar_BorderLess: Sans bordure
Les paramètres 'Min' et 'Max' représentent les limites de la barre de progression. S'ils sont omis, ou si #PB_Ignore est spécifié, alors les valeurs précédentes seront utilisées. Les valeurs par défaut de 'Min' et 'Max' pour les champs nouvellement créés sont respectivement 0 et 100.

Exemple

  If OpenWindow(0, 0, 0, 340, 50, "Progression StatusBar", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
    If CreateStatusBar(0, WindowID(0))
      AddStatusBarField(120)
      AddStatusBarField(170)
    EndIf

    StatusBarText(0, 0, "ProgressBar !")
    StatusBarProgress(0, 1, 25)

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


StatusBarText()

Syntaxe

StatusBarText(#BarreEtat, Champ, Texte$ [, Apparence])
Description
Change le texte du 'Champ' spécifié de la '#BarreEtat'. Le paramètre 'Apparence' est facultatif et peut prendre les valeurs suivantes :
  #PB_StatusBar_Raised    : Bordure en relief élevé
  #PB_StatusBar_BorderLess: Sans bordure
  #PB_StatusBar_Center    : Texte centré
  #PB_StatusBar_Right     : Texte aligné à droite
Les options peuvent être combinées avec l'opérateur '|' (OR):
  #PB_StatusBar_BorderLess | #PB_StatusBar_Right : Champ sans bordure aligné à droite

CreateStatusBar() contient un exemple montrant l'utilisation de StatusBarText().


String

PureBasic - String

Généralités

La bibliothèque String vous permet d'effectuer des opérations courantes sur des chaînes de caractères.

Sommaire des commandes

Asc
Bin
Chr
CountString
FindString
Hex
InsertString
LCase
LSet
LTrim
Left
Len
Mid
RSet
RTrim
RemoveString
ReplaceString
ReverseString
Right
Space
Str
StrD
StrF
StrU
StringByteLength
StringField
Trim
UCase
Val
ValD
ValF
ValQ

Exemple

String.pb

OS Supportés

Tous

Guide de référence - Index


Asc()

Syntaxe

ValeurASCII = Asc(Chaine$)
Description
Renvoie la valeur ASCII du premier caractère d'une chaîne.

Arguments

Chaine$ La chaîne de caractère à utiliser.

Valeur de retour

Renvoie la valeur ASCII du premier caractère de la chaîne.

Si le programme est compilé en unicode, il renverra une valeur de caractère unicode, sinon il renverra une valeur de caractère ASCII.

Remarques

Vous trouverez une table ASCII ici.

Il est également possible d'obtenir la valeur ASCII d'un caractère (et non d'une chaîne) en le plaçant entre des apostrophes.

Exemple

  Debug Asc("!") ; Affichera la valeur 33

Voir aussi

Chr()


Bin()

Syntaxe

Resultat$ = Bin(Valeur.q [, Type])
Description
Convertit un nombre entier en un nombre binaire.

Arguments

Valeur.q Un nombre entier de type 'quad' (8 octets).
Type (optionnel) Permet de traiter la 'Valeur' comme un type différent:
  #PB_Byte   : La valeur sera traitée comme un 'byte' (0 à 255)
  #PB_Ascii  : La valeur sera traitée comme un 'caractère ascii' (0 à 255)
  #PB_Word   : La valeur sera traitée comme un 'word' (0 à 65535)
  #PB_Unicode: La valeur sera traitée comme un 'caractère unicode' (0 à 65535)
  #PB_Long   : La valeur sera traitée comme un 'long' (0 à 4294967296)
  #PB_Quad   : La valeur sera traitée comme un 'quad' (0 à 18446744073709551615)

Valeur de retour

Convertit une valeur numérique de type 'quad' en chaîne en utilisant la représentation binaire.

Exemple

  Debug Bin(32) ; Affichera "100000"
  Debug Bin(1024*1024*1024*1024) ; Affichera "10000000000000000000000000000000000000000"

Note: Si des zéros supplémentaires sont nécessaires pour formater correctement le texte, il est possible d'utiliser RSet().

Exemple

  Debug RSet(Bin(32), 16, "0") ; Affichera "0000000000100000"

Voir aussi

Str(), Val(), Hex()


Chr()

Syntaxe

Texte$ = Chr(ValeurCaractere)
Description
Renvoie une chaîne obtenue avec la valeur du caractère donné.

Arguments

ValeurCaractere La valeur du caractère.

Cela peut être une valeur ASCII, ou une valeur Unicode si le programme est compilé en mode Unicode.

Valeur de retour

Renvoie une chaîne obtenue avec la valeur du caractère donné.

Remarques

Vous trouverez une table ASCII ici.

Exemple

  Debug Chr(33) ; Affichera le caractère "!"

Voir aussi

Asc(), Val()


CountString()

Syntaxe

Resultat = CountString(Chaine$, ChaineATrouver$)
Description
Renvoie le nombre d'occurences d'une sous-chaîne dans une chaîne de caractères.

Arguments

Chaine$ | La chaîne de caractère à utiliser.
ChaineATrouver$ | La chaîne de caractère à trouver.

Valeur de retour

Renvoie le nombre d'occurences de la 'ChaineATrouver$' dans la 'Chaine$'.

Remarques

Cette fonction ne raisonne pas sur des mots, donc si la 'ChaineATrouver$' se trouve à l'intérieur d'un mot, elle sera comptabilisée quand même, comme le prouve l'exemple suivant.

Exemple

  Resultat = CountString("Combien de 'ien' contient le mot chien ?", "ien") ; Le résultat sera 4

Voir aussi

FindString(),
InsertString(),
RemoveString(),
ReplaceString(),
ReverseString(),
StringByteLength(),
StringField()


FindString()

Syntaxe

Position = FindString(Chaine$, ChaineCherchee$ [, PositionDepart] [, Mode]])
Description
Cherche une sous-chaîne dans une chaîne de caractères.

Arguments

Chaine$ | La chaîne de caractère à utiliser.
ChaineCherchee$ | La chaîne de caractère à trouver.
PositionDepart (optionnel) Position du caractère à partir de laquelle la recherche commence.

L'indice du premier caractère valide est 1.

Si ce paramètre n'est pas spécifié, la chaîne entière est recherchée.
Mode (optionnel) Peut être une des valeurs suivantes:
  #PB_String_CaseSensitive: Recherche sensible à la casse (A <> a) (par défaut).
  #PB_String_NoCase       : Recherche insensible à la casse (A = a).

Valeur de retour

Si 'ChaineCherchee$' est trouvée, sa position, en nombre de caractères commençant à 1, est renvoyée dans 'Position' sinon zéro est renvoyé.

Exemple

  Position = FindString("PureBasic", "Bas") ; 'Position' recevra la valeur 5

Voir aussi

CountString(),
InsertString(),
RemoveString(),
ReplaceString(),
ReverseString(),
StringByteLength(),
StringField()


Hex()

Syntaxe

Resultat$ = Hex(Valeur.q [, Type])
Description
Convertit un entier en une valeur hexadécimal.

Arguments

Valeur.q Un entier de type 'quad'.
Type (optionnel)
  #PB_Byte   : La valeur est un octet (8-bit) allant de 0 à 255
  #PB_Ascii  : La valeur est un octet (8-bit) allant de 0 à 255
  #PB_Word   : La valeur est un word (16-bit) allant de 0 à 65535
  #PB_Unicode: La valeur est un word (16-bit) allant de 0 à 65535
  #PB_Long   : La valeur est un long (32-bit) allant de 0 à 4294967295
  #PB_Quad   : La valeur est un quad (64-bit) allant de 0 à 18446744073709551615

Valeur de retour

Convertit une valeur numérique de type 'quad' en une chaîne de caractères au format hexadécimal.

Exemple

  Debug Hex(-1)
  Debug Hex(-1, #PB_Byte)
  Debug Hex(-1, #PB_Word)
  Debug Hex(-1, #PB_Long)
  Debug Hex(-1, #PB_Quad)    ;  Quad est la valeur par défaut.
  Debug Hex(12) ; Affichera "C"
  Debug Hex(1234567890) ; Affichera "499602D2"
Note: Si des zéros supplémentaires sont nécessaires pour formater correctement le texte, il est possible d'utiliser RSet():
  Debug RSet(Hex(12), 4, "0") ; Affichera "000C"

Voir aussi

Bin(),
Str(),
Val()


InsertString()

Syntaxe

Resultat$ = InsertString(Chaine$, ChaineAInserer$, Position)
Description
Insère une sous-chaîne dans une chaîne de caractères.

Arguments

Chaine$ | La chaîne de caractère à utiliser.
ChaineAInserer$ | La chaîne de caractère à inserer.
Position | La position d'insertion (commence à 1).

Valeur de retour

Insère la 'ChaineAInserer$' dans la 'Chaine$' à la 'Position' spécifiée.

Exemple

  Debug InsertString("Hello !", "World", 7)  ; Affichera "Hello World!"
  Debug InsertString("Hello !", "World", 1)  ; Affichera "WorldHello !"

Voir aussi

CountString(),
FindString(),
RemoveString(),
ReplaceString(),
ReverseString(),
StringByteLength(),
StringField()


LCase()

Syntaxe

Resultat$ = LCase(Chaine$)
Description
Convertit une chaîne en minuscules

Arguments

Chaine$ La chaîne de caractère à convertir.

Valeur de retour

Renvoie la chaîne convertie en lettres minuscules (quand c'est possible).

Remarques

Cette commande accepte les caractères accentués. Si un 'É' majuscule est trouvé, il sera transformé en un 'é' minuscule.

Exemple

  Debug LCase("PureBasic, LA PUISSANCE À L'ÉTAT PUR") ; Affichera "purebasic, la puissance à l'état pur"

Voir aussi

UCase()


LSet()

Syntaxe

Resultat$ = LSet(Chaine$, Longueur [, Caractere$])
Description
Ajuste la longueur d'une chaîne de caractères en y ajoutant des caractères en fin de chaîne si nécessaire pour atteindre la longueur spécifiée.

Arguments

Chaine$ | La chaîne de caractère à utiliser.
Longueur | Le nombre de caractères à ajouter.
Caractere$ (optionnel) | Peut être utilisé en lieu et place du caractère d'espacement qui est la valeur par défaut.

Valeur de retour

Renvoie une chaîne en y ajoutant des caractères en fin de chaîne si nécessaire pour atteindre la longueur spécifiée.

Remarques

Si la chaîne est plus longue que la longueur spécifiée, elle sera tronquée à partir du début de la chaîne.

Exemple

  Resultat$ = LSet("L", 8)          ; Resultat$ sera: "L       "
  Resultat$ = LSet("L", 8, "-")     ; Resultat$ sera: "L-------"
  Resultat$ = LSet("LongString", 4) ; Resultat$ sera: "Long"

Voir aussi

RSet()


LTrim()

Syntaxe

Resultat$ = LTrim(Chaine$ [, Caractere$])
Description
Supprime tous les espaces situés au début d'une chaîne.

Arguments

Chaine$ La chaîne de caractère à utiliser.
Caractere$ (optionnel) Supprimera tous les 'Caractere$' situés au début de la chaîne.

'Caractere$' doit être une chaine contenant seulement un caratère.

Valeur de retour

Renvoie une chaîne dont tous les espaces situés au début de la chaîne ont été supprimés.

Exemple

  Debug LTrim("   PureBasic   ")   ; Affichera "PureBasic   ".
  Debug LTrim("!!Hello Word", "!") ; Affichera "Hello World"

Voir aussi

RTrim(), Trim()


Left()

Syntaxe

Resultat$ = Left(Chaine$, Longueur)
Description
Renvoie la partie gauche d'une chaîne.

Arguments

Chaine$ | La chaîne de caractère à utiliser.
Longueur | Le nombre de caractères à renvoyer.

Valeur de retour

Renvoie les caractères de la partie gauche de la 'Chaine$'.

Remarques

Cette fonction renverra toute la chaîne si la longueur est supérieure à la taille de la chaîne de caractères.

Exemple

  Debug Left("PureBasic", 4) ; Affichera "Pure"

Voir aussi

Len(),
Mid(),
Right()


Len()

Syntaxe

Longueur = Len(Chaine$)
Description
Renvoie la longueur d'une chaîne.

Arguments

Chaine$ La chaîne de caractère à utiliser.

Valeur de retour

Renvoie la longueur en caractères de la chaîne.

Exemple

  a = Len("PureBasic") ; a recevra 9

Voir aussi

Left(),
Mid(),
Right()


Mid()

Syntaxe

Resultat$ = Mid(Chaine$, PositionDepart [, Longueur])
Description
Extrait une sous-chaîne d'une chaîne.

Arguments

Chaine$ | La chaîne de caractère à utiliser.
PositionDepart | La position de départ (commence à 1).
Longueur (optionnel) Précise combien de caractères seront extraits.

Si le paramètre 'Longueur' est omis, les caractères sont extraits jusqu'à la fin de la chaîne 'Chaine$'.

Valeur de retour

Renvoie une sous-chaîne de longueur 'Longueur', à partir du caractère situé à la position 'PositionDepart'.

Exemple

  Debug Mid("Hello", 2) ; Affichera "ello"
  Debug Mid("Hello", 2, 1) ; Affichera "e"

Voir aussi

Left(),
Len(),
Right()


RSet()

Syntaxe

Resultat$ = RSet(Chaine$, Longueur [, Caractere$])
Description
Ajuste la longueur de la chaîne de caractères en y ajoutant des caractères en début de chaîne si nécessaire pour atteindre la longueur spécifiée.

Arguments

Chaine$ | La chaîne de caractère à utiliser.
Longueur | La longueur de chaîne aà atteindre.
Caractere$ (optionnel) | Peut être utilisé en lieu et place du caractère d'espacement qui est la valeur par défaut.

Valeur de retour

Renvoie une chaîne en y ajoutant des caractères en début de chaîne si nécessaire pour atteindre la longueur spécifiée.

Remarques

Si la chaîne est plus longue que la longueur spécifiée, elle sera tronquée à partir du début de la chaîne.

Exemple

  Resultat$ = RSet("R", 8)          ; Le résultat est: "       R"
  Resultat$ = RSet("R", 8, "-")     ; Le résultat est: "-------R"
  Resultat$ = RSet("LongString", 4) ; Le résultat est: "Long"

Voir aussi

LSet()


RTrim()

Syntaxe

Resultat$ = RTrim(Chaine$ [, Caractere$])
Description
Supprime tous les espaces situés à la fin d'une chaîne.

Arguments

Chaine$ La chaîne de caractère à utiliser.
Caractere$ (optionnel) Supprimera tous les 'Caractere$' situés à la fin de la chaîne.

'Caractere$' doit être une chaine contenant seulement un caratère.

Valeur de retour

Renvoie une chaîne dont tous les espaces situés à la fin de la chaîne ont été supprimés.

Exemple

  Debug RTrim("   PureBasic   ")   ; Affichera "   PureBasic".
  Debug RTrim("Salut le Monde!!", "!") ; Affichera "Salut le Monde"

Voir aussi

LTrim(), Trim()


RemoveString()

Syntaxe

Chaine$ = RemoveString(Chaine$, ChaineASupprimer$ [, Mode [, Position [, NbOccurences]]])
Description
Supprime une sous-chaîne dans une chaîne.

Arguments

Chaine$ | La chaîne de caractère à utiliser.
ChaineASupprimer$ | La chaîne de caractère à supprimer.
Mode (optionnel) Peut être une combinaison des valeurs suivantes:
  #PB_String_CaseSensitive : La suppression est sensible à la casse (A<>a). Par défaut.
  #PB_String_NoCase        : La suppression est insensible à la casse (A=a).
Position (optionnel) Position du premier caractère à partir de laquel la suppression s'effectue.

La position du premier caractère est 1.
NbOccurences (optionnel) | Si le paramètre optionnel 'NbOccurences' est spécifié, la suppression s'arrêtera une fois 'NbOccurences' atteint.

Valeur de retour

Renvoie une chaîne dont toutes les occurrences ChaineASupprimer$ ont été supprimées.

Exemple

  Debug RemoveString("deviser de l'Art", "de")          ; Affichera "viser  l'Art"
  Debug RemoveString("deviser de l'Art", "de", 0, 1, 1) ; Affichera "viser de l'Art"

Voir aussi

CountString(),
FindString(),
InsertString(),
ReplaceString(),
ReverseString(),
StringByteLength(),
StringField()


ReplaceString()

Syntaxe

Texte$ = ReplaceString(Chaine$, ChaineCherchee$, ChaineRemplacee$ [, Mode [, PositionDepart [, NbOccurences]]])
Description
Remplace une sous-chaîne par une autre.

Arguments

Chaine$ | La chaîne de caractère à utiliser.
ChaineCherchee$ | La chaîne de caractère à substituée.
ChaineRemplacee$ | La chaîne de caractère de remplacement.
Mode (optionnel) Peut être une combinaison des valeurs suivantes:
  #PB_String_CaseSensitive : La suppression est sensible à la casse (A<>a). Par défaut.
  #PB_String_NoCase : Recherche les occurrences sans tenir compte de la casse (A=a).
  #PB_String_InPlace: Remplacement direct dans la Chaîne de caractères initiale 'Chaîne$'. Dans ce cas,
                      'ChaineRemplacee$' doit absolument avoir la même taille que 'ChaineCherchee$'.
                      C'est une fonctionnalité pour programmeurs expérimentés qui ont besoin d'une fonction
                      extrêmement rapide pour ce cas particulier. Quand cette option est utilisée, le résultat renvoyé par ReplaceString() doit être
                      ignoré (car c'est la chaîne de caractères passée en paramètre qui est modifiée).
PositionDepart (optionnel) Permet de spécifier à partir de quel caractère le remplacement doit être effectué.

Sa valeur minimale est 1.
NbOccurences (optionnel) | Si le paramètre optionnel 'NbOccurences' est spécifié, le remplacement s'arrêtera une fois 'NbOccurences' atteint.

Valeur de retour

Renvoie un chaîne dont toutes les occurrences 'ChaineCherchee$' ont été substituées par 'ChaineRemplacee$'.

Exemple

  Debug ReplaceString("deviser de l'Art", " de", " sur") ; Affichera "deviser sur l'Art"
  Debug ReplaceString("Salut les gens, Salut les gens", "SALUT", "ho non...", #PB_String_NoCase, 10) ; Affichera "Salut les gens, ho non... les gens"

  test$ = "Bundy, Barbie, Buddy"
  ReplaceString(test$, "B", "Z", #PB_String_InPlace, 1)  ; Tous les B seront remplacés par des Z  (Dans ce mode la chaîne de caractères passée en paramètre est modifiée)
  Debug test$   ; Affichera la chaîne de caractères modifiée.

Voir aussi

CountString(),
FindString(),
InsertString(),
RemoveString(),
ReverseString(),
StringByteLength(),
StringField()


ReverseString()

Syntaxe

Resultat$ = ReverseString(Chaine$)
Description
Inverse tous les caractères d'une chaîne.

Arguments

Chaine$ La chaîne de caractère à utiliser.

Valeur de retour

Inverse tous les caractères de la 'Chaine$'.

Le dernier caractère devient le premier caractère et ainsi de suite.

Exemple

  Debug ReverseString("Salut")  ; Affichera "tulaS"

Voir aussi

CountString(),
FindString(),
InsertString(),
RemoveString(),
ReplaceString(),
StringByteLength(),
StringField()


Right()

Syntaxe

Resultat$ = Right(Chaine$, Longueur)
Description
Renvoie la partie droite d'une chaîne.

Arguments

Chaine$ | La chaîne de caractère à utiliser.
Longueur | Le nombre de caractères renvoyés est déterminé par Longueur.

Valeur de retour

Renvoie les caractères de la partie droite de la chaîne 'Chaine$'.

Remarques

Cette fonction renverra toute la chaîne si la longueur est supérieure à la taille de la chaîne de caractères.

Exemple

  Debug Right("PureBasic", 5) ; Affichera "Basic".

Voir aussi

Left(),
Len(),
Mid()


Space()

Syntaxe

Resultat$ = Space(Longueur)
Description
Créé une chaîne de caractères de longueur 'Longueur' et contenant que des espaces.

Arguments

Longueur Le nombre d'espace à ajouter.

Valeur de retour

Renvoie une chaîne de caractères de longueur 'Longueur' et contenant que des espaces.

Exemple

  Debug Space(10) ; Affichera "           ".


Str()

Syntaxe

Resultat$ = Str(Valeur.q)
Description
Convertit un nombre entier de type 'quad' en une chaîne de caractères.

Arguments

Valeur.q Le nombre entier à convertir.

Valeur de retour

Renvoie une chaîne de caractères représentant la 'Valeur'.

Remarques

Les nombres à virgules doivent être convertis avec StrF() ou StrD() et les nombres entiers non signés avec StrU().

Exemple

  Valeur.q = 100000000000000001
  Debug "Résultat: " + Str(Valeur)

Voir aussi

Val(), Hex(), Bin(),
StrD(),
StrF(),
StrU(),
Val(),
ValD(),
ValF(),
ValQ()


StrD()

Syntaxe

Resultat$ = StrD(Valeur.d [, NombreDeDecimales])
Description
Convertit un nombre à virgule en double précision en une chaîne de caractères.

Arguments

Valeur.d Le nombre à virgule à convertir.
NombreDeDecimales (optionnel) Le nombre maximum de décimales, avec la suppression des zéros à droite, sinon le nombre sera arrondi à 10 décimales.

Le nombre sera arrondi si 'NombreDeDecimales' est plus petit que le nombre de décimales existantes dans 'Valeur.d'.

Valeur de retour

Renvoie une chaîne de caractères représentant la 'Valeur'.

Remarques

Les nombres entiers signés doivent être convertis avec Str() et les nombres entiers non signés avec StrU().
Il est possible d'omettre cette commande lors de la concaténation d'une chaîne et d'un 'double', cela utilisera alors le comportement par défaut de StrD().

Exemple

  valeur.d = 10.54
  Debug "Résultat: " + StrD(valeur)    ; Sans le 2ème paramètre, le nombre flottant est arrondi à 10 décimales.
  Debug "Résultat: " + StrD(valeur,2)  ; Résultat avec deux décimales, la valeur est arrondie.
  Debug "Résultat: " + StrD(valeur,0)  ; Résultat sans décimales, la valeur est arrondie.

Voir aussi

Str(),
StrF(),
StrU(),
Val(),
ValD(),
ValF(),
ValQ()

OS Supportés

Windows, Linux, MacOS X (x86)


StrF()

Syntaxe

Resultat$ = StrF(Valeur.f [, NombreDeDecimales])
Description
Convertit un nombre à virgule en une chaîne de caractères.

Arguments

Valeur.f Le nombre à virgule à convertir.
NombreDeDecimales (optionnel) Le nombre maximum de décimales, avec la suppression des zéros à droite, sinon le nombre sera arrondi à 10 décimales.

Le nombre sera arrondi si 'NombreDeDecimales' est plus petit que le nombre de décimales existantes dans 'Valeur.f'.

Valeur de retour

Renvoie une chaîne de caractères représentant la 'Valeur'.

Remarques

Les nombres entiers signés doivent être convertis avec Str() et les nombres entiers non signés avec StrU().
Il est possible d'omettre cette commande lors de la concaténation d'une chaîne et d'un 'float', cela utilisera alors le comportement par défaut de StrF().

Exemple

  valeur.f = 10.54
  Debug "Résultat: " + StrF(valeur)    ; Sans le 2ème paramètre, le nombre flottant est arrondi à 10 décimales.
  Debug "Résultat: " + StrF(valeur,2)  ; Résultat avec deux décimales, la valeur est arrondie.
  Debug "Résultat: " + StrF(valeur,0)  ; Résultat sans décimales, la valeur est arrondie.

Voir aussi

Str(),
StrD(),
StrU(),
Val(),
ValD(),
ValF(),
ValQ()


StrU()

Syntaxe

Resultat$ = StrU(Valeur.q, Type)
Description
Convertit un nombre entier non-signé en une chaîne de caractères.

Arguments

Valeur Le nombre entier à convertir.
Type
  #PB_Byte   : La valeur est un octet (8-bit) allant de 0 à 255
  #PB_Ascii  : La valeur est un octet (8-bit) allant de 0 à 255
  #PB_Word   : La valeur est un word (16-bit) allant de 0 à 65535
  #PB_Unicode: La valeur est un word (16-bit) allant de 0 à 65535
  #PB_Long   : La valeur est un long (32-bit) allant de 0 à 4294967295
  #PB_Quad   : La valeur est un quad (64-bit) allant de 0 à 18446744073709551615

Valeur de retour

Renvoie une chaîne de caractères représentant la 'Valeur'.

Remarques

Les nombres entiers signés doivent être convertis avec Str() et les nombres à virgules (float) avec StrF() ou StrD().

Exemple

  byte.b = 255
  Debug Str(byte) ; Affichera -1
  Debug StrU(byte, #PB_Byte) ; Affichera 255

Voir aussi

Str(),
StrD(),
StrF(),
Val(),
ValD(),
ValF(),
ValQ()


StringByteLength()

Syntaxe

Resultat = StringByteLength(Chaine$ [, Format])
Description
Renvoie le nombre d'octet nécessaire pour stocker une chaîne de caractères en mémoire.

Arguments

Chaine$ La chaîne de caractère à utiliser.
Format (optionnel)
  #PB_Ascii  : La chaine est considérée comme une chaine ASCII
  #PB_UTF8   : La chaine est considérée comme une chaine UTF-8
  #PB_Unicode: La chaine est considérée comme une chaine unicode
Si le paramètre 'Format' n'est pas spécifié, le format sera #PB_Unicode si le format de l'exécutable est en mode unicode, sinon il sera #PB_Ascii.
Note: le nombre d'octets renvoyé n'inclu pas le caractère 'nul' de fin de chaîne. La taille du caractère nul est de 1 octet en mode ASCII et UTF-8 et de 2 octets en mode unicode.

Valeur de retour

Renvoie le nombre d'octet nécessaire pour stocker la chaîne de caractères en mémoire en fonction du 'Format' spécifié.

Exemple

  Resultat = StringByteLength("ä", #PB_UTF8) ; Le Resultat sera 2

Voir aussi

CountString(),
FindString(),
InsertString(),
RemoveString(),
ReplaceString(),
ReverseString(),
StringField()


StringField()

Syntaxe

Resultat$ = StringField(Chaine$, Index, Delimiteur$)
Description
Renvoie un champ d'une chaîne à l'index spécifié.

Arguments

Chaine$ | La chaîne de caractère à utiliser.
Index La position du champ.

La première position est 1.
Delimiteur$ | La chaîne choisi comme séparateur des champs (plusieurs caractères de longueur autorisé).

Valeur de retour

Renvoie un champ d'une chaîne à l'index spécifié.

Exemple

For k=1 To 7
  Debug StringField("Je suis une chaîne contenant des champs", k, " ")
Next

Voir aussi

CountString(),
FindString(),
InsertString(),
RemoveString(),
ReplaceString(),
ReverseString(),
StringByteLength()


Trim()

Syntaxe

Resultat$ = Trim(Chaine$ [, Caractere$])
Description
Supprime tous les espaces situés au début et à la fin de la chaîne de caractères.

Arguments

Chaine$ La chaîne de caractère à utiliser.
Caractere$ (optionnel) S'il est spécifié, cela supprimera tous les 'Caractere$' situés au début et à la fin de la chaîne.

'Caractere$' doit être une chaine contenant seulement un caratère.

Valeur de retour

Renvoie une chaîne de caractère dont tous les espaces situés au début et à la fin ont été supprimée.

Exemple

  Debug Trim("   PureBasic   ") ; Affichera "PureBasic".
  Debug Trim("!!Salut!!", "!")  ; Affichera "Salut"

Voir aussi

LTrim(), RTrim()


UCase()

Syntaxe

Resultat$ = UCase(Chaine$)
Description
Convertit une chaîne en majuscule.

Arguments

Chaine$ La chaîne de caractère à utiliser.

Valeur de retour

Renvoie dans Resultat$ la chaîne 'Chaine$' convertie en lettres majuscules (quand c'est possible).

Cette commande accepte les caractères accentués. Si un 'é' minuscule est trouvé, il sera transformé en un 'É' majuscule.

Exemple

  Debug UCase("PureBasic, La puissance à l'état pur") ; Affichera "PUREBASIC, LA PUISSANCE À L'ÉTAT PUR"

Voir aussi

LCase()


Val()

Syntaxe

Resultat = Val(Chaine$)
Description
Convertit une chaîne en une valeur numérique.

Arguments

Chaine$ La chaîne de caractère à utiliser.

Valeur de retour

Renvoie une valeur numérique entière.

La chaîne doit représenter un entier au format décimal, hexadécimal (avec le préfixe '$') ou binaire (avec le préfixe '%').
La conversion s'arrêtera au premier caractère non numérique.

Remarques

Les chaînes représentant une valeur flottante devraient être converties avec ValF(), des doubles avec ValD() et des quads avec ValQ().

Exemple

  Debug Val("1024")  ; Affichera 1024.
  Debug Val("$FF")   ; Affichera 255.
  Debug Val("%1000") ; Affichera 8.

Voir aussi

Str(),
StrD(),
StrF(),
ValD(),
ValF(),
ValQ()


ValD()

Syntaxe

Resultat.d = ValD(Chaine$)
Description
Convertit une chaîne en une valeur numérique de type 'Double'.

Arguments

Chaine$ La chaîne de caractère à utiliser.

Valeur de retour

Renvoie une valeur numérique de type 'Double'.

La chaîne doit représenter un double au format décimal.
La conversion s'arrêtera au premier caractère non numérique.

Remarques

Les chaînes représentant un entier 'long' peuvent également être converties avec Val(), des nombres flottants 32-bit avec ValF() (avec moins de précision que ValD()) et des quads avec ValQ().

Exemple

  Resultat.d = ValD("10.000024") ; Resultat recevra la valeur 10.000024.

Voir aussi

Str(),
StrD(),
StrF(),
StrU(),
Val(),
ValF(),
ValQ()

OS Supportés

Windows, Linux, MacOS X (x86)


ValF()

Syntaxe

Resultat.f = ValF(Chaine$)
Description
Convertit une chaîne en une valeur numérique de type 'Float'.

Arguments

Chaine$ La chaîne de caractère à utiliser.

Valeur de retour

Renvoie une valeur numérique de type 'Float'

La chaîne doit représenter un float au format décimal.
La conversion s'arrêtera au premier caractère non numérique.

Remarques

Les chaînes représentant un entier long peuvent également être converties avec Val(), des nombres flottants 64-bit avec ValD() (avec plus de précision que ValF()) et des quads avec ValQ().

Exemple

  Resultat.f = ValF("10.24") ; Resultat recevra la valeur 10.23999977111816.

Voir aussi

Str(),
StrD(),
StrF(),
StrU(),
Val(),
ValD(),
ValQ()


ValQ()

Syntaxe

Resultat.q = ValQ(Chaine$)
Description
Convertit une chaîne en une valeur numérique de type 'Quad'.

Arguments

Chaine$ La chaîne de caractère à utiliser.

Valeur de retour

Renvoie une valeur numérique entière de type 'Quad'.

La chaîne doit représenter un entier au format décimal, hexadécimal (avec le préfixe '$') ou binaire (avec le préfixe '%').

Remarques

Les chaînes représentant un entier long peuvent également être converties avec Val(), des nombres flottants 32-bit avec ValF() et des nombres flottants 64-bit avec ValD().

Exemple

  Debug ValQ("1024102410241024") ; Affichera '1024102410241024'.
  Debug ValQ("$10FFFFFFFF")      ; Affichera '73014444031'.
  Debug ValQ("%1000")            ; Affichera '8'.

Voir aussi

Str(),
StrD(),
StrF(),
StrU(),
Val(),
ValD(),
ValF()


SysTray

PureBasic - SysTray

Généralités

SysTray est une zone de notification située à droite de la barre des tâches Windows. Elle contient souvent les icônes des programmes résidents (antivirus...) et l'horloge. PureBasic gère l'accès à cette zone et vous permet d'ajouter un nombre quelconque d'icônes.

Sommaire des commandes

AddSysTrayIcon
ChangeSysTrayIcon
IsSysTrayIcon
RemoveSysTrayIcon
SysTrayIconToolTip

Exemple

SysTray.pb

OS Supportés

Tous

Guide de référence - Index


AddSysTrayIcon()

Syntaxe

AddSysTrayIcon(#SysTrayIcone, FenetreID, ImageID)
Description
Ajoute une icône dans la zone de notification.

Arguments

#SysTrayIcone Le numéro de la nouvelle icône.

Si #PB_Any est utilisé pour le paramètre '#SysTrayIcone', le numéro de la nouvelle icône sera renvoyé dans 'Resultat'.
FenetreID L'identifiant système de la fenêtre.

Peut être obtenu avec la fonction WindowID().
ImageID Numéro de l'image préalablement chargée par la fonction LoadImage().

Les images de type (.ico) ne sont supportées que sous Windows, pour Linux utilisez une image au format PNG.
Le format PNG a l'avantage d'utiliser la transparence.

Un ImageID valide peut être obtenu simplement avec la fonction ImageID().

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Quand un évènement intervient sur une icône de la zone SysTray, l'évènement #PB_Event_SysTray est renvoyé. EventGadget() peut alors être utilisé pour connaître l'icône cliquée.
La fonction EventType() est également mise à jour par cette fonction.

Toutes vos icônes SysTray sont automatiquement supprimées à la fin du programme.

Voir aussi

RemoveSysTrayIcon()


ChangeSysTrayIcon()

Syntaxe

ChangeSysTrayIcon(#SysTrayIcone, ImageID)
Description
Change une icône de la zone de notification.

Arguments

#SysTrayIcone Le numéro de l'icône à changer.
ImageID Numéro de la nouvelle image préalablement chargée par la fonction LoadImage().

Les images de type (.ico) ne sont supportées que sous Windows, pour Linux utilisez une image au format PNG.
Le format PNG a l'avantage d'utiliser la transparence.

Un ImageID valide peut être obtenu simplement avec la fonction ImageID().

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

AddSysTrayIcon(), RemoveSysTrayIcon()


IsSysTrayIcon()

Syntaxe

Resultat = IsSysTrayIcon(#SysTrayIcone)
Description
Teste si une icône de la zone de notification est correctement initialisée.

Arguments

#SysTrayIcone Le numéro de l'icône.

Valeur de retour

Si le 'Résultat' est différent de zéro alors cet objet est valide.

Remarques

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.

C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

AddSysTrayIcon()


RemoveSysTrayIcon()

Syntaxe

RemoveSysTrayIcon(#SysTrayIcone)
Description
Supprime une icône de la zone de notification.

Arguments

#SysTrayIcone Le numéro de l'icône à supprimer.

Si #PB_All est spécifié, toutes les icônes SysTray restantes sont libérées.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Toutes les icônes restantes sont automatiquement supprimées quand le programme se termine.

Voir aussi

AddSysTrayIcon()


SysTrayIconToolTip()

Syntaxe

SysTrayIconToolTip(#SysTrayIcone, Texte$)
Description
Associe un texte flottant (bulle d'aide) à une icône de la zone de notification.

Arguments

#SysTrayIcone | Le numéro de l'icône.
Texte$ | 'Tooltip' ou texte flottant qui apparaît au bout d'un certain temps lorsque le curseur de la souris est immobile au dessus de l'icône.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

AddSysTrayIcon()


System

PureBasic - System

Généralités

La bibliothèque système offre l'accès à certaines informations spécifiques au système, comme le nombre de processeurs, la quantité de mémoire disponible, etc.

Sommaire des commandes

ComputerName
CountCPUs
MemoryStatus
UserName

Exemple

System.pb

OS Supportés

Tous

Guide de référence - Index


ComputerName()

Syntaxe

Resultat$ = ComputerName()
Description
Renvoie le nom de l'ordinateur.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le nom de l'ordinateur.

Exemple

  Debug "Nom de l'ordinateur : " + ComputerName()


CountCPUs()

Syntaxe

Resultat = CountCPUs(Type)
Description
Renvoie le nombre de core du microprocesseur.

Arguments

Type Peut être une des valeurs suivantes:
  #PB_System_CPUs        : Le nombre total de coeurs du processeur installés sur l'ordinateur.
  #PB_System_ProcessCPUs : Le nombre de coeurs du processeur disponibles pour le processus en cours.
                           Ceci est utile car le système d'exploitation peut obliger un processus à
                           n'utiliser qu'un petit nombre de CPU.

Valeur de retour

Renvoie le nombre de core du microprocesseur.

Exemple

  Debug "Le nombre total de coeurs du processeur installé sur l'ordinateur: " + CountCPUs(#PB_System_CPUs)
  Debug "Le nombre de coeurs du processeur disponibles pour le processus en cours: " + CountCPUs(#PB_System_ProcessCPUs)


MemoryStatus()

Syntaxe

Resultat.q = MemoryStatus(Type)
Description
Renvoie les informations sur un type de mémoire demandé.

Arguments

Type Le type de mémoire à tester. Peut être une des valeurs suivantes:
  #PB_System_TotalPhysical: La quantité totale de mémoire installée, en octets.
  #PB_System_FreePhysical : La mémoire disponible, en octets.
  #PB_System_TotalVirtual : La taille de la mémoire virtuelle totale, en octets (Windows uniquement).
  #PB_System_FreeVirtual  : La taille de la mémoire virtuelle disponible, en octets (Windows uniquement).
  #PB_System_TotalSwap    : La taille de la mémoire de swap total, en octets (Windows et Linux uniquement).
  #PB_System_FreeSwap     : La taille de la mémoire de swap disponible, en octets (Windows et Linux uniquement).
  #PB_System_PageSize     : La taille de la page mémoire, en octets (généralement 4 Ko).

Valeur de retour

Renvoie les informations sur le type de mémoire spécifiée.

Exemple

  Debug "La quantité totale de mémoire installée, en octets: " + MemoryStatus(#PB_System_TotalPhysical)
  Debug "La mémoire disponible, en octets: " + MemoryStatus(#PB_System_FreePhysical)
  Debug "La taille de page mémoire, en octets (généralement 4 Ko): " + MemoryStatus(#PB_System_PageSize)
  ;(Windows et Linux uniquement)
  ;Debug "La taille de la mémoire de swap total, en octets (Windows et Linux uniquement): " + MemoryStatus(#PB_System_TotalSwap)
  ;Debug "La taille de la mémoire de swap disponible, en octets (Windows et Linux uniquement): " + MemoryStatus(#PB_System_FreeSwap)
  ;(Windows uniquement)
  ;Debug "La taille de la mémoire virtuelle totale, en octets (Windows uniquement): " + MemoryStatus(#PB_System_TotalVirtual)
  ;Debug "La taille de la mémoire virtuelle disponible, en octets (Windows uniquement): " + MemoryStatus(#PB_System_FreeVirtual)


UserName()

Syntaxe

Resultat$ = UserName()
Description
Renvoie le nom de l'utilisateur en cours.

Arguments

Cette fonction n'a pas de paramètre.

Valeur de retour

Renvoie le nom de l'utilisateur actuellement loggé.

Exemple

  Debug "Utilisateur actuellement connecté: " + UserName()


Terrain

PureBasic - Terrain

Généralités

Les terrains sont des scènes 3D extérieures qui simulent un environnement naturel réaliste basé sur des plans en 2D pré-calculés.

Ils sont utiles dans de nombreux cas, comme par exemple les jeux de simulation en 3D.

InitEngine3D() doit être appelé avec succès avant l'utilisation des commandes 'Terrain'.

Il est possible de créer un terrain gigantesque (La taille est fonction de la puissance de l'ordinateur) en réunissant plusieurs 'parcelles' plus petites appelées 'tiles'.

Sommaire des commandes

AddTerrainTexture
BuildTerrain
CreateTerrain
DefineTerrainTile
FreeTerrain
GetTerrainTileHeightAtPoint
GetTerrainTileLayerBlend
SaveTerrain
SetTerrainTileHeightAtPoint
SetTerrainTileLayerBlend
SetupTerrains
TerrainHeight
TerrainLocate
TerrainMousePick
TerrainPhysicBody
TerrainRenderMode
TerrainTileHeightAtPosition
TerrainTileLayerMapSize
TerrainTilePointX
TerrainTilePointY
TerrainTileSize
UpdateTerrain
UpdateTerrainTileLayerBlend

Exemple

Terrain.pb
TerrainBlend.pb
TerrainHeight.pb
TerrainPhysic.pb
TerrainShadow.pb

OS Supportés

Tous

Guide de référence - Index


AddTerrainTexture()

Syntaxe

AddTerrainTexture(#Terrain, Couche, TailleMonde, NomCarteDiffusionSpeculaire$, NomCarteHauteurNormale$)
Description
Ajoute une texture au terrain.

Arguments

#Terrain | Le terrain à utiliser.
Couche L'indice de la couche (calque) sur laquelle la texture est appliquée.

L'indice de la première couche commence à 0.

Le nombre maximum de couches est défini lors de la création du terrain, voir CreateTerrain().
TailleMonde | La taille du monde de la texture.
NomCarteDiffusionSpeculaire$ Le nom de la carte (image) de diffusion spéculaire à appliquer sur cette couche.

Le mot spéculaire désigne la direction dans laquelle la lumière se réfléchit d'après les lois de Descartes.
NomCarteHauteurNormale$ | Le nom de la carte (image) de hauteur normale (perpendiculaire) à appliquer sur cette couche.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateTerrain()


BuildTerrain()

Syntaxe

BuildTerrain(#Terrain)
Description
Construit un terrain.

Arguments

#Terrain Le terrain à construire.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Avant de construire un terrain, les parcelles doivent être définies par DefineTerrainTile() et les textures ajoutées avec AddTerrainTexture().

Voir aussi

CreateTerrain(), DefineTerrainTile(), AddTerrainTexture()


CreateTerrain()

Syntaxe

Resultat = CreateTerrain(#Terrain, Taille, TailleMonde, Echelle, NbCouches, NomFichier$, Extension$)
Description
Crée un nouveau terrain.

Arguments

#Terrain Le numéro d'identification du nouveau terrain.

Si #PB_Any est utilisé à la place de '#Gadget' alors le numéro du nouveau gadget sera renvoyé dans 'Resultat'.
Taille | La taille du nouveau terrain (moins une arête).
TailleMonde | La taille du monde du nouveau terrain.
Echelle | Le facteur d'échelle à appliquer au nouveau terrain.
NbCouches Le nombre de couches de texture du nouveau terrain.

Pour ajouter une couche de texture, utilisez AddTerrainTexture().
NomFichier$ Le nom du fichier (sans l'extension) pour stocker les données de terrain précalculées.

Comme le terrain peut être complexe et prendre beaucoup de temps pour sa création, un cache sera écrit sur le disque et rechargé automatiquement s'il est présent (et non périmés).
Extension$ | L'extension utilisée par les fichiers de données.

Valeur de retour

Renvoie une valeur non nulle en cas de succès et zéro en cas d'échec.

Si #PB_Any a été utilisé pour le paramètre #Terrain alors la valeur de retour est le numéro d'identification du terrain, généré automatiquement.

Remarques

SetupTerrains() doit être appelé auparavant pour régler les paramètres par défaut du nouveau terrain. Après la création du terrain, de nouvelles parcelles (tiles) peuvent être définies par DefineTerrainTile() et les textures peuvent être appliquées avec AddTerrainTexture(). Une fois la définition du terrain terminée, BuildTerrain() doit être appelé pour le construire.

Voir aussi

FreeTerrain(), SetupTerrains(), BuildTerrain(), DefineTerrainTile(), AddTerrainTexture()


DefineTerrainTile()

Syntaxe

DefineTerrainTile(#Terrain, ParcelleX, ParcelleY, NomCarteHauteur$, RetournementX, RetournementY)
Description
Définit le contenu d'une parcelle du terrain final.

Arguments

#Terrain Le terrain à utiliser.
ParcelleX, ParcelleY L'indice en x et en y de la parcelle, par rapport à la parcelle centrale du terrain.

La parcelle centrale commence à 0.0.

La valeur peut être négative.
RetournementX, RetournementY
  #True : L'image sera renversée.
  #False: Aucun retournement ne sera effectué.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateTerrain()


FreeTerrain()

Syntaxe

FreeTerrain(#Terrain)
Description
Libère un terrain et toute la mémoire associée.

Arguments

#Terrain Le terrain à libérer.

Si #PB_All est spécifié, tous les terrains restants sont libérés.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Ce terrain ne doit pas être utilisé en utilisant son numéro avec les autres fonctions de cette bibliothèque, après l'appel de cette fonction, à moins de le créer à nouveau.

Tous les terrains restants sont automatiquement libérés lorsque le programme se termine.

Voir aussi

CreateTerrain()


GetTerrainTileHeightAtPoint()

Syntaxe

Resultat = GetTerrainTileHeightAtPoint(#Terrain, ParcelleX, ParcelleY, x, y)
Description
Renvoie la hauteur de la parcelle au point spécifié.

Arguments

#Terrain | Le terrain à utiliser.
ParcelleX, ParcelleY | L'indice 'x' et 'y' de la parcelle.
x, y | La position en 'x' et en 'y' dans la parcelle, en pixels.

Valeur de retour

Renvoie la hauteur de la parcelle de terrain, dans l'unité du monde, aux coordonnées spécifiées.

Voir aussi

CreateTerrain(), DefineTerrainTile()


GetTerrainTileLayerBlend()

Syntaxe

Resultat = GetTerrainTileLayerBlend(#Terrain, ParcelleX, ParcelleY, Couche, x, y)
Description
Renvoie la valeur de mélange de la couche de la parcelle d'un terrain à la position spécifiée.

Arguments

#Terrain | Le terrain à utiliser.
ParcelleX, ParcelleY | L'indice 'x' et 'y' de la parcelle.
Couche L'indice de la couche.

L'indice de la première couche commence à 0.

Le nombre maximum de couches est définie lors de la création du terrain, voir CreateTerrain().
x, y | La position dans la parcelle, en pixels, de la valeur de mélange.

Valeur de retour

Renvoie la valeur de mélange de la couche de la parcelle à la position spécifiée.

La valeur de mélange varie de 0.0 (entièrement transparent) à 1.0 (complètement opaque).

Voir aussi

CreateTerrain()


SaveTerrain()

Syntaxe

SaveTerrain(#Terrain, Modification)
Description
Enregistre le terrain sur disque en utilisant le nom de fichier et l'extension définis par CreateTerrain().

Arguments

#Terrain Le terrain à sauvegarder.
Modification
  #True : Le terrain ne sera sauvé que s'il a été modifié depuis la dernière sauvegarde.
  #False: Il sera toujours sauvé.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateTerrain()


SetTerrainTileHeightAtPoint()

Syntaxe

SetTerrainTileHeightAtPoint(#Terrain, ParcelleX, ParcelleY, x, y, Hauteur)
Description
Définit la hauteur de la parcelle d'un terrain aux coordonnées spécifiées.

Arguments

#Terrain | Le terrain à utiliser.
ParcelleX, ParcelleY | L'indice 'x' et 'y' de la parcelle.
x, y | La position en 'x' et en 'y' dans la parcelle, en pixels.
Hauteur | La nouvelle hauteur du terrain, dans l'unité du monde, à la position spécifiée dans la parcelle.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le changement ne sera pas pris en compte immédiatement, UpdateTerrain() doit être appelé une fois toutes les modifications faites.

Voir aussi

CreateTerrain(), GetTerrainTileHeightAtPoint(), UpdateTerrain()


SetTerrainTileLayerBlend()

Syntaxe

SetTerrainTileLayerBlend(#Terrain, ParcelleX, ParcelleY, Couche, x, y, Valeur)
Description
Définit la valeur de mélange de la couche de la parcelle du terrain à la position spécifiée.

Arguments

#Terrain | Le terrain à utiliser.
ParcelleX, ParcelleY | L'indice 'x' et 'y' de la parcelle.
Couche L'indice de la couche.

L'indice de la première couche commence à 0.

Le nombre maximum de couches est défini lors de la création du terrain, voir CreateTerrain().
x, y | La position dans la parcelle, en pixels, de la valeur de mélange.
Valeur La valeur de mélange de couche de parcelle du terrain à la position spécifiée.

La valeur de mélange varie de 0.0 (entièrement transparent) à 1.0 (complètement opaque).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Le changement ne sera pas pris en compte immédiatement, UpdateTerrainTileLayerBlend() doit être appelé une fois toutes les modifications éffectuées.

Voir aussi

CreateTerrain()


SetupTerrains()

Syntaxe

SetupTerrains(LumiereID, DistanceCarteComposite, Options)
Description
Configuration des paramètres par défaut pour tous les futurs terrains.

Arguments

LumiereID La lumière à utiliser pour le rendu du terrain.

Pour obtenir un identifiant valide, utilisez LightID().
DistanceCarteComposite La distance à laquelle on commence à utiliser une carte composite si elle est présente, dans l'unité du monde.
Options Peut être une combinaison des valeurs suivantes:
  #PB_Terrain_Lightmap     : Active la carte allégée pour les terrains (une texture avec des ombres statiques).
  #PB_Terrain_NormalMapping: Active le mapping normal pour les terrains. Il s'agit d'une texture spéciale
                             qui simule le relief, comme les petits rochers, etc.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateTerrain()


TerrainHeight()

Syntaxe

Resultat = TerrainHeight(#Terrain, x, z)
Description
Renvoie la hauteur d'un terrain à la position spécifiée dans le monde.

Arguments

#Terrain | Le terrain à utiliser.
x, z | La position en 'x' et en 'z' dans le monde (en unité du monde) de la hauteur du terrain.

Valeur de retour

Renvoie la hauteur du terrain (en unité du monde) à la position spécifiée.

Si le terrain ne se trouve pas à la position spécifiée, le résultat sera nul.

Voir aussi

CreateTerrain()


TerrainLocate()

Syntaxe

TerrainLocate(#Terrain, x, y, z)
Description
Modifie l'emplacement absolu d'un terrain dans le monde.

Arguments

#Terrain | Le terrain à utiliser.
x, y, z | Nouvel emplacement absolu dans le monde (dans l'unité du monde).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateTerrain()


TerrainMousePick()

Syntaxe

Resultat = TerrainMousePick(#Terrain, CameraID, x, y)
Description
Simule un clic de souris sur un terrain au point 2D spécifié sur la caméra spécifiée.

Arguments

#Terrain | Le terrain à utiliser.
CameraID La caméra à utiliser.

Pour obtenir un identifiant valide, voir CameraID().
x, y | La position du point ,en pixels, dans le champs de la caméra.

Valeur de retour

Si le terrain a reçu un clic simulé de souris, 'Resultat' vaudra #True, sinon il vaudra #False.

Pour obtenir des informations sur la position du clic, utilisez PickX(), PickY() et PickZ().

Voir aussi

CreateTerrain(), CreateCamera()


TerrainPhysicBody()

Syntaxe

TerrainPhysicBody(#Terrain, Restitution, Friction)
Description
Ajoute un corps physique statique au terrain.

Arguments

#Terrain Le terrain à utiliser.
Restitution Le facteur de restitution.

Si défini à 0.0, le terrain ne restituera aucune force, ce qui signifie que l'objet qui entre en collision avec lui ne rebondira pas sur le terrain. Avec une valeur supérieure à 0.0, il restituera une certaine force à l'objet qui va rebondir en cas de collision avec le terrain. Plus la valeur du coefficient de restitution est élevée et plus le rebond sera important.
Friction La force de frottement.

Si défini à 0.0, l'objet glissera sur le terrain sans perdre de force. Avec une valeur supérieure à 0.0, l'objet perdra de la vitesse (freinage) en cas de collision avec le terrain. Plus la valeur de la force de frottement est élevée et plus la vitesse décroît rapidement (décélération).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cela permet aux objets physiques d'entrer en collision avec le terrain.

Voir aussi

CreateTerrain()


TerrainRenderMode()

Syntaxe

TerrainRenderMode(#Terrain, Options)
Description
Modifie la façon dont le terrain est rendu.

Arguments

#Terrain Le terrain à utiliser.
Options Peut être une combinaison des valeurs suivantes:
  #PB_Terrain_CastShadows   : Active la projection des ombres dynamiques sur le terrain (peut être lent).
  #PB_Terrain_LowLODShadows : Active la projection des ombres de faible qualité (pour avoir un rendu plus rapide).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateTerrain()


TerrainTileHeightAtPosition()

Syntaxe

Resultat = TerrainTileHeightAtPosition(#Terrain, ParcelleX, ParcelleY, Couche, x, y)
Description
Renvoie la hauteur de la parcelle d'un terrain aux coordonnées spécifiées.

Arguments

#Terrain | Le terrain à utiliser.
ParcelleX, ParcelleY | L'indice 'x' et 'y' de la parcelle.
Couche L'indice de la couche.

L'indice de la première couche commence à 0.

Le nombre maximum de couches est défini lors de la création du terrain, voir CreateTerrain().
x, y | La position en 'x' et en 'y' dans la parcelle, en pixels, de la hauteur du terrain.

Valeur de retour

Renvoie la hauteur de la parcelle du terrain (dans l'unité du monde) aux coordonnées spécifiées.

Voir aussi

CreateTerrain()


TerrainTileLayerMapSize()

Syntaxe

Resultat = TerrainTileLayerMapSize(#Terrain, ParcelleX, ParcelleY)
Description
Renvoie la taille de la carte de mélange des couches de la parcelle d'un terrain.

Arguments

#Terrain | Le terrain à utiliser.
ParcelleX, ParcelleY | L'indice 'x' et 'y' de la parcelle.

Valeur de retour

Renvoie la taille (en pixels) de la carte de mélange du terrain.

Comme la carte de couche de mélange est toujours carrée, la taille correspond à la largeur et à la hauteur.

Voir aussi

CreateTerrain(), DefineTerrainTile()


TerrainTilePointX()

Syntaxe

Resultat = TerrainTilePointX(#Terrain, ParcelleX, ParcelleY, x, y, z)
Description
Renvoie la position 'x' du point (x,y,z) dans la parcelle d'un terrain.

Arguments

#Terrain | Le terrain à utiliser.
ParcelleX, ParcelleY | L'indice 'x' et 'y' de la parcelle.
x, y, z | La position en du point dans le monde, en unité du monde.

Valeur de retour

Renvoie la position en 'x', en pixels, du point dans la parcelle du terrain.

Voir aussi

CreateTerrain(), DefineTerrainTile()


TerrainTilePointY()

Syntaxe

Resultat = TerrainTilePointY(#Terrain, ParcelleX, ParcelleY, x, y, z)
Description
Renvoie la position 'y' du point (x,y,z) dans la parcelle d'un terrain.

Arguments

#Terrain | Le terrain à utiliser.
ParcelleX, ParcelleY | L'indice 'x' et 'y' de la parcelle.
x, y, z | La position en du point dans le monde, en unité du monde.

Valeur de retour

Renvoie la position en 'y', en pixels, du point dans la parcelle du terrain.

Voir aussi

CreateTerrain(), DefineTerrainTile()


TerrainTileSize()

Syntaxe

Resultat = TerrainTileSize(#Terrain, ParcelleX, ParcelleY)
Description
Renvoie la taille de la parcelle du terrain.

Arguments

#Terrain | Le terrain à utiliser.
ParcelleX, ParcelleY | L'indice 'x' et 'y' de la parcelle.

Valeur de retour

Renvoie la taille, en pixels, de la parcelle du terrain.

Comme une parcelle est toujours carrée, la taille correspond à la largeur et à la hauteur de la parcelle.

Voir aussi

CreateTerrain(), DefineTerrainTile()


UpdateTerrain()

Syntaxe

UpdateTerrain(#Terrain)
Description
Mises à jour d'un terrain.

Arguments

#Terrain Le terrain à utiliser.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Nécessaire après la modification du terrain avec des commandes comme SetTerrainTileHeightAtPoint().

Voir aussi

CreateTerrain(), SetTerrainTileHeightAtPoint()


UpdateTerrainTileLayerBlend()

Syntaxe

UpdateTerrainTileLayerBlend(#Terrain, ParcelleX, ParcelleY, Couche)
Description
Met à jour la couche de mélange d'unee parcelle d'un terrain.

Arguments

#Terrain | Le terrain à utiliser.
ParcelleX, ParcelleY | L'indice 'x' et 'y' de la parcelle.
Couche L'indice de la couche à mettre à jour.

L'indice de la première couche commence à 0.

Le nombre maximum de couches est défini lors de la création du terrain, voir CreateTerrain().

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Ceci est nécessaire après la modification de la couche de mélange avec la valeur SetTerrainTileLayerBlend().

Voir aussi

CreateTerrain(), SetTerrainTileLayerBlend()


Text3D

PureBasic - Text3D

Généralités

La bibliothèque Text3D est destinée à faciliter l'affichage du texte dans le monde de la 3D. Il est possible d'utiliser n'importe quelle police, le texte peut être déplacé ou sa taille peut changer en fonction de l'objet à suivre.

InitEngine3D() doit être appelé avec succès avant d'utiliser ces fonctions.

Sommaire des commandes

CreateText3D
FreeText3D
IsText3D
MoveText3D
ScaleText3D
Text3DAlignment
Text3DCaption
Text3DColor
Text3DID

Exemple

Text3D.pb

OS Supportés

Tous

Guide de référence - Index


CreateText3D()

Syntaxe

Resultat = CreateText3D(#Texte3D, Texte$ [, Police$, Hauteur, Couleur])
Description
Crée un nouveau texte 3D.

Arguments

#Texte3D Le numéro du nouveau texte 3D.

#PB_Any peut être utilisé pour générer automatiquement ce numéro.
Texte$ Le texte à afficher.

Il peut être modifié avec Text3DCaption().
Police$ (optionnel) | Le nom de la police à utiliser.
Hauteur (optionnel) | La hauteur de la police à utiliser.
Couleur (optionnel) La couleur RGB à utiliser.

Pour obtenir une couleur valide, utilisez RGB().
La couleur peut être changée avec Text3DColor().

Valeur de retour

Renvoie une valeur non nulle si le texte a été créé avec succès ou zéro en cas d'erreur.
Si #PB_Any a été utilisé pour le paramètre #Texte3D alors le nouveau numéro généré est renvoyé en cas de succès.

Remarques

Pour être affiché, le texte doit être relié à un noeud ou une entité.

Voir aussi

FreeText3D()


FreeText3D()

Syntaxe

FreeText3D(#Texte3D)
Description
Libère un texte 3D.

Arguments

#Texte3D Le texte 3D à libérer.

Si #PB_All est spécifié, tous les textes 3D restants sont libérés.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Une fois que le texte est libéré, il ne peut plus être utilisé.

Tout les textes restant sont automatiquement libérés lorsque le programme se termine.

Voir aussi

CreateText3D()


IsText3D()

Syntaxe

Resultat = IsText3D(#Texte3D)
Description
Teste si le nombre donné est un texte 3D valide et correctement initialisé.

Arguments

#Texte3D Le texte 3D à tester.

Valeur de retour

Renvoie une valeur non nulle si #Texte3D est un texte valide ou zéro sinon.

Remarques

Cette fonction est robuste et peut être utilisée avec n'importe quelle valeur. C'est une bonne façon de s'assurer que le texte est prêt à être utilisé.

Voir aussi

CreateText3D()


MoveText3D()

Syntaxe

MoveText3D(#Texte3D, x, y, z [, Mode])
Description
Déplace un texte 3D.

Arguments

#Texte3D | Le texte 3D à utiliser.
x, y, z | La nouvelle position du texte.
Mode (optionnel) Le mode de déplacement. Peut être une des valeurs suivantes:
  #PB_Relative: Déplacement relatif, à partir de la position courante du texte (par défaut).
  #PB_Absolute: Déplacement absolu vers la position spécifiée.
Combiné à l'une des valeurs suivantes:
  #PB_Local : Déplacement local.
  #PB_Parent: Déplacement par rapport à la position du parent.
  #PB_World : Déplacement par rapport au monde.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

ScaleText3D()


ScaleText3D()

Syntaxe

ScaleText3D(#Texte3D, x, y, z [,Mode])
Description
Change la taille d'un texte 3D suivant les 3 directions de l'espace.

Arguments

#Texte3D | Le texte 3D à utiliser.
x, y, z | Les facteurs d'échelle (agrandissement ou rapetissement) en x, y et z.
Mode (optionnel) Le mode du changement de taille. Peut être une des valeurs suivantes:
  #PB_Relative: Changement relatif, sur la base de la taille initiale (par défaut).
                Une valeur de 1.0 ne change pas la taille.
  #PB_Absolute: Changement absolu, dans l'unité du monde.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Avec le mode #PB_Relative, la taille du noeud sera multipliée par la valeur donnée pour obtenir la nouvelle taille.

Voir aussi

MoveText3D()


Text3DAlignment()

Syntaxe

Text3DAlignment(#Texte3D, Alignement)
Description
Modifie l'alignement d'un texte 3D.

Arguments

#Texte3D Le texte 3D à utiliser.
Alignement L'alignement du texte. Peut être une combinaison des valeurs suivantes:
  #PB_Text3D_Left  : Le texte sera aligné à gauche
  #PB_Text3D_Top   : Le texte sera aligné en haut
  #PB_Text3D_Bottom: Le texte sera aligné en bas
  #PB_Text3D_HorizontallyCentered: Le texte sera centré horizontalement
  #PB_Text3D_VerticallyCentered  : Le texte sera centré verticalement

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateText3D()


Text3DCaption()

Syntaxe

Text3DCaption(#Texte3D, Texte$)
Description
Modifie le texte (la légende) d'un texte 3D.

Arguments

#Texte3D | Le texte 3D à utiliser.
Texte$ | Le nouveau texte à afficher.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateText3D()


Text3DColor()

Syntaxe

Text3DColor(#Texte3D, Couleur)
Description
Changer la couleur d'un texte 3D.

Arguments

#Texte3D Le texte 3D à utiliser.
Couleur La nouvelle couleur du texte.
Pour obtenir une couleur valide, voir RGB().

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

CreateText3D()


Text3DID()

Syntaxe

Text3DID = Text3DID(#Texte3D)
Description
Renvoie l'identifiant système unique d'un texte 3D.

Arguments

#Texte3D Le texte 3D à utiliser.

Valeur de retour

Renvoie l'identifiant système unique du texte 3D.


Texture

PureBasic - Texture

Généralités

Les textures permettent aux objets 3D (Meshs) d'avoir un aspect réaliste.
En effet, sans textures les objets 3D seraient affichés avec une seule couleur.

PureBasic offre la possibilité de créer des textures directement à l'aide des outils 2D de base (bibliothèque 2DDrawing) ou de les charger à partir de fichiers.

InitEngine3D() doit être appelé avec succès avant de pouvoir utiliser les commandes relatives aux textures.

Sommaire des commandes

CreateCubeMapTexture
CreateRenderTexture
CreateTexture
EntityCubeMapTexture
FreeTexture
GetScriptTexture
IsTexture
LoadTexture
SaveRenderTexture
TextureHeight
TextureID
TextureOutput
TextureWidth
UpdateRenderTexture

Exemple

Texture.pb
CreateTexture.pb
CreateTexture2.pb
CreateRenderTexture.pb
SaveRenderTexture.pb

OS Supportés

Tous

Guide de référence - Index


CreateCubeMapTexture()

Syntaxe

Resultat = CreateCubeMapTexture(#Texture, Largeur, Hauteur, NomTexture$ [, CouleurFond])
Description
Crée une nouvelle texture cube map.

Une texture cube map refléchit le milieu qui l'entoure.

Arguments

#Texture Le numéro d'identification de la nouvelle texture.

#PB_Any peut être utilisé pour générer automatiquement ce numéro.

Largeur, Hauteur Les dimensions de la nouvelle texture, en pixels.

NomTexture$ Le nom de la texture dans les scripts OGRE.

Cette texture doit être définie dans le script avec la bonne valeur pour avoir un cube mapping qui fonctionne.

Si 'NomTexture$' est réglé sur 'CubeMapTexture', un script matériau doit contenir la définition suivante (qui peut être adaptée en fonction de vos besoins):
  material CubeMapMaterial
  {
    technique
    {
      pass
      {
        texture_unit
        {
          cubic_texture CubeMapTexture combinedUVW
          tex_address_mode clamp
          env_map cubic_reflection
        }
      }
    }
  }

CouleurFond (optionnel) La couleur de fond de la scène de cube mapping, si aucune SkyBox() n'est utilisée.

Pour obtenir une couleur valide, utilisez RGB().

Valeur de retour

Renvoie zéro si la texture ne peut pas être créée.

Si #PB_Any est utilisé pour le paramètre '#Texture', le numéro de la nouvelle texture est retourné.

Remarques

Cette texture doit exister dans un script OGRE.

Voir aussi

EntityCubeMapTexture()


CreateRenderTexture()

Syntaxe

Resultat = CreateRenderTexture(#Texture, CameraID, Largeur, Hauteur [, Options [, NomTextureRendu$]])
Description
Crée une texture de rendu.

Arguments

#Texture Le numéro de la nouvelle texture.

#PB_Any peut être utilisé pour générer automatiquement ce numéro.
CameraID Le numéro de la caméra à associer à la texture.

Cet ID peut être obtenu par CameraID().
Largeur, Hauteur Les dimensions de la nouvelle texture, en pixels.
Options (optionnel)
  #PB_Texture_AutomaticUpdate: La texture est mise à jour automatiquement à chaque RenderWorld() (par défaut).
  #PB_Texture_ManualUpdate   : La texture n'est pas mise à jour automatiquement, UpdateRenderTexture() doit
                               être appelé manuellement.
  #PB_Texture_CameraViewPort : La fenêtre caméra ne sera pas supprimée, utile pour toujours être en mesure
                               de faire une capture de la caméra.
NomTextureRendu$ (optionnel) Le nom de la nouvelle texture dans le système OGRE.

Cela permet d'utiliser ce nom dans le script pour assigner un shader à cette texture.

Valeur de retour

Renvoie zéro si la texture ne peut pas être créée.

Si #PB_Any est utilisé pour le paramètre '#Texture', le numéro de la nouvelle texture est retourné.

Remarques

La caméra associée à la texture rendra son point de vue directement sur la texture, sans être affichée à l'écran. Cela peut être très utile pour des objets qui affichent une partie de la scène comme un écran de télévision, un miroir, etc.

Voir aussi

UpdateRenderTexture(), SaveRenderTexture()


CreateTexture()

Syntaxe

Resultat = CreateTexture(#Texture, Largeur, Hauteur)
Description
Crée une nouvelle texture.

Arguments

#Texture Le numéro de la nouvelle texture.

Si #PB_Any est utilisé pour le paramètre '#Texture', le numéro de la nouvelle texture sera renvoyé dans 'Resultat'.
Largeur, Hauteur Les dimensions de la texture, en pixels.

Valeur de retour

Si le 'Resultat' est zéro, la création de la texture a échoué.

Si la texture a été déjà créée, elle est automatiquement libérée et remplacée par la nouvelle.

Remarques

Il est préférable que les dimensions des textures soient une puissance de 2 et carrée si possible, pour que le rendu soit optimal. Par exemple: 64*64, 128*128, 256*256, mais aussi 128x64, 16x32... etc. En effet, les anciennes cartes graphiques ont des limitations strictes quant à la taille des textures, et il est conseillé de se limiter à des textures maximales de 256*256 pour une compatibilité maximale. Le fait d'utiliser une texture en haute définition permet un rendu magnifique sur une carte graphique actuelle mais causera un ralentissement,parfois très important sur une carte ancienne.

L'utilisation de textures transparentes (mode Alpha) est possible.

Exemple

  CreateTexture(0, 256, 256) ; Crée une nouvelle texture de dimension 256x256.

Voir aussi

CreateRenderTexture()


EntityCubeMapTexture()

Syntaxe

Resultat = EntityCubeMapTexture(#Texture, #Entity)
Description
Applique la texture cube map à l'entité.

Arguments

#Texture La texture à utiliser.

La texture doit avoir été créée par CreateCubeMapTexture().
#Entity L'entité sur laquelle s'applique la texture.

Une même texture peut être appliquée sur de nombreuses entités.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

L'entité sera le reflet du monde qui l'entoure.

Voir aussi

CreateCubeMapTexture()


FreeTexture()

Syntaxe

FreeTexture(#Texture)
Description
Supprime une texture.

Arguments

#Texture La texture à utiliser.

Si #PB_All est spécifié, toutes les textures restantes sont libérées.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Toutes les textures restantes sont automatiquement supprimées quand le programme se termine.

Voir aussi

CreateTexture() ou LoadTexture().


GetScriptTexture()

Syntaxe

Resultat = GetScriptTexture(#Texture, Nom$)
Description
Obtenir une texture définie dans un fichier de script OGRE.

Arguments

#Texture | La texture à utiliser.
Nom$ | Le nom de la texture dans le fichier script.

Valeur de retour

Si 'Resultat' est zéro alors la texture est introuvable ou n'a pas pu être chargée.

Voir aussi

LoadTexture()


IsTexture()

Syntaxe

Resultat = IsTexture(#Texture)
Description
Teste si une texture est correctement initialisée.

Arguments

#Texture La texture à tester.

Valeur de retour

Si le 'Résultat' est différent de zéro, alors cet objet est valide.

Remarques

Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage.

C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.

Voir aussi

CreateTexture()


LoadTexture()

Syntaxe

Resultat = LoadTexture(#Texture, NomFichier$)
Description
Charge une texture à partir d'un fichier

Arguments

#Texture Le numéro de la texture à charger.

Si #PB_Any est utilisé pour le paramètre '#Texture', le numéro de la nouvelle texture sera renvoyé dans 'Resultat'.
NomFichier$ Le nom du fichier qui peut etre au format PNG, TGA ou JPG.

Le 'NomFichier$' doit être accessible dans le chemin géré par Add3DArchive().

Valeur de retour

Si le 'Resultat' est zéro, la texture ne peut pas être chargée.

Si la texture était déjà créée, elle est automatiquement supprimée et remplacée par la nouvelle.

Remarques

Il est préférable que les dimensions des textures soient une puissance de 2 et carrée si possible, pour que le rendu soit optimal. Par exemple: 64*64, 128*128, 256*256, mais aussi 128x64, 16x32... etc. En effet, les anciennes cartes graphiques ont des limitations strictes quant à la taille des textures, et il est conseillé de se limiter à des textures maximales de 256*256 pour une compatibilité maximale. Le fait d'utiliser une texture en haute définition permet un rendu magnifique sur une carte graphique actuelle mais causera un ralentissement, parfois très important sur une carte ancienne.

Voir aussi

GetScriptTexture()


SaveRenderTexture()

Syntaxe

Resultat = SaveRenderTexture(#Texture, NomFichier$)
Description
Sauvegarde le contenu d'une texture de rendu.

Arguments

#Texture La texture à utiliser.
NomFichier$ Le nom du fichier où la texture sera sauvée.

Cela peut être un chemin absolu ou relatif (dans le répertoire courant).

Valeur de retour

Si la texture ne peut être sauvée (erreur de permission, disque plein, etc), la valeur retournée sera zéro.

Remarques

Il peut être utile de faire des captures d'écran d'une scène particulière.

Le format de sauvegarde peut être "BMP", "PNG", "JPG", "TGA", etc.

Voir aussi

CreateRenderTexture()


TextureHeight()

Syntaxe

Hauteur = TextureHeight(#Texture)
Description
Renvoie la hauteur d'une texture.

Arguments

#Texture La texture à utiliser.

Valeur de retour

Renvoie la hauteur en pixels de la texture.

Voir aussi

TextureWidth()


TextureID()

Syntaxe

TextureID = TextureID(#Texture)
Description
Renvoie l'identifiant unique d'une texture.

Arguments

#Texture Le numéro de la texture à utiliser.

Valeur de retour

Renvoie le numéro de la texture.

Remarques

Cet identifiant est notamment nécessaire pour les commandes suivante: AddMaterialLayer()(), CreateMaterial().

Voir aussi

TextureOutput()


TextureOutput()

Syntaxe

OutputID = TextureOutput(#Texture)
Description
Renvoie l'identifiant OutputID d'une texture nécessaire à StartDrawing() pour dessiner directement sur la texture.

Arguments

#Texture La texture à utiliser.

Valeur de retour

Renvoie le numéro de la texture.

Exemple

  ...
  StartDrawing(TextureOutput(#Texture))
    ; faire des trucs de dessin ici ...
  StopDrawing()

Voir aussi

TextureID()


TextureWidth()

Syntaxe

Largeur = TextureWidth(#Texture)
Description
Renvoie la largeur d'une texture.

Arguments

#Texture La texture à utiliser.

Valeur de retour

Renvoie la largeur en pixels de la texture.

Voir aussi

TextureHeight()


UpdateRenderTexture()

Syntaxe

UpdateRenderTexture(#Texture)
Description
Met à jour une texture avec la vue actuelle de la caméra.

Arguments

#Texture La texture à mettre à jour.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Si la texture de rendu a été créé avec l'option #PB_Texture_AutomaticUpdate, cette fonction n'est pas nécessaire.

Voir aussi

CreateRenderTexture(), SaveRenderTexture()


Thread

PureBasic - Thread

Généralités

Un thread est une partie d'un programme qui peut être lancée de manière asynchrone en arrière plan du programme. Cela signifie qu'il est possible d'effectuer certaines opérations longues (compression, manipulation d'images ...) sans interrompre l'ensemble du programme, et de laisser ainsi l'utilisateur effectuer d'autres tâches. Un thread s'exécute à l'intérieur du programme, il ne s'agit pas d'un autre processus. Lorsque le programme se termine, tous les threads sont détruits. Sous PureBasic, les threads sont des procédures appelées de manière asynchrone. Un thread tourne jusqu'à ce que la procédure se termine.

PureBasic a une option spéciale de compilation pour créer des exécutables multi-threadés (Le switch /THREAD pour le compilateur en ligne de commande ou l'option "Créer un exécutable multi-threadé" dans les options de compilation de l'IDE). Sans cette option, certaines fonctions (ainsi que la gestion des strings) sont plus rapides, mais inutilisables dans les threads. Il est toujours possible de créer des threads sans être dans ce mode, mais ce n'est pas recommandé, car même une simple manipulation de chaîne de caractères dans un thread peut être dangereux et doit être protégé. Activer cette option rend tout cela possible, mais au prix d'une diminution de la rapidité d'exécution. La décision de compiler en mode threadé doit donc être prise uniquement si le besoin s'en fait sentir.

Note: Les threads doivent être utilisés avec précaution, car il est possible que des ressources partagées (mémoire, fichiers, variables etc..) soient accédées au même moment ce qui causera des résultats aléatoires. Les commandes relatives aux 'Mutex' peut être utilisées pour synchroniser ces ressources partagées.

Sommaire des commandes

CreateMutex
CreateSemaphore
CreateThread
FreeMutex
FreeSemaphore
IsThread
KillThread
LockMutex
PauseThread
ResumeThread
SignalSemaphore
ThreadID
ThreadPriority
TryLockMutex
TrySemaphore
UnlockMutex
WaitSemaphore
WaitThread

Exemple

Thread.pb

OS Supportés

Tous

Guide de référence - Index


CreateMutex()

Syntaxe

Mutex = CreateMutex()
Description
Crée un nouveau mutex.

L'objectif principal des mutex est de faire de la synchronisation entre les threads. Ils ne consomment pas beaucoup de temps processeur, mais ils ne fonctionnent qu'au sein du programme (il n'est pas possible de synchroniser plusieurs programmes différents). Un mutex est un objet qui ne peut être verrouillé que par un seul thread à la fois, donc il est utilisé pour protéger l'accès aux ressources partagées (pour éviter que plusieurs threads accèdent en même temps aux même données).
Les commandes LockMutex() et UnlockMutex() permettent de verrouiller ou de déverrouiller le mutex. Quand un mutex est verrouillé, les autres threads qui demandent le verrouillage sont stoppés et mis dans une file d'attente. Dès que le mutex est déverrouillé, le thread suivant dans la file d'attente verrouille à son tour le mutex et continue son exécution.

Exemple

  ; Executez ce programme une fois comme il se présente. Vous verrez que les lignes imprimées seront
  ; mélangées entre les threads. Maintenant supprimez les commentaires devant les commandes de Mutex
  ; et les chaînes seront imprimées dans l'ordre, car un seul thread à la fois
  ; sera autorisé à exécuter les commandes d'impression.
  ;
  Procedure SansMutex(*Numero)
    Shared Mutex

    For a = 1 To 5
      ;LockMutex(Mutex)    ; supprimez le commentaire pour voir la différence

      PrintN("Thread "+Str(*Numero)+" essaie d'imprimer 5 fois a la suite :")
      For b = 1 To 5
        Delay(50)
        PrintN("Thread "+Str(*Numero)+" Ligne "+Str(b))
      Next b

      ;UnlockMutex(Mutex)  ; supprimez le commentaire pour voir la différence
    Next a
  EndProcedure

  OpenConsole()
  Mutex = CreateMutex()

  thread1 = CreateThread(@SansMutex(), 1)
  Delay(25)
  thread2 = CreateThread(@SansMutex(), 2)
  Delay(25)
  thread3 = CreateThread(@SansMutex(), 3)

  WaitThread(thread1)
  WaitThread(thread2)
  WaitThread(thread3)

  Input()


CreateSemaphore()

Syntaxe

Semaphore = CreateSemaphore([CompteurInitial])
Description
Crée un nouveau sémaphore. Le paramètre optionnel 'CompteurInitial' doit être une valeur positive qui indique le compteur initial du sémaphore. S'il n'est pas spécifié, le compteur initial vaudra 0.

Un sémaphore est un objet de synchronisation de threads, qui contient un compteur interne. Il gère deux types d'opérations: attente et signalement. L'opération d'attente diminue la valeur du compteur du sémaphore de un. Si le compteur devait passer à une valeur inférieure à 0, l'opération d'attente sera bloquante, jusqu'à ce qu'une opération de signalement soit faite. Cette dernière augmente la valeur du compteur de un, libérant le thread bloqué (si il y en a un).

Contrairement à un mutex, un sémaphore n'appartient pas à un thread particulier, ce qui permet aux opérations d'attente/signalement d'être effectuées depuis n'importe quel thread, ce qui n'est pas le cas de LockMutex() et UnlockMutex(). Une utilisation courante des sémaphores est la création d'un thread qui attend sur le sémaphore avec WaitSemaphore() et d'un autre qui le débloque avec SignalSemaphore(): c'est le pattern producteur/consommateur.

Exemple

Cet exemple montre un thread "producteur" qui ajoute des éléments à une liste et un thread principal qui affiche la liste au fur et à messure que des éléments sont ajoutés. Le sémaphore permet au thread principal de se mettre en attendre si la liste ne contient aucun élément. A noter que cela aurait pu aussi être effectué avec un mutex, en testant à intervalle régulier si la liste est vide ou non (en utilisant Delay()). Le sémaphore est bien plus efficace, car il débloque immédiatemment le thread lorsque le signalement est effectué, et élimine l'intervalle d'attente.
  ; Assurez vous que l'option "Activer la gestion des threads" est sélectionnée
  ;
  Global Semaphore = CreateSemaphore()
  Global Mutex     = CreateMutex()
  Global NewList Queue()

  Procedure Producer(Total)

    For i = 1 To Total
      Delay(Random(750) + 250)

      ; L'accès à la liste nécessite tout de même un mutex pour être threadsafe
      LockMutex(Mutex)
        LastElement(Queue())
        AddElement(Queue())
        Queue() = i
      UnlockMutex(Mutex)

      ; Envoie un signal pour indiquer qu'un nouvel élément est disponible
      SignalSemaphore(Semaphore)
    Next i

  EndProcedure

  If CreateThread(@Producer(), 30)

    For i = 1 To 30
      ; Attente d'un nouvel élément
      WaitSemaphore(Semaphore)

      ; Affiche l'état de la liste
      LockMutex(Mutex)
        Queue$ = "Queue:"
        ForEach Queue()
          Queue$ + " " + Str(Queue())
        Next Queue()
        Debug Queue$

        ; Efface le premier élément de la liste
        FirstElement(Queue())
        DeleteElement(Queue())
      UnlockMutex(Mutex)

    Next i

  EndIf


CreateThread()

Syntaxe

Thread = CreateThread(@NomdeProcedure(), *Valeur)
Description
Créé un nouveau thread tournant en arrière plan de l'application. Si le thread est créé correctement, la fonction renvoie le numéro du thread qui pourra être utilisé avec les autres commandes de la bibliothèque, telles que KillThread(), PauseThread(), etc... La procédure doit être créée selon le format suivant:
  Procedure VotreProcedure(*Valeur)
  EndProcedure
L'argument '*Valeur' de CreateThread() est passé comme argument de la procédure appelée. Il est très important de ne pas modifier le nombre de paramètre de cette procédure, qui doit toujours rester à 1.

Exemple

  Procedure VotreProcedure(*Valeur)
    ; La variable '*Valeur' contiendra 23
  EndProcedure

  CreateThread(@VotreProcedure(), 23)

Exemple: Passer plusieurs paramètres à un thread

  Structure Personne
    Nom$
    Age.b
    Telephone.l
  EndStructure

  Procedure Thread(*Parametres.Personne)

    ; Affiche les parametres
    ;
    Debug *Parametres\Nom$
    Debug *Parametres\Age
    Debug *Parametres\Telephone

    ; Une fois qu'on en a plus besoin, ClearStructure() est nécessaire pour s'assurer
    ; que les objets dynamiques (s'il y en a) sont correctement libérés.
    ClearStructure(*Parametres, Personne)
    FreeMemory(*Parametres)

  EndProcedure

  ; On utilise de la mémoire dynamique, donc cela continuera de fonctionner meme si l'appel
  ; est fait à l'interieur d'une procédure.
  ;
  *Parametres.Personne = AllocateMemory(SizeOf(Personne))
  *Parametres\Nom$ = "Jean"
  *Parametres\Age   = 30
  *Parametres\Telephone = 10203040

  CreateThread(@Thread(), *Parametres) ; Crée le thread

  Delay(2000)


FreeMutex()

Syntaxe

FreeMutex(Mutex)
Description
Supprime le 'Mutex' et sa mémoire associée.

Un mutex doit être déverrouillé avant d'être supprimé. Pour être sûr de cela, il est préférable que tous les threads utilisant ce mutex soient terminés.


FreeSemaphore()

Syntaxe

FreeSemaphore(Semaphore)
Description
Supprime le sémaphore et sa mémoire associée.


IsThread()

Syntaxe

Resultat = IsThread(Thread)
Description
Détermine si le numéro du thread est un thread préalablement créé avec la commande CreateThread(), et si il est toujours en cours d'exécution. Si le thread est invalide ou déjà terminé, alors 'Resultat' sera 0.


KillThread()

Syntaxe

KillThread(Thread)
Description
Termine le thread spécifié, préalablement créé avec CreateThread(). Cette fonction est très, dangereuse, ne l'utilisez que si nécessaire, car quand un thread est tué, il n'a aucune chance de libérer ses propres ressources (comme sa pile par exemple).

Exemple

  ; Une procedure/thread qui ne se terminera jamais. A ne pas faire, mais cela
  ; montre comment KillThread fonctionne
  Procedure ImprimeUnTruc(*Intervalle)
    Repeat
      Print(".")
      Delay(*Intervalle)
    ForEver
  EndProcedure

  If OpenConsole()
    thread = CreateThread(@ImprimeUnTruc(), 500)
    If thread
      For i=0 To 10
        Print("A")
        Delay(999)

        If i=5
          KillThread(thread)
        EndIf
      Next
    EndIf
  EndIf


LockMutex()

Syntaxe

LockMutex(Mutex)
Description
Demande le verrouillage d'un mutex et si il ne l'est pas, le verrouille et continue son exécution. Le prochain thread qui demandera le verrouillage de ce mutex ne pourra continuer son exécution que lorsque ce mutex sera déverrouillé.

Quand cette commande se termine, il est garanti que seulement un thread continue d'exécuter le code protégé par ce mutex et peut ainsi accéder aux ressources partagées en lecture et en écriture sans risque de corruption.

Si un autre thread appel LockMutex() alors que ce mutex est verrouillé, il sera stoppé et mis en attente jusqu'à ce que ce thread appelle UnlockMutex() pour déverrouiller le mutex.

Note: étant donné que LockMutex() attend indéfiniment que le mutex soit déverrouillé, il peut y avoir des situations de blocage si un appel à UnlockMutex() est oublié.

Voir CreateMutex() pour un exemple d'utilisation.


PauseThread()

Syntaxe

PauseThread(Thread)
Description
Interrompt le thread spécifié, préalablement créé avec CreateThread(). Le thread peut être relancé avec ResumeThread().

Exemple

  Procedure ImprimeUnTruc(*Bidon)
    For i = 0 To 10
      PrintN(".")
      Delay(200)
    Next
  EndProcedure

  If OpenConsole()
    thread = CreateThread(@ImprimeUnTruc(), 0)
    If thread

      Delay(100)
      PauseThread(thread)
      For i = 0 To 10
        PrintN("A")
        Delay(50)
      Next

      ; Relance le thread en lui donnant assez de temps pour terminer
      ResumeThread(thread)
      Delay(3000)
    EndIf
  EndIf


ResumeThread()

Syntaxe

ResumeThread(Thread)
Description
Relance le thread spécifié, préalablement interrompu avec PauseThread().

Voir PauseThread() pour un exemple d'utilisation.


SignalSemaphore()

Syntaxe

SignalSemaphore(Semaphore)
Description
Augmente la valeur du compteur interne du sémaphore de un, ce qui a pour effet de débloquer le thread en attente sur ce sémaphore (si il y en a un).

Note: Le compteur maximal d'un sémaphore est limité à une valeur 32-bit signée, donc un maximum de 2147483647 appels à SignalSemaphore() peuvent être effectués sans être contre-balancés par des appels à WaitSemaphore().

Voir CreateSemaphore() pour un exemple d'utilisation.


ThreadID()

Syntaxe

ThreadID = ThreadID(Thread)
Description
Renvoie l'identifiant système du thread spécifié. Cette commande est utile lorsque qu'une fonction a besoin de la référence (ID) du thread.

L'identifiant 'ThreadID' est parfois appelé 'Handle'. Pour plus d'informations consultez le chapitre Numéros et Identifiants (Handles).


ThreadPriority()

Syntaxe

AnciennePriorite = ThreadPriority(Thread, Priorite)
Description
Change la priorité du thread spécifié et renvoie l'ancienne priorité. La priorité peut prendre une valeur de la plage 1 à 32. 1 est la priorité la plus basse, 16 est une priorité normale et 32 correspond à un niveau de priorité en temps-critique (la plus haute, à n'utiliser que si vous êtes sûr de ce que vous faites). Si la priorité est 0, alors aucun changement n'est effectué (utile pour seulement trouver le niveau de priorité du thread sans le modifier).

Windows ne supporte pas les 32 niveaux de priorité, voici le tableau correspondant:
  - 1 : Le plus bas
  - Entre 2 et 15 : En dessous de la normale
  - 16: Normal
  - Entre 17 et 30: Au dessus de la normale
  - 31: Le plus haut
  - 32: Temps critique

Valeur de retour

Renvoie la priorité du thread avant l'appel de cette commande. Ce qui peut être utile si vous voulez seulement augmenter la priorité du thread pour un court moment et ensuite revenir à l'ancienne valeur. La valeur renvoyée n'est pas nécessairement la même que celle donnée en paramètre de ThreadPriority(), car elle dépend de la granularité du réglage de la priorité offerte par le système.

Exemple

  ; Une procedure toujours en cours d'exécution (aucune commande Delay n'est employée
  ; car cela obligerait le thread à s'arrêter pendant qu'il serait en attente)
  Procedure ImprimeUnTruc(*Intervalle)
    For i = 0 To 1000000000
      ; occupé par une méchante attente
    Next
  EndProcedure

  If OpenConsole()
    thread = CreateThread(@ImprimeUnTruc(), 500)
    If thread
      ; Augmente la priorité au-dessus du thread principal
      ; Vous devriez remarquer un délai avant que la commande d'impression
      ; ne soit executée. Maintenant changez le 17 en 15 (plus bas que la priorité normale)
      ; et observez que la commande d'impression s'execute instantanément
      ThreadPriority(thread, 17)
      PrintN("Attend que le thread de plus haute priorite se termine")
    EndIf

    PrintN("Appuyer sur Entree pour quitter")
    Input()
  EndIf

OS Supportés

Windows


TryLockMutex()

Syntaxe

Resultat = TryLockMutex(Mutex)
Description
Essaie de verrouiller le 'Mutex' spécifié. Contrairement à LockMutex(), cette commande ne stoppe pas l'exécution du thread jusqu'à ce que le mutex soit libre. Ceci peut être pratique dans une situation ou le thread peut continuer à faire autre chose en attendant que le mutex soit libéré. Si le 'Resultat' est 0, alors le verrouillage du mutex a échoué, sinon le mutex est verrouillé.

Note: si le mutex a été verrouillé, la commande UnlockMutex() doit être appelée pour libérer le mutex une fois que les accès aux ressources partagées sont terminées. Ne pas le faire peut engendrer facilement des situations de blocage.

Exemple

 Procedure ThreadProcedure(*Valeur)
    Shared Mutex

    Repeat
      If TryLockMutex(Mutex)
        PrintN("Mutex verrouille avec succes.")

        UnlockMutex(Mutex)
        Break ; quitte la boucle et le thread
      Else
        PrintN("Toujours en train d'attendre d'avoir acces au mutex...")
        Delay(200)
      EndIf
    ForEver
  EndProcedure

  OpenConsole()

  Mutex = CreateMutex()
  LockMutex(Mutex) ; le programme principal verrouille en premier le mutex
  Thread = CreateThread(@ThreadProcedure(), 0)

  Delay(4000)
  UnlockMutex(Mutex) ; maintenant déverouille le mutex, pour que le thread puisse y accéder

  Input()


TrySemaphore()

Syntaxe

Resultat = TrySemaphore(Semaphore)
Description
Diminue la valeur du compteur interne du sémaphore de un seulement si le compteur est supérieur à zéro. Cette commande a le même comportement que WaitSemaphore(), sauf qu'elle ne bloquera pas si le compteur devait tomber en dessous de zéro.

Valeur de retour

Renvoie une valeur différente de zéro si le compteur du sémaphore a été diminué, ou zéro si le compteur n'a pas pu être diminué (il était déjà à zéro).


UnlockMutex()

Syntaxe

UnlockMutex(Mutex)
Description
Déverrouille un mutex préalablement verrouillé avec LockMutex(). Le mutex est de nouveau disponible pour les autres threads.

Note: un mutex peut être déverrouillé uniquement par le thread qui l'a verrouillé.

Voir CreateMutex() pour un exemple d'utilisation.


WaitSemaphore()

Syntaxe

WaitSemaphore(Semaphore)
Description
Diminue la valeur du compteur interne du sémaphore de un, ce qui a pour effet de bloquer le thread, si la valeur venait à tomber en dessous de zéro. Le thread sera débloqué dès qu'un autre thread appellera SignalSemaphore().

Note: Le compteur maximal d'un sémaphore est limité à une valeur 32-bit signée, donc un maximum de 2147483647 appels à WaitSemaphore() peuvent être effectués sans être contre-balancés par des appels à SignalSemaphore().

Voir CreateSemaphore() pour un exemple d'utilisation.


WaitThread()

Syntaxe

WaitThread(Thread)
Description
Arrête l'exécution du programme jusqu'à ce que le 'Thread' se termine. Si ce thread est déjà terminé le retour est immédiat.

Exemple

  Procedure ImprimeUnTruc(*Intervalle)
    For i = 0 To 10
      PrintN(".")
      Delay(*Intervalle)
    Next
  EndProcedure

  If OpenConsole()
    thread = CreateThread(@ImprimeUnTruc(), 500)
    If thread
      ; Attend que le thread se termine avant de continuer
      ; Essayer de mettre en commentaire la commande WaitThread et regardez ce qu'il se produit
      WaitThread(thread)

      For i = 0 To 10
        PrintN("A")
        Delay(1000)
      Next
    EndIf
  EndIf


ToolBar

PureBasic - ToolBar

Généralités

La barre d'outils (Toolbar) est très utile pour accéder rapidement aux fonctions principales d'une application en cliquant simplement sur une icône. Les barres d'outils représentent souvent des raccourcis de menus. PureBasic vous permet de créer un nombre quelconque de barres d'outils et de les gérer comme si elles étaient des menus.

Sommaire des commandes

CreateToolBar
DisableToolBarButton
FreeToolBar
GetToolBarButtonState
IsToolBar
SetToolBarButtonState
ToolBarHeight
ToolBarID
ToolBarImageButton
ToolBarSeparator
ToolBarStandardButton
ToolBarToolTip

Exemple

ToolBar.pb

OS Supportés

Tous

Guide de référence - Index


CreateToolBar()

Syntaxe

Resultat = CreateToolBar(#BarreOutils, FenetreID)
Description
Crée une barre d'outils vide identifiée par le numéro #BarreOutils sur la fenêtre 'FenetreID'. Si #PB_Any est utilisé pour le paramètre '#BarreOutils', le numéro de la nouvelle barre d'outils sera renvoyé dans 'Resultat'. 'FenetreID' peut être récupéré facilement grâce à la commande WindowID(). Cette barre d'outils devient celle par défaut pour les créations des éléments qu'elle doit contenir. Vous pouvez maintenant utiliser ToolBarStandardButton() et ToolBarSeparator() pour créer ces éléments. Si Resultat = 0, la barre d'outils n'a pu être créée.

La détection des évènements sur les barres d'outils est similaire à celle des menus, et nécessite donc la commande EventMenu().

Exemple

  If OpenWindow(0, 0, 0, 150, 25, "Barre d'outils", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateToolBar(0, WindowID(0))
      ToolBarStandardButton(0, #PB_ToolBarIcon_New)
      ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
      ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
    EndIf
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Menu
        Debug "Identifiant Barre d'outils: "+Str(EventMenu())
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf


DisableToolBarButton()

Syntaxe

DisableToolBarButton(#BarreOutils, Bouton, Etat)
Description
Active ou désactive un bouton de la #BarreOutils. Si Etat est égal à 0, le bouton est activé. sinon le bouton est désactivé.

Exemple

  If OpenWindow(0, 0, 0, 150, 60, "Barre d'outils", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateToolBar(0, WindowID(0))
      ToolBarStandardButton(0, #PB_ToolBarIcon_New)
      ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
      ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
      DisableToolBarButton(0, 1, 1) : Disabled = #True
    EndIf

    ButtonGadget(0, 10, 30, 130, 20, "Active l'icône 'Ouvrir'")

    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Gadget
        If EventGadget() = 0
          If Disabled = #True
            DisableToolBarButton(0, 1, 0)
            SetGadgetText(0,"Désactive l'icône 'Ouvrir'")
            Disabled = #False
          Else
            DisableToolBarButton(0, 1, 1)
            SetGadgetText(0,"Active l'icône 'Ouvrir'")
            Disabled = #True
          EndIf
        EndIf
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf


FreeToolBar()

Syntaxe

FreeToolBar(#BarreOutils)
Description
Détruit la #BarreOutils. Si elle était associée à une fenêtre, elle est automatiquement dissociée avant d'être détruite.

Si #PB_All est spécifiée, toutes les barres d'outils restantes sont libérées.

Note: toutes les barres d'outils restantes sont automatiquement supprimées quand le programme se termine.


GetToolBarButtonState()

Syntaxe

Resultat = GetToolBarButtonState(#BarreOutils, Bouton)
Description
Renvoie l'état du 'Bouton' dans la #BarreOutils. Si 'Resultat' est égal à 1, alors le bouton est enfoncé, sinon le bouton est relâché (utile pour les boutons utilisant l'option #PB_ToolBar_Toggle).

OS Supportés

Windows, Linux


IsToolBar()

Syntaxe

Resultat = IsToolBar(#BarreOutils)
Description
Teste si la #BarreOutils est correctement initialisée. Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. Si le 'Résultat' est différent de zéro, alors cet objet est valide. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.


SetToolBarButtonState()

Syntaxe

SetToolBarButtonState(#BarreOutils, Bouton, Etat)
Description
Change l'état du 'Bouton' dans la #BarreOutils. Si 'Etat' est égal à 1, alors le bouton est enfoncé, sinon le bouton est relâché (utile pour les boutons utilisant l'option #PB_ToolBar_Toggle).

OS Supportés

Windows, Linux


ToolBarHeight()

Syntaxe

ToolBarHeight = ToolBarHeight(#BarreOutils)
Description
Renvoie la hauteur en pixel de la #BarreOutils. C'est utile pour calculer correctement la hauteur d'une fenêtre lorsqu'une barre d'outils est utilisée.

Note: Sous OS X cette commande renvoie 0, car la barre d'outils ne fait pas partie de l'intérieur de la fenêtre, aucun calcul n'est nécessaire.


ToolBarID()

Syntaxe

ToolBarID = ToolBarID(#BarreOutils)
Description
Renvoie l'identifiant système unique de la #BarreOutils.


ToolBarImageButton()

Syntaxe

ToolBarImageButton(Bouton, ImageID [, Mode])
Description
Ajoute un bouton Image à la barre d'outils en cours de création. La fonction CreateToolBar() doit avoir été appelée avant d'utiliser cette fonction. 'ImageID' peut être obtenu simplement en utilisant ImageID() de la bibliothèque Image. Il est préférable d'utiliser des images au format 'icone' (.ico) sous Windows, ou PNG sous Linux/MacOS X si un fond réellement transparent est nécessaire.

Le paramètre factultatif 'Mode' peut prendre l'une des valeurs suivantes:
  #PB_ToolBar_Normal: le bouton sera un bouton standard (mode par défaut)
  #PB_ToolBar_Toggle: le bouton sera un bouton de type switch (soit enfoncé, soit relâché)
Les commandes GetToolBarButtonState() et SetToolBarButtonState() permettent de charger l'état d'un bouton de type #PB_ToolBar_Toggle.

La détection des évènements sur les barres d'outils est similaire à celle des menus, et nécessite donc la commande EventMenu().

Exemple

  If OpenWindow(0, 0, 0, 150, 25, "Barre d'outils", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

    CreateImage(0, 16, 16)
    StartDrawing(ImageOutput(0))
      Box(0, 0, 16, 16, RGB(255, 255, 255))
      Box(4, 4, 8, 8, RGB(255, 0, 0))
    StopDrawing()

    CreateImage(1, 16, 16)
    StartDrawing(ImageOutput(1))
      Box(0, 0, 16, 16, RGB(255, 0, 0))
      Box(4, 4, 8, 8, RGB(255, 255, 255))
    StopDrawing()

    If CreateToolBar(0, WindowID(0))
      ToolBarImageButton(0, ImageID(0))
      ToolBarImageButton(1, ImageID(1))
    EndIf

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


ToolBarSeparator()

Syntaxe

ToolBarSeparator()
Description
Ajoute un séparateur vertical à la barre d'outils en cours de création. La fonction CreateToolBar() doit avoir été appelée avant d'utiliser cette fonction.

Exemple

  If OpenWindow(0, 0, 0, 150, 25, "Barre d'outils", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateToolBar(0, WindowID(0))
      ToolBarStandardButton(0, #PB_ToolBarIcon_New)
      ToolBarSeparator()
      ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
      ToolBarSeparator()
      ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
      ToolBarSeparator()
      ToolBarSeparator()
    EndIf
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Menu
        Debug "Identifiant de la barre d'outils : "+Str(EventMenu())
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf


ToolBarStandardButton()

Syntaxe

ToolBarStandardButton(Bouton, IconeBouton [, Mode])
Description
Ajoute un bouton standard à la barre d'outils en cours de construction. La fonction CreateToolBar() doit avoir été appelée avant d'utiliser cette fonction. Un bouton standard est une icône disponible dans le système d'exploitation. La constante IconeBouton doit être l'une des constantes suivantes :
  #PB_ToolBarIcon_New          (Nouveau fichier)
  #PB_ToolBarIcon_Open         (Ouvre Fichier)
  #PB_ToolBarIcon_Save         (Enregistre Fichier)
  #PB_ToolBarIcon_Print        (Imprime)
  #PB_ToolBarIcon_PrintPreview (Aperçu avant impression)
  #PB_ToolBarIcon_Find         (Cherche une occurence)
  #PB_ToolBarIcon_Replace      (Remplace une occurence)

  #PB_ToolBarIcon_Cut          (Couper)
  #PB_ToolBarIcon_Copy         (Copier)
  #PB_ToolBarIcon_Paste        (Coller)
  #PB_ToolBarIcon_Undo         (Annule l'action)
  #PB_ToolBarIcon_Redo         (Repète l'action)

  #PB_ToolBarIcon_Delete       (Efface)
  #PB_ToolBarIcon_Properties   (Propriétés)
  #PB_ToolBarIcon_Help         (Aide)
Le paramètre factultatif 'Mode' peut prendre l'une des valeurs suivantes:
  #PB_ToolBar_Normal: le bouton sera un bouton standard (mode par défaut)
  #PB_ToolBar_Toggle: le bouton sera un bouton de type switch (soit enfoncé, soit relâché)
Les commandes GetToolBarButtonState() et SetToolBarButtonState() permettent de charger l'état d'un bouton de type #PB_ToolBar_Toggle.

La détection des évènements sur les barres d'outils est similaire à celle des menus, et nécessite donc la commande EventMenu().

Exemple

  If OpenWindow(0, 0, 0, 150, 25, "Barre d'outils", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateToolBar(0, WindowID(0))
      ToolBarStandardButton(0, #PB_ToolBarIcon_New)
      ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
      ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
    EndIf
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Menu
        Debug "Identifiant de la barre d'outils : "+Str(EventMenu())
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf

OS Supportés

Windows, Linux


ToolBarToolTip()

Syntaxe

ToolBarToolTip(#BarreOutils, Bouton, Texte$)
Description
Associe ou remplace un texte flottant du bouton dans la #BarreOutils spécifée. Un 'Tooltip' est un texte flottant qui apparait au bout d'un certain temps lorsque le curseur de la souris est immobile au dessus d'un bouton d'une barre d'outils.

Exemple

  If OpenWindow(0, 0, 0, 150, 60, "Barre d'outils", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateToolBar(0, WindowID(0))
      ToolBarStandardButton(0, #PB_ToolBarIcon_New)
      ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
      ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
      ToolBarToolTip(0, 0, "Nouveau")
      ToolBarToolTip(0, 1, "Ouvrir...")
      ToolBarToolTip(0, 2, "Enregistrer")
    EndIf
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


VertexAnimation

PureBasic - VertexAnimation

Généralités

Les animations vertex permettent de gérer les "animations-poses" d'un mesh .

Le mesh doit contenir une liste prédéfinie de poses.

Sommaire des commandes

AddVertexPoseReference
CreateVertexAnimation
CreateVertexPoseKeyFrame
CreateVertexTrack
MeshPoseCount
MeshPoseName
UpdateVertexPoseReference
VertexPoseReferenceCount

Exemple

VertexAnimation.pb

OS Supportés

Tous

Guide de référence - Index


AddVertexPoseReference()

Syntaxe

AddVertexPoseReference(#Mesh, Animation$, Piste, ImageCle, IndexPose, Influence)
Description
Ajoute une nouvelle pose de référence pour une animation.

Arguments

#Mesh Le mesh à utiliser.
Animation$ Le nom de l'animation.
Attention ce nom est sensible à la casse.
Piste L'index de la piste.

La piste doit être préalablement créée avec CreateVertexTrack().

ImageCle L'index de l'image-clé.

L'image-clé doit être préalablement créée avec CreateVertexPoseKeyFrame().

IndexPose L'index de pose.

La première pose a un index qui commence à zéro.

Influence L'influence de la pose.

Cette valeur varie de 0.0 (pas d'influence) à 1.0 (influence totale).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

L'animation doit déjà être créée avec CreateVertexAnimation() ou être prédéfinie dans le mesh.

Voir aussi

CreateVertexAnimation(), CreateVertexTrack()


CreateVertexAnimation()

Syntaxe

Resultat = CreateVertexAnimation(#Mesh, Animation$, Duree)
Description
Crée une nouvelle animation.

Arguments

#Mesh | Le mesh à utiliser.
Animation$ Le nom de la nouvelle animation .
Attention ce nom est sensible à la casse.
Duree | La durée de la nouvelle animation (en millisecondes).

Valeur de retour

Renvoie une valeur non nulle si l'animation a été créé avec succès.

Voir aussi

CreateVertexTrack()


CreateVertexPoseKeyFrame()

Syntaxe

Resultat = CreateVertexPoseKeyFrame(#Mesh, Animation$, Piste, Temps)
Description
Crée une nouvelle image-clé dans une animation.

Arguments

#Mesh Le mesh à utiliser.
Animation$ Le nom de l'animation.
Attention ce nom est sensible à la casse.
Piste L'index de piste.

La piste doit être préalablement créée avec CreateVertexTrack().

Temps Le temps dans l'animation de l'image clé (en millisecondes).

Cette valeur doit être comprise entre zéro et la 'longueur' définie dans CreateVertexAnimation().

Valeur de retour

Renvoie l'index de la nouvelle image-clé.

Remarques

L'animation doit déjà être créée avec CreateVertexAnimation() ou être prédéfinie dans le mesh.

Voir aussi

CreateVertexAnimation(), CreateVertexTrack()


CreateVertexTrack()

Syntaxe

Resultat = CreateVertexTrack(#Mesh, Animation$, Index)
Description
Crée une nouvelle piste d'animation.

Arguments

#Mesh Le mesh à utiliser.
Animation$ Le nom de l'animation.
Attention ce nom est sensible à la casse.
Index Le nouvel index de la piste.

Index doit commencer à partir de zéro.

Valeur de retour

Renvoie une valeur non nulle si la piste animation a été créée avec succès.

Remarques

L'animation doit déjà être créée avec CreateVertexAnimation() ou être prédéfinie dans le mesh.

Chaque piste a la même longueur, telle que définie dans CreateVertexAnimation().

Voir aussi

CreateVertexAnimation()


MeshPoseCount()

Syntaxe

Resultat = MeshPoseCount(#Mesh)
Description
Renvoie le nombre de poses dans un mesh.

Arguments

#Mesh Le mesh à utiliser.

Valeur de retour

Renvoie le nombre de poses dans le mesh spécifié.

Remarques

Une pose est une animation vertex prédéfinie dans le mesh.

Voir aussi

MeshPoseName(), AddVertexPoseReference()


MeshPoseName()

Syntaxe

Resultat$ = MeshPoseName(#Mesh, IndexPose)
Description
Renvoie le nom d'une pose dans un mesh.

Arguments

#Mesh Le mesh à utiliser.
IndexPose L'index de la pose. La première pose commence à zéro.

L'index doit être inférieur au résultat de MeshPoseCount().

Valeur de retour

Renvoie le nom de la pose à l'index spécifié.

Remarques

Une pose est une animation vertex prédéfinie dans le mesh.

Voir aussi

MeshPoseName(), AddVertexPoseReference()


UpdateVertexPoseReference()

Syntaxe

UpdateVertexPoseReference(#Mesh, Animation$, Piste, ImageCle, IndexPose, Influence)
Description
Mises à jour d'une nouvelle pose de référence pour une animation.

Arguments

#Mesh Le mesh à utiliser.
Animation$ Le nom de l'animation.
Attention ce nom est sensible à la casse.
Piste L'index de piste.

La piste doit être préalablement créée avec CreateVertexTrack().

ImageCle L'index de l'image-clé.

L'image-clé doit être préalablement créée avec CreateVertexPoseKeyFrame().

IndexPose L'index de pose.

La première pose a un index qui commence à zéro.

Influence L'influence de la pose.

Cette valeur varie de 0.0 (pas d'influence) à 1.0 (influence totale).

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

L'animation doit déjà être créée avec CreateVertexAnimation() ou être prédéfinie dans le mesh.

Voir aussi

CreateVertexAnimation(), CreateVertexTrack()


VertexPoseReferenceCount()

Syntaxe

Resultat = VertexPoseReferenceCount(#Mesh, Animation$, Piste, ImageCle)
Description
Renvoie le nombre de poses de référence dans l'image-clé spécifiée.

Arguments

#Mesh Le mesh à utiliser.
Animation$ Le nom de l'animation.
Attention ce nom est sensible à la casse.
Piste L'index de piste.

La piste doit être préalablement créée avec CreateVertexTrack().

ImageCle L'index de l'image-clé.

L'image-clé doit être préalablement créée avec CreateVertexPoseKeyFrame().

Valeur de retour

Renvoie le nombre de poses de référence dans l'image-clé spécifiée.

Remarques

L'animation doit déjà être créée avec CreateVertexAnimation() ou être prédéfinie dans le mesh.

Voir aussi

CreateVertexAnimation(), CreateVertexTrack(), AddVertexPoseReference()


Window

PureBasic - Window

Généralités

Cette bibliothèque vous permet de gérer et manipuler les composants essentiels et indispensables à une interface graphique moderne: Les fenêtres.

Sommaire des commandes

AddKeyboardShortcut
AddWindowTimer
CloseWindow
DisableWindow
EventData
EventGadget
EventMenu
EventTimer
EventType
EventWindow
GetActiveWindow
GetWindowColor
GetWindowState
GetWindowTitle
HideWindow
IsWindow
OpenWindow
PostEvent
RemoveKeyboardShortcut
RemoveWindowTimer
ResizeWindow
SetActiveWindow
SetWindowCallback
SetWindowColor
SetWindowState
SetWindowTitle
SmartWindowRefresh
StickyWindow
WaitWindowEvent
WindowBounds
WindowEvent
WindowHeight
WindowID
WindowMouseX
WindowMouseY
WindowOutput
WindowWidth
WindowX
WindowY

Exemple

Window.pb

OS Supportés

Tous

Guide de référence - Index


AddKeyboardShortcut()

Syntaxe

AddKeyboardShortcut(#Fenetre, Raccourci, Event)
Description
Ajoute ou remplace un raccourci clavier pour la fenêtre spécifiée. Un raccourci clavier génère un évènement du type 'Menu' car ils sont souvent associés aux élèments des menus (CTRL+O, CTRL+C etc...). 'Event' est le nombre unique qui permettra d'identifier ce raccourci clavier. via la commande EventMenu(). La valeur de 'Event' doit être comprise entre 0 et 64000. Par défaut, une fenêtre a déjà 2 raccourcis clavier pour gérer les déplacement entre les Gadgets: #PB_Shorcut_Tab et #PB_Shortcut_Tab|#PB_Shortcut_Shift shortcuts Un raccourci clavier peut être enlevé avec RemoveKeyboardShortcut().

Le paramètre 'Raccourci' peut prendre l'une des valeurs suivantes:
  #PB_Shortcut_Back
  #PB_Shortcut_Tab
  #PB_Shortcut_Clear
  #PB_Shortcut_Return
  #PB_Shortcut_Menu
  #PB_Shortcut_Pause
  #PB_Shortcut_Print
  #PB_Shortcut_Capital
  #PB_Shortcut_Escape
  #PB_Shortcut_Space
  #PB_Shortcut_Prior
  #PB_Shortcut_Next
  #PB_Shortcut_End
  #PB_Shortcut_Home
  #PB_Shortcut_Left
  #PB_Shortcut_Up
  #PB_Shortcut_Right
  #PB_Shortcut_Down
  #PB_Shortcut_Select
  #PB_Shortcut_Execute
  #PB_Shortcut_Snapshot
  #PB_Shortcut_Insert
  #PB_Shortcut_Delete
  #PB_Shortcut_Help
  #PB_Shortcut_0
  #PB_Shortcut_1
  #PB_Shortcut_2
  #PB_Shortcut_3
  #PB_Shortcut_4
  #PB_Shortcut_5
  #PB_Shortcut_6
  #PB_Shortcut_7
  #PB_Shortcut_8
  #PB_Shortcut_9
  #PB_Shortcut_A
  #PB_Shortcut_B
  #PB_Shortcut_C
  #PB_Shortcut_D
  #PB_Shortcut_E
  #PB_Shortcut_F
  #PB_Shortcut_G
  #PB_Shortcut_H
  #PB_Shortcut_I
  #PB_Shortcut_J
  #PB_Shortcut_K
  #PB_Shortcut_L
  #PB_Shortcut_M
  #PB_Shortcut_N
  #PB_Shortcut_O
  #PB_Shortcut_P
  #PB_Shortcut_Q
  #PB_Shortcut_R
  #PB_Shortcut_S
  #PB_Shortcut_T
  #PB_Shortcut_U
  #PB_Shortcut_V
  #PB_Shortcut_W
  #PB_Shortcut_X
  #PB_Shortcut_Y
  #PB_Shortcut_Z
  #PB_Shortcut_LeftWindows
  #PB_Shortcut_RightWindows
  #PB_Shortcut_Apps
  #PB_Shortcut_Pad0
  #PB_Shortcut_Pad1
  #PB_Shortcut_Pad2
  #PB_Shortcut_Pad3
  #PB_Shortcut_Pad4
  #PB_Shortcut_Pad5
  #PB_Shortcut_Pad6
  #PB_Shortcut_Pad7
  #PB_Shortcut_Pad8
  #PB_Shortcut_Pad9
  #PB_Shortcut_Multiply
  #PB_Shortcut_Add
  #PB_Shortcut_Separator
  #PB_Shortcut_Subtract
  #PB_Shortcut_Decimal
  #PB_Shortcut_Divide
  #PB_Shortcut_F1
  #PB_Shortcut_F2
  #PB_Shortcut_F3
  #PB_Shortcut_F4
  #PB_Shortcut_F5
  #PB_Shortcut_F6
  #PB_Shortcut_F7
  #PB_Shortcut_F8
  #PB_Shortcut_F9
  #PB_Shortcut_F10
  #PB_Shortcut_F11
  #PB_Shortcut_F12
  #PB_Shortcut_F13
  #PB_Shortcut_F14
  #PB_Shortcut_F15
  #PB_Shortcut_F16
  #PB_Shortcut_F17
  #PB_Shortcut_F18
  #PB_Shortcut_F19
  #PB_Shortcut_F20
  #PB_Shortcut_F21
  #PB_Shortcut_F22
  #PB_Shortcut_F23
  #PB_Shortcut_F24
  #PB_Shortcut_Numlock
  #PB_Shortcut_Scroll
Les touches de raccourci ci-dessus peuvent être combinées avec les valeurs suivantes si nécessaire:
  #PB_Shortcut_Shift  : 'Shift' doit être enfoncé pour que le raccourci soit validé
  #PB_Shortcut_Control: 'Control' doit être enfoncé pour que le raccourci soit validé
  #PB_Shortcut_Alt    : 'Alt' doit être enfoncé pour que le raccourci soit validé
  #PB_Shortcut_Command: 'Apple' doit être enfoncé pour que le raccourci soit validé (MacOS X)
Note: la constante #PB_Shortcut_Command est seulement utile sous MacOS X et permet d'utiliser la touche 'Apple' (droite ou gauche) pour définir un raccourci. Cette constante est aussi supportée sur les autres OS (pour faciliter la portabilité): elle aura un rôle identique à #PB_Shortcut_Control.

Exemple

  AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_ShortCut_F, 15) ; Crée un raccourci clavier CTRL+F sur la fenêtre 0
                                                                    ; qui générera un évènement de valeur 15.


AddWindowTimer()

Syntaxe

AddWindowTimer(#Fenetre, Minuteur, Temps)
Description
Ajoute un nouveau minuteur à la '#Fenetre' spécifiée. Cela génèrera des évènements de type #PB_Event_Timer de manière périodique à WindowEvent() ou WaitWindowEvent(). Un nouvel évènement sera envoyé dès que le 'Temps' (en milliseconde) s'est écoulé. RemoveWindowTimer() permet de supprimer un minuteur d'une fenêtre.

Arguments

Le paramètre #Fenetre spécifie la fenêtre qui contient le minuteur. Un minuteur est toujours lié à une fenêtre et sera supprimé si cette fenêtre est fermée.

Une fenêtre peut avoir plusieurs minuteurs actifs en même temps. L'identifiant 'Minuteur' sera renvoyé par EventTimer() quand un évènement de type "#PB_Event_Timer" est reçu. Il peut être utilisé pour retirer le minuteur de la fenêtre avec RemoveWindowTimer().

Note: Les évènements minuteur ne seront générés que si aucun autres évènements ne doivent être processés (les minuteurs ont une priorité basse). Cela implique qu'ils sont relativement peu précis, et que la durée entre deux évènements du même minuteur peut varier. Ils n'ont pas pour vocation à être utilisé pour de la précision, mais plutôt pour effectuer des tâches périodiques comme par exemple la mise à jour d'un gadget.

Exemple

  If OpenWindow(0, 0, 0, 400, 100, "Timer Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ProgressBarGadget(0, 10, 10, 380, 20, 0, 100)
    AddWindowTimer(0, 123, 250)

    Value = 0
    Repeat
      Event = WaitWindowEvent()

      If Event = #PB_Event_Timer And EventTimer() = 123
        Value = (Value + 5) % 100
        SetGadgetState(0, Value)
      EndIf

    Until Event = #PB_Event_CloseWindow
  EndIf


CloseWindow()

Syntaxe

CloseWindow(#Fenetre)
Description
Ferme une fenêtre.

Arguments

#Fenetre La fenêtre à fermer.

Si #PB_All est spécifié, toutes les autres fenêtres sont fermées.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Toutes les fenêtres restant ouvertes sont automatiquement fermées quand le programme se termine.


DisableWindow()

Syntaxe

DisableWindow(#Fenetre, Etat)
Description
Active ou désactive les interactions avec l'utilisateur sur la #Fenetre spécifiée.

Le paramètre 'Etat' peut prendre une des valeurs suivantes:
  1: La fenêtre est désactivée.
  0: La fenêtre est activée.


EventData()

Syntaxe

Valeur = EventData()
Description
Renvoie la valeur associée à l'événement en cours.

Valeur de retour

Renvoie la valeur associée à l'événement en cours.
Si l'événement courant n'est pas un événement personnalisé envoyé par PostEvent(), alors cette valeur n'est pas définie.

Remarques

L'événement doit être un événement personnalisé envoyé avec PostEvent().

Voir aussi

PostEvent(), WindowEvent()


EventGadget()

Syntaxe

Gadget = EventGadget()
Description
Utilisez cette fonction après un évènement de type #PB_Event_Gadget (renvoyé par WindowEvent() ou WaitWindowEvent()) pour savoir le numéro du gadget qui a été utilisé (renvoyé dans 'Gadget').


EventMenu()

Syntaxe

Menu = EventMenu()
Description
Utilisez cette fonction après un évènement de type #PB_Event_Menu (renvoyé par WindowEvent() ou WaitWindowEvent()) pour savoir quel élément du menu a été utilisé (renvoyé dans 'Menu')

Cette commande permet aussi de détecter quel bouton d'une barre d'outil (créé avec CreateToolBar()) a été utilisé.

Un évènement sur une barre d'outils est similaire à un évènement sur un menu (car les barres d'outils sont la plupart du temps des racourcis pour des opérations disponibles dans les menus). Il est donc préférable de prendre les même identifiants pour l'élément du menu et le bouton de la barre d'outils qui représentent la même action, comme ça aucun code supplémentaire n'est nécessaire pour gérer la barre d'outils.


EventTimer()

Syntaxe

Minuteur = EventTimer()
Description
Après un évènement de type #PB_Event_Timer (renvoyé par WindowEvent() ou WaitWindowEvent()), cette fonction détermine quel minuteur a envoyé cet évènement. La valeur renvoyée est la même que celle spécifiée lors de la création du minuteur avec AddWindowTimer().


EventType()

Syntaxe

Event = EventType()
Description
Utilisez cette fonction après WindowEvent() ou WaitWindowEvent() pour savoir quel est le type du dernier évènement survenu. Les valeurs suivantes sont possibles lorsqu'un évènement du type #PB_Event_Gadget (bibliothèque Gadget) ou #PB_Event_SysTray (bibliothèque SysTray) survient:
  #PB_EventType_LeftClick       : Clic avec le bouton gauche de la souris
  #PB_EventType_RightClick      : Clic avec le bouton droit de la souris
  #PB_EventType_LeftDoubleClick : Double-clic avec le bouton gauche de la souris
  #PB_EventType_RightDoubleClick: Double-clic avec le bouton droit de la souris
  #PB_EventType_Focus           : Obtention du focus.
  #PB_EventType_LostFocus       : Perte du focus.
  #PB_EventType_Change          : Le contenu a changé.
  #PB_EventType_DragStart       : L'utilisateur a essayé de lancer Une opération Glisser & Déposer.
EventType() peut être utilisé avec les gadgets suivants :

- CanvasGadget() - Le CanvasGadget a un ensemble spécial de types d'évènement.
- ComboBoxGadget() - ExplorerListGadget()
- ExplorerTreeGadget()
- ImageGadget()
- ListViewGadget()
- ListIconGadget()
- MDIGadget()
- SpinGadget()
- StringGadget()
- WebGadget() - Le WebGadget a un ensemble spécial de types d'évènement.

(Voir la définition du gadget pour connaître les évènements valides)

Exemple

  If OpenWindow(0, 0, 0, 230, 120, "Exemple EventType() ...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

    ListIconGadget(1, 10, 10, 150, 100, "ListIconGadget", 140, #PB_ListIcon_GridLines)
     For a= 1 To 4
       AddGadgetItem(1, -1, "Ligne "+Str(a))
     Next a

     Repeat
       Event = WaitWindowEvent()

       Select Event

         Case #PB_Event_Gadget
           Select EventGadget()
             Case 1
               Select EventType()
                 Case #PB_EventType_LeftClick        : Debug "Clic avec le bouton gauche de la souris"
                 Case #PB_EventType_RightClick       : Debug "Clic avec le bouton droit de la souris"
                 Case #PB_EventType_LeftDoubleClick  : Debug "Double-clic avec le bouton gauche de la souris"
                 Case #PB_EventType_RightDoubleClick : Debug "Double-clic avec le bouton droit de la souris"
               EndSelect
           EndSelect

       EndSelect
     Until Event = #PB_Event_CloseWindow
  EndIf


EventWindow()

Syntaxe

NumeroFenetre = EventWindow()
Description
Utilisez cette fonction après WindowEvent() ou WaitWindowEvent() pour savoir sur quelle fenêtre s'est produit le dernier évènement.


GetActiveWindow()

Syntaxe

Fenetre = GetActiveWindow()
Description
Renvoie le numéro de la fenêtre qui est actuellement active, qui a le focus clavier ou -1 si aucune fenêtre n'est active.

Une fenêtre peut être activée avec la commande SetActiveWindow().


GetWindowColor()

Syntaxe

Couleur = GetWindowColor(#Fenetre)
Description
Renvoie la couleur de fond de la #Fenetre préalablement spécifiée à l'aide de la commande SetWindowColor().

Si aucune couleur de fond n'a été spécifiée, la valeur -1 est renvoyée.


GetWindowState()

Syntaxe

Etat = GetWindowState(#Fenetre)
Description
Détermine si la #Fenetre est maximisée, minimisée ou affichée normalement.

La valeur 'Etat' peut prendre l'une des valeurs suivantes:
  #PB_Window_Normal  : La fenêtre est affichée normalement.
  #PB_Window_Maximize: La fenêtre est maximisée.
  #PB_Window_Minimize: La fenêtre est minimisée.
L'état d'affichage d'une fenêtre est modifiable avec la commande SetWindowState().


GetWindowTitle()

Syntaxe

Resultat$ = GetWindowTitle(#Fenetre)
Description
Renvoie dans 'Resultat$' le texte actuellement affiché dans la barre de titre de la #Fenetre specifiée. Le titre de la fenêtre est modifiable avec la commande SetWindowTitle().
  If OpenWindow(2, 100, 100, 200, 100, "Un joli titre")
    Titre$ = GetWindowTitle(2)  ; Titre$ contiendra la chaîne "Un joli titre"
  EndIf


HideWindow()

Syntaxe

HideWindow(#Fenetre, Etat, [, Options]) )
Description
Cache ou rend visible la #Fenetre spécifiée.

Arguments

Etat 'Etat' peut prendre une des valeurs suivantes:
  #True  : La #Fenetre est cachée
  #False : La #Fenetre est rendue visible
Options Peut prendre une des valeurs suivantes:
  #PB_Window_NoActivate: La fenêtre s'affiche mais n'est pas activée.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Voir aussi

OpenWindow()


IsWindow()

Syntaxe

Resultat = IsWindow(#Fenetre)
Description
Teste si la #Fenetre est correctement initialisée. Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. Si le 'Résultat' est différent de zéro, alors cet objet est valide. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.


OpenWindow()

Syntaxe

Resultat = OpenWindow(#Fenetre, x, y, LargeurInterne, HauteurInterne, Titre$ [, Options [, FenetreMereID]])
Description
Ouvre une nouvelle fenêtre avec les paramètres spécifiés. Si #PB_Any est utilisé pour le paramètre '#Fenetre', le numéro de la fenêtre sera renvoyé dans 'Resultat'.
La nouvelle fenêtre devient la fenêtre active sans avoir besoin d'utiliser SetActiveWindow() (sauf si elle a été créée en mode invisible). Si Resultat = 0, la fenêtre ne peut être ouverte.

'LargeurInterne' et 'HauteurInterne' spécifient les dimensions nécessaires pour la zone interne de la fenêtre (sans les bordures et la barre de titre) afin d'assurer la compatibilité avec les systèmes d'habillage des fenêtres propres à Windows XP, AmigaOS et Linux (la taille des bordures peut en effet varier selon la police et/ou le thème utilisé). 'x' et 'y' indiquent la position initiale de la fenêtre (sauf si l'une des options de centrage est utilisée). Si l'une d'elle est #PB_Ignore, le système choisira une position pour la fenêtre.

Le paramètre 'FenetreMereID' est facultatif et indique de quelle fenêtre la nouvelle fenêtre dépend. 'FenetreMereID' peut être obtenu facilement par la commande WindowID().

Les options possibles sont:
  #PB_Window_SystemMenu     : Autorise le menu système sur la barre de titre.
  #PB_Window_MinimizeGadget : Ajoute l'icône 'Réduire' sur la barre de titre. #PB_Window_SystemMenu est ajouté automatiquement.
  #PB_Window_MaximizeGadget : Ajoute l'icône 'Agrandir' sur la barre de titre. #PB_Window_SystemMenu est ajouté automatiquement.
  #PB_Window_SizeGadget     : Ajoute les possibilités de redimensionnement à la fenêtre.
  #PB_Window_Invisible      : Crée la fenêtre mais ne l'affiche pas. Non supporté sur AmigaOS.
  #PB_Window_TitleBar       : Crée la fenêtre avec une barre de titre.
  #PB_Window_BorderLess     : Crée une fenêtre sans bordure.
  #PB_Window_Tool           : Crée une fenêtre avec une barre de titre plus fine, et non visible dans la barre des tâches.
  #PB_Window_ScreenCentered : Centre la fenêtre au milieu de l'écran. Les paramètres x,y sont ignorés.
  #PB_Window_WindowCentered : Centre la fenêtre au milieu de la fenêtre mère ('FenetreMereID' doit être spécifié). Les paramètres x,y sont ignorés.
  #PB_Window_Maximize       : Ouvre la fenêtre en mode maximisé. (Note: sous Linux, certains gestionnaires de fenêtres ne supportent pas cela)
  #PB_Window_Minimize       : Ouvre la fenêtre en mode minimisé.
  #PB_Window_NoGadgets      : Empêche la création d'une GadgetList. UseGadgetList() peut être utilisé pour le faire plus tard.
  #PB_Window_NoActivate     : Ne pas activer la fenêtre après son ouverture.
Si le paramètre facultatif 'Options' n'est pas renseigné, #PB_Window_SystemMenu sera utilisé.

Tous les évènements possibles dans une fenêtre sont gérés par les commandes WindowEvent() et WaitWindowEvent(). Pour les situations spéciales les callbacks sont utilisées, voir la description de SetWindowCallback(). Sous Windows, la largeur et la hauteur d'une fenêtre avec une bordure ne peuvent pas être inférieur à environ 100 pixels. Pour ouvrir une fenêtre plus petite, utiliser l'option #PB_Window_BorderLess.

Note: Une fenêtre ne devrait pas être ouverte dans un thread, car il y a une limitation sur OS X et Linux. Une erreur débogueur sera levée. Quand une fenêtre est ouverte dans un thread, le thread doit appeler WindowEvent() ou WaitWindowEvent() dans une boucle pour gérer les évènements pour cette fenêtre, car les évènements des fenêtres sont propres à chaque thread.


PostEvent()

Syntaxe

PostEvent(Evenement [, Fenetre, Objet [, Type [, Valeur]]])
Description
Envoie un événement à la fin de la file d'attente interne.

Arguments

Evenement L'événement à envoyer.

Pour une liste des évènements PureBasic, voir WindowEvent().
Lors de l'utilisation d'événements personnalisés, la première valeur doit être au moins #PB_Event_FirstCustomValue, pour ne pas entrer en conflit avec les événements internes.
Fenetre (optionnel) Le numéro de fenêtre associé à l'événement.

Lors de l'utilisation d'un événement personnalisé, cela peut être n'importe quel nombre entier.
Cette valeur peut être récupérée avec EventWindow().
Objet (optionnel) Le numéro de l'objet associé à l'événement.

Cela peut être par exemple un numéro de gadget ou de menu.
Lors de l'utilisation d'un événement personnalisé, cela peut être n'importe quel nombre entier.
Cette valeur peut être récupérée avec EventGadget().
Type (optionnel) Le type associé à l'événement.

Lors de l'utilisation d'un événement personnalisé, cela peut être n'importe quel nombre entier.
Cette valeur peut être récupérée avec EventType().
Valeur (optionnel) La données associées à l'événement.

Seulement avec un événement personnalisé, cela peut être n'importe quel nombre entier.
Cette valeur peut être récupérée avec EventData().

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Cette commande peut être très utile pour communiquer entre les threads et la boucle d'événements principale. Par exemple, un thread peut envoyer un événement personnalisé quand il a fini son traitement (avec une donnée associée), de sorte que la boucle principale peut l'obtenir et le traitement ultérieur peut être fait.
  ; Tous nos événements personnalisés
  Enumeration #PB_Event_FirstCustomValue
    #EvenementDebutAction
    #EvenementFinAction
  EndEnumeration

  Procedure Thread(Valeur)

    Delay(1000)
    PostEvent(#EvenementDebutAction)

    Delay(3000)
    PostEvent(#EvenementFinAction)

  EndProcedure

  OpenWindow(0, 200, 200, 100, 100, "PostEvent")

  CreateThread(@Thread(), 0)

  Repeat
    Event = WaitWindowEvent()

    Select Event
      Case #EvenementDebutAction
        Debug "Le Thread commence une action... "

      Case #EvenementFinAction
        Debug "Le Thread a terminé une action"
    EndSelect

  Until Event = #PB_Event_CloseWindow

Voir aussi

WindowEvent(), EventWindow(), EventGadget(), EventType(), EventData()


RemoveKeyboardShortcut()

Syntaxe

RemoveKeyboardShortcut(#Fenetre, Raccourci)
Description
Enlève le raccourci clavier précédemment ajouté avec AddKeyboardShortcut(). Pour une liste complète des raccourcis disponibles: AddKeyboardShortcut(). Si 'Raccourci' est égal à #PB_Shortcut_All alors tous les raccourcis claviers sont enlevés d'un coup.


RemoveWindowTimer()

Syntaxe

RemoveWindowTimer(#Window, Minuteur)
Description
Retire le 'Minuteur' de la '#Fenetre' spécifiée. Le 'Minuteur' doit avoir la même valeur que celle spécifiée lors de sa création avec AddWindowTimer(). Il n'y aura plus d'évènements générés par ce minuteur.


ResizeWindow()

Syntaxe

ResizeWindow(#Fenetre, x, y, Largeur, Hauteur)
Description
Déplace et redimensionne la #Fenetre. Si un ou plusieurs paramètres doivent être ignorés (inchangés), la constante #PB_Ignore peut être utilisée pour ces paramètres.


SetActiveWindow()

Syntaxe

SetActiveWindow(#Fenetre)
Description
Change la fenêtre active du programme. On dit aussi qu'on lui donne le 'Focus'.


SetWindowCallback()

Syntaxe

SetWindowCallback(@NomDeLaProcedure() [, #Fenetre])
Description
Pour programmeurs expérimentés. Cette fonction est seulement disponible sous Microsoft Windows. Les évènements classiques devraient toujours être gérés avec les commandes WaitWindowEvent() ou WindowEvent(). Cette commande permet d'accéder directement à la callback utilisée par Windows pour gérer les évènements reçus par l'application. Cela permet d'avoir un contrôle total sur ces derniers. Attention, c'est relativement bas niveau pour du BASIC et peut interférer avec les évènements PureBasic si elle est incorrectement utilisée.

Le paramètre optionnel permet d'affecter la commande SetWindowCallback() seulement à la '#Fenetre' spécifiée.

Pour annuler une Callback (fonction de rappel) il suffit d'appeler SetWindowCallback(0 [, #Fenetre]).

La procédure qui servira de callback doit avoir 4 paramètres et se présente sous la forme suivante:
  Procedure MaProcedureCallback(WindowID, Message, wParam, lParam)
    Resultat = #PB_ProcessPureBasicEvents
    ;
    ; entrez votre code ici
    ;
    ProcedureReturn Resultat
  EndProcedure
L'exemple qui suit montre comment tester quelques paramètres d'une fenêtre. (En utilisant les constantes de l' API Windows):
  Procedure WinCallback(hWnd, uMsg, wParam, lParam)
    ; Nous pouvons tester dans la callback les paramètres renseignés automatiquement par windows

    If uMsg = #WM_SIZE
      Select wParam
        Case #SIZE_MINIMIZED
          Debug "La fenêtre est minimisée"
        Case #SIZE_RESTORED
          Debug "La fenêtre est rétablie"
        Case #SIZE_MAXIMIZED
          Debug "La fenêtre est agrandie"
      EndSelect
    EndIf

    ProcedureReturn #PB_ProcessPureBasicEvents
  EndProcedure

  If OpenWindow(0, 0, 0, 200, 100, "Messages", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)

    SetWindowCallback(@WinCallback())    ; active la callback

    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          End
      EndSelect
    ForEver

  EndIf

OS Supportés

Windows


SetWindowColor()

Syntaxe

SetWindowColor(#Fenetre, Couleur)
Description
Change la couleur de fond de la #Fenetre.

La commande RGB() peut être utilisée pour obtenir une couleur valide. Un tableau avec les couleurs les plus courantes est disponible ici.

La valeur -1 pour le paramètre 'Couleur' est disponible pour réinitialiser la couleur de fond par la couleur par défaut.

La couleur de fond d'une fenêtre peut être récupérée à l'aide de GetWindowColor().


SetWindowState()

Syntaxe

SetWindowState(#Fenetre, Etat)
Description
Change l'état minimisé ou maximisé de la #Fenetre.

La valeur 'Etat' peut prendre l'une des valeurs suivantes:
  #PB_Window_Normal  : La fenêtre sera affichée normalement.
  #PB_Window_Maximize: La fenêtre sera maximisée.
  #PB_Window_Minimize: La fenêtre sera minimisée.
L'état d'affichage d'une fenêtre est récupérable avec la commande GetWindowState().


SetWindowTitle()

Syntaxe

SetWindowTitle(#Fenetre, NouveauTitre$)
Description
Change le texte actuellement affiché dans la barre de titre de la #Fenetre spécifiée.
  If OpenWindow(2, 100, 100, 200, 100, "Titre initial")
    SetWindowTitle(2, "Titre après changement !")

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
Le titre de la fenêtre est récupérable avec la commande GetWindowTitle().


SmartWindowRefresh()

Syntaxe

SmartWindowRefresh(#Fenetre, Etat)
Description
Active une méthode particulière d'affichage de fenêtre visant à réduire les scintillements lors d'un redimensionnement. Si la fenêtre n'est pas redimensionnable, cette commande n'est pas utile. Cette méthode n'est pas garantie de fonctionner dans tous les cas de figure, et le mieux est de l'activer, faire des tests pour voir si elle a vraiment un effet. Si 'Etat' est 0, le rafraichissement intelligent est désactivé, sinon il est activé.

OS Supportés

Windows


StickyWindow()

Syntaxe

StickyWindow(#Fenetre, Etat)
Description
Affiche la #Fenetre toujours au premier plan (même devant les autres programmes), même si elle n'est pas active.

Le paramètre 'Etat' peut prendre l'une des valeurs suivantes:
  1: la fenêtre sera toujours au premier plan.
  0: le fenêtre ne restera pas au premier plan si elle n'est pas active.


WaitWindowEvent()

Syntaxe

Evenement = WaitWindowEvent([Minuteur])
Description
Bloque l'exécution du programme jusqu'à ce qu'un évènement intervienne. Cette fonction est identique à WindowEvent(), mais le blocage de l'exécution est très important dans un environnement multi-tâches.

Arguments

Minuteur (optionnel) Permet de spécifier le temps maximal (en millisecondes) durant lequel la fonction sera bloquante si aucun évènement ne survient.

Si aucun délai n'est spécifié, il attend indéfiniment jusqu'à ce qu'un événement se produit.

Valeur de retour

Renvoie l'événement qui s'est produit, consultez WindowEvent() pour plus d'informations.

Remarques

Une application devrait, si possible, toujours utiliser cette fonction en préférence à WindowEvent() car il ne prend pas de temps CPU en attente d'un événement.

Quand une fenêtre est ouverte dans un thread, le thread doit appeler WindowEvent() ou WaitWindowEvent() dans une boucle pour gérer les évènements pour cette fenêtre, car les évènements des fenêtres sont propres à chaque thread.

WaitWindowEvent() ne peut être appelé qu'une seule fois par boucle d'évènements, sinon les évènements seront "perdus" (chaque événement ne peut être traité qu'une seule fois et n'est plus disponible pour un deuxième traitement).

Exemple

  If OpenWindow(0, 0, 0, 230, 90, "Exemple de gestion des évènements...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

   ButtonGadget  (1, 10, 10, 200, 20, "Cliquez moi")
   CheckBoxGadget(2, 10, 40, 200, 20, "Cochez  moi")

   If CreateMenu(0, WindowID(0))
     MenuTitle("Menu")
     MenuItem(1, "Item 1")
     MenuItem(2, "Item 2")
     MenuItem(3, "Item 3")
   EndIf

   Repeat
     Event = WaitWindowEvent()

     Select Event

       Case #PB_Event_Gadget
         Select EventGadget()
           Case 1 : Debug "Bouton 1 cliqué!"
           Case 2 : Debug "Bouton 2 cliqué!"
         EndSelect

       Case #PB_Event_Menu
         Select EventMenu()
           Case 1 : Debug "Menu item 1 cliqué!"
           Case 2 : Debug "Menu item 2 cliqué!"
           Case 3 : Debug "Menu item 3 cliqué!"
         EndSelect

     EndSelect
   Until Event = #PB_Event_CloseWindow
 EndIf


WindowBounds()

Syntaxe

WindowBounds(#Fenetre, LargeurMinimale, HauteurMinimale, LargeurMaximale, HauteurMaximale)
Description
Change les dimensions minimale et maximale de la #Fenetre (en pixels). C'est utile pour éviter qu'une fenêtre ne devienne trop petite ou trop grande quand un utilisateur la redimensionne. Il est possible d'utiliser #PB_Ignore en guise de paramètre pour conserver une ou des valeurs.

Exemple

  If OpenWindow(0, 0, 0, 300, 300, "Redimensionne moi !", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
    WindowBounds(0, 200, 200, 400, 400)

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


WindowEvent()

Syntaxe

Event = WindowEvent()
Description
Teste si un évènement s'est produit sur chacune des fenêtres ouvertes. Cette fonction est à retour immédiat. Utilisez-la de préférence dans une boucle temposisée pour ne pas monopoliser les ressources de microprocesseur dans cette tâche.
Si vous souhaitez bloquer l'exécution du programme, utilisez la fonction WaitWindowEvent().
Pour obtenir le numéro de fenêtre où s'est produit l'évènement, utilisez la fonction EventWindow().

Cette commande doit être utilisée avec précaution, car comme elle n'est pas bloquante, elle peut consommer tout le temps processeur quand elle est dans une boucle d'attente. Dans de tels cas, utilisez la commande Delay() quelque part dans la boucle ou la commande WaitWindowEvent() avec un petit minuteur est conseillé.

Quand une fenêtre est ouverte dans un thread, le thread doit appeler WindowEvent() ou WaitWindowEvent() dans une boucle pour gérer les évènements pour cette fenêtre, car les évènements des fenêtres sont propres à chaque thread.

Les évènements possibles sont :
  #PB_Event_Menu            : Un menu a été sélectionné
  #PB_Event_Gadget          : Un gadget a été cliqué
  #PB_Event_SysTray         : Une icône dans la zone SysTray a été cliquée
  #PB_Event_Timer           : Le temps d'un minuteur s'est écoulé
  #PB_Event_CloseWindow     : L'icône de fermeture de fenêtre a été cliquée
  #PB_Event_Repaint         : Tout ou partie du contenu de la fenêtre a été détruit et doit être reconstitué
                              (Utile pour les applications graphiques 2D)
  #PB_Event_SizeWindow      : La fenêtre a été redimensionnée
  #PB_Event_MoveWindow      : La fenêtre a été déplacée
  #PB_Event_MinimizeWindow  : La fenêtre a été minimisée
  #PB_Event_MaximizeWindow  : La fenêtre a été maximisée
  #PB_Event_RestoreWindow   : La fenêtre a été restaurée à sa taille normale
  #PB_Event_ActivateWindow  : La fenêtre a été activée (gain du focus)
  #PB_Event_DeactivateWindow: La fenêtre a été désactivée (perte du focus)
  #PB_Event_WindowDrop      : Une opération Glisser & Déposer s'est terminée sur une fenêtre
  #PB_Event_GadgetDrop      : Une opération Glisser & Déposer s'est terminée sur un gadget
  #PB_Event_RightClick      : Un clic droit de la souris s'est produit sur la fenêtre. Cela peut être utile pour afficher un menu contextuel
  #PB_Event_LeftClick       : Un clic gauche de la souris s'est produit sur la fenêtre
  #PB_Event_LeftDoubleClick : Un double clic gauche de la souris s'est produit sur la fenêtre

Vous trouverez un exemple dans la description de WaitWindowEvent().

Après un évènement #PB_Event_WindowDrop ou #PB_Event_GadgetDrop , les fonctions de la bibliothèque Drag & Drop peuvent être utilisées pour examiner et lire les données déposées.

Pour une utilisation efficace de la boucle WindowEvent() il convient de respecter cette structure:
  Repeat
    Event = WindowEvent()

    If Event    ; Un evenement est dans la file d'attente, il faut le gerer.
      ....
    Else
      Delay(1)  ; Plus d'evenements dans la file d'attente, laissons du temps processeur aux autres applications !
    EndIf
  Until Event = #PB_Event_CloseWindow
Note: Le délai ne doit pas être spécifié après chaque évènement, car quand il y a de nombreux évènements dans la file d'attente (lors d'un rafraîchissement de fenêtre, de gadgets etc..) l'application attendra 1 ms entre chaque évènement ce qui rendra l'affichage très lent. Le délai est utile uniquement quand il n'y a plus d'évènement dans la file d'attente (donc quand WindowEvent() renvoie 0). Une autre façon de procéder est d'utiliser les 'timers' de l'API avec WaitWindowEvent().


WindowHeight()

Syntaxe

Hauteur = WindowHeight(#Fenetre [, Mode])
Description
Renvoie la hauteur d'une fenêtre.

Arguments

#Fenetre La fenêtre à utiliser.
Mode (optionnel) Le mode de calcul de la hauteur de la fenêtre. Cela peut être une des valeurs suivantes:
  #PB_Window_InnerCoordinate: Hauteur de la zone intérieure de la fenêtre.
                              (où un gadget peut être ajouté), à l'exclusion
                              des bordures (par défaut).
  #PB_Window_FrameCoordinate: Hauteur de la fenêtre, incluants les bordures.

Valeur de retour

Renvoie la hauteur en pixels de la fenêtre spécifiée.

Voir aussi

OpenWindow(), WindowWidth()


WindowID()

Syntaxe

WindowID = WindowID(#Fenetre)
Description
Renvoie l'identifiant unique de la fenêtre dans le système d'exploitation. Cette fonction est très utile car WindowID est souvent demandé par d'autres fonctions.


WindowMouseX()

Syntaxe

x = WindowMouseX(#Fenetre)
Description
Renvoie la position horizontale de la souris en points graphique depuis le bord gauche de la #Fenetre. x peut contenir une valeur négative si le pointeur de la souris est à l'extérieur de la #Fenetre.

Pour avoir la position absolue en 'x' de la souris sur le bureau, la commande DesktopMouseX() est disponible.

Exemple

  If OpenWindow(0, 0, 0, 300, 30, "Position de la souris sur la fenêtre", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

    TextGadget(0, 10, 6, 200, 20, "")

    Repeat
      Event = WaitWindowEvent(20) ; Boucle au moins chaque 20ms pour une mise à jour

      SetGadgetText(0, "Coordonnées: " + Str(WindowMouseX(0)) + "," + Str(WindowMouseY(0)))
    Until Event = #PB_Event_CloseWindow
  EndIf


WindowMouseY()

Syntaxe

y = WindowMouseY(#Fenetre)
Description
Renvoie la position verticale de la souris en points graphique depuis le bord supérieur de la #Fenetre. y peut contenir une valeur négative si le pointeur de la souris est à l'extérieur de la #Fenetre.

Pour avoir la position absolue en 'y' de la souris sur le bureau, la commande DesktopMouseY() est disponible.

Exemple

  If OpenWindow(0, 0, 0, 300, 30, "Position de la souris sur la fenêtre", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

    TextGadget(0, 10, 6, 200, 20, "")

    Repeat
      Event = WaitWindowEvent(20) ; Boucle au moins chaque 20ms pour une mise à jour

      SetGadgetText(0, "Coordonnées: " + Str(WindowMouseX(0)) + "," + Str(WindowMouseY(0)))
    Until Event = #PB_Event_CloseWindow
  EndIf


WindowOutput()

Syntaxe

OutputID = WindowOutput(#Fenetre)
Description
Renvoie la valeur OutputID de la #Fenetre nécessaire à StartDrawing() pour effectuer les dessins 2D directement sur la #Fenetre.

Note: Le contenu dessiné sur une fenêtre sera effacé dès que la fenêtre ou une partie de cette dernière sera recouverte par une autre fenetre, quand elle sera déplacée en dehors de l'écran ou quand elle sera cachée ou minimisée. Pour garder le contenu visible, il est obligatoire de le redessiner après chaque évènement #PB_Event_Repaint. Une manière plus confortable pour afficher un dessin sur une fenêtre est d'utiliser une image et ImageGadget() qu'il est possible de mettre à jour avec SetGadgetState(). Tout l'affichage sera géré par le gadget.


WindowWidth()

Syntaxe

Largeur = WindowWidth(#Fenetre [, Mode])
Description
Renvoie la largeur d'une fenêtre.

Arguments

#Fenetre La fenêtre à utiliser.
Mode (optionnel) Le mode de calcul de la largeur de la fenêtre. Cela peut être une des valeurs suivantes:
  #PB_Window_InnerCoordinate: Largeur de la zone intérieure de la fenêtre.
                              (où un gadget peut être ajouté), à l'exclusion
                              des bordures (par défaut).
  #PB_Window_FrameCoordinate: Largeur de la fenêtre, incluants les bordures.

Valeur de retour

Renvoie la largeur en pixels de la fenêtre spécifiée.

Voir aussi

OpenWindow(), WindowHeight()


WindowX()

Syntaxe

X = WindowX(#Fenetre [, Mode])
Description
Renvoie la position gauche d'une fenêtre.

Arguments

#Fenetre La fenêtre à utiliser.
Mode (optionnel) Le mode de calcul de la position X de la fenêtre. Cela peut être une des valeurs suivantes:
  #PB_Window_FrameCoordinate: Position X de la fenêtre, incluant les bordures (par défaut).
  #PB_Window_InnerCoordinate: Position X de la zone intérieure de la fenêtre
                              (où gadget peut être ajouté), à l'exclusion des bordures.

Valeur de retour

Renvoie la position X depuis le bord gauche de l'écran (en pixels) de la fenêtre.

Voir aussi

OpenWindow(), WindowY()


WindowY()

Syntaxe

Y = WindowY(#Fenetre [, Mode])
Description
Renvoie la position haute d'une fenêtre.

Arguments

#Fenetre La fenêtre à utiliser.
Mode (optionnel) Le mode de calcul de la position Y de la fenêtre. Cela peut être une des valeurs suivantes:
  #PB_Window_FrameCoordinate: Position Y de la fenêtre, incluant les bordures (par défaut).
  #PB_Window_InnerCoordinate: Position Y de la zone intérieure de la fenêtre
                              (où gadget peut être ajouté), à l'exclusion des bordures.

Valeur de retour

Renvoie la position Y depuis le bord haut de l'écran (en pixels) de la fenêtre.

Voir aussi

OpenWindow(), WindowY()


Window3D

PureBasic - Window3D

Généralités

La bibliothèque Window3D permet de créer des interfaces graphiques complexes (GUI) directement sur la zone d'écran utilisant le moteur 3D. Elle est principalement destinée à la création de jeux ou d'applications qui doivent se lancer en mode plein écran et qui nécessitent une interface utilisateur.
La syntaxe de cette bibliothèque est similaire à la bibliothèque window.
Le moteur utilisé pour l'interface graphique se nomme CEGUI, il permet l'utilisation de skins, il est rapide et contient de nombreux gadgets prédéfinis. Vous trouverez plus d'informations au sujet de CEGUI ici : http://www.cegui.org.uk.

InitEngine3D() doit être appelé avec succès avant de pouvoir utiliser les commandes relatives aux fenêtres 3D.

Pour utiliser les fenêtres 3D, une caméra doit être créée au préalable.

Sommaire des commandes

CloseWindow3D
DisableWindow3D
EventGadget3D
EventType3D
EventWindow3D
GetActiveWindow3D
GetWindowTitle3D
HideWindow3D
IsWindow3D
OpenWindow3D
ResizeWindow3D
SetActiveWindow3D
SetWindowTitle3D
WindowEvent3D
WindowHeight3D
WindowID3D
WindowWidth3D
WindowX3D
WindowY3D

Exemple

Window3D.pb

OS Supportés

Tous

Guide de référence - Index


CloseWindow3D()

Syntaxe

CloseWindow3D(#Fenetre3D)
Description
Ferme la #Fenetre3D spécifiée.

Si #PB_All est spécifié, toutes les fenêtres 3D restantes sont fermées.

Note: toutes les fenêtres restant ouvertes sont automatiquement fermées quand le programme se termine.


DisableWindow3D()

Syntaxe

DisableWindow3D(#Fenetre3D, Etat)
Description
Active ou désactive les interactions avec l'utilisateur sur la #Fenetre3D spécifiée.

Le paramètre 'Etat' peut prendre une des valeurs suivantes:
  1: La fenêtre est désactivée.
  0: La fenêtre est activée.


EventGadget3D()

Syntaxe

Gadget3D = EventGadget3D()
Description
Utilisez cette fonction après un évènement de type #PB_Event3D_Gadget (renvoyé par WindowEvent3D()) pour connaitre le numéro du gadget qui a été utilisé (renvoyé dans 'Gadget3D').


EventType3D()

Syntaxe

Event3D = EventType3D()
Description
Utilisez cette fonction après WindowEvent3D() pour savoir quel est le type du dernier évènement survenu. Les valeurs suivantes sont possibles lorsqu'un évènement du type #PB_Event3D_Gadget (bibliothèque Gadget3D) survient:
  #PB_EventType3D_Focus           : Obtention du focus.
  #PB_EventType3D_LostFocus       : Perte du focus.
  #PB_EventType3D_Change          : Le contenu a changé.
EventType3D() peut être utilisé avec les gadgets suivants :

- SpinGadget3D()
- StringGadget3D()
(Voir la définition du gadget pour connaître les évènements valides)


EventWindow3D()

Syntaxe

Fenetre3D = EventWindow3D()
Description
Utilisez cette fonction après WindowEvent3D() pour savoir sur quelle fenêtre s'est produit le dernier évènement.


GetActiveWindow3D()

Syntaxe

Fenetre3D = GetActiveWindow3D()
Description
Renvoie le numéro de la fenêtre qui est actuellement active (qui a le 'focus').

Une fenêtre peut être activée avec la commande SetActiveWindow3D().


GetWindowTitle3D()

Syntaxe

Resultat$ = GetWindowTitle3D(#Fenetre3D)
Description
Renvoie dans 'Resultat$' le texte actuellement affiché dans la barre de titre de la #Fenetre3D specifiée. Le titre de la fenêtre est modifiable avec la commande SetWindowTitle3D().


HideWindow3D()

Syntaxe

HideWindow3D(#Fenetre3D, Etat)
Description
Cache ou rend visible la #Fenetre3D spécifiée. 'Etat' peut prendre une des valeurs suivantes:
  1: La #Fenetre3D est cachée
  0: La #Fenetre3D est rendue visible


IsWindow3D()

Syntaxe

Resultat = IsWindow3D(#Fenetre3D)
Description
Teste si la #Fenetre3D est correctement initialisée. Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. Si le 'Résultat' est différent de zéro, alors cet objet est valide. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.


OpenWindow3D()

Syntaxe

Resultat = OpenWindow3D(#Fenetre3D, x, y, LargeurInterne, HauteurInterne, Titre$ [, Options])
Description
Ouvre une nouvelle fenêtre avec les paramètres spécifiés. Si #PB_Any est utilisé pour le paramètre '#Fenetre3D', le numéro de la fenêtre sera renvoyé dans 'Resultat'.
La nouvelle fenêtre devient la fenêtre active sans avoir besoin d'utiliser SetActiveWindow3D() (sauf si elle a été créée en mode invisible). Si Resultat = 0, la fenêtre ne peut être ouverte.

'LargeurInterne' et 'HauteurInterne' spécifient les dimensions nécessaires pour la zone interne de la fenêtre (sans les bordures et la barre de titre). 'x' et 'y' indiquent la position initiale de la fenêtre (sauf si l'une des options de centrage est utilisée). Si l'une d'elle est #PB_Ignore, le système choisira une position pour la fenêtre.

Les options possibles sont:
  #PB_Window3D_SizeGadget     : Ajoute les possibilités de redimensionnement à la fenêtre.
  #PB_Window3D_Invisible      : Crée la fenêtre mais ne l'affiche pas.
  #PB_Window3D_BorderLess     : Crée une fenêtre sans bordure.

Tous les évènements possibles dans une fenêtre sont gérés par la commande WindowEvent3D().


ResizeWindow3D()

Syntaxe

ResizeWindow3D(#Fenetre3D, x, y, Largeur, Hauteur)
Description
Déplace et redimensionne la #Fenetre3D. Si un ou plusieurs paramètres doivent être ignorés (inchangés), la constante #PB_Ignore peut être utilisée pour ces paramètres.


SetActiveWindow3D()

Syntaxe

SetActiveWindow3D(#Fenetre3D)
Description
Change la fenêtre active du programme. On dit aussi qu'on lui donne le 'Focus'.


SetWindowTitle3D()

Syntaxe

SetWindowTitle3D(#Fenetre3D, NouveauTitre$)
Description
Change le texte actuellement affiché dans la barre de titre de la #Fenetre3D spécifiée.

Le titre de la fenêtre est récupérable avec la commande GetWindowTitle3D().


WindowEvent3D()

Syntaxe

Event3D = WindowEvent3D()
Description
Teste si un évènement s'est produit sur chacune des fenêtres ouvertes. Cette fonction est à retour immédiat.
Pour obtenir le numéro de fenêtre où s'est produit l'évènement, utilisez la fonction EventWindow3D().

Les évènements possibles sont :
  #PB_Event3D_Gadget         : Un Gadget3D a été cliqué
  #PB_Event3D_CloseWindow    : L'icône de fermeture de fenêtre a été cliquée
  #PB_Event3D_SizeWindow     : La fenêtre a été redimensionnée
  #PB_Event3D_MoveWindow     : La fenêtre a été déplacée
  #PB_Event3D_ActivateWindow : La fenêtre a été activée (gain du focus)


WindowHeight3D()

Syntaxe

Hauteur = WindowHeight3D(#Fenetre3D)
Description
Renvoie la hauteur en pixels de la #Fenetre3D spécifiée.


WindowID3D()

Syntaxe

WindowID3D = WindowID3D(#Fenetre3D)
Description
Renvoie l'identifiant unique de la fenêtre dans le système d'exploitation. Cette fonction est très utile car WindowID3D est souvent demandé par d'autres fonctions.


WindowWidth3D()

Syntaxe

Largeur = WindowWidth3D(#Fenetre3D)
Description
Renvoie la largeur en pixels de la #Fenetre3D spécifiée.


WindowX3D()

Syntaxe

x = WindowX3D(#Fenetre3D)
Description
Renvoie la position gauche de la #Fenetre3D spécifiée, en pixels.


WindowY3D()

Syntaxe

y = WindowY3D(#Fenetre3D)
Description
Renvoie la position haute de la #Fenetre3D spécifiée, en pixels.


XML

PureBasic - XML

Généralités

Cette bibliothèque permet de manipuler très facilement les fichiers XML, que ce soit en en lecture ou en écriture. Elle est basée sur expat qui est sous licence MIT consultable ici. Expat est déjà utilisée dans de nombreux projets d'envergures (comme Mozilla ou Perl), et est à la fois robuste et rapide.

Important: La licence d'expat est très permissive, et permet son utilisation gratuite dans n'importe quel type de projet (commercial ou non) à partir du moment ou le texte de la licence est fourni avec l'application lors de sa distribution. Donc si vous utilisez cette bibliothèque, vous devez inclure un fichier contenant la licence mentionnée ci-dessus.

Les fonctions d'expat peuvent être utilisées directement dans PureBasic comme n'importe quelle autre fonction API (avec un 'underscore' à la fin du nom de la fonction). Les constantes et les structures définies dans expat.h sont aussi directement disponibles. La version unicode d'expat est automatiquement choisie si l'option Compiler-Switch "Créer un exécutable unicode" est utilisée. Pour plus de détails sur les fonctions d'expat, consultez la documentation sur http://expat.sourceforge.net/

La bibliothèque supporte partiellement les DTD ('Document Type Definitions') et les espaces de noms. Le but est de garder l'ensemble des commandes très simple tout en permettant à cette bibliothèque de manipuler n'importe quel document XML correct (respectant les règles).

Le parser de la bibliothèque expat est un analyseur syntaxique ("parser") non validant ce qui signifie qu'il vérifie si les documents parsés comportent des erreurs dans les balises (un document doit être "bien formé" selon la norme XML), mais il ne valide pas le document par rapport à un DTD. En parsant le document cette bibliothèque place les DTDs dans un noeud spécifique de l'arbre XML en lui attribuant le type #PB_XML_DTD. Ce noeud contient la balise DOCTYPE complète. De cette manière on peut facilement y accèder et en manipuler le contenu mais on peut aussi l'ignorer si ces informations ne sont pas nécessaires. La balise est simplement recopiée quand le document est exporté ou sauvegardé.

Les espaces de noms ne sont pas résolus lors de l'analyse syntaxique du document ("parsing"). Cela signifie que dans un document utilisant des espaces de noms, ces espaces de noms sont accessibles comme des attributs de noeud normaux, et les noms des noeuds/attributs utilisant les espaces de noms seront visibles en tant que : "namespace:tagname" (i.e "espace_de_noms:balise"). Cela permet à un document utilisant les espaces de noms d'être lu et sauvegardé comme n'importe quel autre document sans détruire sa structure. Pour fonctionner avec des espaces de noms plus simples, les fonctions ResolveXMLNodeName() et ResolveXMLAttributeName() sont fournies pour résoudre les conflits éventuels de noms à l'intérieur des documents qui utilisent les espaces de noms.

Le débogueur PureBasic permet d'examiner les objets XML pendant l'exécution du programme à l'aide du visualisateur de bibliothèques.

La spécification officielle du XML et des Namespaces XML par le W3C est disponible ici:
Spécification XML
Namespaces XML
Traductions de divers documents relatifs au XML

XML sur Wikipedia fournit aussi une bonne introduction au XML.

Sommaire des commandes

CatchXML
ChildXMLNode
CopyXMLNode
CreateXML
CreateXMLNode
DeleteXMLNode
ExamineXMLAttributes
ExportXML
ExportXMLSize
FormatXML
FreeXML
GetXMLAttribute
GetXMLEncoding
GetXMLNodeName
GetXMLNodeOffset
GetXMLNodeText
GetXMLStandalone
IsXML
LoadXML
MainXMLNode
MoveXMLNode
NextXMLAttribute
NextXMLNode
ParentXMLNode
PreviousXMLNode
RemoveXMLAttribute
ResolveXMLAttributeName
ResolveXMLNodeName
RootXMLNode
SaveXML
SetXMLAttribute
SetXMLEncoding
SetXMLNodeName
SetXMLNodeOffset
SetXMLNodeText
SetXMLStandalone
XMLAttributeName
XMLAttributeValue
XMLChildCount
XMLError
XMLErrorLine
XMLErrorPosition
XMLNodeFromID
XMLNodeFromPath
XMLNodePath
XMLNodeType
XMLStatus

Exemple

Xml.pb

OS Supportés

Tous

Guide de référence - Index


CatchXML()

Syntaxe

Resultat = CatchXML(#XML, *Adresse, Longueur [, Options [, Encodage]])
Description
Crée un objet #XML à partir de la zone mémoire spécifiée. La création de l'objet XML peut se faire en une seule fois, ou de manière progressive (par exemple lors de la réception d'un flux XML par le réseau). Si #PB_Any est utilisé pour le paramètre '#XML', le numéro du nouvel objet sera renvoyé dans 'Resultat'.

Arguments

'*Adresse' et 'Longueur' doivent indiquer une zone de mémoire valide. Si le paramètre 'Options' est omis, la zone mémoire doit contenir les données XML au complet. Pour interpréter un flux XML en plusieurs blocs, les options suivantes sont disponibles:
  #PB_XML_StreamStart: Démarre l'interprétation du premier bloc
  #PB_XML_StreamNext : Continue l'interprétation avec un nouveau bloc
  #PB_XML_StreamEnd  : Termine l'interprétation après ce bloc
Lors de l'appel de cette fonction avec l'option #PB_XML_StreamStart ou #PB_XML_StreamEnd, le paramètre 'Longueur' peut être égal à 0, pour démarrer ou finir l'interprétation sans spécifier réellement de données.

A noter que lors de l'interprétation par blocs, toute donnée fournie est immédiatement accessible dans l'objet XML avant même que l'appel avec #PB_XML_StreamEnd ait eu lieu.

Le paramètre optionnel "Encodage" peut être utilisé pour obliger le parser à utiliser un encodage spécifique. (la déclaration XML est modifiée selon l'encodage choisi). Les valeurs possibles sont :
  #PB_Ascii
  #PB_Unicode
  #PB_UTF8
Ce paramètre devra être utilisé lorsque le document n'a pas de déclaration XML, ou que l'information d'encodage est fournie en dehors du document XML, par exemple à travers un en-tête de type "mime" dans un protocole de communication.

Valeur de retour

Cette commande renvoie 0 seulement lors d'options invalides ou si une zone de mémoire est corrompue. Pour vérifier les erreurs d'interprétation, il convient d'utiliser XMLStatus(). Dans le cas d'une erreur d'interprétation, toutes les données correctement lues avant l'erreur sont quand même disponibles dans l'objet XML.


ChildXMLNode()

Syntaxe

*Resultat = ChildXMLNode(*Noeud [, Index])
Description
Renvoie le noeud fils du noeud XML spécifié. Si 'Index' est omis, le premier noeud fils est renvoyé, sinon le noeud fils situé à l'index indiqué est renvoyé (la numération de l'index commence à 1).

Valeur de retour

Renvoie un pointeur sur le noeud fils indiqué, ou zéro s'il n'existe pas.


CopyXMLNode()

Syntaxe

*Resultat = CopyXMLNode(*Noeud, *NoeudParent [, *NoeudPrecedent])
Description
Duplique le '*Noeud' XML spécifié et tout son contenu (texte et noeuds fils) à un nouvel emplacement. Cette fonction peut même copier des noeuds de documents XML différents. Pour déplacer un noeud à un nouvel emplacement, utiliser MoveXMLNode().

Arguments

'*Noeud' indique le noeud à dupliquer.
'*NoeudParent' est le noeud sous lequel le noeud copié sera inséré. Pour insérer le noeud à la racine de l'objet XML, utiliser RootXMLNode().
'*NoeudPrecedent' représente le noeud fils de '*NoeudParent' après lequel le nouveau noeud devra être inséré. Si sa valeur est omise ou égale à 0, le nouveau noeud est inséré en tant que premier fils du noeud parent. Si sa valeur est -1, alors le nouveau noeud est inséré comme dernier fils du noeud parent.

Les règles suivantes doivent être respectées pour que la copie se déroule correctement:
- Le noeud racine ne peut pas être copié
- '*NoeudParent' ne peut pas être de type #PB_XML_Comment ou #PB_XML_CData
- '*NoeudPrecedent' doit être un fils direct du '*NoeudParent' (s'il est spécifié)
- Si l'objet XML a déjà un noeud principal, seuls les noeuds de type autres que #PB_XML_Normal et #PB_XML_CData peuvent être insérés à la racine

Valeur de retour

Renvoie le pointeur du noeud nouvellement copié ou zéro si la duplication n'est pas possible.


CreateXML()

Syntaxe

Resultat = CreateXML(#XML [, Encodage])
Description
Crée un nouvel objet #XML vide. Si #PB_Any est utilisé pour le paramètre '#XML', le numéro du nouvel objet sera renvoyé dans 'Resultat'. Si le 'Resultat' est égal à zéro, la fonction a échoué.
'Encodage' détermine l'encodage qui sera utilisé par l'objet XML. Les valeurs possibles sont #PB_Ascii, #PB_Unicode ou #PB_UTF8 (#PB_UTF8 est la valeur par défaut).

Le nouvel objet aura seulement un seul noeud racine, qui pourra être accédé avec RootXMLNode(). Pour ajouter de nouveaux noeuds, utiliser CreateXMLNode().

Exemple

  ; Création d'un objet xml
  xml = CreateXML(#PB_Any)
  mainNode = CreateXMLNode(RootXMLNode(xml))
  SetXMLNodeName(mainNode, "Zoo")

  ; Création du premier noeud
  item = CreateXMLNode(mainNode)
  SetXMLNodeName(item, "Animal")
  SetXMLAttribute(item, "id", "1")
  SetXMLNodeText(item, "Elephant")

  ; Création du second noeud
  item = CreateXMLNode(mainNode)
  SetXMLNodeName(item, "Animal")
  SetXMLAttribute(item, "id", "2")
  SetXMLNodeText(item, "Tigre")

  ; Enregistre l'objet XML dans le fichier spécifié.
  SaveXML(xml, "demo.xml")


CreateXMLNode()

Syntaxe

*Resultat = CreateXMLNode(*NoeudParent [, *NoeudPrecedent [, Type]])
Description
Crée un nouveau noeud XML et l'insert sous le '*NoeudParent' spécifié.

Arguments

'*NoeudParent' est le noeud sous lequel le nouveau noeud doit être inséré. Pour insérer le noeud à la racine de l'objet XML, utilisez RootXMLNode().
'*NoeudPrecedent' représente le noeud fils de '*NoeudParent' après lequel le nouveau noeud devra être inséré. Si sa valeur est omise ou égale à 0, le nouveau noeud est inséré en tant que premier fils du noeud parent. Si sa valeur est -1, alors le nouveau noeud est inséré comme dernier fils du noeud parent.
'Type' spécifie le type pour ce nouveau noeud. Le type par défaut est #PB_XML_Normal. Note: le type du noeud ne peut plus être modifié une fois qu'il a été créé.

Les règles suivantes doivent être respectées pour que l'insertion se passe correctement:
- '*NoeudParent' ne peut pas être de type #PB_XML_Comment ou #PB_XML_CData
- '*NoeudPrecedent' doit être un fils direct du '*NoeudParent' (s'il est spécifié)
- Un noeud de type #PB_XML_Root ne peut pas être créé manuellement
- Si l'objet XML a déjà un noeud principal, seuls les noeuds de type autres que #PB_XML_Normal et #PB_XML_CData peuvent être insérés à la racine

Valeur de retour

Renvoie le pointeur du noeud nouvellement créé ou zéro s'il n'a pas pu être inséré à cet endroit.


DeleteXMLNode()

Syntaxe

DeleteXMLNode(*Noeud)
Description
Efface le '*Noeud' XML et tout son contenu (texte et fils).

Note: le noeud racine d'un document XML ne peut pas être effacé.


ExamineXMLAttributes()

Syntaxe

Resultat = ExamineXMLAttributes(*Noeud)
Description
Démarre l'énumération des attributs du '*Noeud' XML spécifié.

Valeur de retour

Renvoie une valeur différente de zéro si le noeud est de type #PB_XML_Normal, sinon zéro est renvoyé (car ces noeuds ne peuvent pas avoir d'attributs).


ExportXML()

Syntaxe

Resultat = ExportXML(#XML, *Adresse, Longueur [, Options])
Description
Ecrit un objet XML dans la zone de mémoire spécifiée.

L'objet XML ainsi créé n'est pas reformaté. Il est réécrit comme il avait été interprété lors de son chargement ou de sa création. Le nombre d'espace ou de retour à la ligne est conservé dans le champs 'text' de chaque noeud XML (voir GetXMLNodeText() pour plus d'informations). Pour reformater le XML avant de l'enregistrer, le champs 'text' de chaque noeud XML peut être modifiée manuellement ou avec FormatXML().

Arguments

'Options' peut être une combinaison des valeurs suivantes (avec l'opérateur '|'):
  #PB_XML_StringFormat : Ecrit un BOM (Byte Order Mark). Voir WriteStringFormat() pour plus d'informations.
  #PB_XML_NoDeclaration: La déclaration XML n'est pas incluse.
Note: Selon les spécifications XML, la déclaration XML peut être omise seulement si le document est encodé en UTF-8 ou UTF-16 ou si l'information d'encodage est fournie en dehors du document (par l'intermédiaire d'un protocole de communication par exemple). Malgré tout, il est conseillé de conserver la déclaration dans le document.

Valeur de retour

Renvoie une valeur différente de zéro si la 'Longueur' était suffisante pour contenir l'objet XML au complet. ExportXMLSize() permet de déterminer la taille nécessaire à l'export.


ExportXMLSize()

Syntaxe

Resultat = ExportXMLSize(#XML [, Options])
Description
Renvoie la taille en octet qui sera nécessaire pour exporter complètement un objet XML dans une zone de mémoire ou dans un fichier. Cette commande est particulièrement utile pour déterminer la taille nécessaire à ExportXML().

Le paramètre 'Options' peut être utiliser pour indiquer les mêmes options que dans la commande ExportXML(). Ce qui permet de tenir compte des options pour le calcul de la taille.


FormatXML()

Syntaxe

FormatXML(#XML, Options [, Indentation])
Description
Nettoie ou reformate l'objet XML pour le rendre plus lisible lors d'un export ou d'un enregistrement", ou plus compact si la taille est primordiale (avant un transfert réseau par exemple).

Le formatage de l'objet XML est stocké dans les champs 'text' et 'offset' de chaque noeud (voir GetXMLNodeText() et GetXMLNodeOffset() pour plus d'informations).

Arguments

'Options' peut être une combinaison des valeurs suivantes:
  #PB_XML_WindowsNewline: Change tous les retours chariot en CRLF
  #PB_XML_LinuxNewline  : Change tous les retours chariot en LF
  #PB_XML_MacNewline    : Change tous les retours chariot en CR

  #PB_XML_CutNewline    : Enlève tous les retours chariot
  #PB_XML_ReduceNewline : Enlève toutes les lignes vides

  #PB_XML_CutSpace      : Enlève tous les espaces
  #PB_XML_ReduceSpace   : Enlève tous les espaces en double

  #PB_XML_ReFormat      : Reformate complètement l'objet XML
  #PB_XML_ReIndent      : Change l'indentation des lignes
Pour #PB_XML_ReFormat et #PB_XML_ReIndent, le paramètre 'Indentation' définit le nombre d'espaces à rajouter par niveau d'indentation.

Note: Il n'y a pas de reformatage dans les sections CData et 'Processing Instructions' mis à part les retours chariots, car les espaces contenus dans ces sections peuvent être importants.

Note: Depuis MacOSX, le retour chariot 'CR' est devenu de moins en moins commun au profit du retour chariot 'LF' utilisé sur tous les systèmes unix. L'option #PB_XML_MacNewline est fournie pour des raisons de compatibilité, mais il est conseillé d'utiliser #PB_XML_LinuxNewline sur MacOS X.


FreeXML()

Syntaxe

FreeXML(#XML)
Description
Supprime l'objet #XML et toutes les données qu'il contenait.

Arguments

#XML L'objet XML à supprimer.

Si #PB_All est spécifié, tous les objets XML restants sont libérés.

Valeur de retour

Cette fonction n'a pas de valeur de retour.

Remarques

Tous les objets XML restants sont automatiquement supprimés quand le programme se termine.


GetXMLAttribute()

Syntaxe

Resultat$ = GetXMLAttribute(*Noeud, Attribut$)
Description
Renvoie la valeur d'un attribut du '*Noeud' XML spécifié. Si l'attribut n'existe pas, une chaîne vide sera renvoyée.

Seuls les noeuds du type #PB_XML_Normal peuvent avoir des attributs. Pour tous les autres types de noeuds, cette fonction renvoie une chaîne vide.


GetXMLEncoding()

Syntaxe

Resultat = GetXMLEncoding(#XML)
Description
Renvoie l'encodage du texte utilisé pour exporter ou enregistrer l'objet #XML.

Valeur de retour

Renvoie soit #PB_Ascii, #PB_Unicode (UTF16) ou #PB_UTF8.


GetXMLNodeName()

Syntaxe

Resultat$ = GetXMLNodeName(*Noeud)
Description
Renvoie le nom du '*Noeud' XML spécifié. Si le noeud n'est pas du type #PB_XML_Normal ou #PB_XML_Instruction, une chaîne vide sera renvoyée.


GetXMLNodeOffset()

Syntaxe

Resultat = GetXMLNodeOffset(*Noeud)
Description
Renvoie le décalage en caractères de ce '*Noeud' par rapport à son parent.

La valeur renvoyée réprésente le nombre de caractères dans le texte du noeud parent qui lie ce noeud et le fils précédent. Donc si ce noeud suit directement le noeud précédent, cette valeur sera 0.


GetXMLNodeText()

Syntaxe

Resultat$ = GetXMLNodeText(*Noeud)
Description
Renvoie le texte contenu à l'intérieur du noeud XML.

Pour un noeud de type #PB_XML_Normal, c'est tout le texte et les espaces contenus dans le noeud qui ne sont pas situés dans des noeuds fils.
Pour le noeud racine, c'est tout les espaces situés en dehors du noeud principal (il ne peut pas y avoir de texte en dehors du noeud principal).
Pour les noeuds #PB_XML_Comment ou #PB_XML_CData, c'est tout le texte du noeud.


GetXMLStandalone()

Syntaxe

Resultat = GetXMLStandalone(#XML)
Description
Renvoie la valeur de l'attribut "autonome" (standalone) de la déclaration XML du document.

Valeur de retour

Renvoie une des valeurs suivantes:
  #PB_XML_StandaloneYes  : Le mode du document est autonome.
  #PB_XML_StandaloneNo   : Le mode du document n'est pas autonome.
  #PB_XML_StandaloneUnset: Le mode autonome n'est pas spécifié dans la déclaration.


IsXML()

Syntaxe

Resultat = IsXML(#XML)
Description
Teste si l'objet #XML est correctement initialisé. Cette fonction a été créé pour pouvoir passer n'importe quelle valeur en paramètre sans qu'il ne puisse y avoir de plantage. Si le 'Resultat' est différent de zéro, alors cet objet est valide. C'est la fonction idéale pour vérifier qu'un objet est correctement initialisé.


LoadXML()

Syntaxe

Resultat = LoadXML(#XML, Fichier$ [, Encodage]))
Description
Crée un objet #XML à partir du fichier spécifié. Si #PB_Any est utilisé pour le paramètre '#XML', le numéro du nouvel objet sera renvoyé dans 'Resultat'.

Le paramètre optionnel "Encodage" peut être utilisé pour obliger le parser à utiliser un encodage spécifique. (la déclaration XML est modifiée selon l'encodage choisi). Les valeurs possibles sont :
  #PB_Ascii
  #PB_Unicode
  #PB_UTF8
Ce paramètre devra être utilisé lorsque le document n'a pas de déclaration XML, ou que l'information d'encodage est fournie en dehors du document XML, par exemple à travers un en-tête de type "mime" dans un protocole de communication.

Valeur de retour

Renvoie une valeur différente de zéro si le fichier a pu être ouvert et lu correctement. Cela ne veut pas dire que le XML contenu dans ce fichier était valide. Pour vérifier les erreurs d'interprétation, il convient d'utiliser XMLStatus(). Dans le cas d'une erreur d'interprétation, toutes les données correctement lues avant l'erreur sont quand même disponibles dans l'objet XML.


MainXMLNode()

Syntaxe

*Resultat = MainXMLNode(#XML)
Description
Renvoie le noeud principal du document #XML. Un objet XML valide doit toujours avoir un noeud principal qui contient tous les autres noeuds. En dehors de ce noeud, il peut seulement y avoir des commentaires. Le type de ce noeud est #PB_Xml_Normal.

Valeur de retour

Renvoie un pointeur sur le noeud principal, ou zéro si l'objet XML n'a pas de noeud principal (ce qui peut arriver si l'objet est vide ou que le noeud principal a été effacé).


MoveXMLNode()

Syntaxe

Resultat = MoveXMLNode(*Noeud, *NoeudParent [, *NoeudPrecedent])
Description
Déplace le '*Noeud' XML spécifié et tout son contenu (texte et noeuds fils) à un nouvel emplacement. Cette fonction peut même déplacer des noeuds de documents XML différents. Pour copier un noeud à un nouvel emplacement, utiliser CopyXMLNode().

Arguments

'*Noeud' indique le noeud à déplacer.
'*NoeudParent' est le noeud sous lequel le noeud déplacé sera inséré. Pour insérer le noeud à la racine de l'objet XML, utiliser RootXMLNode().
'*NoeudPrecedent' représente le noeud fils de '*NoeudParent' après lequel le nouveau noeud devra être inséré. Si sa valeur est omise ou égale à 0, le nouveau noeud est inséré en tant que premier fils du noeud parent. Si sa valeur est -1, alors le nouveau noeud est inséré comme dernier fils du noeud parent.

Les règles suivantes doivent être respectées pour que le déplacement se déroule correctement:
- Le noeud racine ne peut pas être déplacé
- '*NoeudParent' ne peut pas être de type #PB_XML_Comment ou #PB_XML_CData
- '*NoeudPrecedent' doit être un fils direct du '*NoeudParent' (s'il est spécifié)
- '*Noeud' et '*NoeudPrecedent' ne peuvent pas être identiques
- '*NoeudParent' ne peut pas être égal à '*Noeud'ou à un de ses fils (un noeud ne peut pas être déplacé dans lui-même)
- Si l'objet XML a déjà un noeud principal, seuls les noeuds de type autres que #PB_XML_Normal et #PB_XML_CData peuvent être insérés à la racine

Valeur de retour

Renvoie une valeur différente de zéro si le déplacement est un succès, ou zéro si le déplacement est impossible.


NextXMLAttribute()

Syntaxe

Resultat = NextXMLAttribute(*Noeud)
Description
Cette fonction doit être appelée après ExamineXMLAttributes() et permet de passer à l'attribut suivant.

Valeur de retour

Renvoie zéro si il n'y a plus d'attributs à énumérer, sinon cela renvoie une valeur différente de zéro.


NextXMLNode()

Syntaxe

*Resultat = NextXMLNode(*Noeud)
Description
Renvoie le noeud XML suivant.

Valeur de retour

Renvoie un pointeur sur le noeud suivant, ou zéro s'il n'y a plus de noeud après celui-ci.


ParentXMLNode()

Syntaxe

*Resultat = ParentXMLNode(*Noeud)
Description
Renvoie le noeud parent du noeud XML spécifié. Chaque noeud XML a un parent, sauf le noeud racine.

Valeur de retour

Renvoie un pointeur sur le noeud parent, ou zéro si '*Noeud' est le noeud racine.


PreviousXMLNode()

Syntaxe

*Resultat = PreviousXMLNode(*Noeud)
Description
Renvoie le noeud XML précédent.

Valeur de retour

Renvoie un pointeur sur le noeud précédent, ou zéro s'il n'y a plus de noeud avant celui-ci.


RemoveXMLAttribute()

Syntaxe

RemoveXMLAttribute(*Noeud, Attribut$)
Description
Supprime l'attribut du '*Noeud' XML spécifié.

Seuls les noeuds du type #PB_XML_Normal peuvent avoir des attributs. Pour tous les autres types de noeuds, cette fonction sera sans effet.


ResolveXMLAttributeName()

Syntaxe

Resultat$ = ResolveXMLAttributeName(*Noeud, Attribut$ [, Separateur$])
Description
Renvoie le nom complet et qualifié du noeud donné en attribut dans un document qui utilise les espaces de noms XML. Le nom complet et qualifié se compose de l'uri de l'espace de noms (s'il existe) et du nom de l'attribut local), séparé par le séparateur donné par 'Separateur$'. Le caractère de séparation (séparateur) par défaut est "/".

Note: à la différence des noms de noeuds, l'espace de noms par défaut n'est pas utilisé pour qualifier un nom qui n'a pas de préfix lié à un espace de noms. Ainsi, les noms qualifiés sans préfix d'espace de noms ont simplement leur nom local renvoyé.

Valeur de retour

Dans un document utilisant les espaces de noms, renvoie le nom qualifié (complet) de l'attribut s'il peut-être correctement résolu ou une chaîne vide si le préfix de l'espace de noms est utilisé sans être jamais déclaré (ce qui n'est pas valide).

Dans un document sans espaces de noms, renvoie le nom de l'attribut.


ResolveXMLNodeName()

Syntaxe

Resultat$ = ResolveXMLNodeName(*Noeud [, Separateur$])
Description
Renvoie le nom qualifié du noeud fourni dans le document qui utilise les espaces de noms XML. Le nom qualifié comporte l'uri de l'espace de noms (s'il existe) et le nom du noeud local, séparés par le caractère de séparation donné dans 'Separateur$'. Le caractère de séparation par défaut est "/".

Valeur de retour

Dans un document utilisant les espaces de noms, cette fonction renvoie le nom qualifié du noeud s'il a été correctement résolu ou une chaîne vide si un préfix d'espaces de noms est utilisé mais n'a jamais été déclaré (ce qui n'est pas valide).

Dans un document sans espaces de noms, la fonction renvoie le nom du noeud.


RootXMLNode()

Syntaxe

*Resultat = RootXMLNode(#XML)
Description
Renvoie un pointeur sur le noeud racine de l'objet #XML. Ce noeud est toujours présent. Il représente le document XML au complet. Le texte de ce noeud contient les espaces en dehors de tout noeud XML (il ne peut pas y avoir de texte en dehors des noeuds). Les fils de ce noeud sont le noeud principal et tous les commentaires situés en dehors du noeud principal. Le type de ce noeud est #PB_Xml_Root.

Valeur de retour

Renvoie toujours un noeud XML valide si l'objet #XML est correctement initialisé.


SaveXML()

Syntaxe

Resultat = SaveXML(#XML, Fichier$ [, Options])
Description
Enregistre l'objet #XML dans le fichier spécifié.

Le fichier XML ainsi créé n'est pas reformaté. Il est réécrit comme il avait été interprété lors de son chargement ou de sa création. Le nombre d'espace ou de retour à la ligne est conservé dans le champ 'text' de chaque noeud XML (voir GetXMLNodeText() pour plus d'informations). Pour reformater le XML avant de l'enregistrer, le champ 'text' de chaque noeud XML peut être modifiée manuellement ou avec FormatXML().

Arguments

'Options' peut être une combinaison des valeurs suivantes (avec l'opérateur '|'):
  #PB_XML_StringFormat : Ecrit un BOM (Byte Order Mark). Voir WriteStringFormat() pour plus d'informations.
  #PB_XML_NoDeclaration: La déclaration XML n'est pas incluse.
Note: Selon les spécifications XML, la déclaration XML peut être omise seulement si le document est encodé en UTF-8 ou UTF-16 ou si l'information d'encodage est fournie en dehors du document (par l'intermédiaire d'un protocole de communication par exemple). Malgré tout, il est conseillé de conserver la déclaration dans le document.

Valeur de retour

Renvoie une valeur différente de zéro si l'enregistrement s'est déroulé correctement, sinon zéro est renvoyé.


SetXMLAttribute()

Syntaxe

SetXMLAttribute(*Noeud, Attribut$, Valeur$)
Description
Change la valeur d'un attribut du '*Noeud' XML spécifié. Si l'attribut n'existe pas encore, il sera ajouté.

Seuls les noeuds du type #PB_XML_Normal peuvent avoir des attributs. Pour tous les autres types de noeuds, cette fonction sera sans effet.


SetXMLEncoding()

Syntaxe

SetXMLEncoding(#XML, Encodage)
Description
Change l'encodage du texte utilisé pour exporter ou enregistrer l'objet #XML. L'encodage peut être #PB_Ascii, #PB_Unicode (UTF16) ou #PB_UTF8.

Note: ce paramètre affecte seulement l'export et l'enregistrement" de l'objet. Les données internes de l'objet XML sont toujours stockées dans le format de 'string' de PureBasic (ascii ou unicode en fonction des options de compilations). Donc un exécutable unicode peut sans problème utiliser #PB_Ascii lors de l'enregistrement et effectuer d'autres changements sans craindre une altération de ses données.


SetXMLNodeName()

Syntaxe

SetXMLNodeName(*Noeud, Nom$)
Description
Change le nom du '*Noeud' XML spécifié. Si le noeud n'est pas du type #PB_XML_Normal ou #PB_XML_Instruction, cette fonction n'aura aucun effet.


SetXMLNodeOffset()

Syntaxe

SetXMLNodeOffset(*Noeud, Decalage)
Description
Change le décalage en caractères du '*Noeud' par rapport au texte de son parent. Voir GetXMLNodeOffset() pour plus d'informations.


SetXMLNodeText()

Syntaxe

SetXMLNodeText(*Noeud, Text$)
Description
Change le texte contenu dans le '*Noeud' spécifié (voir GetXMLNodeText() pour plus d'informations).

Note: Si le noeud contient des fils, changer son contenu peut aussi demander un ajustement du décalage des noeuds fils.


SetXMLStandalone()

Syntaxe

SetXMLStandalone(#XML, Autonome)
Description
Change l'attribut "autonome" (standalone) de la déclaration XML lors de l'exportation ou de l'enregistrement du document.

'Autonome' peut être une des valeurs suivantes:
  #PB_XML_StandaloneYes  : Le mode du document est autonome.
  #PB_XML_StandaloneNo   : Le mode du document n'est pas autonome.
  #PB_XML_StandaloneUnset: Le mode autonome n'est pas spécifié dans la déclaration.
Note : Tant que la bibliothèque ne valide pas les définitions de type de document (DTDs), la valeur de cet attribut n'a aucun effet sur l'analyse syntaxique/l'enregistrement des documents avec cette bibliothèque excepté qu'ils sont lus depuis la déclaration XML ou écrits dans cette déclaration. Cette valeur est cependant importante quand on travaille avec des documents XML qui sont destinés à un analyseur syntaxique validant, c'est la raison pour laquelle cette commande existe.


XMLAttributeName()

Syntaxe

Resultat$ = XMLAttributeName(*Noeud)
Description
Après avoir appellé ExamineXMLAttributes() et NextXMLAttribute() cette fonction renvoie le nom de l'attribut du '*Noeud' en cours d'examen.


XMLAttributeValue()

Syntaxe

Resultat$ = XMLAttributeValue(*Noeud)
Description
Après avoir appelé ExamineXMLAttributes() et NextXMLAttribute() cette fonction renvoie la valeur de l'attribut du '*Noeud' en cours d'examen.


XMLChildCount()

Syntaxe

Resultat = XMLChildCount(*Noeud)
Description
Renvoie le nombre de noeud fils appartenant au '*Noeud' indiqué.


XMLError()

Syntaxe

Resultat$ = XMLError(#XML)
Description
Quand une erreur d'interprétation XML survient, cette commande renvoie un message textuel (en anglais) décrivant succintement l'erreur. XMLStatus() peut être utilisée pour détecter si une erreur est survenue.

Pour avoir plus d'informations sur l'erreur, XMLErrorLine() et XMLErrorPosition() sont disponibles.


XMLErrorLine()

Syntaxe

Resultat = XMLErrorLine(#XML)
Description
Quand une erreur d'interprétation XML survient, cette commande renvoie la ligne incriminée dans le document (la numérotation des lignes commence à 1). XMLStatus() peut être utilisée pour détecter si une erreur est survenue.

Pour savoir à quelle position dans la ligne l'erreur est apparue , utiliser XMLErrorPosition().


XMLErrorPosition()

Syntaxe

Resultat = XMLErrorPosition(#XML)
Description
Quand une erreur d'interprétation XML survient, cette commande renvoie la position du caractère dans la ligne incriminée (voir XMLErrorLine()). (la numérotation des caractères commence à 1). XMLStatus() peut être utilisée pour détecter si une erreur est survenue.


XMLNodeFromID()

Syntaxe

*Resultat = XMLNodeFromID(#XML, ID$)
Description
Dans un objet XML valide, si un noeud a un attribut nommé "ID", la valeur de cet attribut doit être unique dans tout le document. Cette commande permet de chercher un noeud dans le document XML en fonction de son attribut ID.

Valeur de retour

Renvoie un pointeur sur le noeud correspondant à l'ID spécifié, ou zéro si aucun noeud n'a été trouvé.


XMLNodeFromPath()

Syntaxe

*Resultat = XMLNodeFromPath(*NoeudParent, Chemin$)
Description
Renvoie le noeud XML contenu dans le '*NoeudParent' dont la relation est déterminée par 'Chemin$'. XMLNodePath() peut être utilisé pour obtenir un tel chemin pour un noeud donné.

Arguments

'Chemin$' contient la liste des noeuds séparée par '/' indiquant le chemin à suivre pour aller du noeud parent au noeud cible. Par exemple "voitures/cabriolet" réprésente le premier noeud avec le nom "cabriolet" dans le noeud nommé "voitures" du '*NoeudParent'.

Le nom d'un noeud peut avoir un index (commençant à 1) pour spécifier lequel des noeuds fils portant le même nom doit être sélectionné. "voitures/cabriolet[3]" représente le 3ème "cabriolet" dans "voitures" de '*ParentNode'.

Autres règles:
- Si un chemin commence avec '/', il est relatif à la racine de l'objet XML. Le paramètre '*NoeudParent' est ignoré.
- Un motif "*" est utilisable à la place d'un nom de noeud pour indiquer que n'importe quel noeud est valide.
- Un noeud de commentaire porte le nom "#comment"
- Un noeud CData porte le nom "#cdata"
- A DTD node has the tagname "#dtd"
- A Processing Instruction node has the tagname "#instruction"

Quelques exemples de chemins:
  "/mainnode/#comment[4]" - le 4ème commentaire dans le noeud "mainnode" du noeud racine.
  "*[10]"                 - le 10ème noeud (de n'importe quel type) du '*NoeudParent'
  "*/*/*"                 - le premier noeud 3 niveau en dessous du '*NoeudParent' en ne tenant pas compte de leurs types
  "node[3]/*[3]/#cdata"   - la première section CData dans le 3ème noeud de n'importe quel type dans le 3ème noeud "node" du '*NoeudParent'
Note: This command is no implementation of the XPath specification. The syntax used and understood by this command is only a small subset of XPath. This means a path returned from XMLNodePath() is a valid XPath query, but this command only understands the syntax described here, not just any XPath query.

Valeur de retour

Renvoie le pointeur du noeud cible, ou zéro si le chemin ne représente pas un noeud valide.


XMLNodePath()

Syntaxe

Resultat$ = XMLNodePath(*Noeud [, *NoeudParent])
Description
Renvoie la réprésentation textuelle de la relation entre le '*Noeud' et son '*NoeudParent'. Si '*NoeudParent' est spécifié, il doit être un parent (immédiat ou non) du '*Noeud'. Si il est omis, le noeud racine sera pris comme référentiel.

Voir XMLNodeFromPath() pour une description sur le format du résultat renvoyé.


XMLNodeType()

Syntaxe

Resultat = XMLNodeType(*Noeud)
Description
Renvoie le type du noeud XML spécifié. Les différentes valeurs possibles sont:

#PB_XML_Root
C'est le noeud racine de l'objet. Il représente le document lui-même. Ce noeud ne peut pas être ajouté ou supprimé. A l'intérieur de ce noeud racine, il ne peut seulement y avoir qu'un seul noeud du type #PB_XML_Normal et, de plus, aucun texte. (Ceci est indispensable pour obtenir un document XML bien formé).
#PB_XML_Normal
C'est un noeud normal dans l'arborescence. Il peut avoir des attributs et contenir du texte ou/et des fils.
Exemple: <attribut noeud="bonjour"> texte contenu </node>
#PB_XML_Comment
Ce noeud contient un commentaire. Il ne peut avoir ni fils ni attribut, seulement du texte.
Exemple: <!-- texte du commentaire -->
#PB_XML_CData
C'est une section CData. Une section CData contient seulement du texte. Son contenu n'est pas interprété par l'analyseur lexical elle peut donc contenir des caractères spéciaux non décorés comme "<" ou ">" par exemple. Les sections CData peuvent être utilisées pour inclure d'autres balises ou codes à l'intérieur d'un document sans avoir à décorer tous les caractères spéciaux qui pourraient être interprétés comme étant du XML.
Exemple: <![CDATA[ contenu de cdata ]]>
#PB_XML_DTD
C'est une déclaration de type de document (DTD). Cette bibliothèque n'utilise pas un analyseur lexical validant, ainsi ces déclarations sont en réalité ignorées quand le document est analysé. Afin de pouvoir les sauvegarder correctement elles sont insérées à l'intérieur de ce type de noeud DTD. Elles peuvent être lues et modifiées grâce à des commandes telles que SetXMLNodeText() et seront sauvegardées en l'état dans le document lors de l'exportation/enregistrement. La commande SetXMLStandalone() peut également être très utile pour travailler avec les DTDs.
Exemple: <!DOCTYPE name SYSTEM "external dtd uri">
#PB_XML_Instruction
Ce noeud représente une instruction (un ordre). Les instructions contiennent des informations destinées à être interprétées/exécutées par l'application cible. Elles ont un nom pour préciser le contenu de l'instruction et les données de l'instruction auxquelles GetXMLNodeText() doit pouvoir accéder.
Exemple: <?php if (...) ... ?>
(Ici "php" est le nom du noeud, et ce qui suit le "?>" est le texte du noeud.)


XMLStatus()

Syntaxe

Resultat = XMLStatus(#XML)
Description
Renvoie le status de la dernière interprétation faite sur cet objet XML (avec LoadXML() ou CatchXML()). Cette commande devrait être utilisée après chaque appel de LoadXML() ou CatchXML() pour s'assurer que tout s'est correctement déroulé. Le message de l'erreur sous forme textuel (en anglais) est disponible grâce à la commande XMLError().

Valeur de retour

Une valeur de 0 (#PB_XML_Success) indique une interprétation réussie, toutes les autres valeurs indiquent différents types d'erreurs.

Les valeurs possibles sont les suivantes:
  #PB_XML_Success             : Aucune erreur
  #PB_XML_NoMemory            : Plus assez de mémoire
  #PB_XML_Syntax              : Erreur de syntaxe
  #PB_XML_NoElements          : Aucun élément trouvé
  #PB_XML_InvalidToken        : Document malformé (balise invalide)
  #PB_XML_UnclosedToken       : Balise fermante manquante
  #PB_XML_PartialCharacter    : Caractère partiel
  #PB_XML_TagMismatch         : Balise qui ne correspond pas
  #PB_XML_DublicateAttribute  : Attribut en double
  #PB_XML_JunkAfterDocElement : Erreur après un élément du document
  #PB_XML_ParamEntityRef      : Paramètre illégal dans la référence de l'entité
  #PB_XML_UndefinedEntity     : Entité indéfinie
  #PB_XML_RecursiveEntityRef  : Référence récursive d'entités
  #PB_XML_AsyncEntity         : Entité asynchrone
  #PB_XML_BadCharacterRef     : Référence à un numéro de caractère invalide
  #PB_XML_BinaryEntityRef     : Référence à une entité binaire
  #PB_XML_AttributeExternalEntityRef: Référence à une entité externe dans un attribut
  #PB_XML_MisplacedXML        : XML ou texte de déclaration mal placé
  #PB_XML_UnknownEncoding     : Encodage inconnu
  #PB_XML_IncorrectEncoding   : L'encodage de la déclaration XML est incorrect
  #PB_XML_UnclosedCDataSection: Section CDATA non fermée
  #PB_XML_ExternalEntityHandling: Erreur dans l'interprétation d'une entité externe
  #PB_XML_NotStandalone       : Le document n'est pas autonome
  #PB_XML_UnexpectedState     : Erreur d'interprétation inattendue
  #PB_XML_EntityDeclaredInPE  : Entité déclarée dans le paramètre entité
  #PB_XML_FeatureRequiresDTD  : La fonctionnalité requise nécessite le support XML_DTD d'Expat
  #PB_XML_CantChangeFeatures  : Impossible de changer de paramètre pendant l'interprétation
  #PB_XML_UnboundPrefix       : Préfix non lié
  #PB_XML_UndeclaringPrefix   : Ne pas enlever la déclaration du préfix
  #PB_XML_IncompletePE        : Balise incomplète dans le paramètre entité
  #PB_XML_XMLDeclaration      : XML déclaration malformée
  #PB_XML_TextDeclaration     : Texte de déclaration malformé
  #PB_XML_PublicID            : Caractère illégal dans un identifiant public
  #PB_XML_Suspended           : Interpréteur suspendu
  #PB_XML_NotSuspended        : Interpréteur non suspendu
  #PB_XML_Aborted             : Interprétation annulée
  #PB_XML_Finished            : Interprétation finie
  #PB_XML_SuspendedPE         : Suspension impossible dans un paramètre entité externe
  #PB_XML_ReservedPrefixXML   : Le préfix réservé (xml) ne doit pas être délié ou lié à un autre espace de noms
  #PB_XML_ReservedPrefixXMLNS : Le préfix réservé (xmlns) ne doit pas être déclaré ou enlevé
  #PB_XML_ReservedNamespaceURI: Un prefix ne doit pas empiéter sur un espace de noms réservé


Obtenir PureBasic

PureBasic est un langage de programmation très performant à un prix raisonnable. En achetant PureBasic, vous encouragez son développement et vous participez à son évolution future. Les mises à jour sont gratuites et illimitées, ce qui implique que vous ne paierez PureBasic qu'une seule et unique fois, contrairement à de nombreux autres logiciels. Encore plus fort, vous avez droit à toutes les versions de PureBasic pour toutes les plateformes actuellement et prochainement supportées (AmigaOS, Windows, Linux x86). Merci encore pour votre confiance et votre support !

La version de démonstration est limitée de la manière suivante:

- Impossible de créer une DLL
- Impossible d'utiliser les fonctions externe (API de l'OS)
- Pas de kit de développement pour ajouter des libraries à PureBasic
- Nombre maximum de lignes pour un programme: 800

Prix : 79 Euros

Paiement en ligne sécurisé (http://www.purebasic.com)

La version complète sera envoyée par e-mail (email contenant un lien à télécharger) dès réception de la commande.


Contacts

Veuillez envoyer vos suggestions, rapports de bugs, ou si vous voulez simplement nous contacter à une des adresses suivantes:

Frédéric 'AlphaSND' Laboureur

Fred 'AlphaSND' est le fondateur de Fantaisie Software et le programmeur principal de PureBasic. Toutes les suggestions, rapports de bugs etc... lui seront adressés à:

Courrier:

Fantaisie Software
10, rue de Lausanne
67640 Fegersheim
France

e-mail: fred@purebasic.com

Richard Andersson

Richard est un programmeur très talentueux qui a beaucoup aidé Fred pour le développement des bibliothèques ASM sur Amiga. Vous pouvez le contacter (en anglais seulement) à l'adresse suivante: e-mail: richard@purebasic.com

André Beer

André se charge de la traduction et du support allemand de PureBasic (manuel et site web).

e-mail: andre@purebasic.com

Benny 'Berikco' Sels

Benny est le coder principal du Visual Designer. Toutes les suggestions, rapports de bugs concernant le Visual Designer peuvent être envoyés à l'adresse suivante:

e-mail: berikco@purebasic.com


Remerciements

Nous voulons remercier les nombreuses personnes qui nous ont aidés dans cet ambitieux projet. Il n'aurait pas pu prendre vie sans eux !

- Tous les utilisateurs enregistrés: Pour supporter activement le développement de ce logiciel... Encore merci !

Codeurs

- Roger Beausoleil: Le premier à croire vraiment en ce projet, et son aide précieuse dans le design initial de PureBasic.

- Andre Beer:Pour prendre le temps de traduire chaque nouvelle version en Allemand...

- Francis G.Loch: Pour avoir corrigé toutes les fautes d'orthographe dans le manuel anglais. Encore merci !

- Steffen Haeuser: Pour avoir donné de son temps lors de la création de la version Amiga PowerPC (PPC) de PureBasic.

- Martin Konrad: Un 'bug reporter' fantastique qui a mis à nus la plupart des bugs présents dans PureBasic Amiga.

- James L. Boyd: Pour avoir trouvé beaucoup de bugs dans la version Windows x86 et pour nous avoir donné une tonne de boulot supplémentaire :).

- Les: Pour avoir corrigé la version anglaise du site web et du guide de référence de PureBasic.

- L'équipe NAsm: Pour avoir créé un assembleur étonnant utilisé pour le développement des bibliothèques x86

- Tomasz Grysztar: Pour FAsm, un excellent assembleur x86 actuellement utilisé par PureBasic. http://flatassembler.net/

- Pelle Orinius: Pour ses excellents outils (linker et compilateur de ressources de PellesC) qui sont actuellement utilisés par PureBasic.

- Jacob Navia:Pour son linker (Lcc32) qui était utilisé dans les versions antérieures de PureBasic

- Frank Wille: Pour nous avoir permis d'inclure ses deux assembleurs (PhxASS et pasm) dans les versions 680x0 et PowerPC de PureBasic. Enfin pour son aide en ce qui concerne la programmation assembleur PPC.

- Danilo, Rings, Paul, Franco and MrVain/Secretly: Pour les rapports de bugs et les suggestions interminables qui ont permis de stabiliser et d'améliorer PureBasic x86 d'une manière très rapide.

- Sylvain B.: Pour avoir traduit la première partie de la documentation française.

- Francois Weil: Pour avoir traduit le reste (une grande majorité) de la documentation française, et ce en moins d'une semaine ! Encore merci...

- David 'Tinman' McMinn et Timo 'Freak' Harter: Pour améliorer considérablement l'aide du PureBasic et ainsi sa découverte au plus grand nombre !

- Danilo : Pour avoir fait un travail énorme sur l'éditeur et même sur le jeu interne des commandes, sans oublier ses excellentes suggestions quant à l'optimisation et la réduction des exécutables... Encore merci !

- Marc Vitry: Pour avoir partagé ses sources de sa bibliothèque 'SerialPort', qui ont servi de base à celle inclue dans le PureBasic

- Stefan Moebius : Pour avoir envoyé les sources de son sous-système DX9, qui ont servies de base au sous-système DX actuel

- Comtois, G-Rom et T-Myke: pour avoir amélioré drastiquement la partie 3D de PureBasic ! Ca compte !

- Gaetan Dupont-Panon: Pour le fabuleux nouvel éditeur visuel de fenêtres, qui fonctionne sour Windows, Linux et OS X !

- Jean R. VIALE: Pour avoir amélioré et corrigé de manière conséquente l'aide française, et pour continuer à le faire !


Historique

XX Janvier 2013 : Version 5.10

- Ajouté: Form designer est désormais intégrée à l'IDE !
- Ajouté: Bibliothèque compression/décompression entièrement retravaillée avec ZIP, BriefLZ, 7z (décompression seulement), LZMA et JCALG1 (Windows x86 et UncompressMemory()seulement). JCALG1 support abandonné. Formats archives pour BriefLZ ont été modifiés.
- Ajouté: Support IPv6 de la bibliothèque réseau. Mise à jour IPString(), MakeIPAddress(), GetClientIP(), IPAddressField(), ExamineIPAddress() et NextIPAddress().Ajout option #PB_Network_IPv6 pour OpenConnection et CreateServer(). Added FreeIP() pour v6 IP
- Ajouté: Bibliothèque System: ComputerName(), UserName(), MemoryStatus(), CountCPUs()
- Ajouté: Retour à la ligne dans l'IDE en utilisant les opérandes: ',' '|' '+' And Or Xor
- Ajouté: les comparaisons de chaînes constantes sont désormais traitées lors de la compilation, ce qui permet une utilisation dans CompilerIf par exemple.
- Ajouté: CocoaMessage() pour OS X
- Ajouté: ' Vérification de la syntaxe ' et compilation du code sans créer ni lancer l' exécutable (/CHECK)
- Ajouté: Paramètre Array/List/Map dans les méthodes des Interfaces
- Ajouté: Support des array/list/map dynamique pour structure/interface dans les residents.
- Ajouté: Option #PB_Character, #PB_Unicode, #PB_Ascii et #PB_Integer avec FillMemory()
- Ajouté: Support de #PB_RegularExpression_NoCase avec CreateRegularExpression()
- Ajouté: EncodeImage() avec PNG, JPEG et JPEG2000
- Ajouté: Support de #PB_Memory_NoClear avec Re/AllocateMemory()
- Ajouté: ImageFormat()
- Ajouté: #PB_Editor_WordWrap avec EditorGadget()
- Ajouté: Comparaison multicaractères dans StringField()
- Ajouté: Paramètre NbOccurences pour ReplaceString()
- Ajouté: PostEvent(), EventData()
- Ajouté: Valeur de retour à SetCurrentDirectory()
- Ajouté: Paramètre #PB_String_NoCase pour FindString()
- Ajouté: Options #PB_Preference_NoSpace et #PB_Preference_GroupSeparator pour OpenPreferences() et CreatePreferences()
- Ajouté: DatabaseColumnIndex()
- Ajouté: #PB_Cipher_URL et #PB_Cipher_NoPadding pour Base64Encoder(), ajouté la compatibilité URL pour Base64Decoder()
- Ajouté: SetGadgetItemImage() pour tous les gadgets qui supportent les images dans les éléments (items)
- Ajouté: Option #PB_Gadget_ScreenCoordinate et #PB_Gadget_WindowCoordinate pour GadgetX/Y()
- Ajouté: #PB_File_SharedRead (pas d'effet sur Linux/OSX), #PB_File_SharedWrite (pas d'effet sur Linux/OSX), #PB_File_Append et #PB_File_NoBuffering pour OpenFile(), ReadFile() et CreateFile()
- Ajouté: Événements #PB_Event_RightClick, #PB_Event_LeftClick et #PB_Event_LeftDoubleClick
- Ajouté: Paramètre titre facultatif dans OpenConsole()
- Ajouté: #PB_ScrollArea_ScrollStep pour ScrollAreaGadget()
- Ajouté: #PB_Ignore pour ResizeImage()
- Ajouté: Lier une adresse IP spécifique à CreateNetworkServer()
- Ajouté: Paramètre Timeout, LocalIP$ et LocalPort à OpenNetworkConnection()
- Ajouté: #PB_NetworkEvent_Disconnect pour NetworkClientEvent()
- Ajouté: #PB_Unicode, #PB_Ascii et #PB_UTF8 pour SendNetworkString()
- Ajouté: #PB_String_MaximumLength attribute pour StringGadget()
- Ajouté: #PB_Event_DeactivateWindow
- Ajouté: #PB_EventType_Change pour EditorGadget()
- Ajouté: Option #PB_Relative/#PB_Absolute pour FileSeek()
- Ajouté: Paramètres 'Offset' et 'Length' pour SHA1/MD5/CRC32FileFingerprint()
- Ajouté: GetSoundPosition(), SetSoundPosition(), SoundLength(), PauseSound(), ResumeSound(), SoundStatus(), GetSoundFrequency()
- Ajouté: #PB_All pour SoundVolume()
- Ajouté: SetGadgetItemState() pour ExplorerListGadget()
- Ajouté: InputRequester ajout fermeture
- Ajouté: InputRequester() ajout option #PB_InputRequester_Password
- Ajouté: Random() ajout la valeur mininmum optionnel
- Ajouté: SetGadgetItemText() pour ListIconGadget(): prise en compte de chr(10) comme dans AddGadgetItem()
- Ajouté: OpenWindowedScreen() les paramètres de redimensionnements sont optionnel maintenant
- Ajouté: ScreenWidth(), ScreenHeight(), ScreenDepth()
- Ajouté: SMTP AUTH dans la bibliothèque mail
- Ajouté: Paramètres optionnels à RemoveMailRecipient(),la capacité de supprimer tous les destinataires
- Ajouté: ReadString(#Fichier [, Options [, Longueur]]) : support longueur et #PB_File_IgnoreEOL
- Ajouté: #PB_Window_InnerCoordinate avec WindowX/Y()
- Ajouté: #PB_Window_FrameCoordinate avec WindowWidth()/Height()
- Ajouté: #PB_Image_Raised avec ImageGadget()
- Ajouté: FreeXXX(#PB_All) pour toutes les fonctions de libération de la mémoire
- Ajouté: Constantes du Compilateur: #PB_Compiler_LineNumbering, #PB_Compiler_InlineAssembly, #PB_Compilre_EnableExplicit
- Ajouté: Constantes du Compilateur: #PB_Compiler_ExecutableFormat (avec #PB_Compiler_DLL, #PB_Compiler_Console, #PB_Compiler_Executable)
- Ajouté: Constantes du Compilateur: #PB_Compiler_IsIncludeFile, #PB_Compiler_IsMainFile, #PB_Compiler_Filename (nom de fichier sans chemin)
- Ajouté: Opérateur du compilateur Bool (). Les opérations booléennes sont maintenant interdites sans Bool ().
- Ajouté: MacroExpandedCount mot-clé
- Ajouté: UndefineMacro mot-clé
- Ajouté: Maintenant XIncludeFile prend également en compte le fichier principal, afin d'éviter la double inclusion si le fichier principal est inclus dans un autre fichier
- Ajouté: TypeOf() pour variable, structure et les champs
- Ajouté: Defined(Label, #PB_Label)
- Ajouté: CompilerElseIf
- Ajouté: Labels locaux
- Ajouté: Define se comporte comme Global et accepte Dim (), NewMap () et NewList () sur la même ligne
- Ajouté: Mot-clé 'Align' pour structure, avec #PB_Structure_AlignC qui imite les structures C
- Ajouté: Autocast les valeurs numériques lorsque des chaînes sont de impliquées, ce qui permet de concaténer des chaînes et des nombres dans les constantes
- Ajouté: 'CONSTANTLIST' pour le compilateur d'interface
- Ajouté: Edition et enregistrement de l'historique de l'EDI pour récupérer les codes précédents et permettre la récupération après incident (voir Fichier > Session History)
- Ajouté: AffectedDatabaseRows(), CheckDatabaseNull() dans la bibliothèque database
- Ajouté: Nouvelle bibliothèque Text3D
- Ajouté: 'Mode ' optionnel pour toutes les fonctions Yaw/Roll/Pitch()
- Ajouté: 'Type' et 'Mode' optionnelà CreateMesh()
- Ajouté: RayCast(), MouseRayCast(), NormalX(), NormalY(), NormalZ()
- Ajouté: UpdateMesh(), EnableManualEntityBoneControl(), MoveEntityBone(), RotateEntityBone(), MeshIndex()
- Ajouté: 'Type' optionnel à AddSubMesh()
- Ajouté: Paramètre 'Type' à FinishMesh()
- Ajouté: ScaleNode(), GetMaterialColor(), GetMaterialAttribute(), ConvertLocalToWorldPosition(), ConvertWorldToLocalPosition()
- Ajouté: MaterialCullingMode(), FetchOrientation(), SetOrientation(), GetX(), GetY(), GetZ(), GetW(), GetLightColor()
- Ajouté: AttachEntityObject(): nom de l'os peut être vide, si l'objet est ajouté directement à l'entité

- Modifié: Renommé SoundFrequency() à SetSoundFrequency()
- Modifié: Renommé AddMeshVertex() à MeshVertexPosition()
- Modifié: Renommé LightColor() to SetLightColor()
- Modifié: Supprimé tous les MaterialXXXXColor() remplacé par SetMaterialColor()
- Modifié: Supprimé tous les XXXXLocate() remplacé par l'option #PB_Absolute pour les commandes MoveXXXX()
- Modifié: Remplacé #PB_Sort_<Type> par #PB_<Type> afin d'éviter d'éventuelles erreurs
- Modifié: Interdire type natif pour les pointeurs
- Modifié: StrF/D(),les zéros de fin sont automatiquement supprimés si pas de décimales spécifiés

- Mise à jour: OGRE a été mis à jour 1.8.2

- Supprimé: SendNetworkFile(), RecieveNetworkFile(), #PB_NetworkEvent_File pour éviter des trous de sécurité
- Supprimé: DirectX7 et NT4 subsystem sur Windows
- Supprimé: SDL subsystem sur Linux
- Supprimé: Version PowerPC pour OS X

- Optimisé: FindString() est jusqu'à deux fois plus rapide

- Réparé: Beaucoup de bugs

5 Novembre 2012 : Version 5.00

- Ajouté: Support de Cocoa sous OS X (maintenant le toolkit par défaut)
- Ajouté: version 64-bit de PureBasic pour OS X
- Ajouté: nouvel éditeur de fenêtres pour Windows, Linux et OS X
- Ajouté: sous-système 'Carbon' pour OS X PowerPC et x86
- Ajouté: support des tableaux multi-dimensionnels dans les structures
- Ajouté: InitScintilla() pour Linux et OS X
- Ajouté: #PB_Window_NoActivate pour OpenWindow() et HideWindow()
- Ajouté: support de #PB_EventType_RightClick pour ScintillaGadget()
- Ajouté: Section 'favoris' à l'outil 'explorateur' de l'IDE
- Ajouté: Evénement pour les outils personnels quand un nouveau source est créé (IDE)
- Ajouté: support de SetWindowCallback() sous OS X
- Ajouté: GTK sous linux est maintenant partiellement thread-safe (Linux)
- Ajouté: support de SpritePixelCollision() sous OS X et Linux

- Mis à jour: version de Scintilla (3.2.2)
- Mis à jour: version d'Expat (2.1.0)
- Mis à jour: version de libjpeg (8.0d)
- Mis à jour: version de libpng (1.5.12)
- Mis à jour: version d'OGRE (1.8.0), Bullet (2.80), Hydrax (0.5.4), CEGUI (0.7.7)
- Mis à jour: version de ModPlug (0.8.8.4)
- Mis à jour: utilisation de of VC++ 2010 au lieu de VC++ 2005 pour compiler les bibliothèques Windows (32-bit et 64-bit)
- Mis à jour: la documenation française a été largement complétée et améliorée par Jean R. VIALE.

- Modifié: SetModulePosition() est maintenant en millisecond

- Corrigé: Nombreux bugs

3D Engine:
- Ajouté: bibliothèque EntityAnimation
- Ajouté: bibliothèque NodeAnimation
- Ajouté: bibliothèque VertexAnimation
- Ajouté: bibliothèque Spline
- Ajouté: support du 'CG Tookit' pour le moteur 3D (pour DirectX et OpenGL), avec InitEngine3D()
- Ajouté: paramètre 'Mode' optionnel à InitEngine3D()
- Ajouté: paramètre 'PickMask' optionnel à MousePick() et CreateEntity()
- Ajouté: RenderWorld() renvoie le temps écoulé depuis le dernier appel (en milliseconds)
- Ajouté: support du brouillard pour SkyBox() et SkyDome()
- Ajouté: 'Couleur' et paramètres 'TextureDimension' à WorldShadows()
- Ajouté: options #PB_World_UnderWater et #PB_World_WaterGodRays pour CreateWater()
- Ajouté: RayPick(), CameraViewWidth(), CameraViewHeight(), CameraViewX(), CameraViewY(), CameraDirection()
- Ajouté: CameraDirectionX/Y/Z(), SetCameraCorrigéYawAxis()

- Ajouté: paramètre 'IsActive' optionnel à CreateCamera()
- Ajouté: ScaleMaterial(), MaterialFog(), ReloadMaterial(), ResetMaterial(), NodeCorrigéYawAxis()
- Ajouté: paramètre 'TextureCoordinateIndex' optionnel à AddMaterialLayer()
- Ajouté: support de #PB_Material_Anisotropic à MaterialFilteringMode()
- Ajouté: support de #PB_Default comme #Matiere pour changer la configuration par défaut.
- Ajouté: #PB_Material_Wireframe, #PB_Material_Point et #PB_Material_Solid à MaterialShadingMode()
- Ajouté: SoundListenerLocate()
- Ajouté: paramètres 'DirectionX/Y/Z' optionnels à NodeLookAt()
- Ajouté: paramètre 'Mode' optionnel à MoveLight(), MoveEntity() et MoveNode()
- Ajouté: CreateTexture() gère maintenant les textures alpha
- Ajouté: #PB_Entity_Wireframe, #PB_Entity_Solid, #PB_Entity_Point et #PB_Entity_DisplaySkeleton à EntityRenderMode()
- Ajouté: FreeEntityJoints(), AttachEntityObject(), DetachEntityObject(), EntityBoneX/Y/Z()
- Ajouté: EntityBonePitch(), EntityBoneRoll(), EntityBoneYaw(), EntityCorrigéYawAxis()
- Ajouté: paramètres 'DirectionX/Y/Z' optionnels à EntityLookAt()
- Ajouté: EntityVelocity(), EntityAngularFactor(), EntityLinearFactor(), EntityCustomParameter(), EntityParentNode()
- Ajouté: EntityBoundingBoxX/Y/Z(), DisableEntityBody()
- Ajouté: #PB_Entity_VelocityX/Y/Z, #PB_Entity_MassCenterX/Y/Z, #PB_Entity_MaxVelocity à Get/SetEntityAttribute()
- Ajouté: LightAttenuation(), LightX/Y/Z(), LightDirection(), LightDirectionX/Y/Z()
- Ajouté: RotateLight(), LightPitch(), LightYaw(), LightRoll()
- Ajouté: GetScriptParticle(), CreateRenderTexture(), UpdateRenderTexture(), SaveRenderTexture()
- Ajouté: CreateCubeMapTexture(), EntityCubeMapTexture()
- Ajouté: HideEffect() gère maintenant le ribbon
- Ajouté: EffectID(), RibbonEffectWidth(), AttachRibbonEffect(), DetachRibbonEffect(), CreateLensFlareEffect(), LensFlareEffectColor()
- Ajouté: EnableHingeJointAngularMotor()
- Ajouté: paramètre '#Joint' pour ConeTwistJoint(), HingeJoint(), PointJoint(), SliderJoint()
- Ajouté: #PB_HingeJoint_LowerLimit et #PB_HingeJoint_UpperLimit à Get/SetJointAttribute()
- Ajouté: paramètres optionnel 'Pitch', 'Yaw', 'Roll' à AddStaticGeometryEntity()
- Ajouté: FreeTerrain(), SetupTerrains(), CreateTerrain(), TerrainPhysicBody(), DefineTerrainTile()
- Ajouté: AddTerrainTexture(), BuildTerrain(), TerrainLocate(), TerrainHeight(), TerrainTileHeightAtPosition()
- Ajouté: TerrainTilePointX/Y(), TerrainTileSize(), GetTerrainTileHeightAtPoint(), SetTerrainTileHeightAtPoint()
- Ajouté: UpdateTerrain(), TerrainTileLayerMapSize(), GetTerrainTileLayerBlend(), SetTerrainTileLayerBlend()
- Ajouté: UpdateTerrainTileLayerBlend(), TerrainMousePick(), SaveTerrain(), TerrainRenderMode()
- Ajouté: gestion des touches spéciales pour InputEvent3D()

- Modifié: CameraLookAt() ne change plus la direction
- Modifié: suppression du paramètre 'Type' sur les commandes Attach/DetachNodeObject()
- Modifié: paramètre 'LargeurInitiale' a été supprimée pour CreateRibbonEffect()

- Supprimé: AnimateEntity() (remplacée par Start/StopEntityAnimation())
- Supprimé: #PB_Entity_Wireframe, #PB_Entity_Point et #PB_Entity_Solid pour EntityRenderMode()
- Supprimé: CheckEntityCollision(), NextWorldCollision(), FirstWorldCollisionEntity(), SecondWorldCollisionEntity()

21 Mai 2012 : Version 4.61

- Ajouté: SDK pour le développement des PureLibraries basé sur VisualC
- Ajouté: support des ressources pour Win9x

- Mis à jour: version de FASM (1.69.35)
- Mis à jour: version de SQLite (3.7.9)
- Mis à jour: version de PCRE (8.30)

- Modifié: OpenGL est maintenant le sous-système par défault sous linux (un nouveau sous-système 'sdl' a été créé)

- Corrigé: les exemples 3D sous Linux
- Corrigé: les résidents WinAPI 64-bit (by Danilo)
- Corrigé: des noombreux bugs dans le compilateur et les bibliothèques

7 Novembre 2011 : Version 4.60

- Ajouté: un nouveau répertoire d'exemples 3D
- Ajouté: bibliothèque 'Joint'
- Ajouté: bibliothèque 'SpecialEffect'
- Ajouté: bibliothèque 'StaticGeometry'
- Ajouté: CameraPitch(), CameraRoll(), CameraYaw(), SwitchCamera()
- Ajouté: ApplyEntityForce(), ApplyEntityImpulse(), EntityPitch(), EntityRoll(), EntityYaw()
- Ajouté: GetEntityAttribute(), GetEntityMaterial(), SetEntityAttribute(), SetEntityMaterial()
- Ajouté: LightDiffuseColor(), SpotLightRange(), LightLookAt(), DisableLightShadows()
- Ajouté: MaterialDepthWrite(), MaterialSelfIlluminationColor(), MaterialShininess(), GetScriptMaterial()
- Ajouté: CreateLine3D(), CreateCube(), CreateSphere(), CreateCylinder(), CreatePlane()
- Ajouté: MeshVertexCount(), UpdateMeshBoundingBox(), MeshRadius(), AddMeshVertex()
- Ajouté: MeshVertexNormal(), MeshVertexColor(), AddSubMesh(), BuildMeshShadowVolume()
- Ajouté: MeshVertexTextureCoordinate(), AddMeshFace(), FinishMesh(), NormalizeMesh()
- Ajouté: SaveMesh(), SetMeshMaterial(), SubMeshCount(), TransformMesh()
- Ajouté: NodePitch(), NodeRoll(), NodeYaw(), GetScriptTexture(), TextureOutput()
- Ajouté: EntityCollide(), RayCollide
- Ajouté: moteur OpenGL à la bibliothèque 3D sous Windows, quand le sous-système OpenGL est activé
- Ajouté: CanvasGadget(), CanvasOutput()
- Ajouté: SetGadgetItemData() pour le PanelGadget
- Ajouté: MoveElement(), MergeLists(), SplitList()
- Ajouté: RandomizeList(), RandomizeArray(), DoubleClickTime()
- Ajouté: PushListPosition(), PopListPosition(), PushMapPosition(), PopMapPosition()
- Ajouté: paramètre ImageID à OpenSubMenu()
- Ajouté: #PB_ListIcon_ThreeState et #PB_ListIcon_Inbetween
- Ajouté: #PB_Tree_ThreeState et #PB_Tree_Inbetween
- Ajouté: évènements de la ComboBox cross-plateformes
- Ajouté: 'DeclareC' keyword for completness

- Modifié: FindString(): le paramètre 'StartPosition' est maintenant optionnel
- Modifié: le WebGadget utilise WebKitGtk sous Linux
- Modifié: ContainerGadget avec #PB_Container_Borderless ne rajoute plus un bord invisible de 2px sous Linux
- Modifié: EntityPhysicBody(), CreateLight(), RenderWorld(), ShowGUI, WorldShadows()
- Modifié: EntityMaterial() renommé en SetEntityMaterial()

- Supprimé: Get/SetEntityMass(), Get/SetEntityFriction()
- Supprimé: SetMeshData()

- Corrigé: De nombreux bogues

IDE:
- Ajouté: option pour compiler des projets en ligne de commande
- Ajouté: les changements de fichiers en dehors de l'IDE sont maintenant détectés
- Ajouté: refonte complète des onglets fichiers avec Drag & Drop, menu déroulant et défilement, aussi sous OSX
- Ajouté: outil de différence pour les fichiers/répertoires
- Ajouté: affichage de l'aide en Html sous Linux/OSX
- Ajouté: affichage de l'aide dans le panneau d'outils
- Ajouté: un nouvel outil de sélection des couleurs
- Ajouté: support du changement de police dans l'IDE sous OS X
- Ajouté: le panneau de projet mémorise l'état des noeuds

Debugger:
- Ajouté: bouton maximiser sur toutes les fenêtres du débogueur
- Ajouté: toutes les fonctions IsXxx() et XxxID() au parseur d'expressions (pour les points d'arrêt 'data')

7 Juin 2010 : Version 4.50

- Ajouté: Support des tableaux, des listes, et des maps dans les structures
- Ajouté: CopyList(), CopyMap(), CopyArray()
- Ajouté: FreeList(), FreeMap(), FreeArray()
- Ajouté: CopyStructure(), InitializeStructure()
- Ajouté: Support du volume initial pour PlaySound()
- Ajouté: Paramètre 'Profondeur' pour SaveImage()
- Ajouté: Option à ImageDepth()
- Ajouté: Option #PB_Image_Transparent pour CreateImage()
- Ajouté: Support du 32-bit pour le décodeur TGA
- Ajouté: RoundBox(), AbortFTPFile(), RandomData()
- Ajouté: Option #PB_2DDrawing_AllChannels pour DrawingMode()
- Ajouté: Support des images pour ComboBoxGadget()
- Ajouté: Fonctions pour la console graphique sous Linux
- Ajouté: Support des fichiers larges sous Linux/OSX
- Ajouté: CryptRandom(), CryptRandomData(), OpenCryptRandom(), CloseCryptRandom()
- Ajouté: De nombreuses fonctions mathématiques: Exp(), ATan2(), Radian(), Degree(), [A]CosH(), [A]SinH(), [A]TanH(), IsNaN(), IsInfinity(), NaN(), Infinity(), Sign()
- Ajouté: Bibliothèque 'Debugger' pour contrôler le débogueur via le code

- Modifié: La bibliothèque Image gère les images en interne uniquement en 24-bit ou en 32-bit (le chargement et la sauvegarde fonctionnent avec d'autres formats)

- Corrigé: Bogues du compilateur et des bibliothèques

IDE/Debugger:
- Ajouté: Les mots clés Break, Continue, ProcedureReturn sont soulignés
- Ajouté: Aide dans la barre de status pour les prototypes et les interfaces
- Ajouté: Indentation contextuelle (le mode 'bloc' est toujours disponible)
- Ajouté: Option "Formater la sélection" dans le menu d'édition
- Ajouté: Option pour visualiser les indentations et les espaces
- Ajouté: Possibilité de sélectionner plusieurs compilateurs dans les options
- Ajouté: Purificateur, dans les outils de déboguage
- Ajouté: Compatibilité complète du débogueur entre tous les processeurs et les OS
- Ajouté: Déboguage réseau pour le débogueur indépendant
- Ajouté: Points d'arrêt conditionnels
- Ajouté: Support des éléments structurés dans l'onglet 'Visualiser Tableau/Liste/Map'

- Modifié: Le nom d'un tableau, d'une liste ou d'une map dans le visualisateur de variables doit maintenant contenir "()" pour afficher les éléments.

1er Février 2010 : Version 4.41

- Corrigé: Bugs du compilateur et des bibliothèques

1er Décembre 2009 : Version 4.40

- Ajouté: Support natif de Linux x64
- Ajouté: Bibliothèque Map intégrée (tables de hash)
- Ajouté: Mot-clé 'Threaded' pour des variables locales au thread
- Ajouté: Affectation complète de structure (a.point = b.point)
- Ajouté: ClearStructure()
- Ajouté: Support des Dylib sous OS X
- Ajouté: Bibliothèque Joystick pour OS X
- Ajouté: Bibliothèque Systray pour OS X
- Ajouté: AESEncoder(), AESDecoder(), StartAESCipher(), AddCipherBuffer(), FinishCipher()
- Ajouté: Trim/LTrim/RTrim() nouveau paramètre
- Ajouté: #PB_Function, #PB_OSFunction, #PB_Map à Defined()
- Ajouté: ReverseString(), InsertString(), RemoveString()
- Ajouté: Support des 'blobs' pour les bases de données
- Ajouté: UsePostgreSQLDatabase(): support natif de PostgreSQL
- Ajouté: Optimiseur de code pour les versions 64-bit (exécutable plus petit et plus rapide)
- Ajouté: Nouveaux types natifs: '.a' (ascii) and '.u' (unicode), qui sont des 'bytes' et des 'words' non-signés.
- Ajouté: #PB_Default à FileBuffersSize()
- Ajouté: #PB_URL_Protocol à Get/SetURLPart()
- Ajouté: #PB_Shadow_TextureAdditive
- Ajouté: FTPDirectoryEntryRaw(), FillMemory()
- Ajouté: Global, Protected, Threaded, Shared et Static acceptent maintenant une affectation pour les variables déclarées.
- Ajouté: AddWindowTimer(), RemoveWindowTimer(), EventTimer()
- Ajouté: #PB_Window_Tool pour créer une fenêtre de type 'outil'
- Ajouté: ShortcutGadget(), StatusBarProgress()
- Ajouté: StatusBarImage() supporte maintenant les images classiques (et pas seulement les icônes)
- Ajouté: #PB_Checkbox_ThreeState pour créer une case à cocher à 3 états
- Ajouté: CreateImageMenu(), CreatePopupImageMenu() pour OSX
- Ajouté: Support complet du canal alpha pour la bibliothèque Image
- Ajouté: Support complet du canal alpha pour tous les éléments qui affichent une image
- Ajouté: Nouveaux modes de dessin pour 2DDrawing avec ImageOutput()
- Ajouté: LinearGradient(), BoxedGradient(), CircularGradient(), EllipsicalGradient(), ConicalGradient()
- Ajouté: CustomGradient(), GradientColor(), ResetGradientColors(), CustomFilterCallback()
- Ajouté: DrawAlphaImage() pour toutes les sorties, pour tous les OS
- Ajouté: DrawAlphaImage() a un nouveau paramètre de transparence
- Ajouté: WindowOutput() sous OSX
- Ajouté: Sprite/ScreenOutput() pour OpenGL (tous les OS)
- Ajouté: DrawingFont() fonctionne maintenant avec SDL
- Ajouté: OutputWidth(), OutputHeight(), OutputDepth()
- Ajouté: GrabDrawingImage(), DrawRotatedText(), RGBA(), Alpha(), AlphaBlend()
- Ajouté: #PB_PixelFormat_ReversedY pour DrawingBuffer()
- Ajouté: #PB_OS_Windows_7, #PB_OS_MacOSX_10_6 pour OSVersion()

- Mis à jour: OGRE 1.6.2, sqlite 3.6.14.2, PCRE 7.9

- Modifié: Les paramètres de Call(C)Function(Fast) sont maintenant uniquement des 'Integer'.
- Modifié: OpenScreen() accepte maintenant le 'FlipMode' et le 'TauxDeRafraichissement'
- Modifié: FlipBuffers() ne prend plus de paramètres optionnels

- Supprimé: #PB_Image_DisplayFormat est déprécié
- Supprimé: SetRefreshRate() a été supprimé, c'est OpenScreen() qui gère cette fonctionnalité

- Corrigé: Les décodeurs d'image sont maintenant compatibles avec les threads
- Corrigé: Beaucoup de bogues dans les bibliothèques et dans le compilateur

IDE PureBasic:
- Ajouté: Gestion de projets
- Ajouté: Mise en valeur des parenthèses et des mots-clés
- Ajouté: 'Edition->Aller au mot-clé correspondant'
- Ajouté: Variable d'environnement 'PB_TOOL_Preferences' pour les outils de l'IDE
- Ajouté: Support des thèmes
- Ajouté: Nouveau thème 'Silk' basé sur le jeu d'icône de Mark James
- Ajouté: Scan implicite des variables pour l'auto-complétion
- Ajouté: Auto-complétion des éléments d'une structure ou d'une interface

- Modifié: Le paramètre d'encodage d'un fichier a été déplacé vers menu "Fichier"

Débogueur PureBasic:
- Optimisé: Rapidité du visualisateur de variables
- Ajouté: Affichage d'une barre de progression pour le visualisateur de variables
- Ajouté: Possibilité de trier une colonne du visualisateur de variable (Windows seulement)

3 Juin 2009 : Version 4.31

- Corrigé: Nombreux bugs du compilateur et des bibliothèques

16 Décembre 2008 : Version 4.30

- Ajouté: Version 64-bit de PureBasic (Windows)
- Ajouté: Support de MacOS X x86
- Ajouté: Bibliothèque 'JPEG 2000'
- Ajouté: Bibliothèque 'Node'
- Ajouté: Bibliothèque 'Gadget3D'
- Ajouté: Bibliothèque 'Window3D'
- Ajouté: Bibliothèque 'Sound3D'
- Ajouté: Support de l'unicode dans le moteur 3d
- Ajouté: Support de MacOS X pour le moteur 3d
- Ajouté: Rotation absolue et relative pour toutes les commandes du moteur 3d
- Ajouté: Deplacement absolu pour les corps physiques du moteur 3d
- Ajouté: EntityID(), EntityLookAt()
- Ajouté: CameraProjectionX(), CameraProjectionY(), WorldDebug(), Sun()
- Ajouté: MousePick(), PointPick(), PickX/Y/Z(), CreateWater(), AntialiasingMode()
- Ajouté: CatchModule(), ArraySize(), WindowBounds(), DesktopX(), DesktopY()
- Ajouté: FinishDatabaseQuery(), DatabaseID()
- Ajouté: CreateSemaphore(), FreeSemaphore(), SignalSemaphore(), WaitSemaphore(), TrySemaphore()
- Ajouté: Type natif '.i' pour gérer les entiers 32/64-bit
- Ajouté: Read/WriteInteger(), Read/WritePreferenceInteger(), PeekI(), PokeI()
- Ajouté: Support de la localisation de la langue pour le compiler et le débogueur
- Ajouté: Paramètre 'Style' pour FontRequester()
- Ajouté: Support de 'And/Or' avec le mot clef CompilerIf
- Ajouté: #PB_Event_MinimizeWindow, #PB_Event_MaximizeWindow, #PB_Event_RestoreWindow
- Ajouté: Support de #PB_Ignore pour AddStatusBarField()
- Ajouté: Support de #PB_Explorer_DisplayMode pour ExplorerListGadget()
- Ajouté: Support de plusieurs joysticks
- Ajouté: Constante #PB_Compiler_FilePath

- Amélioré: Refonte complète de la bibliothèque 'OnError' (cross-plateforme)
- Amélioré: Le paramètre de InitScintilla() est maintenant optionnel
- Amélioré: Re-écriture complète du débogueur pour supporter les nouvelles plateformes

- Optimisé: Bibliothèque 'XML' pour pouvoir gérer des gros fichiers rapidement
- Optimisé: Bibliothèque 'LinkedList' pour éviter trop de fragmentation mémoire

- Modifié: Le mot clef 'Read' nécessite un type (Read.l, Read.q etc.) pour éviter des problèmes de migration 64-bit
- Modifié: CountList() en ListSize()
- Modifié: ClearGadgetItemList() en ClearGadgetItems()
- Modifié: CameraProjection() en CameraProjectionMode()
- Modifié: AddElement() et consors renvoient le pointeur du début des données
- Modifié: La hauteur de ComboBoxGadget() est la hauteur réelle du gadget
- Modifié: #Long, #Byte, #Word etc. en #PB_Long, #PB_Byte, #PB_Word etc.
- Modifié: Les axes de rotation x,y de RotateEntity(), RotateCamera() et RotateBillboard()
- Modifié: L'angle de CameraFOV() de radian en degré

- Supprimé: StrQ(), HexQ(), BinQ(), ValQ()
- Supprimé: ChangeListIconGadgetDisplay(), remplacé par un attribut de gadget
- Supprimé: Compatibilité arrière de ButtonImageGadget()
- Supprimé: CreateGadgetList(), fait automatiquement dans OpenWindow()
- Supprimé: CopyTexture(), TextureOutput()

- Corrigé: Sous-système DX9 sous Windows
- Corrigé: Nombreux bogues du compilateur et des bibliothèques

23 Mai 2008 : Version 4.20

- Ajouté: Bibliothèque 'Mail'
- Ajouté: Bibliothèque 'Ftp'
- Ajouté: Bibliothèque 'RegularExpression'
- Ajouté: Bibliothèque 'Http'
- Ajouté: Bibliothèque 'SerialPort'
- Ajouté: Bibliothèque 'FLAC'
- Ajouté: Bibliothèque 'SQLite'
- Ajouté: Sous-système DirectX 9
- Ajouté: Support du streaming pour les fichiers OGG et FLAC
- Ajouté: Support de #PB_Sound_MultiChannel pour la bibliothèque 'Sound'
- Ajouté: CreateImageMenu(), CreatePopupImageMenu(), SHA1FingerPrint(), SHA1FileFingerPrint()
- Ajouté: CRC32FileFingerprint(), ExamineMD5FingerPrint(), ExamineSHA1FingerPrint(),
- Ajouté: NextFingerPrint(), FinishFingerPrint(), IsFingerPrint()
- Ajouté: Gestion de l'héxadecimal et du binaire pour Val() et ValQ()
- Ajouté: Constante compilateur #PB_Compiler_Procedure
- Ajouté: #PB_Round_Nearest pour Round()
- Ajouté: Mode de dessin 'XOr' pour Linux/SDL et MacOS X
- Ajouté: Un "Profileur" pour surveiller le nombre d'appel par ligne de code
- Ajouté: Le débogueur peut maintenant évaluer des expressions
- Ajouté: Le visualisateur de mémoire gère lui aussi les expressions pour les adresses
- Ajouté: Indiquer un "+" devant le champ "adresse de fin" du visualisateur de mémoire la rend relative
- Ajouté: Placer la souris au dessus d'une variable dans l'IDE affichera sa valeur quand le programme est en cours d'éxecution
- Ajouté: Selectionner une expression plus complexe et placer la souris au dessus affichera le resultat (si possible)

- Modifié: Le paramètre 'Taille' de Mid() est rendu optionnel

- Optimisé: La compilation est bien plus rapide (jusqu'à 8x)
- Optimisé: Toutes les commandes ont été optimisées en changeant de compilateur C (Windows seulement)

- Corrigé: De nombreux problèmes relatifs au compilateur et aux commandes

4 Novembre 2007 : Version 4.10

- Ajouté: Bibliothèque 'XML'
- Ajouté: Bibliothèque 'Drag & Drop'
- Ajouté: Compatibilité avec Windows Vista (UAC), excepté la bibliothèque 'Sprite' (prévue pour 4.20)
- Ajouté: Remplacement de MIDAS par ModPlug pour la bibliothèque 'Module'
- Ajouté: ScintillaGadget(), TruncateFile()
- Ajouté: Directives de compilation EnableASM et DisableASM
- Ajouté: #PB_OS_Windows_Vista et #PB_OS_Windows_Server_2008 pour OSVersion()
- Ajouté: Nombreuses nouvelles fonctionnalités pour la commande WebGadget()
- Ajouté: Nombreux ajouts sur l'IDE (nouveau protocole de communication avec le compilateur, coloration des parenthèses, affichage plus rapide etc.)
- Ajouté: Sortie synchronisée des versions Windows, Linux et MacOS X !

- Modifié: InitDatabase() renommé en UseODBCDatabase()
- Modifié: Sous Windows, les fichiers de configurations de l'IDE et des outils PureBasic sont maintenant stockés dans le répertoire personnel de l'utilisateur

- Supprimé: L'outil de mises à jour 'SmartUpdate' n'est plus supporté

- Corrigé: Beaucoup de problèmes relatifs au compilateur et aux commandes

18 Décembre 2006 : Version 4.02 (Joyeux Noël !)

- Corrigé: Problèmes avec certaines macros
- Corrigé: LoadImage() ne fonctionnait pas en unicode avec les plugins
- Corrigé: ExplorerListGadget() et les fichiers de plus de 4GB
- Corrigé: ExaminePreferenceKeys() ignorait la première valeur
- Corrigé: ExamineDirectory() ne gérait pas correctement les motifs
- Corrigé: Quelques problèmes sur l'IDE et le débogueur
- Corrigé: Plusieurs bogues sur le compilateur

30 Octobre 2006 : Version 4.01

- Modifié: CreateThread() ne renvoie plus un identifiant système (utiliser ThreadID() à la place)

- Corrigé: Plusieurs problèmes importants concernant l'unicode et les quads
- Corrigé: Le mode 'thread safe' ne fonctionnait pas correctement dans certains cas
- Corrigé: Les directives de compilation dans les macros ne pouvaient pas être imbriquées
- Corrigé: GetFileDate() et DirectoryEntryDate() n'utilisaient pas la date locale
- Corrigé: OpenFileRequester() pouvait échouer si trop de fichiers étaient sélectionnés
- Corrigé: De nombreux bogues mineurs

8 Mai 2006 : Version 4.00

Comme PureBasic 4 est une mise à jour très conséquente aussi bien en terme de nouveautés que de changements, un document résumant toutes les modifications effectuées sur les bibliothèques depuis la dernière version stable est disponible: click ici.

- Ajouté: Support natif de l'unicode
- Ajouté: Support des sous-systèmes
- Ajouté: Longueur des chaînes de caractères illimitée que ce soit en ASCII ou en Unicode
- Ajouté: Le jeu de commandes complet est maintenant 'thread-safe'
- Ajouté: Type Character (.c)
- Ajouté: Type Double(.d)
- Ajouté: Type Quad (.q)
- Ajouté: Opérateurs logiques 'XOr' et 'Not'
- Ajouté: Type 'chaîne fixe' (Texte${#Longueur})
- Ajouté: Macro/EndMacro - en mode simple et complexe
- Ajouté: With/EndWith pour un code plus concis
- Ajouté: Assignement possible avec Static (très important), Protected et Global: "Global a = 5"
- Ajouté: Support des listes chaînées de pointeurs
- Ajouté: Support de Global, Protected, Static et Shared pour les tableaux et les listes chaînées: "Global NewList MyList.l()".
- Ajouté: #PB_Compiler_File, #PB_Compiler_Line, #PB_Compiler_Version, #PB_Compiler_Home, #PB_Compiler_Debugger, #PB_Compiler_ThreadSafe, #PB_Compiler_Unicode
- Ajouté: Directive CompilerError "Message"
- Ajouté: Support de @procedure() et ?Label dans la directive Data.l
- Ajouté: Paramètres optionnels pour les procédures, les interfaces, et les prototypes
- Ajouté: Commutateur /CONSTANT Test=Value pour déclarer des constantes sur la ligne de commande
- Ajouté: Mot clef 'Swap' pour échanger rapidement le contenu de deux variables.
- Ajouté: 'Case' multiples pour Select/EndSelect: Case 1, 2, 6 To 20
- Ajouté: Mot clef 'Prototype' pour déclarer des pointeurs de fonctions facilement
- Ajouté: Mot clef 'ProcedureC' pour déclarer des procédure cdecl facilement
- Ajouté: Les paramètres des procédures peuvent avoir le même nom qu'une variable globale (protection automatique)
- Ajouté: EnableExplicit/DisableExplicit: les variables doivent être déclarées avec Define, Global, Protected, Shared ou Static.
- Ajouté: Directive Defined(Nom, Type)
- Ajouté: ReDim pour les tableaux à une ou plusieurs dimensions
- Ajouté: Import/ImportC/EndImport pour importer des fonctions à partir d'une bibliothèque externe (.lib)
- Ajouté: Les listes et les tableaux peuvent être passés en paramètre d'une procédure
- Ajouté: Le commutateur /LINKER permet de passer des commandes directement au linker
- Ajouté: Les PseudoTypes: p-ascii, p-unicode, p-variant, p-utf8 et p-bstr
- Ajouté: Les erreurs de l'assembleur et du linker sont automatiquement affichées en ligne de commande
- Ajouté: Sous système OpenGL pour les applications multimédia
- Ajouté: Support de l'alphachannel pour les Sprite3D (au travers des PNG et TIFF)
- Ajouté: Directive Subsystem() pour détecter si un sous-système est utilisé
- Ajouté: Les nombre flottants peuvent être écrits sous la forme: 123.5e-20
- Ajouté: Des alias pour les variables locales sont générés quand '!' est utilisé pour spécifier du code assembleur (ex: p.v_variable)
- Ajouté: Les fonctionnalités 'Passer la procédure' et 'Sortir de la procédure' pour le débogueur
- Ajouté: Bibliothèque 'Process'

- Amélioré: Le support de NT4 est maintenant effectué à l'aide d'un sous-système (DirectX 3)
- Amélioré: Les fichiers résidents supportent les types quad et double, les macros et les prototypes
- Amélioré: De nombreuses commandes
- Amélioré: Le moteur OGRE a été mis à jour en version 1.0.7
- Amélioré: La documentation française a été grandement retravaillée

- Optimisé: La taille du plus petit exécutable est passée de 2,5 kb à 1,5 kb
- Optimisé: Combinaison des flottants et des constantes plus rapide
- Optimisé: La bibliothèque 'Fichier' a été complètement réécrite et gère maintenant un système de cache pour des performances bien plus élevées. Elle supporte aussi les très gros fichiers (64-bit).
- Optimisé: Les procédures sont maintenant aussi petites que possible, ce qui devrait améliorer un peu les performances

- Modifié: La bibliothèque console supporte la redirection (ie: utilisation possible pour un CGI par exemple)
- Modifié: Quand un paramètre numérique est requis, il n'est plus possible de passer une chaîne de caractères
- Modifié: Les noms temporaires 'purebasic.exe' ne sont plus nommés aléatoirement, car cela pouvait ralentir quelques parefeux
- Modifié: 'DefType' a été renommé en 'Define'

- Corrigé: Les commandes internes préservent tous les registres réservés
- Corrigé: La souris est automatiquement libérée en mode fenêtré quand la fenêtre perd le focus
- Corrigé: KeyboardInkey() gère correctement les touches shift et control
- Corrigé: IsScreenActive() fonctionne correctement en mode fenêtré
- Corrigé: Beaucoup de bogues mineurs qui ont été découverts depuis la dernière version

16 Août 2005 : Version 3.94

- Ajouté: Nouvel environnement de développement (IDE) beaucoup plus puissant
- Ajouté: 3 nouveaux débogueurs (!) évolués
- Ajouté: Support des ressources Windows pour le compilateur et l'IDE (option /RESOURCE)
- Ajouté: Support des versions pour les exécutables et les DLL
- Ajouté: Evènement #PB_Event_ActivateWindow
- Ajouté: Option #PB_Web_Mozilla pour utiliser l'ActiveX Mozilla avec WebGadget()
- Ajouté: GetToolBarButtonState() et SetToolBarButtonState()
- Ajouté: Documentation complète sur l'IDE et les débogueurs

- Corrigé: Images 32x32 dans un ListIconGadget() en mode 'grandes icônes'
- Corrigé: Bug avec OpenScreen()/CloseScreen() et les sprite3D
- Corrigé: MovieLength() et MovieInfo() ne fonctionnaient pas avec le format WMV (merci à Traumatic ;-)
- Corrigé: La désactivation des images et icônes sur les barres d'outils avec les skins XP
- Corrigé: Plantage lors de la fermeture d'une fenêtre avec une barre de status/outils déjà libérée
- Corrigé: ImageGadget() et ButtonImageGadget() ne fonctionnaient pas avec AnimateWindow_()
- Corrigé: Bug ImageGadget() avec DisableGadget()
- Corrigé: LineXY() ne libérait pas la mémoire correctement
- Corrigé: Line() et LineXY() affectait la position du texte de DrawText()
- Corrigé: SortList() pouvait planter avec des gros tableaux déjà triés
- Corrigé: SetMenuItemState() changeait aussi l'état de désactivation
- Corrigé: Un ComboboxGadget() créé avec #PB_Any ne gérait pas les TAB correctement
- Corrigé: OpenFileRequester() ne fonctionnait pas si le fichier par défaut n'était pas correct
- Corrigé: Bug du compilateur avec les concaténations de chaînes et les procédures
- Corrigé: Problème d'alignement des variables dans les procédures pouvant affecter certaines API

28 Février 2005 : Version 3.93

- Ajouté: SortStructuredArray(), SortList(), SortStructuredList()
- Ajouté: Directives de compilation pour LibraryMaker
- Ajouté: KeyboardMode() (n'était pas dans la documentation)
- Ajouté: Paramètre optionnel 'Couleur' pour les fonctions ColorRequester() et FontRequester()
- Ajouté: Support de SetGadgetText() pour les ComboBoxGadget() éditables
- Ajouté: #PB_Default pour ClipSprite() permet d'enlever la zone de clipping
- Ajouté: #PB_FileSystem_Force pour CopyDirectory()
- Ajouté: #PB_OS_Windows_Server_2003 pour OSVersion()
- Ajouté: Base64Decoder(), GetGadgetFont()
- Ajouté: Paramètre optionnel 'Mode' pour ResizeImage()
- Ajouté: Evènement lors du déplacement ou du redimensionnement d'un splitter
- Ajouté: Vérifications temps réel pour Plot(x,y,Color) avec ScreenOutput() et SpriteOutput()
- Ajouté: Vérifications supplémentaires pour DirectoryEntrySize/Name/Attributes()

- Amélioré: Editeur PureBasic par Tinman
- Amélioré: Interface Importer et les interfaces DirectX9 dans les residents (merci à Traumatic !)
- Amélioré: Utilisation des icônes de Kale pour l'éditeur
- Amélioré: Documentation française en partie revue et corrigée par trasfract

- Optimisé: Le mode 'Débogueur' est plus compact et plus rapide
- Optimisé: Bibliothèque Misc (chaque commande est maintenant indépendante)
- Optimisé: Fonction Base64Encoder() plus rapide
- Optimisé: Génération du code assembleur plus compact pour les concaténations de string

- Modifié: Syntaxe d'OffsetOf(), pour calquer celle de SizeOf()

- Corrigé: Un bug dans ImageGadget() avec les skins XP activées et images 32-bit
- Corrigé: ExplorerListGadget() n'affichait pas les .ico and .lnk correctement
- Corrigé: ButtonImageGadget() pouvait perdre son image dans quelques rares cas
- Corrigé: Plus de son 'ding' lors d'un clic de souris en mode plein écran quand ExamineMouse() n'est pas utilisé
- Corrigé: L'icône du programme est correctement affichée lors d'un ALT+TAB avec une application plein ecran
- Corrigé: Les sprites sont correctement rechargés lorsque que ALT+TAB est utilisé
- Corrigé: CopyDirectory() modifiait le string passé en paramètre dans un cas particulier
- Corrigé: ListIndex() ne fonctionnait pas correctement
- Corrigé: RemoveString() et CRC32FingerPrint() ne pouvaient pas être utilisés dans une expressions
- Corrigé: SetGadgetItemText() ne fonctionnait pas avec ListViewGadget()
- Corrigé: ExamineDirectory() plantait si un string non initialisé était passé en paramètre
- Corrigé: CalendarGadget() ne pouvait pas être utilisé plusieur fois sur la même fenêtre
- Corrigé: RSet() pouvait renvoyer un résultat erroné
- Corrigé: CreateFile() ne fonctionnait pas avec les fichiers cachés
- Corrigé: ZeroMemory_(), FillMemory_(), MoveMemory_() et CopyMemory_() n'étaient pas reconnus
- Corrigé: #PB_Event_MoveWindow n'était pas émis correctement
- Corrigé: #PB_EventType_LostFocus n'était pas émis si 2 StringGadget() étaient côte à côte
- Corrigé: Les tooltips des gadgets ne s'affichaient pas sur NT4 si la fenêtre etait 'toujours au dessus'
- Corrigé: Le plugin OGG ne fonctionnait plus. Il est plus rapide maintenant.
- Corrigé: ResizeImage() ne change plus l'image si les mêmes dimensions sont utilisées
- Corrigé: TAB dans un EditorGadget() ne sort plus du gadget mais insert un TAB
- Corrigé: LCase() ne gérait pas le caractère allemand 'ß' correctement
- Corrigé: SetGadgetState() ne fonctionnait pas correctement avec OptionGadget()
- Corrigé: Les dimensions de la fenêtre du Débogueur n'étaient pas enregistrées
- Corrigé: AddGadgetItem() avec EditorGadget()
- Corrigé: SortArray() pouvait planter sur des gros tableaux déjà triés
- Corrigé: ReceiveNetworkFile() ne gérait pas les noms de fichier longs
- Corrigé: Affichage corrompu avec ButtonImageGadget() et le mode 'Toggle' (avec l'API)
- Corrigé: SpriteWidth() et SpriteHeight() renvoyaient des valeurs erronées lorsque ClipSprite() était utilisé
- Corrigé: MessageRequester() sur une fenêtre 'console' la faisait disparaître
- Corrigé: SetGadgetState() avec ListIconGadget() prenait le focus
- Corrigé: Base64Encoder() ne produisait pas un encodage correct
- Corrigé: Probleme de rafraichissement avec Frame3DGadget() et les options #PB_Frame3D_Single/Double
- Corrigé: Fuite de ressource GDI dans ButtonImageGadget() et ImageGadget()
- Corrigé: RotateSprite3D() n'utilisait pas le bon angle
- Corrigé: DisableMenuItem() ne fonctionnait pas avec #PB_Any
- Corrigé: GadgetWidth() ne fonctionnait pas avec SpinGadget()
- Corrigé: Date() renvoyait un mauvais résultat avec une date très petite (1970,1,1,0,0,0)
- Corrigé: CallFunctionFast() ne prenait que 17 paramètres à la place de 20
- Corrigé: OpenWindowedScreen() avec AutoStretch n'affichait pas la totalité des pixels
- Corrigé: Quelques problèmes de rafraichissement avec PanelGadget()
- Corrigé: La couleur transparente avec les écrans 32-bit et les sprites en mode 'texture'
- Corrigé: Quelques bogues mineurs dans l'IDE
- Corrigé: Plusieurs bogues dans le compilateur (concaténation de strings, interfaces dans les procédures)

25 Octobre 2004 : Version 3.92

- Ajouté: CalendarGadget() et DateGadget(), merci à Fr34k !
- Ajouté: LibraryID(), SwapElements()
- Ajouté: SaveSprite() a maintenant un paramètre 'Options' et gère les écrans/sprites 8-bit
- Ajouté: Un double-click sur le fond des fenêtres génère un évènement (merci à Rings)

- Optimisé: CountList() et ListIndex() sont dorénavant très rapides.

- Modifié: DeleteElement() revient toujours à l'élément précédent, pour être compatible avec For/Each.
(voir la documentation pour plus d'informations)
- Modifié: Le répertoire courant de l'application n'est jamais changé par les commandes PureBasic.
Auparavant, le répertoire contenant l'exécutable était considéré comme le répertoire courant.

- Corrigé: Bug dans CloseWindow() et HideWindow() quand le paramètre 'ParentWindow' d'OpenWindow() était utilisé
- Corrigé: IsSound() n'était pas disponible dans le mode de compatibilité NT4
- Corrigé: AddDate() pouvait renvoyer un mauvais résultat en fonction du fuseau horaire de l'ordinateur
- Corrigé: Fuite de mémoire avec les linkedlists, tableaux et variables locales quand une structure contenant un string était utilisée
- Corrigé: La qualité par défaut de SaveSprite() avec le plugin JPEG est '7'.
- Corrigé: DisplayPalette() ne fonctionnait pas totalement sur les systèmes XP
- Corrigé: ImageGadget() support les ToolTips et le changement d'icône en image (et vice et versa)
- Corrigé: ButtonImageGadget() supporte les skins XP et le changement d'icône en image (et vice et versa)
- Corrigé: SetGadgetItemText() pour ListViewGadget() effacait le 'UserData' de l'élément
- Corrigé: CopyImage() échouait sur Window NT 4 dans certaines circonstances
- Corrigé: Fuite de mémoire dans la commande SendNetworkFile()
- Corrigé: StatusBarText() ne rafraichissait pas correctement la barre de status avec l'option 'Borderless'
- Corrigé: CatchImage() avec #PB_Any
- Corrigé: Le décodeur PNG gère maintenant sans problème les PNG corrompus
- Corrigé: L'encodeur JPEG pouvait crasher si le critère de qualité était de 3 ou moins
- Corrigé: Une erreur mineure sur le TreeGadget() quand les 'checkboxes' étaient activées
- Corrigé: La compression avec les commandes 'Pack' pouvait se bloquer dans certaines circonstances
- Corrigé: La bibliothèque OnError n'était pas utilisable dans une DLL (merci à Rings)
- Corrigé: La concaténation de chaînes de caractères statiques était erronée dans certains cas
- Corrigé: Le compilateur ne retournait pas un code d'erreur différent de 0 si une erreur était survenue
- Corrigé: Plusieurs bogues dans le compilateur

4 Juillet 2004 : Version 3.91

- Ajouté: Bibliothèque Desktop
- Ajouté: IsDatabase(), IsFile(), IsFont(), IsDirectory(), IsGadget(), IsImage(), IsLibrary(), IsMenu(), IsModule(), IsMovie(), IsPalette(), IsSprite(), IsSprite3D(), IsStatusBar(), IsSysTrayIcon(), IsToolBar(), IsWindow()
- Ajouté: Le fichier 'manifest' (pour les skins XP) est maintenant inclu dans l'executable
- Ajouté: Support d'un fichier principal dans l'IDE pour les projets multi-fichiers
- Ajouté: Détection par le débogueur de l'utilisation des éléments vides d'une liste chainée

- Modifié: WindowMouseX() et WindowMouseY() renvoie leurs valeurs a partir de la zone cliente (DesktopMouseX() remplace WindowX()+WindowMouseX()).
- Modifié: Le compilateur de ressource et le linker sont ceux du PellesC (exécutables encore plus petits).

- Corrigé: AddDate()
- Corrigé: Le MDIGadget ne se retaillait pas correctement quand il était ajouté après une barre de status
- Corrigé: InputPathRequester() pouvait crasher sous Win98 sous certaines circontances
- Corrigé: La position de OpenWindowedScreen() était incorrecte quand il était attaché à un container
- Corrigé: Trim() dans certaines expressions
- Corrigé: Un crash qui pouvait arriver à la fin du programme quand OpenHelp() était utilisé.
- Corrigé: Le film affiché par PlayMovie() pouvait disparaitre lors de la première lecture
- Corrigé: Plusieurs bogues du compilateur, notamment lors de l'accès à certaines structures

12 Avril 2004 : Version 3.90

- Ajouté: Support de #PB_Any (numérotation dynamqieu) pour les bibliothèques DataBase, File, Font, FileSystem, Gadget, Image, Library,
Module, Movie, Palette, Sprite, Sprite3D, SysTray, ToolBar, StatusBar et Window
- Ajouté: CountString(), KeyboardInkey(), GetWindowTitle(), SetWindowTitle(), ElapsedMilliseconds()
- Ajouté: RemoveGadgetColumn(), SetGadgetAttribute(), GetGadgetAttribute(), SetGadgetItemAttribute(), GetGadgetItemAttribute()
- Ajouté: MDIGadget() par Fr34k
- Ajouté: Support de la synchronisation de l'écran pour FlipBuffers() (y compris en mode fenêtré)
- Ajouté: Redimensionnement automatique pour les 'StatusBar' et 'ToolBar' (plus besoin de callback)
- Ajouté: Nouvelle méthode de redimensionnement pour les fenêtres par Fr34k (plus besoin de callback)
- Ajouté: Nouveau paramètre optionnel 'z' pour TransformSprite3D()
- Ajouté: Plusieurs nouvelles options pour SplitterGadget() pour plus de flexibilité
- Ajouté: Support de SetGadgetAttribute() pour ScrollAreaGadget().
- Ajouté: Support NT4 des Joysticks et des Modules
- Ajouté: Affichage hexadécimal, positionnement paramétrable des fenêtres pour le débogueur
- Ajouté: Support de toutes les icônes lors de la création d'un exécutable
- Ajouté: Amélioration de l'IDE: Interface viewer, support du MS SDK, chercher dans les fichiers, numérotation des lignes
- Ajouté: Mot clef 'Static' pour les variables locales qui doivent être persistantes
- Ajouté: Toute dernière version de FAsm (l'assembleur), plus rapide et permet de gérer de plus gros sources
- Ajouté: Support du 'QuickHelp' dans Purebasic IDE pour la plupart des fonctions API !

- Modifié: Plus de #MemoryID et d'Options' pour AllocateMemory()
- Modifié: CDAudioName() ne nécessite plus d'ID.

- Optimisé: CDAudio, Database, File, Network, StatusBar and Systray (chaque commande est maintenant indépendante)

- Supprimé: UpdateStatusBar(), UseMemory() et MemoryID()

- Corrigé: Documentation francaise parfaitement à jour
- Corrigé: Support de NT4 (DirectX 3) pour les bibliothèques Sprite, Palette, Sound, Keyboard et Mouse
- Corrigé: CreateSprite3D(), la largeur et la hauteur etait trop grande d'1 pixel
- Corrigé: SpritePixelCollision(), si le même sprite était utilisé pour les deux collisions
- Corrigé: Debugger sous win98 (les fenêtres passaient quelque fois en arrière plan)
- Corrigé: OpenWindowedScreen() ne prenait pas en compte la hauteur du menu (quand il y en avait un)
- Corrigé: IsFilename() ne prenait pas tous les cas de figure en compte
- Corrigé: Plusieurs erreurs du compilateur avec des expressions complexes
- Corrigé: SizeOf() quand il était utilisé avec des structures étendues (Extends)
- Corrigé: NewPrinterPage(), bug sous Win98 quand on imprimait la deuxième page
- Corrigé: CloseScreen() quand la bibliothèque Sprite3D était utilisée
- Corrigé: Plusieurs problèmes de chemin relatifs lors de l'utilisation du compilateur en mode console
- Corrigé: Maintenant, tous les 'Requesters' bloquent les autres fenêtres ouvertes

9 Décembre 2003 : Version 3.81

- Ajouté: DatabaseUpdate(), DatabaseError()
- Ajouté: Support de Play/Stop/Resume/PauseMovie() pour les films rendus sur sprites
- Ajouté: Support du mot clef 'Extends' pour les 'Structure'
- Ajouté: Support des icônes et du redimensionnement en temps réel pour DrawImage()
- Ajouté: Support des formats BMP en 2, 16 et 256 couleurs pour Catch/LoadSprite()
- Ajouté: Support du paramètre '#PB_Default' pour DrawingFont()
- Ajouté: Gestion du Japonais au niveau des Gadget, de l'éditeur et du Visual Designer
- Ajouté: SmartUpdate, un outil permettant la mise à niveau automatique de PureBasic
- Ajouté: Dernière version du Visual Designer

- Optimisé: Les ExplorerGadgets sont maintenant 5x plus rapide pour la lecture des répertoires

- Modifié: Les labels ne sont plus sensibles au minuscules/majuscules
- Modifié: La qualité par défaut de SaveImage() avec le plugin JPEG est maintenant fixée à 7
- Modifié: InitModule() et InitPalette() ne nécessitent plus de paramètres maximums
- Modifié: PlayMovie() a changé pour les films rendus sur sprites

- Corrigé: Une fuite mémoire aux niveaux des films rendus sur sprites
- Corrigé: Les commandes de la bibilothèque 'Requesters' pouvaient bloquer les autres applications
- Corrigé: Des définitions d'interfaces étaient erronnées dans les résidents
- Corrigé: La combinaison de plusieurs constantes de type string pouvait engendrer des erreurs
- Corrigé: KeyboardReleased(#PB_Key_All) ne fonctionnait pas
- Corrigé: Un problème du compilateur avec les Interfaces dans les procedures
- Corrigé: Un problème avec ProcedureDLL quand un retour de type String était utilisé
- Corrigé: CopySprite() ne fonctionnait pas avec les sprites de type 'Alpha'
- Corrigé: Un problème avec l'optimiseur avec des variables de type bytes et word (très rare)
- Corrigé: Un problème avec les décodeurs JPEG et TIFF dans des situations extrèmes
- Corrigé: Légers problèmes avec EditorGadget() et SpinGadget()

6 Octobre 2003 : Version 3.80

- Ajouté: ExplorerComboBoxGadget()
- Ajouté: CameraProjection(), CameraBackColor() et CameraRange()
- Ajouté: L'opérateur modulo: '%'
- Ajouté: 'ForEach' pour énumérer les éléments d'une liste facilement
- Ajouté: Interface/EndInterface pour les appels 'Objets' tels que COM ou DirectX !
- Ajouté: Fichiers résidents complets pour le support des interfaces
- Ajouté: 'Break' et 'Continue' pour modifier les itérations des boucles
- Ajouté: Enumeration/EndEnumeration pour déclarer rapidement des ensembles de constantes
- Ajouté: OffsetOf() pour retrouver l'index d'un champ d'une structure ou d'une interface
- Ajouté: SizeOf() supporte maintenant les interfaces et les variables
- Ajouté: Les constantes Float, String et les interfaces sont intégrées dans les résidents
- Ajouté: Support de la 'Qualité' pour SaveImage() avec le plugin JPEG
- Ajouté: Le paramètre 'Options' de MessageRequester() est maintenant optionnel
- Ajouté: La coloration syntaxique ainsi que le navigateur de structures

- Optimisé: Suppression de nombreuses dépendances de OGRE, donc Engine3D.dll a été réduite

- Modifié: Les constantes sont de nouveau constantes

- Corrigé: Affichage des registres ASM dans le Débogueur
- Corrigé: Problème avec 'IncludePath' utilisé avec 'IncludeBinary'
- Corrigé: TAB peut maintenant être utilisé pour sortir d'un ComboBoxGadget() éditable
- Corrigé: DeleteDirectory() ne pouvait pas effacer un répertoire en lecture seule
- Corrigé: Le decodeur TGA ne gérait pas les images inversées verticalement et 'RLE'
- Corrigé: AddPackFile() et PackMemory() se bloquait de temps en temps
- Corrigé: La taille des structures peut maintenant être supérieure à 32ko
- Corrigé: Int() pouvait générer des résultats faussés avec des valeurs négatives
- Corrigé: Les listes chainées pouvait se décaler dans certains cas très rares
- Corrigé: Line() et LineXY() ne dessinaient pas le dernier point
- Corrigé: Vérification InitEngine3D() en temps réel (debugger)
- Corrigé: TextLength() n'acceptait pas les chaînes de caractères vides
- Corrigé: ProcedureReturn pouvait crasher quand il était utilisé dans un 'Select'
- Corrigé: Les sons étaient limités à 50 quand le debugger était activé
- Corrigé: ClipSprite() ne supportait pas DisplayAlphaSprite(), DisplayShowSprite(), DisplaySolidSprite() et DisplayTranslucideSprite()
- Corrigé: Un mot clef réservé (comme 'Data') ne pouvait pas être utilisé dans une structure
- Corrigé: CreatePack(), SaveImage() et SaveSprite() ne supportait pas les noms de fichiers très long
- Corrigé: Inkey() mettait le programme en attente
- Corrigé: FileSize() retournait une valeur erronée pour les racines ('C:\') sous Win9x
- Corrigé: L'editeur inversait les tabs dans un cas très rare

13 Juillet 2003 : Version 3.72

- Modifié: Attention! L'index du motif pour SelectedFilePattern() et Open/SaveFileRequester() commence à '0' au lieu de '1'.
- Modifié: Attention! L'index retourné par ListIndex() commence à '0' au lieu de '1'

- Amélioré: IDE: Chercher/Remplacer amélioré; une '*' identifie un fichier modifié
- Amélioré: La bibliothèque 'Toolbar' a été optimisée
- Amélioré: Toutes les commandes ont maintenant une aide rapide (barre d'état de l'éditeur)

- Corrigé: ParseDate() renvoyait des valeurs incorrectes quand aucun séparateur n'était utilisé
- Corrigé: ResizeImage() retaille maintenant les images avec qualité
- Corrigé: Plusieurs problèmes d'évènements concernant les Gadgets (Splitter et Panel)
- Corrigé: Les décodeurs PNG et JPEG ne supportaient pas tous les formats spéciaux
- Corrigé: Le nom du plusieurs fonctions (bibliothèque OnError)
- Corrigé: Plusieurs bogues concernant le compilateur

7 Juin 2003 : Version 3.70

- Ajouté: Bibliothèque Terrain
- Ajouté: Bibliothèque Billboard
- Ajouté: Bibliothèque Entity
- Ajouté: Bibliothèque Material
- Ajouté: Bibliothèque Particle
- Ajouté: Bibliothèque OnError
- Ajouté: CameraLookAt(), CameraRenderMode(), CameraFOV(), Engine3DFrameRate(), CountRenderedTriangles()
- Ajouté: CreateMesh(), SetMeshData()
- Ajouté: ExamineLibraryFunctions(), NextLibraryFunction(), LibraryFunctionName(), LibraryFunctionAddress()
- Ajouté: IsFunctionEntry(), CallCFunction(), CallCFunctionFast()
- Ajouté: RenderMovieFrame(): il est maintenant possible de jouer un film directement sur un sprite ou un écran !
- Ajouté: OpenGadgetList(), ScrollBarGadget(), ScrollAreaGadget(), SplitterGadget()
- Ajouté: HyperLinkGadget(), ContainerGadget(), EditorGadget()
- Ajouté: TreeGadgetItemNumber(), ExplorerListGadget(), ExplorerTreeGadget()
- Ajouté: L'option #PB_FontRequester_Effects pour FontRequester()
- Ajouté: PanelGadget() a été entièrement réécrit pour supporter les thèmes Windows XP
- Ajouté: TreeGadget() a été réécrit pour permettre insertion dynamique d'éléments
- Ajouté: AddGadgetItem() pour le PanelGadget() supporte les images
- Ajouté: Le paramètre 'FenetreMereID' a été ajouté à OpenWindow()
- Ajouté: Support du format 'CDecl' pour les bibliothèques et les procédures (Ajouté 'ProcedureCDLL' and 'DeclareCDLL' keyword)
- Ajouté: End [CodeSortie]
- Ajouté: Messages d'erreurs plus précis pour les erreurs de linker et d'assembleur
- Ajouté: Nouveau switch pour le compilateur en ligne: /LINENUMBERING
- Ajouté: Support complet du debugger pour le moteur 3D
- Ajouté: Support du gadget ComboBox par les commandes GetGadgetItemText() and SetGadgetItemText()
- Ajouté: De nombreuses nouvelles fonctions pour le Visual Designer: Ordre des tabulations, selection de la police, nouveaux gadgets etc..

- Modifié: Bibliothèque Mesh, due à l'introduction de la bibliothèque Entity
- Modifié: ClosePanelGadget() à été renommé en CloseGadgetList()
- Modifié: Les label de l'assembleur en ligne sont maintenant sous la forme 'l_label' au lieu de 'pLabel'

- Optimisé: la bibliothèque Movie

- Corrigé: SpriteCollision() et SpritePixelCollision() étaient incorrect (1 pixel de décalage)
- Corrigé: Le résultat de CopyDirectory() était faux dans certains cas
- Corrigé: StrF(): L'arrondi est maintenant effectué correctement
- Corrigé: Plusieurs warning étaient manquant dans le debugger
- Corrigé: Les nombres à virgule flottante (floats) et les nombres entiers étaient quelquefois mal évalués

25 Mars 2003 : Version 3.62

- Supprimé: FakeEndSelect

- Corrigé: Plusieurs bogues dans le compilateur
- Corrigé: Bug dans l'encodeur et le décodeur PNG
- Corrigé: ProcedureReturn dans un Select/EndSelect
- Corrigé: Array allocation si aucune mémoire n'est disponible
- Corrigé: Int() ne fonctionnait depuis la v3.60
- Corrigé: Val() accept maintenant tous les formats Basic
- Corrigé: AddPackFile() avait quelques problèmes sur certains types de fichiers
- Corrigé: RunProgram() avec les chemins de fichiers très longs

19 Mars 2003 : Version 3.61

- Corrigé: Bug capital dans la gestion des tableaux
- Corrigé: Bug capital dans la commande MD5FileFingerprint()
- Corrigé: Editeur: coloration syntaxique pour commande/procédures et le raccourci Alt+V
- Corrigé: 2 bogues dans le Visual Designer
- Corrigé: Chargement des sprites avec les plugins (JPEG, PNG) en mode 16-bit
- Corrigé: Le mot clef XOR dans l'assembleur en ligne n'était plus reconnu
- Corrigé: Décodeur TGA sur certains fichiers

17 Mars 2003 : Version 3.60

- Ajouté: Puissant éditeur visuel, pour créer rapidement des interfaces graphiques
- Ajouté: Nombreuses optimisations du compilateur qui produit un code plus compact et plus rapide (principalement concernant les tableaux et les variables structurées)
- Ajouté: Décodeur JPEG, TIFF, PNG et TGA pour les sprites et les images (plugins)
- Ajouté: Encodeur JPEG et PNG pour les sprites et les images (plugins)
- Ajouté: Decodeur OGG pour les sons (plugins)
- Ajouté: AvailableScreenMemory(), SelectedFilePattern(), DefaultPrinter()
- Ajouté: Paramètre 'Options' pour LoadFont() pour gérer l'italique, le gras etc.
- Ajouté: Support des sources multiples pour le debugger (fichiers inclus)
- Ajouté: Contrôle de dépassement d'index des tableaux dans le debugger
- Ajouté: Contrôle de dépassement de lecture des 'Data' dans le debuggercheck
- Ajouté: Support des icônes pour CatchImage()
- Ajouté: DLL Importer in the Library SDK
- Ajouté: Support des processeurs MMX, 3DNOW, SSE et SSE2, avec auto-selection (pour choisir automatiquement à l'exécution la routine la plus rapide en fonction du processeur).

- Optimisé: Bibliothèques Font, Gadget et Window (Commandes séparées, merci à Danilo)

- Supprimé: CatchJPEGSPrite() et LoadJPEGSprite() (remplacés par les plugins)

- Amélioration: Le format des bibliothèques PureBasic (compressé)
- Amélioration: L'assembleur en ligne accepte les mot clefs du FPU
- Amélioration: L'éditeur: double-clique sur (X)IncludeFile ouvre le fichier, l'aide contextuelle fonctionne pour tous les mots clefs (If/EndIf..) Coloration syntaxique de l'assembleur, aide contextuelle pour l'assembleur

- Modifié: SetGadgetFont() prends maintenant 2 paramètres

- Corrigé: SortArray() lors de tris en de strings mode minuscule=majuscule
- Corrigé: RunProgram() avec 3 paramètres
- Corrigé: ImageOutput() sous Win98
- Corrigé: Sprite 16bits sur des anciennes cartes graphiques qui travaillent en 15bits
- Corrigé: Quelques bogues dans le compilateur

13 Janvier 2003 : Version 3.51

- Amélioré: Documentation francaise

- Corrigé: Quelques bogues dans le compilateur
- Corrigé: IPString() et IPAddressField() géraient les IP en mode inversé
- Corrigé: InputRequester()
- Corrigé: ReadPreferenceLong/String/Float() pour permettre les espaces dans les mots clefs
- Corrigé: Beep lorsque le bouton de la souris était enfoncé, en mode plein écran
- Corrigé: Date() et ParseDate() lorsqu'une date invalide était spécifiée
- Corrigé: Problème avec les thèmes XP sur l'éditeur
- Corrigé: Problème du 'ProcedureBrowser' sur XP (Merci à Dominique et à Plouf)
- Corrigé: Les dimensions de la commande OpenWindow() étaient erronées dans certains cas

- Supprimé: Validation 'Gosub/Return' introduit dans la version 3.50 (pour des raisons de flexibité)

6 Janvier 2003 : Version 3.50 - Bonne Année !

- Ajouté: Bibliothèque Engine3D: Add3DArchive(), AmbientColor(), Fog(), InitEngine3D(), LoadWord(), RenderWorld(), SkyBox(), SkyDome()
- Ajouté: Bibliothèque Camera: CameraLocate(), CameraX(), CameraY(), CameraZ(), CreateCamera(), FreeCamera(), MoveCamera(), RotateCamera()
- Ajouté: Bibliothèque Light: CopyLight(), CreateLight(), FreeLight(), HideLight(), LightColor(), LightLocate(), LightSpecularColor(), MoveLight()
- Ajouté: Bibliothèque Mesh: CopyMesh(), FreeMesh(), GetMeshAnimationTime(), MeshAnimation(), MeshAnimationLength(), MeshLocate(), MeshTexture(), MeshX(), MeshY(), MeshZ(), MoveMesh(), ResizeMesh(), RotateMesh(), ScaleMesh(), SetMeshAnimationTime()
- Ajouté: Bibliothèque Texture: CopyTexture(), CreateTexture(), FreeTexture(), LoadTexture(), TextureHeight(), TextureID(), TextureOutput(), TextureWidth()
- Ajouté: WriteFloat(), ReadFloat(), MouseLocate(), MD5FileFingerprint()
- Ajouté: Les options STDCALL et ANY pour les PureLibraries. Voir la documentation du SDK doc
- Ajouté: GetGadgetItemState() supporte les boites à cocher du TreeGadget()
- Ajouté: SetGadgetState() supporte le ButtonImageGadget()

- Amélioré: CallFunction() et CallFunctionFast(): Les floats peuvent être passé directement
- Amélioré: Le paramètre 'Apparence' de SetStatusBarText() est maintenant optionel
- Amélioré: Le paramètre 'Options' de Frame3DGadget() est maintenant optionel

- Optimisé: CallFunctionFast() (2x plus rapide)
- Optimisé: La génération du code: Chr(#Constante) et quelques améliorations en vitesse d'execution

- Modifié: L'assembleur (FASM), est maintenant utilisé, résultant en un code plus compact et plus rapide
- Modifié: LSet() par RSet() et RSet() par LSet() (Fonctionnement inversé par rapport au autres BASIC)
- Modifié: OpenTreeGadgetNode() et CloseTreeGadgetNode() nécessitent un paramètre
- Modifié: ReleaseMouse() nécessite un paramètre

- Corrigé: Le support de la souris en mode jeux fenetré
- Corrigé: SelectElement() lorsque la valeur passée était -1
- Corrigé: TreeGadget() quand il était utilisé plusieurs fois sur la même fenêtre
- Corrigé: SaveImage() sur le bureaux en mode 16bits et 8bits
- Corrigé: RSet() avec 2 arguments
- Corrigé: Un bug dans ParseDate()
- Corrigé: AddPackFile() et AddPackMemory(): dépassement de capacité dans quelques rares cas
- Corrigé: OpenFileRequester() en mode multiselection
- Corrigé: Un bug etrange quand de nombreuses images étaient utilisées dans les GadgetItems
- Corrigé: Bibliothèque Cipher

9 Octobre 2002 : Version 3.40

- Modifié: Les noms de 'Structure' ne prennent plus en compte les différences majuscules<>minuscules

- Ajouté: Bibliothèque Date: Date(), Year(), Month(), Day(), DayOfWeek(), DayOfYear(), Hour(), Minute(), Second(), FormatDate(), AddDate(), ParseDate()
- Ajouté: Hostname(), ExamineIPAddresses(), NextIPAddress(), IPString()
- Ajouté: LSet(), RSet(), Bin(), RemoveString(), StringField()
- Ajouté: ModuleVolume(), OSVersion(), WaitThread()
- Ajouté: CopyDirectory(), DeleteDirectory(), IsFilename()
- Ajouté: NextSelectedFileName(), InputRequester()
- Ajouté: DrawingBuffer(), DrawingBufferPixelFormat(), DrawingBufferPitch(), FillArea()
- Ajouté: Constantes intégrée au compilateur: #PB_Compiler_Date, #PB_Compiler_OS

- Optimisé: FileSystem, StringExtension et Date (chaque commande est maintenant indépendante)

- Amélioré: RunProgram() a un nouveau paramètre optionnel: RepertoireCourant$
- Amélioré: SetGadgetFont(#PB_Font_Default) revient à la font par défaut
- Amélioré: OpenWindow() accepte #PB_Window_WindowCentered et #PB_Window_ScreenCentered
- Amélioré: GetGadgetItemText() et SetGadgetItemText() suppotre le TreeGadget()
- Amélioré: ReplaceString() a un nouveau paramètre optionnel: 'PositionDepart'
- Amélioré: SetGadgetState() supporte ImageGadget() pour changer son image
- Amélioré: Paramètre 'NiveauCompression' pour PackMemory(), AddPackFile() et AddPackMemory()
- Amélioré: Dans une DLL, AttachProcess(), DetachProcess(), etc.. doivent avoir le paramètre 'Instance'
- Amélioré: Lors de la création d'une DLL, les '_' précédent les noms de fonctions on été supprimés

- Corrigé: Problème de débogueur dans la bibliothèque FileSystem
- Corrigé: ReadPreferenceLong() et ReadPreferenceFloat()
- Corrigé: Bug de SpriteOutput() lors de l'utilisation de Plot()
- Corrigé: CDAudioTrackLength(): La dernière piste renvoyait toujours 0
- Corrigé: OpenWindowedScreen(): Mauvaises valeurs pour OffsetBas/Droite
- Corrigé: GetPathPart(), GetFilePart() et GetExtensionPart()
- Corrigé: SetGadgetText() lors d'une utilisation avec une ComboBox et une chaîne vide
- Corrigé: SetClipboardText() utilise maintenant le format TEXT au lieu du format OEM
- Corrigé: Le compilateur ne permet plus qu'une variable globale soit utilisée en paramètre d'une procédure
- Corrigé: En mode 'InlineASM', 'MOV eax, "String"' et 'MOV eax, #CONSTANT' étaient mal compilés
- Corrigé: Bug lors de l'utilisation des constantes négatives de type float
- Corrigé: Bug lors de l'utilisation de floats avec les fonctions API
- Corrigé: Bug lors d'une comparaison entre une chaîne de caractères et un nombre
- Corrigé: Bug lors de l'utilisation d'IncludeBinary dans une 'DataSection'
- Corrigé: Bug lorsque DECLARE et PROCEDURE ne correspondaient pas
- Corrigé: Bug lorsque DEBUG etait utilisé dans les procédures et affichait des chaînes de caractères

- Amélioration notable de l'éditeur (Fichiers multiples, Procédure browser, outils personnalisés et bien plus...). Il est maintenant OpenSource ! Merci à Danilo.

16 Aout 2002 : Version 3.30

C'est une version de correction de bogues et de synchronisation avec Linux

- Ajouté: HideMenu(), CreateSprite(), UseBuffer()
- Ajouté: Aide en français (entièrement traduite)

- Amélioré: SortArray() fonctionne avec les tableaux de 'float'
- Amélioré: GetFilePart(), GetPathPart() et GetExtensionPart() enlève les trémas (") si besoin est
- Amélioré: SetGadgetItemState() et GetGadgetItemState() peuvent maintenant agir sur ListIconGadget()
- Amélioré: LoadSprite(), GrabSprite(), CopySprite(), CatchSprite(), LoadJPEGSPrite(), CatchJPEGSprite() ont un nouveau paramètre 'Mode' optionnel

- Corrigé: SetClipboardText(): ne fonctionnait pas dans certains cas
- Corrigé: SpritePixelCollision(): ne fonctionnait pas si les sprites étaient de tailles différentes
- Corrigé: LoadJPEGSprite ignorait le paramètre 'Mode' (pas bon pour les Sprites3D)
- Corrigé: Bug dans AddGadgetItem() utilisé en conjonction avec ListIconGadget()
- Corrigé: PokeF() était manquant
- Corrigé: MovieAudio(): mauvaise échelle pour le volume (décibels)
- Corrigé: ReleaseMouse() n'était pas reconnue
- Corrigé: Bug dans la bibliothèque 2DDrawing (encore...)
- Corrigé: LoadSprite() ne fonctionnait pas avec les BMP en 16-bit et 32-bit
- Corrigé: GetGadgetText() utilisé avec un ComboBoxGadget() éditable
- Corrigé: ReadByte() et ReadWord() (avec des variables de type long/word)
- Corrigé: FreeMenu(), GadgetX() et GadgetY()
- Corrigé: DisplaySolidSprite() était manquant
- Corrigé: Routine de debug manquant pour GadgetID()
- Corrigé: Bug quand plusieurs films étaient ouverts (crash lors de la sortie du programme)
- Corrigé: ResizeImage()
- Corrigé: PreferenceGroup()
- Corrigé: ExamineMouse() renvoyait toujours 0
- Corrigé: PathRequester() crashait avec un chemin non initialisé
- Corrigé: InitSprite3D() crashait quand il était seul
- Corrigé: Editeur: ZoomSprite3D() ne s'affichait pas en surbrillance

9 Juin 2002 : Version 3.20

Attention! Le comportement des callbacks a changé et va provoquer des blocages si vous ne les mettez pas à jour ! Voir la documentation de SetWindowCallback().

- Ajouté: Cipher library: CRC32Fingerprint(), MD5Fingerprint(), DESFingerprint(), Base64Encoder()
- Ajouté: AddKeyboardShortcut(), RemoveKeyboardShortcut(), SpinGadget(), WebGadget()
- Ajouté: GetMenuItemState(), SetMenuItemState(), MenuHeight()
- Ajouté: KeyboardReleased(), Trim(), Space()
- Ajouté: SelectElement(), LineXY(), GetExtensionPart()
- Ajouté: Opérateurs binaires ! (XOR) et ~ (NOT)
- Ajouté: Mot clef BASIC 'Protected'
- Ajouté: Support pour Shift+Tab pour revenir en arrière dans les gadgets
- Ajouté: Le débogueur détecte maintenant les pointeurs nuls et les divisions par 0

- Optimisé: Les bibliothèques 2DDrawing, Keyboard, Mouse, Sound et Sprite (commandes séparées) !
- Optimisé: Plot() est 40x plus rapide quand elle est utilisée avec ScreenOutput() (DirectX)

- Amélioré: PokeS() et PeekS() ont maintenant un paramètre 'Longueur' facultatif
- Amélioré: KeyboardPushed() gère #PB_Key_All comme paramètre
- Amélioré: FileSize() renvoie -2 si le fichier est un répertoire
- Amélioré: WindowID() peut avoir un paramètre optionel #Window
- Amélioré: Tous les gadgets ont un paramètre 'Options' facultatif qui permet de contrôler les looks ! (voir la documentation de chaque gadgets pour plus d'information)
- Amélioré: Plot(), Line(), Box(), Circle(), Ellipse() ont maintenant un paramètre 'couleur' facultatif.
- Amélioré: Quelques bogues corrigés dans le débogueur. Quand un programme est arrêté par le débogueur, tout est correctement libéré.
- Amélioré: Ajout des routines de debug à la bibliothèque Sprite

- Modifié: Renommage de StripLead() et StripTrail() en RTrim() et LTrim() pour une compatibilité avec les autres BASIC
- Modifié: NetworkClientEvent(), CloseNetworkConnection()
- Modifié: CreateToolBar(): ajout du paramètre 'WindowID'
- Modifié: CreateMenu(): ajout du paramètre 'WindowID'
- Modifié: NetworkClientEvent() et NetworkServerEvent(): plus de 'String' event: pouvait être une faille de sécurité majeure..
- Modifié: OpenWindowedScreen() les paramètres x,y prennent en compte les bordures et le titre de la fenêtre.
- Modifié: ResizeWindow(), WindowWidth() et WindowHeight() sont relatives à l'intérieur de la fenêtre, pour éviter les problèmes de skin

- Supprimé: AttachToolBar(), DetachToolBar(), AttachMenu(), ReceiveNetworkString()

- Corrigé: Frame3DGadget() avec un cadre en relief et enfoncé
- Corrigé: Evènements du ListViewGadget()
- Corrigé: FileSize()
- Corrigé: StopDrawing(), problèmes d'affichage sous win9x (corruption après de nombreux appels)
- Corrigé: Problèmes relatifs au debugger..
- Corrigé: AddGadgetItem() avec ListIconGadget() (-1 comme position ne fonctionnait pas)
- Corrigé: SpritePixelCollision() avec les sprites clippés
- Corrigé: Bug probable dans Random()
- Corrigé: SpritePixelCollision(), seule la valeur transparente noire (0,0,0) fonctionnait
- Corrigé: InitSprite(), InitSound(), InitPalette(), InitKeyboard() n'affichent plus de fenêtres si DirectX7+ n'est pas présent
- Corrigé: RemoveGadgetItem() et ClearGadgetItemList utilisés PanelGadget()
- Corrigé: PathRequester() chemin par defaut sous Win9x
- Corrigé: @linkedlist() avec le type '.s' renvoie maintenant le pointeur correct vers l'élément (au lieu du pointeur du string)
- Corrigé: ReadPreferenceString()
- Corrigé: Documentation: SaveImage(), ScreenID(), SelectedFontStyle() et SelectedFontColor() étaient manquants

6 Mai 2002 : Version 3.10

- Ajouté: Bibliothèque Preference: OpenPreferences(), CreatePreferences(), ReadPreferenceLong/Float/String(), WritePreferenceLong/Float/String() PreferenceComment(), PreferenceGroup()
- Ajouté: Support des skins Windows XP (Voir la fenêtre 'Compiler Options')
- Ajouté: GadgetX(), GadgetY(), GadgetWidth(), GadgetHeight(), GetGadgetItemState(), SetGadgetItemState(), GetGadgetItemText(), SetGadgetItemText(), CountGadgetItems(), TrackBarGadget(), IPAddressGadget()
- Ajouté: HideWindow(), RandomSeed(), MakeIPAddress(), IPAddressField()
- Ajouté: MouseWheel(), CatchSprite(), SaveSprite()
- Ajouté: RotateSprite3D(), ZoomSprite3D(), TransformSprite3D(), Sprite3DQuality(), Sprite3DBlendingMode()
- Ajouté: EventType(): Return/Change/Focus peuvent être detectés dans les StringGadget() et les ComboBox()
- Ajouté: CatchImage(), CreatePack(), ClosePack(), NextPackFile(), AddPackFile(), AddPackMemory(), PackFileSize(), OpenPack()
- Ajouté: DirectoryEntrySize(), DirectoryEntryAttributes()
- Ajouté: Compatible avec 'WindowBlinds' sur Windows XP

- Optimisé: Bibliothèques Image, Misc2, GadgetExtension, Requester, Sprite3D, Memory, et Packer (commandes séparées)

- Amélioré: CompareMemoryString(): Ajout d'un paramètre facultatif 'Longueur'
- Amélioré: DisplayPopupMenu(): Les paramètres (x,y) sont maintenant facultatifs
- Amélioré: ResizeGadget(): Utiliser '-1' dans un des paramètres pour garder la valeur précédente
- Amélioré: GetGadgetText() et SetGadgetText() fonctionnent maintenant avec TreeGadget() et ListIconGadget()
- Amélioré: AddGadgetItem() a maintenant un paramètre facultatif 'Image'
- Amélioré: OpenWindow() ajoute maintenant automatiquement la taille des bords pour éviter les problèmes de skin
- Amélioré: FileSize() renvoie la taille du fichier même si celui-ci est en cours d'utilisation

- Supprimé: InitGadget() etait inutile
- Supprimé: DoubleClick() et EventMouseButtons(), utiliser EventType() à la place
- Supprimé: OpenDefaultConsole(). Maintenant OpenConsole() detecte automatiquement si le programme est compilé en mode 'console' ou 'windows'
- Supprimé: AddListIconGadgetItem() et AddTreeGadgetItem(): utiliser AddGadgetItem() à la place
- Supprimé: ExpandTreeGadgetItem() et TreeGadgetItemState(): utiliser Set/GetGadgetItemState() à la place

- Corrigé: Evènements pour les ComboBox, ListIcon et Systray.
- Corrigé: Fuite de mémoire avec les strings dans certains cas
- Corrigé: Bug dans les procédures utilisées en tant que callbacks
- Corrigé: Create3DSprite(): la taille était un pixel trop petite
- Corrigé: Chaque fenêtre a sa propre classe
- Corrigé: PlaySound(): la routine du débogueur était manquante et une erreur à la fin du son joué
- Corrigé: ResizeGadget() avec PanelGadget() et quelques problèmes de rafraîchissement
- Corrigé: FindString() sous Win9x
- Corrigé: ExamineDirectory() sous Win9x
- Corrigé: Bibliothèque Module, le playback devrait fonctionner partout
- Corrigé: SetGadgetText() avec ListViewGadget()
- Corrigé: SelectedFontColor()
- Corrigé: Bug dans DeleteElement()
- Corrigé: NewList xxxx() seul produisait une erreur
- Corrigé: Bug lors de l'impression d'images
- Corrigé: Command Random() (encore !)
- Corrigé: ResizeImage() sous Win9x
- Corrigé: Bug avec IncludeBinary (seul un chemin absolu fonctionnait)
- Corrigé: Editeur: 'Tab' n'était pas correctement géré, bug dans la coloration syntaxique

4 Avril 2002 : Version 3.00

- Ajouté: Bibliothèque Library
- Ajouté: Bibliothèque Help
- Ajouté: Bibliothèque Clipboard
- Ajouté: Bibliothèque Printer
- Ajouté: Bibliothèque Timer (Merci à Danilo)
- Ajouté: Bibliothèque ComDX (Merci à Danilo)
- Ajouté: ElseIf
- Ajouté: Si une condition (If/While...) n'est pas fermée avant 'EndProcedure', le compilateur s'arrete.
- Ajouté: ToolBarToolTip(), SpritePixelCollision()
- Ajouté: CopyMemoryString(), MemoryStringLength(), CompareMemory(), ReAllocateMemory()
- Ajouté: CompareMemoryString(), CopyImage(), ResizeImage(), GrabImage(), SetPaletteColor()
- Ajouté: MovieStatus(), MovieLength(), SoundVolume(), SoundPan(), SoundFrequency(), CatchSound()
- Ajouté: FirstDatabaseRow(), PreviousDatabaseRow(), CreatePalette(), GetPaletteColor()
- Ajouté: UsePalette(), RGB(), ReplaceString(), StrU(), StrF(), ValF(), HideGadget(), GadgetID()
- Ajouté: Possibilité d'avoir un nombre de paramètres variables pour chaque commande
- Ajouté: 'Declare' et 'DeclareDLL' pour pouvoir utiliser les procédures avant de les déclarer
- Ajouté: Catalogue Hollandais pour l'editeur

- Modifié: Nouvelle architecture pour les bibliothèques PureBasic pour permettre d'intégrer seulement les commandes réellement utilisées à la place de toute la bibliothèque. Pour l'instant, peu de bibliothèque ont été modifiées, mais c'est en cours :). De plus, les bibliothèques utilisent maintenant la norme STDCALL pour le passage des arguments, ce qui résout le problème des arguments inversés pour les DLL et les Callbacks. Les anciennes bibliothèques sont bien sûr toujours compatibles.
- Modifié: StopSound(): Utiliser '-1' arrête tous les sons d'un coup.
- Modifié: PlaySound(): Le paramètre 'Flags' est maintenant optionnel
- Modifié: Sort(): Une limite peut être spécifiée (ex: trier les éléments de 20 à 50 du tableau)
- Modifié: Fichiers résidents: Constantx '#VK_xx' ajoutées et quelques structures corrigées.
- Modifié: InitSound() n'a plus besoin de paramètre
- Modifié: Renommage de BackColour(), FrontColour() et TransparentSpriteColour() en BackColor(), FrontColor() et TransparentSpriteColor()

- Corrigé: Crash du compilateur pendant l'utilisation des constantes 'string'
- Corrigé: StartDrawing() bogues
- Corrigé: Random(), nombres plus aléatoires..
- Corrigé: GetDatabaseString(): lors du retour de valeurs nulles
- Corrigé: ExamineDirectory(): Plantages sur les sytèmes Windows 9x
- Corrigé: Les résidents utilisateurs sont maintenant correctement chargés.
- Corrigé: Bug dans l'éditeur qui empêchait la saisie de caractères spéciaux
- Corrigé: Bug FPU qui empêchait OpenGL de s'initialiser
- Corrigé: 'Debug' command: accepte maintenant les paramètres de type 'float'.

- Supprimé: Bibliothèques de Mr Skunk, car nous n'avons pas les sources pour corriger les bogues

24 Fevrier 2002 : Version 2.95

Note: Cette version permet de corriger des bogues importants avant la version majeure 3.0

- Ajouté: Support du format HtmlHelp pour l'aide. Les anciens fichiers HTML peuvent être supprimés.

- Corrigé: bogues dans le compilateur bogues (Float dans les tableaux de structure, XIncludeFile, constantes 'xx', bug dans des expressions, fuites de mémoire dans les procédures contenant des strings)
- Corrigé: Intégration de la bibliothèque Image avec les Sprites
- Corrigé: Bug dans LoadJPGSprite()
- Corrigé: L'éditeur ne mettait pas en couleur correctement

27 Janvier 2002 : Version 2.90

- Ajouté: Création des DLL !
- Ajouté: Les constantes peuvent maintenant être un string ou un float
- Ajouté: Les commandes Debug et DebugLevel
- Ajouté: Editeur traduit en Italien par Yuri.

- Modifié: Les noms de variables, constantes et tableaux ne sont plus sensibles aux minuscules/majuscules.

- Corrigé: PathRequester(), OpenFileRequester(), SaveFileRequester()
- Corrigé: Petit bug sur ExamineDirectory()
- Corrigé: GetDatabaseFloat()
- Corrigé: Le compilateur ne fonctionnait pas sur Windows NT4 Sp6a.

13 Janvier 2002 : Version 2.82

- Ajouté: PeekF(), PokeF()
- Ajouté: Bibliothèque Math: ACos(), ASin(), ATan(), Pow(), Log(), Log10(), Round(), Cos(), Sin(), Tan(), Abs(), Sqr(), Int()
- Ajouté: SpriteOutput(): possibilité d'utiliser les commandes 2DDrawing sur n'importe quel sprite !
- Ajouté: #PB_WindowInvisible

- Corrigé: bogues dans le compilateur (a.l = Pow(), a = -16/variable)
- Corrigé: OpenDatabaseRequester() qui ignorait certains drivers ODBC
- Corrigé: FrontColour() qui plantait DirectX
- Corrigé: SaveImage() enregistrait toujours en 24-bit au lieu de 32-bit
- Corrigé: ListViewGadget() a maintenant une hauteur exacte (pas arrondie)<br easy> - Corrigé: SysTrayIconToolTip() ne plante plus si le texte spécifié dépasse 64 caractères
- Corrigé: ListIconGadget() ne libérait pas les icônes après FreeGadget()
- Corrigé: ChangeListIconGadgetDiplay() se redessine automatiquement
- Corrigé: Couleur de fond des fenêtres sous Windows XP

- Modifié: StrF(Nombre) pour StrF(Nombre, Precision)

1er Janvier 2002 : Version 2.80 (Bonne année !)

Compilateur:
- Amélioré: réécriture complète du parseur pour gérer les expressions complexes
- Amélioré: Optimisation du code généré - Ajouté: l'option /REASM (ligne de commande) pour réassembler un code source après modification
- Ajouté: possibilité d'utiliser les floats dans les appels API
- Corrigé: Support des nombres flottants (comparaison, procedure, Abs(), Sin() etc..)
- Corrigé: Tous les bogues connus

Bibliothèques:
- Ajouté: Bibliothèque Sprite3D: Create3DSprite(), Display3DSprite(), Transform3DSprite(), Free3DSprite(), Start3D(), Stop3D()
- Ajouté: SaveImage()
- Ajouté: Routine de debug temps réél pour toutes les commandes
- Corrigé: ExamineDirectory()
- Corrigé: OpenFile() (Read wasn't working)

Editeur:
- Ajouté: Aide rapide (dans la barre d'état) pour toutes les commandes
- Ajouté: Accès rapide aux procédures
- Ajouté: Compatibilité Windows XP et support des thèmes
- Corrigé: Bug lors du remplacement de mots

28 Novembre 2001 : Version 2.70

- Ajouté: ChangeSysTrayIcon(), SysTrayIconToolIip(), ExpandTreeGadgetItem(), TreeGadgetItemState()
- Ajouté: DisableMenuItem(), GadgetToolTip(), StatusBarIcon()
- Ajouté: UseGadgetList(), TransparentSpriteColor(), ClipSprite(), CopySprite(), GrabSprite()
- Ajouté: ProgramParameter()
- Ajouté: Bibliothèque Thread
- Ajouté: Support du '!' pour inclure des commandes directement gérées par l'assembleur
- Ajouté: Undo/Redo à plusieur niveau dans l'éditeur
- Ajouté: Coloration syntaxique lors d'un copier/coller

- Amélioré: StatusBarText(): 2 nouvelles options pour l'alignement (Centré et Droite)
- Amélioré: ReadData() renvoie maintenant le nombre d'octets lus
- Amélioré: Le debugger est maintenant un thread de haute priorité

- Modifié: PlaySound() ajout d'une option pour jouer en boucle.
- Modifié: SetStatusBarText() -> StatusBarText()
- Modifié: InitSprite() suppression du paramètre maximum pour les sprites

- Corrigé: DatabaseQuery(), GetPathPart(), LoadSprite()
- Corrigé: CloseScreen() peut maintenant switcher du mode plein écran au mode fenêtré
- Corrigé: bogues dans le compilateur ('Tableaux multidimensionnels' et 'Read data' dans les procédures)
- Corrigé: Scintillement de l'éditeur

6 Novembre 2001 : Version 2.60

- Ajouté: Bibliothèque Database
- Ajouté: Bibliothèque Compressor
- Ajouté: Bibliothèque Console (Thanks to Sylvain)
- Ajouté: CopyMemory(), CatchJPEGSprite(), LoadJPEGSprite(), WindowMouseX(), WindowMouseY()
- Ajouté: MovieSeek(), MovieInfo(), DrawImage(), ScreenOutput(), WindowOutput()
- Ajouté: ImageOutput(), CreateImage()
- Ajouté: Possibilité d'utiliser les commandes 2DDrawing directement sur les écrans de jeux
- Ajouté: Mode XOR et rempli/détouré pour les commandes 2DDrawing
- Ajouté: Possibilité d'utiliser -1 avec FreeMemory() pour libérer toutes la mémoire d'un coup.
- Ajouté: Nouvelles options pour RunProgram(): lancement en tâche de fond et/ou caché
- Ajouté: Puissant moniteur assembleur dans le débogueur
- Ajouté: Afficheur de variables dans le débogueur

- Modifié: Toutes les vieilles fonctions MemoryBank ont été renommées.
- Modifié: ReadMemory() et WriteMemory -> ReadData(), WriteData()
- Modifié: Le format des bibliothèques PureBasic (voir le SDK)
- Modifié: DrawingOutput() a été renommé en StartDrawing() et ne prends plus WindowID() en argument
- Modifié: Eof() prend un paramètre maintenant

- Corrigé: StopModule() n'a plus de paramètre #Module
- Corrigé: Un petit bug dans le compilateur
- Corrigé: PlayMovie()
- Corrigé: Le debugger était inexact quand des commandes ASM étaient utilisées
- Corrigé: Un coller dans l'éditeur ne change plus la police de caractères
- Corrigé: Un gros bug dans le débugger introduit dans la version 2.60. Désolé !

23 Septembre 2001 : Version 2.50

- Ajouté: Bibliothèque Mouse
- Ajouté: Bibliothèque Movie
- Ajouté: Bibliothèque Sort
- Ajouté: Adresse d'un procédure (@procedurename())
- Ajouté: Support du format 'Console' dans le fichier .exe compilé
- Ajouté: DisplayTranslucideSprite(), DisplayAlphaSprite(), DisplayShadowSprite(), DisplayRGBFilter(), ChangeAlphaIntensity(), ClearScreen() OpenWindowedScreen(), DisplaySolidSprite(), CloseScreen(), SetFrameRate(), IsScreenActive(), StartSpecialFX(), StopSpecialFX(), ResizeGadget() JoystickAxisX(), JoystickAxisY(), ChangeGamma(), SetWindowCallback(), Red(), Green(), Blue()

- Modifié: LoadSprite()
- Modifié: DisplayPalette (Supprimé l'argument écran)
- Modifié: ExamineJoystick()
- Modifié: OpenScreen (ajouté paramètre Text$)
- Modifié: FontRequester (Ajouté un nom et taille de police initiale)
- Modifié: Frame3DGadget (Ajouté un flag de style de bordure)

- Corrigé: Un bug dans les routines DirectX en mode multitache (Sprite, Keyboard, Mouse).
- Corrigé: Le support d'icone pour les bibliothèques ToolBar et Image
- Corrigé: SelectedFontName()
- Corrigé: ClearGadgetItemList() quant elle est utilisée avec TreeGadget()
- Corrigé: LoadFont() (YSize incorrecte)

Editeur:
- Ajouté: Sauvegarde automatique optionnelle avant la compilation
- Ajouté: Support de toutes les polices de caractères
- Ajouté: Autorise/Supprime la syntaxe colorée
- Ajouté: 2 nouveaux modes de coloration : 'Texte normal' et 'Procedures/Commandes'
- Ajouté: Changement de couleurs en temps réel
- Ajouté: Fenêtre 'A propos' améliorée;-)

- Amélioré: Coloration du texte ultra rapide au chargement d'un fichier
- Amélioré: Comportement de la coloration de syntaxe

1er Aout 2001 : Version 2.40

- Ajouté: Commandes de support des Data's : Read, Restore, Data, DataSection, EndDataSection
- Ajouté: Support des nombres flottants (première phase)
- Ajouté: Bibliothèque MemoryBank
- Ajouté: Bibliothèque StatusBar
- Ajouté: Bibliothèque Image
- Ajouté: Bibliothèque Systray
- Ajouté: EventlParam(), EventwParam(), ListIndex(), ListCount() ChangeCurrentElement(), ToolBarImageButton(), EventMouseButton(), UseDirectory(), CreatePopupMenu(), DisplayPopupMenu(), TreeGadget(), ImageGadget(), ButtonImageGadget(), AddTreeGadgetItem(), ListIconGadget(), AddListIconGadgetItem(), ChangeListIconGadgetDisplay(), AddGadgetColumn()

- Modifié: Le type par défaut devient un 'Long' (32-bit) au lieu d'un 'Word' (16-bit)
- Modifié: WaitWindowEvent()/WindowEvent() renvoient tous les événements Windows !
- Modifié: ComboBoxGadget(), PanelGadget() et ListViewGadget()
- Modifié: ExamineDirectory() -> Un nombre est ajouté pour pouvoir examiner plusieurs répertoires simultanément

- Corrigé: CopyFile() (ne peut plus écraser un fichier existant)
- Corrigé: FrontColour() (les couleurs Texte ne changent pas..)
- Corrigé: GetGadgetState(), SetGadgetState() et RemoveGadgetItem() pour supporter PanelGadget

- Supprimé: InitWindow(), InitRequester(), InitToolBar(), InitFont(), InitFile() and InitMenu()

17 Mai 2001 : Version 2.30

- Ajout: Support des 'Tab' dans la bibliothèque Gadget
- Ajout: Directives de compilation : CompilerIf/Else/Endif, CompilerSelect/Case/Default/EndSelect
- Ajout: Bibliothèque CD-Audio
- Ajout: Bibliothèque FileSystem
- Ajout: Linker d'icone intégré (GoRC n'est plus nécessaire)
- Ajout: GetGadgetState(), SetGadgetState(), AddGadgetItem(), RemoveGadgetItem(), ClearGadgetItemList() PanelGadget(), ClosePanelGadget(), TextGadget(), SpritesCollision(), Delay(), OptionGadget(), Frame3DGadget() Loc(), PeekW/B(), PokeW/B(), GetPathPart(), GetFilePart(), RunProgram(), DoubleClick(), PathRequester()

- Amélioration: Debugger (Le mode pas à pas fonctionne maintenant parfaitement)
- Amélioration: Fichier exécutable généré plus compact et plus rapide
- Amélioration: Réécriture complète du noyau du compilateur
- Amélioration: Réduction significative de la taille du compilateur et de l'éditeur
- Amélioration: Beaucoup de petites corrections de bogues trop longues à énumérer

- Corrigé: Quelques bogues du compilateur

- Changement: LSR et RSR en << et >>
- Changement: AddComboBoxItem() et AddListViewItem() en AddGadgetItem()

25 March 2001 : Version 2.20

- Ajout: Support du debugger dans toutes les PureLibrairies. Un programme ne 'plante' plus maintenant aussi facilement et il est plus facile de détecter les erreurs.
- Ajout: Support de Windows NT4.0 pour les bibliothèques multimédia (Sprite, Palette, Sound & Keyboard), ce qui permet le développement de jeux ou d'applications mulitmédia qui sont compatible WinNT4 !
- Ajout: Lof(), ReadMemory(), WriteMemory(), PeekS(), PokeS(), NetworkClientEvent(), SetGadgetFont(), WaitWindowEvent(), FileSeek()
- Ajout: Bibliothèque Module : Permet de jouer les modules Protracker, Fastracker ou Impulse Tracker.
- Ajout: Chaque fichier source contient ses informations (exécutable, options de compilation, etc.)
- Ajout: Préférences pour personnaliser facilement l'éditeur (couleurs, répertoire par défaut, etc...)
- Ajout: Possibilité d'associer une icône lors lors de la création d'un fichier exécutable
- Ajout: Accès direct au fichier d'aide Win32.hlp en pressant F1 sur une fonction de l'API.

- Corrigé de bogues du compilateur, il est maintenant plus stable
- Mise à jour des documentations

26 Février 2001 : Version 2.10

- Ajout: ListViewGadget(), AddListViewItem(), GetGadgetText(), SetGadgetText(), PeekS(), SizeOf()
- Ajout: Fichier résident Microsoft Windows © contenant les constantes et les structures nécessaires pour accéder à l'API depuis PureBasic
- Ajout: Debugger intégré pour suivre pas à pas le déroulement d'un programme. Il propose 4 commandes (Pas à pas, Stop, Continue, et Quit (utile pour sortir d'une boucle infinie...) et peut être appelé et contrôlé dans le code source par les commandes suivantes : CallDebugger, EnableDebugger, DisableDebugger.

- Editeur largement amélioré : multilangues (Français, Allemand, Anglais), aide contextuelle (F1 sur un mot-clé), Goto ligne, options de compilation, amélioration de la syntaxe colorée, fichier '.prefs'

- Nombreux bogues corrigés et stabilité de PureBasic améliorée.
- Mise à jour: Documentation Allemande des manuels

17 Décembre 2000 : Version 2.00

- Version finale !
- Correction de tous les bogues connus

28 November 2000 : Version 2.00 PR 3

- Quelques bogues DirectX sont corrigés (WaponezII doit maintenant fonctionner partout)
- Ajout: 2 nouvelles bibliothèques (Requester et ToolBar)
- Editeur dédié (avec syntaxe colorée et un accès direct au compilateur)

12 November 2000 : Version 2.00 PR 2

- Seconde version publique de la version Windows. Pour programmeurs expérimentés et beta-testers.
- Ajout: 6 nouvelles bibliothèques (Sprite, Joystick, Keyboard, Sound, Network and Palette)
- De nombreux bogues ont été corrigés. Merci aux traqueurs de bogues :)
- Une première version de Waponez II (Shoot-em-up) est ajoutée pour tester les fonctions de jeu.

22 Octobre 2000 : Version 2.00 PR 1

- Première version publique de la très attendue version Windows ! Destinée uniquement aux programmeurs expérimentés.

- On y retrouve la majorité des fonctionnalités de la version Amiga, plus quelques nouvelles. La version Amiga 2.00 sera proposée en même temps que la version Windows complète pour que leurs développements soient parfaitement synchronisés.

- Mise à jour de la version allemande de PureBasic 1.60 (AmigaOS).

- Fantaisie Software a maintenant une nouvelle adresse internet : http://www.purebasic.com


2DDrawing.pb

;
; ------------------------------------------------------------
;
;   PureBasic - 2D Drawing example file
;
;    (c) 2005 - Fantaisie Software
;
; ------------------------------------------------------------
;

If OpenWindow(0, 100, 200, 300, 200, "2D Drawing Test")

  ; Create an offscreen image, with a green circle in it.
  ; It will be displayed later
  ;
  If CreateImage(0, 300, 200)
    If StartDrawing(ImageOutput(0))
      Circle(100,100,50,RGB(0,0,255))  ; a nice blue circle...

      Box(150,20,20,20, RGB(0,255,0))  ; and a green box

      FrontColor(RGB(255,0,0)) ; Finally, red lines..
      For k=0 To 20
        LineXY(10,10+k*8,200, 0)
      Next

      DrawingMode(#PB_2DDrawing_Transparent)
      BackColor(RGB(0,155,155)) ; Change the text back and front colour
      FrontColor(RGB(255,255,255))
      DrawText(10,50,"Hello, this is a test")

      StopDrawing()
    EndIf
  EndIf

  ; Create a gadget to display our nice image
  ;
  ImageGadget(0, 0, 0, 0, 0, ImageID(0))

  ;
  ; This is the 'event loop'. All the user actions are processed here.
  ; It's very easy to understand: when an action occurs, the Event
  ; isn't 0 and we just have to see what have happened...
  ;

  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow  ; If the user has pressed on the window close button

EndIf

End   ; All the opened windows are closed automatically by PureBasic


2DDrawingAlpha.pb

;
; ------------------------------------------------------------
;
;   PureBasic - 2D Drawing example file (alpha channel demo)
;
;    (c) 2010 - Fantaisie Software
;
; ------------------------------------------------------------
;

UsePNGImageDecoder()

If OpenWindow(0, 0, 0, 800, 600, "Alphachannel demo", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  LoadFont(0, "Impact", 30)
  CatchImage(2, ?TestImage)

  ; Alphachannel output image
  ;
  If CreateImage(0, 800, 600, 32) And StartDrawing(ImageOutput(0))

    ; Make the whole image transparent

    ;
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0, 0, 800, 600, $00000000)

    ; The classic Circle-thing :)
    ;
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    Circle( 75,  75, 50, RGBA(255,   0,   0, 128))
    Circle(125,  75, 50, RGBA(  0, 255,   0, 128))
    Circle(100, 125, 50, RGBA(  0,   0, 255, 128))

    ; new DrawAlphaImage() capability
    DrawingMode(#PB_2DDrawing_Default)
    x = 20
    For Alpha = 255 To 0 Step -20
      DrawAlphaImage(ImageID(2), x, 210, Alpha)
      x + 20
    Next Alpha

    ; Some DrawText stuff
    ;
    DrawingFont(FontID(0))
    w = TextWidth("Alphachannel demo")
    h = TextHeight("Alphachannel demo")

    DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)

    ; draw the text semi-transparent
    DrawText(25, 275, "Alphachannel demo", $40FF0000)
    DrawText(50, 300, "Alphachannel demo", $80FF0000)
    DrawText(75, 325, "Alphachannel demo", $A0FF0000)

    ; Show the difference between the drawing modes
    ;
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    y = 400
    For i = 0 To 255 Step 4
      Line(25, y, 500, 1, RGBA(0, 0, 255, 255-i))
      y + 1
    Next i

    DrawingFont(#PB_Default)
    DrawText( 50, 380, "Default",      $FF000000, $00000000)
    DrawText(150, 380, "AlphaBlend",   $FF000000, $00000000)
    DrawText(250, 380, "AlphaClip",    $FF000000, $00000000)
    DrawText(350, 380, "AlphaChannel", $FF000000, $00000000)
    DrawText(450, 380, "AllChannels",  $FF000000, $00000000)

    DrawingMode(#PB_2DDrawing_Default)
    DrawImage(ImageID(2), 50, 410)

    DrawingMode(#PB_2DDrawing_AlphaBlend)
    DrawImage(ImageID(2), 150, 410)

    DrawingMode(#PB_2DDrawing_AlphaClip)
    DrawImage(ImageID(2), 250, 410)

    DrawingMode(#PB_2DDrawing_AlphaChannel)
    DrawImage(ImageID(2), 350, 410)

    DrawingMode(#PB_2DDrawing_AllChannels)
    DrawImage(ImageID(2), 450, 410)

    ; Now lets see the gradient drawing mode
    ; The gradient defined the color to draw, the color parameter of the commands is then ignored
    ;
    DrawingFont(FontID(0))
    DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent|#PB_2DDrawing_Gradient)
    LinearGradient(310, 10, 310+TextWidth("Alphachannel Gradient demo"), 10+TextHeight("Alphachannel Gradient demo"))
    GradientColor(0.0,  $80FF0000)
    GradientColor(0.25, $FF00FF00)
    GradientColor(0.50, $8000FFFF)
    GradientColor(0.75, $FF0000FF)
    GradientColor(1.0,  $80FF0000)
    DrawText(310, 10, "Alphachannel Gradient demo")

    DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Outlined)
    Box(350, 75, 400, 150, $FF0000FF)
    Circle(400, 125, 20,  $FF0000FF)
    Circle(600, 125, 20,  $FF0000FF)
    Circle(500, 175, 40,  $FF0000FF)
    Circle(700, 150, 40,  $FFFF0000)
    Box(430, 80, 15, 140, $FF0000FF)

    DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Gradient)
    ConicalGradient(550, 150, 0)
    ResetGradientColors()
    GradientColor(0.0,  $FF0000FF)
    GradientColor(0.25, $8000FF00)
    GradientColor(0.5,  $FFFF0000)
    GradientColor(0.75, $8000FFFF)
    GradientColor(1.0,  $FF0000FF)
    FillArea(360, 80, -1)

    StopDrawing()
  EndIf

  ; Solid image for display
  ;
  If CreateImage(1, 800, 600, 24) And StartDrawing(ImageOutput(1))

    ; create the background effect
    #box_size = 7

    Box(0, 0, 800, 600, $FFFFFF)
    For y = 0 To 600 Step #box_size*2
      For x = 0 To 800 Step #box_size*2
        Box(x, y, #box_size, #box_size, $C0C0C0)
        Box(x+#box_size, y+#box_size, #box_size, #box_size, $C0C0C0)
      Next x
    Next y

    ; draw the alpha image
    DrawAlphaImage(ImageID(0), 0, 0)

    StopDrawing()
  EndIf

  ImageGadget(0, 0, 0, 0, 0, ImageID(1))

  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

DataSection
  TestImage:
    Data.b $89,$50,$4E,$47,$0D,$0A,$1A,$0A,$00,$00,$00,$0D,$49,$48,$44,$52
    Data.b $00,$00,$00,$30,$00,$00,$00,$30,$08,$06,$00,$00,$00,$57,$02,$F9
    Data.b $87,$00,$00,$00,$09,$70,$48,$59,$73,$00,$00,$1C,$20,$00,$00,$1C
    Data.b $20,$01,$CD,$0F,$9B,$9E,$00,$00,$00,$07,$74,$49,$4D,$45,$07,$D6
    Data.b $0C,$1C,$15,$17,$0D,$B6,$53,$C9,$04,$00,$00,$0C,$9C,$49,$44,$41
    Data.b $54,$68,$DE,$D5,$99,$79,$8C,$5D,$D7,$5D,$C7,$3F,$E7,$9C,$7B,$EF
    Data.b $5B,$E6,$BD,$D9,$17,$CF,$E2,$78,$A9,$27,$09,$B6,$A2,$26,$71,$90
    Data.b $93,$8A,$2C,$60,$D2,$02,$6D,$54,$94,$96,$48,$24,$6D,$11,$55,$55
    Data.b $05,$A5,$40,$25,$4A,$04,$52,$A1,$82,$06,$A9,$8A,$10,$02,$A1,$A6
    Data.b $34,$40,$45,$CB,$2A,$0A,$51,$A0,$B4,$84,$2C,$4E,$52,$E3,$6C,$B6
    Data.b $C7,$F6,$64,$C6,$19,$7B,$16,$8F,$67,$5F,$DF,$BE,$DF,$77,$CF,$E1
    Data.b $8F,$7B,$66,$3C,$36,$89,$ED,$B1,$C7,$48,$1C,$E9,$E8,$5E,$DD,$27
    Data.b $BD,$FB,$FB,$9E,$DF,$F6,$FD,$FE,$AE,$62,$8B,$56,$4B,$3C,$2A,$9E
    Data.b $79,$F4,$A1,$96,$87,$F6,$DF,$D6,$11,$53,$2A,$32,$B6,$94,$52,$81
    Data.b $D6,$0E,$A0,$00,$B9,$61,$0B,$BB,$B9,$E4,$FE,$9A,$96,$D8,$22,$FB
    Data.b $C5,$F4,$23,$0F,$7E,$B9,$51,$D7,$FF,$D8,$F1,$5C,$29,$1C,$15,$18
    Data.b $29,$2B,$06,$72,$46,$90,$D1,$82,$4C,$A0,$C9,$D4,$B5,$49,$D7,$11
    Data.b $E9,$BA,$54,$99,$9A,$A3,$D2,$15,$A9,$D2,$45,$44,$2A,$A7,$4D,$7A
    Data.b $36,$5F,$4A,$1D,$3E,$37,$93,$7E,$73,$72,$B6,$70,$66,$25,$E5,$07
    Data.b $DA,$68,$60,$6D,$07,$F6,$7A,$63,$00,$9C,$79,$E2,$D1,$9B,$55,$A6
    Data.b $30,$50,$74,$DD,$06,$E3,$07,$18,$BF,$8E,$30,$06,$61,$C0,$51,$02
    Data.b $E5,$39,$38,$9E,$83,$F2,$5C,$1C,$C7,$C5,$95,$02,$19,$F8,$50,$2E
    Data.b $41,$AD,$82,$10,$E0,$7A,$11,$94,$E7,$82,$52,$B5,$74,$AE,$58,$D0
    Data.b $F9,$6A,$26,$55,$F5,$8F,$DC,$F9,$C3,$D7,$9E,$06,$E6,$81,$8C,$05
    Data.b $72,$D1,$72,$AE,$D7,$F8,$87,$6F,$DE,$A1,$A2,$E9,$FC,$B7,$A7,$CF
    Data.b $4F,$37,$68,$40,$1B,$83,$36,$60,$08,$37,$F6,$AA,$0D,$04,$1A,$02
    Data.b $6D,$D0,$08,$94,$1B,$C5,$69,$6A,$C2,$69,$6C,$42,$7A,$1E,$A2,$0A
    Data.b $C2,$57,$4C,$8D,$0C,$7A,$1D,$41,$AD,$75,$5F,$57,$57,$FC,$E1,$D7
    Data.b $DE,$01,$B8,$17,$78,$1D,$28,$DC,$10,$00,$7F,$76,$FF,$81,$2F,$2E
    Data.b $9C,$9D,$78,$C0,$6C,$74,$AB,$00,$63,$42,$F7,$5E,$78,$6E,$C2,$80
    Data.b $17,$20,$8D,$41,$FB,$15,$AA,$2B,$15,$CA,$2B,$4B,$61,$6C,$08,$45
    Data.b $C1,$D4,$89,$F9,$25,$F6,$DF,$B4,$DD,$FC,$C2,$91,$E3,$E9,$C9,$62
    Data.b $69,$9B,$B5,$B1,$F6,$7E,$C6,$63,$93,$EA,$9A,$D7,$D0,$AF,$3D,$BA
    Data.b $33,$37,$B3,$F0,$8D,$AA,$EF,$83,$31,$18,$13,$9A,$6B,$36,$A2,$31
    Data.b $1B,$1E,$08,$90,$02,$A4,$B4,$5B,$80,$14,$06,$25,$C0,$77,$14,$54
    Data.b $0A,$3C,$B0,$BD,$8F,$2F,$9D,$1A,$C9,$1F,$4B,$65,$97,$80,$53,$C0
    Data.b $00,$B0,$B8,$E5,$00,$6E,$EF,$68,$91,$D1,$E5,$D4,$B7,$B2,$D9,$6C
    Data.b $23,$18,$CC,$DA,$59,$6F,$30,$DE,$98,$0D,$BF,$58,$8F,$20,$D6,$C2
    Data.b $CB,$80,$08,$EF,$44,$43,$92,$62,$6E,$85,$7B,$BB,$B7,$F1,$17,$E7
    Data.b $E7,$4A,$FF,$3C,$35,$37,$0F,$BC,$03,$BC,$0C,$BC,$07,$14,$2F,$FE
    Data.b $E7,$2D,$00,$F0,$DC,$CF,$3F,$F0,$B9,$D4,$C2,$E2,$CF,$69,$63,$42
    Data.b $43,$0D,$18,$63,$CD,$5D,$F7,$C6,$C5,$EF,$34,$EF,$03,$D0,$4D,$B6
    Data.b $B0,$9C,$5A,$E4,$F6,$D6,$56,$4E,$94,$AB,$B5,$AF,$0D,$9D,$59,$02
    Data.b $4E,$00,$2F,$59,$0F,$64,$3F,$A8,$02,$61,$6B,$F4,$A6,$D7,$C0,$AF
    Data.b $7E,$AA,$A7,$3E,$33,$FF,$7C,$B1,$52,$89,$E9,$75,$E3,$2F,$24,$EE
    Data.b $7A,$F2,$1A,$61,$3D,$20,$2C,$B0,$8B,$81,$44,$92,$CD,$2C,$66,$D3
    Data.b $EC,$F0,$1C,$62,$8D,$8D,$C1,$27,$0F,$1F,$5D,$AE,$69,$3D,$08,$FC
    Data.b $27,$F0,$DF,$36,$74,$EA,$97,$B3,$65,$D3,$49,$BC,$2D,$1E,$95,$0D
    Data.b $CB,$A9,$3F,$9F,$CF,$64,$5B,$EB,$DA,$86,$87,$14,$08,$21,$C2,$E4
    Data.b $15,$62,$3D,$65,$8D,$08,$BD,$83,$30,$17,$9D,$BC,$30,$E0,$C5,$13
    Data.b $A4,$2A,$55,$9A,$B4,$4F,$7F,$4F,$AF,$B9,$FF,$D5,$37,$53,$85,$7A
    Data.b $7D,$14,$38,$04,$1C,$B1,$A5,$D3,$BF,$92,$3D,$9B,$06,$F0,$BD,$BB
    Data.b $6F,$DB,$51,$2A,$64,$9B,$DC,$98,$BB,$D4,$28,$44,$9B,$13,$68,$55
    Data.b $01,$7C,$24,$01,$10,$04,$9A,$7A,$50,$47,$23,$C2,$92,$23,$42,$4F
    Data.b $5C,$F4,$52,$2F,$42,$59,$45,$08,$52,$33,$7C,$64,$D7,$4E,$1E,$79
    Data.b $EB,$64,$F6,$5C,$A1,$34,$09,$FC,$D8,$EE,$F3,$B6,$F2,$DC,$90,$4E
    Data.b $DC,$00,$7C,$18,$F8,$B8,$14,$E2,$CE,$CE,$88,$D7,$D6,$1F,$75,$93
    Data.b $3B,$A3,$5E,$BC,$37,$EA,$C5,$BA,$63,$D1,$C8,$81,$F6,$D6,$86,$42
    Data.b $D5,$57,$75,$AD,$C1,$7A,$06,$04,$CA,$F5,$30,$DA,$40,$73,$27,$33
    Data.b $D3,$A3,$1C,$DC,$BE,$9D,$A7,$46,$27,$0B,$CF,$8E,$4D,$4E,$02,$AF
    Data.b $00,$CF,$DB,$F8,$CF,$7D,$50,$D2,$6E,$05,$00,$0F,$E8,$06,$3E,$64
    Data.b $AF,$4D,$76,$37,$02,$4D,$F7,$75,$B4,$DC,$FC,$F5,$5D,$7D,$3F,$5D
    Data.b $F1,$7D,$A9,$A5,$40,$08,$89,$10,$82,$68,$A2,$89,$B2,$72,$E9,$2E
    Data.b $67,$19,$CE,$64,$D8,$D7,$DE,$C1,$6B,$C5,$4A,$F9,$37,$8F,$0D,$CE
    Data.b $D8,$90,$79,$0E,$78,$13,$48,$5D,$2E,$69,$B7,$A2,$91,$F9,$C0,$1C
    Data.b $B0,$02,$44,$2C,$A0,$28,$10,$FB,$E8,$AE,$BE,$9D,$7F,$78,$53,$CF
    Data.b $F7,$D2,$B9,$9C,$34,$80,$D1,$06,$21,$34,$5E,$34,$46,$25,$92,$20
    Data.b $7D,$EE,$34,$BB,$3E,$B4,$C7,$FC,$D5,$E8,$54,$7E,$78,$7C,$2E,$B7
    Data.b $58,$A9,$AE,$00,$EF,$02,$2F,$DA,$7A,$9F,$DE,$8C,$F1,$D7,$0A,$C0
    Data.b $58,$10,$BE,$AD,$CF,$02,$E0,$B7,$EE,$DC,$1B,$FB,$62,$6F,$F7,$B3
    Data.b $53,$B3,$B3,$ED,$D2,$5A,$61,$0C,$08,$29,$50,$AD,$3D,$4C,$9F,$3D
    Data.b $C9,$DD,$BB,$76,$F3,$C4,$C0,$70,$EE,$D0,$D2,$EA,$14,$30,$04,$0C
    Data.b $5B,$00,$A7,$80,$A5,$0F,$6A,$56,$5B,$0A,$E0,$C4,$E7,$7F,$B1,$AF
    Data.b $AB,$BD,$E5,$EE,$B9,$7C,$31,$FF,$97,$C7,$4E,$9F,$FD,$F6,$D1,$A1
    Data.b $55,$A0,$FE,$1B,$7B,$76,$FE,$C9,$FC,$EC,$DC,$4F,$79,$9E,$8B,$D6
    Data.b $10,$18,$83,$36,$86,$78,$F7,$2E,$46,$CE,$BE,$CB,$BE,$BE,$3E,$7E
    Data.b $F7,$BD,$F1,$FC,$CB,$0B,$4B,$D3,$B6,$44,$FE,$97,$6D,$52,$CB,$96
    Data.b $E7,$F8,$D7,$52,$D2,$37,$95,$03,$23,$8F,$7C,$7C,$77,$9B,$E7,$9F
    Data.b $90,$E5,$5A,$A3,$17,$8B,$E2,$C6,$63,$A6,$8C,$9C,$AF,$69,$31,$5D
    Data.b $5C,$4E,$1D,$F0,$A5,$C0,$AF,$07,$54,$FD,$80,$7A,$60,$50,$89,$36
    Data.b $06,$C7,$DE,$A3,$29,$1E,$E5,$B9,$D5,$5C,$F1,$EF,$C7,$26,$D7,$8C
    Data.b $FF,$37,$DB,$69,$53,$F6,$D4,$CD,$B5,$36,$D4,$AB,$F6,$C0,$67,$77
    Data.b $F7,$39,$CD,$75,$FF,$AF,$4B,$42,$37,$CA,$B6,$26,$F2,$42,$11,$18
    Data.b $21,$02,$4D,$4F,$63,$26,$D7,$D3,$D8,$D5,$46,$60,$04,$D5,$9A,$4F
    Data.b $B9,$E2,$83,$8C,$71,$6C,$6C,$94,$93,$B3,$73,$2C,$B5,$75,$54,$FE
    Data.b $69,$6C,$72,$19,$38,$69,$3B,$EC,$80,$35,$BE,$7E,$BD,$64,$F2,$6A
    Data.b $01,$88,$A7,$EF,$D8,$F7,$EB,$C2,$D1,$0F,$44,$3D,$17,$53,$AD,$13
    Data.b $51,$06,$A9,$1C,$8C,$00,$A7,$B3,$05,$E5,$44,$08,$0C,$18,$E9,$10
    Data.b $C8,$18,$D3,$B9,$22,$AB,$E9,$15,$5A,$1C,$C5,$1D,$1E,$D1,$5F,$BE
    Data.b $7F,$7F,$B7,$1B,$8D,$DC,$E1,$41,$09,$6D,$92,$43,$99,$DC,$C9,$3F
    Data.b $38,$75,$76,$32,$5D,$F3,$2B,$36,$7C,$D6,$44,$8B,$D9,$F2,$10,$1A
    Data.b $FD,$D4,$47,$F7,$36,$4B,$73,$54,$C4,$9C,$B8,$11,$21,$9D,$14,$CA
    Data.b $41,$48,$85,$54,$0A,$A9,$1C,$84,$0A,$63,$BF,$EA,$07,$94,$CB,$3E
    Data.b $E5,$9A,$8F,$89,$46,$A9,$6B,$4D,$10,$F8,$54,$4A,$45,$74,$21,$4F
    Data.b $BC,$52,$A0,$39,$E2,$12,$73,$5C,$DC,$48,$24,$8F,$1B,$19,$79,$FC
    Data.b $E8,$D0,$D7,$BE,$3F,$39,$3B,$68,$2B,$5B,$75,$4B,$3D,$F0,$D4,$87
    Data.b $6F,$F6,$9A,$D1,$DF,$51,$31,$27,$AE,$37,$E2,$5E,$A3,$CE,$6B,$47
    Data.b $A6,$0D,$C6,$08,$04,$02,$29,$15,$AE,$32,$D4,$7D,$8D,$A7,$5C,$DC
    Data.b $68,$03,$AD,$8D,$9D,$18,$2F,$8A,$69,$68,$24,$9D,$5A,$62,$F0,$D8
    Data.b $6B,$EC,$4D,$36,$25,$FF,$71,$75,$31,$FA,$FD,$C9,$D9,$7B,$AC,$E1
    Data.b $45,$DB,$81,$AF,$DA,$0B,$57,$62,$A3,$E2,$0B,$3B,$7B,$9F,$54,$51
    Data.b $79,$E0,$82,$02,$17,$17,$5F,$4D,$C8,$8F,$D7,$08,$1D,$58,$5E,$24
    Data.b $25,$42,$48,$A4,$08,$29,$85,$90,$0A,$57,$3A,$88,$62,$85,$F1,$63
    Data.b $6F,$B0,$23,$12,$E7,$07,$D9,$42,$E9,$F7,$4F,$BD,$07,$D0,$62,$8D
    Data.b $DE,$DA,$32,$3A,$F1,$B1,$03,$B7,$47,$A4,$F9,$AA,$72,$54,$28,$0B
    Data.b $85,$C4,$08,$19,$1A,$27,$25,$88,$D0,$48,$83,$E4,$02,$7B,$5E,$23
    Data.b $76,$12,$69,$F9,$90,$10,$E1,$30,$A2,$5E,$0F,$38,$79,$FC,$75,$7A
    Data.b $84,$66,$C4,$50,$FB,$CA,$C0,$F0,$32,$70,$06,$78,$1B,$18,$03,$CA
    Data.b $9B,$CD,$81,$CB,$D2,$E9,$A9,$72,$35,$98,$C9,$E5,$53,$A3,$4B,$E9
    Data.b $F6,$7A,$D5,$4F,$B6,$2B,$E5,$4A,$C7,$11,$D2,$71,$2D,$08,$15,$4A
    Data.b $AB,$90,$86,$A2,$8D,$08,$35,$B1,$D6,$68,$0D,$46,$48,$A4,$08,$F3
    Data.b $04,$E9,$70,$7A,$78,$80,$58,$3E,$4D,$D0,$D8,$58,$7F,$E4,$C8,$F1
    Data.b $45,$5F,$9B,$41,$E0,$47,$96,$C0,$CD,$5F,$4B,$2F,$B8,$2C,$80,$91
    Data.b $7C,$49,$1D,$5A,$CD,$55,$7F,$B8,$94,$CE,$7F,$F7,$FC,$C2,$6A,$A6
    Data.b $5C,$F3,$1E,$EC,$ED,$EC,$10,$9E,$7B,$E1,$F4,$CD,$05,$FA,$AC,$4D
    Data.b $28,$EA,$03,$1D,$0A,$FB,$50,$43,$4A,$A4,$72,$18,$9B,$38,$4B,$7D
    Data.b $69,$86,$8E,$CE,$8E,$E0,$13,$87,$8F,$AD,$14,$EA,$C1,$69,$CB,$FB
    Data.b $5F,$05,$A6,$AE,$96,$7D,$6E,$56,$D0,$68,$9B,$58,$B3,$BF,$D4,$DB
    Data.b $59,$FD,$C6,$5D,$7B,$3F,$EB,$25,$E3,$6E,$28,$50,$04,$06,$C9,$F8
    Data.b $CC,$2A,$A5,$89,$31,$DC,$6A,$99,$A0,$1E,$A0,$09,$E3,$5D,$5B,$50
    Data.b $42,$2A,$66,$16,$E6,$C9,$4C,$8D,$D2,$DF,$DB,$AD,$1F,$3A,$32,$90
    Data.b $5A,$A8,$54,$CF,$5A,$FE,$F3,$12,$30,$B1,$D9,$CA,$B3,$99,$2A,$54
    Data.b $07,$52,$5F,$BD,$75,$47,$ED,$4B,$BB,$B7,$FF,$43,$A4,$B1,$21,$A6
    Data.b $B5,$59,$D7,$B3,$73,$A9,$02,$93,$13,$A3,$F4,$75,$B5,$E9,$4F,$1E
    Data.b $3E,$91,$E9,$95,$54,$EE,$6B,$49,$AA,$FD,$AD,$4D,$89,$BD,$6D,$6D
    Data.b $71,$95,$68,$12,$2B,$5A,$B1,$30,$31,$CC,$1D,$7D,$3D,$E6,$D3,$EF
    Data.b $0C,$66,$CE,$17,$CB,$13,$F6,$D4,$5F,$B1,$C6,$57,$AE,$A7,$13,$5F
    Data.b $B1,$0F,$C4,$1D,$47,$4C,$FC,$CC,$FE,$67,$22,$ED,$6D,$8F,$6B,$A5
    Data.b $C2,$E1,$88,$10,$64,$2A,$9A,$A3,$43,$C3,$F4,$B4,$35,$99,$C7,$4F
    Data.b $9D,$4D,$BD,$97,$2B,$4E,$02,$A7,$ED,$00,$AA,$B9,$41,$A9,$AE,$FB
    Data.b $1A,$63,$DD,$B7,$34,$44,$DB,$13,$5E,$34,$FA,$1F,$A9,$5C,$F9,$64
    Data.b $26,$37,$03,$BC,$06,$FC,$00,$18,$04,$F2,$D7,$63,$FC,$55,$01,$98
    Data.b $3E,$B8,$FF,$B1,$44,$6B,$EB,$DF,$E2,$45,$84,$16,$60,$90,$54,$EA
    Data.b $F0,$C6,$F0,$08,$6E,$D4,$31,$5F,$1F,$9F,$CD,$0C,$A4,$B2,$E7,$AC
    Data.b $14,$3C,$64,$75,$6C,$12,$E8,$B2,$7A,$A1,$07,$E8,$B4,$EF,$1A,$03
    Data.b $0E,$5B,$E3,$B3,$9B,$A5,$CE,$9B,$0E,$A1,$33,$0F,$DC,$FE,$13,$89
    Data.b $64,$F2,$5B,$78,$AE,$08,$45,$79,$58,$65,$06,$C6,$26,$79,$7D,$7A
    Data.b $86,$F9,$D6,$B6,$CA,$C9,$74,$6E,$09,$38,$6A,$E3,$F9,$B8,$55,$53
    Data.b $CA,$6A,$84,$04,$D0,$6C,$05,$8F,$B4,$9D,$76,$CE,$9E,$FC,$75,$1B
    Data.b $7F,$D9,$24,$FE,$D7,$7B,$F6,$C5,$F7,$35,$35,$FE,$48,$26,$13,$3B
    Data.b $40,$AC,$CF,$73,$16,$6B,$01,$E7,$4B,$45,$2A,$F9,$02,$F7,$B4,$35
    Data.b $B9,$BF,$F7,$B3,$F7,$24,$1F,$DE,$DD,$A7,$3E,$D6,$D7,$99,$2E,$F9
    Data.b $C1,$F4,$78,$AE,$50,$B5,$B9,$53,$B1,$86,$AE,$02,$0B,$C0,$AC,$05
    Data.b $50,$B9,$DE,$B0,$B9,$62,$08,$25,$5C,$47,$4C,$1E,$BC,$EB,$59,$AF
    Data.b $B9,$E9,$0B,$5A,$CA,$0B,$E3,$12,$11,$56,$1F,$5F,$2A,$2A,$91,$08
    Data.b $99,$5C,$91,$F4,$EA,$2A,$D1,$5A,$95,$AE,$64,$03,$1D,$AD,$CD,$7E
    Data.b $C5,$98,$E3,$73,$85,$D2,$AB,$87,$E6,$96,$5F,$FC,$CA,$B1,$D3,$43
    Data.b $DA,$98,$D2,$86,$D1,$E0,$96,$19,$7E,$59,$00,$0B,$0F,$FE,$E4,$AF
    Data.b $24,$9B,$9B,$FE,$C6,$B8,$EE,$FA,$7C,$DB,$AC,$F9,$5C,$4A,$90,$2A
    Data.b $6C,$62,$42,$51,$AD,$6B,$2A,$8E,$4B,$BE,$54,$A2,$98,$CF,$E2,$94
    Data.b $8B,$B4,$7A,$2E,$2D,$89,$38,$28,$35,$BD,$5A,$2E,$BF,$7E,$26,$5B
    Data.b $78,$F9,$A9,$E1,$89,$1F,$BF,$B5,$9A,$5B,$B5,$1E,$A8,$6F,$55,$08
    Data.b $FD,$2F,$00,$E3,$07,$F7,$DF,$B6,$AD,$31,$F9,$86,$88,$46,$13,$21
    Data.b $CD,$11,$04,$98,$90,$2A,$0B,$81,$11,$21,$85,$40,$28,$8C,$0C,$AF
    Data.b $DA,$F6,$84,$5A,$3D,$C0,$F7,$5C,$8A,$7E,$8D,$4A,$B9,$08,$99,$14
    Data.b $4D,$D4,$69,$F2,$3C,$12,$B1,$48,$39,$5B,$AD,$BD,$3D,$57,$AA,$1C
    Data.b $7A,$7E,$6E,$E5,$C5,$3F,$1A,$99,$1A,$03,$D6,$BC,$A3,$AF,$D5,$3B
    Data.b $17,$01,$F8,$E6,$81,$7D,$D1,$CF,$B5,$37,$1D,$93,$89,$86,$7D,$C8
    Data.b $90,$BF,$84,$5F,$17,$2C,$00,$42,$00,$6B,$7B,$1D,$C8,$DA,$33,$04
    Data.b $DA,$EE,$40,$1B,$EA,$91,$18,$65,$61,$A8,$96,$F3,$04,$E9,$25,$12
    Data.b $A5,$3C,$CD,$8E,$43,$5B,$3C,$66,$AA,$5A,$8F,$2F,$55,$FD,$57,$07
    Data.b $73,$C5,$97,$7F,$67,$68,$FC,$8D,$B1,$42,$39,$6B,$BD,$13,$6C,$C6
    Data.b $3B,$97,$7A,$C0,$FB,$F2,$EE,$EE,$83,$77,$B5,$34,$3E,$79,$4F,$47
    Data.b $CB,$81,$6D,$89,$86,$98,$56,$2A,$F4,$F7,$06,$00,$7A,$23,$00,$29
    Data.b $31,$22,$FC,$8A,$A4,$C5,$5A,$87,$16,$68,$2C,$C9,$13,$12,$23,$25
    Data.b $81,$EB,$51,$F3,$5C,$CA,$A5,$0C,$F5,$EC,$32,$B1,$CC,$0A,$ED,$AE
    Data.b $43,$B3,$EB,$A1,$94,$93,$5B,$AD,$D5,$DF,$38,$5F,$AE,$BE,$F2,$77
    Data.b $53,$F3,$2F,$3D,$33,$3E,$7D,$DE,$32,$80,$FA,$95,$3C,$73,$69,$15
    Data.b $92,$6F,$A5,$0B,$FA,$B9,$F9,$D5,$EC,$37,$C7,$67,$B3,$43,$A9,$B4
    Data.b $1F,$0D,$02,$AF,$2F,$E2,$C5,$94,$72,$C2,$09,$95,$10,$F6,$1F,$C5
    Data.b $DA,$C4,$7F,$C3,$1B,$C4,$C6,$2F,$01,$17,$EE,$85,$44,$21,$88,$18
    Data.b $49,$C2,$4D,$10,$4D,$76,$22,$FA,$F6,$90,$8E,$27,$59,$74,$24,$2B
    Data.b $D9,$74,$24,$22,$D8,$B3,$3B,$16,$79,$70,$B4,$54,$6E,$7F,$69,$31
    Data.b $35,$67,$85,$7E,$79,$B3,$00,$B0,$BC,$64,$D9,$C0,$F9,$91,$42,$E5
    Data.b $DC,$BF,$CC,$AD,$4C,$7F,$67,$72,$6E,$39,$5D,$28,$D0,$2A,$45,$B4
    Data.b $D3,$73,$23,$46,$3A,$E1,$0C,$D4,$88,$F5,$CA,$64,$6C,$9D,$DD,$08
    Data.b $CE,$58,$70,$42,$08,$1B,$6E,$E1,$90,$4B,$4A,$85,$AB,$05,$0D,$5E
    Data.b $12,$65,$A2,$2C,$A4,$57,$91,$F9,$A2,$F9,$ED,$33,$13,$0B,$7F,$3A
    Data.b $3A,$BD,$68,$BB,$F9,$F4,$D5,$34,$3B,$F5,$3E,$33,$9F,$9A,$6D,$46
    Data.b $8B,$76,$46,$39,$5E,$0E,$F4,$B9,$B7,$33,$85,$73,$DF,$9D,$5A,$98
    Data.b $79,$61,$6E,$29,$67,$AA,$65,$D5,$E7,$AA,$78,$C2,$71,$94,$91,$CE
    Data.b $45,$A7,$7D,$61,$42,$BD,$E6,$A1,$B5,$9F,$2D,$ED,$DE,$00,$AC,$5A
    Data.b $2C,$30,$F9,$EE,$11,$3A,$74,$D5,$3C,$39,$36,$95,$FB,$F7,$B9,$95
    Data.b $05,$3B,$2B,$3A,$6A,$79,$52,$E9,$4A,$1E,$10,$57,$91,$23,$8E,$ED
    Data.b $AA,$2D,$96,$1A,$EC,$04,$FA,$A5,$10,$FD,$0F,$75,$35,$DF,$FA,$E9
    Data.b $9E,$AE,$5D,$F7,$76,$77,$B5,$39,$B1,$A4,$34,$8E,$67,$3D,$22,$D1
    Data.b $A8,$F5,$9C,$40,$2A,$BB,$43,$1D,$2D,$94,$43,$B9,$54,$60,$E6,$CC
    Data.b $00,$ED,$51,$C7,$3C,$71,$7A,$3C,$F3,$56,$2A,$37,$65,$47,$2E,$2F
    Data.b $00,$C7,$6C,$D3,$AB,$5F,$37,$17,$BA,$44,$7E,$BA,$76,$B8,$DB,$06
    Data.b $F4,$01,$BB,$81,$9B,$5B,$3D,$A7,$FF,$B1,$9E,$F6,$5B,$1E,$EA,$ED
    Data.b $DE,$BE,$B7,$BD,$3D,$59,$8F,$24,$D1,$D2,$59,$4F,$FA,$30,$D9,$D5
    Data.b $FA,$2E,$15,$73,$2C,$4C,$0C,$D3,$1C,$73,$F5,$E7,$07,$47,$D3,$43
    Data.b $21,$11,$3C,$6C,$F5,$C1,$89,$0D,$F3,$A2,$1B,$32,$DC,$15,$16,$4C
    Data.b $C4,$92,$B6,$4E,$E0,$26,$A0,$1F,$E8,$BF,$AD,$31,$7E,$CB,$67,$7A
    Data.b $3B,$F6,$3C,$D8,$DB,$D3,$DD,$92,$68,$F1,$EA,$91,$44,$28,$29,$A5
    Data.b $83,$91,$92,$42,$3E,$C3,$EA,$F4,$28,$B1,$58,$24,$F8,$CC,$C9,$91
    Data.b $D4,$B9,$62,$65,$C2,$7E,$85,$7C,$C1,$92,$BC,$CC,$66,$B4,$B1,$D8
    Data.b $82,$46,$B8,$31,$C4,$B6,$01,$BB,$80,$7E,$25,$44,$FF,$27,$BA,$9A
    Data.b $6F,$7D,$B8,$BB,$63,$D7,$47,$B6,$F5,$B4,$89,$78,$8B,$CC,$96,$4B
    Data.b $64,$17,$A6,$20,$E2,$06,$8F,$9E,$18,$59,$59,$A8,$D4,$C6,$AC,$36
    Data.b $78,$D1,$CE,$4A,$37,$CD,$50,$C5,$16,$D2,$92,$0F,$0C,$B1,$36,$CF
    Data.b $E9,$7F,$AC,$B7,$FD,$D6,$7D,$D1,$58,$EF,$8A,$31,$3C,$3D,$3E,$93
    Data.b $CD,$FA,$F5,$35,$E3,$5F,$B2,$33,$D2,$6B,$62,$A8,$82,$1B,$B3,$D4
    Data.b $25,$21,$B6,$03,$D8,$63,$C3,$AC,$CB,$36,$A9,$E3,$36,$69,$47,$6D
    Data.b $CD,$37,$5B,$C2,$85,$6E,$00,$59,$74,$80,$98,$D5,$05,$DB,$AC,$77
    Data.b $2A,$56,$C8,$CF,$5F,$CB,$28,$E5,$FF,$12,$C0,$A5,$21,$E6,$D8,$30
    Data.b $33,$37,$92,$62,$FF,$BF,$5A,$FF,$03,$14,$40,$F3,$DA,$D8,$5F,$19
    Data.b $B7,$00,$00,$00,$00,$49,$45,$4E,$44,$AE,$42,$60,$82
EndDataSection


AddMaterialLayer.pb

;
; ------------------------------------------------------------
;
;   PureBasic - AddMaterialLayer
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, RollZ

LoadFont(0, "Arial", 12, #PB_Font_Bold)

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ;- Mesh
    LoadMesh(0, "robot.mesh")

    ;- Texture
    CreateTexture(1, 512, 512)
    StartDrawing(TextureOutput(1))
      DrawingFont(FontID(0))
      DrawText( 90, 200, "PureBasic", RGB(255, 255, 105))
    StopDrawing()

    ;- Material
    CreateMaterial(0, LoadTexture(0, "r2skin.jpg"))
    AddMaterialLayer(0, TextureID(1), #PB_Material_Add)

    ;- Entity
    CreateEntity(0, MeshID(0), MaterialID(0))
    StartEntityAnimation(0, "Walk")
    RotateEntity(0, 0, -90, 0)

    ;- Camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 70, 90, #PB_Absolute)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Arithmetic.pb

;
; Program to demonstrate the capatibilities of the PureBasic compiler.
;

; First step standard variables
;
Byte.b  = 2        ; Byte (8 bit) variable
Word.w  = 3000     ; Word (16 bit) variable
Long.l  = 400000   ; Long (32 bit) variable
Float.f = 125.545  ; Float (32 bit) variable

Binary = %1011 ; 11 in binary format
Hexa   = $FF   ; 255 in hexadecimal format

; Variable interactions:
;
Result.l = Byte+Word+Long*Byte

; Structures
;
Structure BasicStructure
  Field1.b
  Field2.w
  Field3.l
EndStructure

; Linked lists
;
NewList TestList.BasicStructure()

AddElement(TestList())
TestList()\Field2 = 1

AddElement(TestList())
TestList()\Field3 = 2

ForEach TestList() ; Display all the elements...
  Debug TestList()\Field2
  Debug TestList()\Field3
Next

End


Array.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Array example file
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

Structure BasicStructure
  Field1.b
  Field2.w
  Field3.l
EndStructure

Structure ComplexStructure
  Field.b
  Basic.BasicStructure ; Creation of the BasicStructure object inside this structure
EndStructure

Dim BasicArray.l(100)  ; Reserve 101 elements from 0 to 100 of 'long' type

Dim StructuredArray.BasicStructure(10) ; 11 elements from 0 to 10 of 10 BasicStructure objects

Dim StructuredMultiArray.ComplexStructure(10, 20, 10) ; 11*21*11 = 2541 elements of ComplexStructures objects

; Filling arrays & Structure access
;
For k=0 To 100        ; Fill the basic array with values from 0 to 100.
  BasicArray(k) = k
Next

For k=0 To 10        ; Fill the structured array..
  StructuredArray(k)\Field1 = k
  StructuredArray(k)\Field2 = k+1
  StructuredArray(k)\Field3 = k+2
Next

For x=0 To 10        ; Fill the multi structured array..
  For y=0 To 20
    For z=0 To 10
      StructuredMultiArray(x, y, z)\Field = x
      StructuredMultiArray(x, y, z)\Basic\Field2 = y+1
      StructuredMultiArray(x, y, z)\Basic\Field3 = z+2
    Next
  Next
Next

; Copy the array into a new array
;
Dim BasicArrayCopy(1)
CopyArray(BasicArray(), BasicArrayCopy())

Debug ArraySize(BasicArrayCopy()) ; Display the size of the copy, should be 100 as the original

End


AsmInline.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Inlined asm example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;
CompilerIf #PB_Compiler_Processor <> #PB_Processor_x86 And #PB_Compiler_Processor <> #PB_Processor_x64
  CompilerError "This example only works on x86 or x64 processors"
CompilerEndIf

Value.l = 10  ; Declare our own variable

EnableASM
  MOV Value, 20 ; Directly use the ASM keywords with PureBasic variable !
  INC Value
DisableASM

MessageRequester("ASM Example", "Should be 21: "+Str(Value), 0)


AttachEntityObject2.pb

;
; ------------------------------------------------------------
;
;   PureBasic - AttachEntityObject
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;
;[Space] = DetachObject
;[RETURN] = AttachObject

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, Speed = 1.0
Define.i RobotMove

If InitEngine3D()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()
    Add3DArchive("Data/"                    , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Textures"            , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Models"              , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Scripts"             , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Particles"           , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Packs/desert.zip"    , #PB_3DArchive_Zip)
    Parse3DScripts()

    ; First create our material
    ;
    CreateMaterial(10, LoadTexture(10, "PureBasic.BMP"))
    SetMaterialColor(10, #PB_Material_SelfIlluminationColor, RGB(165, 165, 165))

    ; Then create the billboard group and use the previous material
    ;
    CreateBillboardGroup(0, MaterialID(10), 40, 10)
    AddBillboard(0, 0, 0, 0, 0)

    GetScriptMaterial(1, "Color/Red")
    GetScriptMaterial(2, "Color/Green")
    CreateMaterial(3, LoadTexture(3, "r2skin.jpg"))
    SetMaterialColor(3, #PB_Material_SelfIlluminationColor, RGB(75, 75, 75))

    ; Particle
    ;
    GetScriptParticleEmitter(0, "Examples/PurpleFountain")
    Jet = GetScriptParticleEmitter(#PB_Any, "Examples/JetEngine1")

    ;Ground
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 700, 700, 70, 70, 15, 15)
    CreateEntity(0,MeshID(0),MaterialID(0))
    EntityRenderMode(0, 0)

    ;Mesh
    ;
    LoadMesh(1, "robot.mesh")
    CreateSphere(2, 10)

    ; Entity
    ;
    CreateEntity(1, MeshID(1), MaterialID(3))
    CreateEntity(2, MeshID(2), MaterialID(1))
    CreateEntity(3, MeshID(2), MaterialID(2))

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 120, 400, #PB_Absolute)
    CameraLookAt(0, EntityX(1), EntityY(1) + 40, EntityZ(1))

    ; Light
    ;
    AmbientColor(RGB(0, 0, 0))

    CreateLight(0, RGB(255, 255, 155))
    SetLightColor(0, #PB_Light_SpecularColor, RGB(255, 255, 255))
    LightAttenuation(0, 100, 0.1)

    CreateLight(1, RGB(255, 255, 155))
    SetLightColor(1, #PB_Light_SpecularColor, RGB(255, 255, 255))
    Range.f = 100
    LightAttenuation(1,  Range, 0.1)

    ; Attach objects
    ;
    AttachEntityObject(1, "Joint18", EntityID(2), 10, -8, -5, 0, 0, 0)
    AttachEntityObject(1, "Joint15", EntityID(3), 10, -8, 0, 0, 0, 0)
    AttachEntityObject(1, "Joint15", ParticleEmitterID(0), 15, 0, 0, 0, 0, 45)
    AttachEntityObject(1, "Joint18", ParticleEmitterID(Jet), 15, -12, -5, 0, 0, -90)
    AttachEntityObject(1, "Joint1" , BillboardGroupID(0), 0, 50, 0, 0, 0, 0)
    AttachEntityObject(1, "Joint18", LightID(0), 10, -35, 20, 0, 0, 0)
    AttachEntityObject(1, "Joint15", LightID(1), 10, -35, -20, 0, 0, 0)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX()/10
        MouseY = -MouseDeltaY()/10
      EndIf

      RobotMove = #False
      If ExamineKeyboard()

        If KeyboardReleased(#PB_Key_Space)
          DetachEntityObject(1, EntityID(2))
          DetachEntityObject(1, BillboardGroupID(0))
          DetachEntityObject(1, LightID(1))
          DetachEntityObject(1, ParticleEmitterID(Jet))
        EndIf

        If KeyboardReleased(#PB_Key_Return)
          AttachEntityObject(1, "Joint18", EntityID(2), 10, -8, -5, 0, 0, 0)
          AttachEntityObject(1, "Joint1", BillboardGroupID(0), 0, 60, 0, 0, 0, 0)
          AttachEntityObject(1, "Joint15", LightID(1), 0, -35, 0, 0, 0, 0)
          AttachEntityObject(1, "Joint18", ParticleEmitterID(Jet), 15, -12, -5, 0, 0, -90)
        EndIf

        If KeyboardPushed(#PB_Key_Left)
          MoveEntity(1, -1 * Speed, 0, 0)
          RotateEntity(1, 0, 180, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_Right)
          MoveEntity(1, 1 * Speed, 0, 0)
          RotateEntity(1, 0, 0, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          MoveEntity(1, 0, 0, -1 * Speed)
          RotateEntity(1, 0, 90, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_Down)
          MoveEntity(1, 0, 0, 1 * Speed)
          RotateEntity(1, 0, -90, 0)
          RobotMove = #True
        EndIf

      EndIf

      If RobotMove
        If EntityAnimationStatus(1, "Walk") = #PB_EntityAnimation_Stopped ; Loop
          StartEntityAnimation(1, "Walk", #PB_EntityAnimation_Manual) ; Start the animation from the beginning
        EndIf
      Else
        StopEntityAnimation(1, "Walk")
      EndIf

      AddEntityAnimationTime(1, "Walk", TimeSinceLastFrame)

      CameraLookAt(0, EntityX(1), EntityY(1) + 40, EntityZ(1))

      TimeSinceLastFrame = RenderWorld() * Speed

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


AttachEntityObject3.pb

;
; ------------------------------------------------------------
;
;   PureBasic - AttachEntityObject
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, Speed = 1.0
Define.i RobotMove

#CameraSpeed = 2

If InitEngine3D()

  InitSprite()
  InitKeyboard()

  If Screen3DRequester()
    Add3DArchive("Data/"                 , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Textures"         , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Models"           , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Scripts"          , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Particles"        , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
    Parse3DScripts()

    WorldShadows(#PB_Shadow_Modulative, 3000, RGB(175, 175, 175))

    ;- Material
    ;
    GetScriptMaterial(1, "Color/Red")
    GetScriptMaterial(2, "Color/Green")
    GetScriptMaterial(3, "Color/Blue")
    GetScriptMaterial(4, "Color/Yellow")
    CreateMaterial(5, LoadTexture(5, "r2skin.jpg"))
    SetMaterialColor(5, #PB_Material_SelfIlluminationColor, RGB(75, 75, 75))

    ;- Ground
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 700, 700, 70, 70, 15, 15)
    CreateEntity(0,MeshID(0),MaterialID(0))
    EntityRenderMode(0, 0)

    ;- Mesh
    ;
    LoadMesh(1, "robot.mesh")
    CreateSphere(2, 10)

    ;- Entity
    ;
    CreateEntity(1, MeshID(1), MaterialID(5))
    CreateEntity(2, MeshID(2), MaterialID(1), -200, 10,  100)
    CreateEntity(3, MeshID(2), MaterialID(2),  200, 10, 0)
    CreateEntity(4, MeshID(2), MaterialID(3),  200, 10,  100)
    CreateEntity(5, MeshID(2), MaterialID(4), -200, 10, -100)

    ScaleEntity(3, 2, 2, 2)

    ;- Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 120, 400, #PB_Absolute)
    CameraLookAt(0, EntityX(1), EntityY(1) + 40, EntityZ(1))

    CreateCamera(1, 0, 0, 100, 100, 0)
    CameraLookAt(1,  EntityX(3), EntityY(3), EntityZ(3))

    ;- TextureRTT
    ;
    CreateRenderTexture(10, CameraID(1), 800, 600, 1)
    CreateMaterial(10, TextureID(10))
    SetMaterialColor(10, #PB_Material_SelfIlluminationColor, RGB(255, 255, 255))

    ;- Billboard group
    ;
    CreateBillboardGroup(0, MaterialID(10), 80, 60)
    AddBillboard(0, 0, 0, 0, 0)

    ;- Attach objects
    ;
    AttachEntityObject(1, "Joint1" , BillboardGroupID(0), 0, 60, 0, 0, 0, 0)
    AttachEntityObject(1, "Joint1", CameraID(1), 0, 0, 0, 0, 0, 10)

    ;-Light
    ;
    CreateLight(0, RGB(255, 255, 255), -40, 100, 80)
    AmbientColor(RGB(80, 80, 80))

    ;- Skybox
    ;
    SkyBox("desert07.jpg")

    Repeat
      Screen3DEvents()

      RobotMove = #False
      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          MoveEntity(1, -1 * Speed, 0, 0)
          RotateEntity(1, 0, 180, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_Right)
          MoveEntity(1, 1 * Speed, 0, 0)
          RotateEntity(1, 0, 0, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          MoveEntity(1, 0, 0, -1 * Speed)
          RotateEntity(1, 0, 90, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_Down)
          MoveEntity(1, 0, 0, 1 * Speed)
          RotateEntity(1, 0, -90, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_PageUp) And Speed < 2.0
          Speed + 0.05
        ElseIf KeyboardPushed(#PB_Key_PageDown) And Speed > 0.1
          Speed - 0.05
        EndIf

      EndIf

      If RobotMove
        If EntityAnimationStatus(1, "Walk") = #PB_EntityAnimation_Stopped ; Loop
          StartEntityAnimation(1, "Walk", #PB_EntityAnimation_Manual) ; Start the animation from the beginning
        EndIf
      Else
        StopEntityAnimation(1, "Walk")
      EndIf

      AddEntityAnimationTime(1, "Walk", TimeSinceLastFrame)

      CameraLookAt(0, EntityX(1), EntityY(1) + 40, EntityZ(1))

      TimeSinceLastFrame = RenderWorld() * Speed

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


AttachEntityObject.pb

;
; ------------------------------------------------------------
;
;   PureBasic - AttachEntityObject
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;
;[Space] = DetachObject
;[RETURN] = AttachObject

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, Speed = 1.0
Define.i RobotMove

If InitEngine3D()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Packs/Desert.zip", #PB_3DArchive_Zip)
    Parse3DScripts()

    WorldShadows(#PB_Shadow_Modulative, -1, RGB(175, 175, 255))

    GetScriptMaterial(1, "Color/Red")
    GetScriptMaterial(2, "Color/Green")

    ;Ground
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1500, 1500, 40, 40, 15, 15)
    CreateEntity(0,MeshID(0),MaterialID(0))
    EntityRenderMode(0, 0)

    ;Mesh
    ;
    LoadMesh(1, "robot.mesh")
    CreateSphere(2, 10)

    ; Entity
    ;
    CreateEntity(1, MeshID(1), #PB_Material_None)
    CreateEntity(2, MeshID(2), MaterialID(1))
    CreateEntity(3, MeshID(2), MaterialID(2))

    ; AttachObject
    ;
    AttachEntityObject(1, "Joint18", EntityID(2), 10, -8, -5, 0, 0, 0)
    AttachEntityObject(1, "Joint15", EntityID(3), 10, -8, 0, 0, 0, 0)

    ; Fog
    ;
    Fog(RGB(255,255,255*0.8), 1, 0, 10000)

    ; SkyBox
    ;
    SkyBox("desert07.jpg")

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 120, 500, #PB_Absolute)
    CameraLookAt(0, EntityX(1), EntityY(1) + 40, EntityZ(1))

    CreateLight(0, RGB(255, 255, 255), -40, 100, 80)
    AmbientColor(RGB(80, 80, 80))

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX()/10
        MouseY = -MouseDeltaY()/10
      EndIf

      RobotMove = #False
      If ExamineKeyboard()

        If KeyboardReleased(#PB_Key_Space)
          DetachEntityObject(1, EntityID(2))
        EndIf

        If KeyboardReleased(#PB_Key_Return)
          AttachEntityObject(1, "Joint18", EntityID(2), 10, -8, -5,  0, 0, 0)
        EndIf

        If KeyboardPushed(#PB_Key_Left)
          MoveEntity(1, -1 * Speed, 0, 0)
          RotateEntity(1, 0, 180, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_Right)
          MoveEntity(1, 1 * Speed, 0, 0)
          RotateEntity(1, 0, 0, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          MoveEntity(1, 0, 0, -1 * Speed)
          RotateEntity(1, 0, 90, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_Down)
          MoveEntity(1, 0, 0, 1 * Speed)
          RotateEntity(1, 0, -90, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_PageUp) And Speed < 2.0
          Speed + 0.05
        ElseIf KeyboardPushed(#PB_Key_PageDown) And Speed > 0.1
          Speed - 0.05
        EndIf

      EndIf

      If RobotMove
        If EntityAnimationStatus(1, "Walk") = #PB_EntityAnimation_Stopped ; Loop
          StartEntityAnimation(1, "Walk", #PB_EntityAnimation_Manual) ; Start the animation from the beginning
        EndIf
      Else
        StopEntityAnimation(1, "Walk")
      EndIf

      AddEntityAnimationTime(1, "Walk", TimeSinceLastFrame)

      RotateCamera(0, MouseY, MouseX, RollZ, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      TimeSinceLastFrame = RenderWorld() * Speed

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


AttachNodeObject.pb

;
; ------------------------------------------------------------
;
;   PureBasic - AttachNodeObject
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;
;[Space] = DetachObject
;[RETURN] = AttachObject

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, Speed = 1.0
Define.i RobotMove

#PB_Unknow  = 0
#PB_Started = 1
#PB_Stopped = 2

If InitEngine3D(3)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()
    Add3DArchive("Data/"                    , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Textures"            , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Models"              , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Scripts"             , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Particles"           , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Packs/desert.zip"    , #PB_3DArchive_Zip)
    Parse3DScripts()

    ; First create our material
    ;
    CreateMaterial(10, LoadTexture(10, "PureBasic.BMP"))
    SetMaterialColor(10, #PB_Material_SelfIlluminationColor, RGB(165, 165, 165))

    ; Then create the billboard group and use the previous material
    ;
    CreateBillboardGroup(0, MaterialID(10), 40, 10, 0, 120, 0)
    AddBillboard(0, 0, 0, 0, 0)

    GetScriptMaterial(1, "Color/Red")
    GetScriptMaterial(2, "Color/Green")
    CreateMaterial(3, LoadTexture(3, "r2skin.jpg"))
    SetMaterialColor(3, #PB_Material_SelfIlluminationColor, RGB(75, 75, 75))

    ; Particle
    ;
    GetScriptParticleEmitter(0, "Examples/PurpleFountain")
    Jet = GetScriptParticleEmitter(#PB_Any, "Examples/JetEngine1")
    MoveParticleEmitter(0, 15, 12, -5, #PB_Absolute)
    MoveParticleEmitter(Jet, -15, 12, -5, #PB_Absolute)
    ;Ground
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 700, 700, 70, 70, 15, 15)
    CreateEntity(0,MeshID(0),MaterialID(0))
    EntityRenderMode(0, 0)

    ;Mesh
    ;
    LoadMesh(1, "robot.mesh")
    CreateSphere(2, 10)

    ; Node
    ;
    CreateNode(1)

    ; Entity
    ;
    CreateEntity(1, MeshID(1), MaterialID(3))
    CreateEntity(2, MeshID(2), MaterialID(1), 0, 18, 0)
    CreateEntity(3, MeshID(2), MaterialID(2))

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 120, 400, #PB_Absolute)
    CameraLookAt(0, EntityX(1), EntityY(1) + 40, EntityZ(1))

    ; Light
    ;
    AmbientColor(RGB(6, 6, 6))

    CreateLight(0, RGB(255, 255, 155), 0, 35, -70)
    SetLightColor(0, #PB_Light_SpecularColor, RGB(255, 255, 255))
    LightAttenuation(0, 100, 0.1)

    CreateLight(1, RGB(255, 255, 155), 0, 35, 70)
    SetLightColor(1, #PB_Light_SpecularColor, RGB(255, 255, 255))
    Range.f = 100
    LightAttenuation(1,  Range, 0.1)

    ; Attach objects
    ;
    AttachNodeObject(1, EntityID(1))
    AttachNodeObject(1, EntityID(2))
    AttachNodeObject(1, ParticleEmitterID(0))
    AttachNodeObject(1, ParticleEmitterID(Jet))
    AttachNodeObject(1, BillboardGroupID(0))
    AttachNodeObject(1, LightID(0))
    AttachNodeObject(1, LightID(1))

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX()/10
        MouseY = -MouseDeltaY()/10
      EndIf

      RobotMove = #False
      If ExamineKeyboard()
        If KeyboardReleased(#PB_Key_F5)
          FreeNode(1)
          Debug EntityX(1)
          Debug EntityY(1)
          Debug EntityZ(1)
MoveEntity(1, 0, 0, 0, #PB_Absolute)
        EndIf
        If KeyboardReleased(#PB_Key_Space)
          DetachNodeObject(1, EntityID(2))
          DetachNodeObject(1, BillboardGroupID(0))
          DetachNodeObject(1, LightID(1))
          DetachNodeObject(1, ParticleEmitterID(Jet))

        EndIf

        If KeyboardReleased(#PB_Key_Return)
          MoveEntity(2,  0, 18, 0, #PB_Absolute)
          AttachNodeObject(1, EntityID(2))
          MoveBillboardGroup(0, 0, 120, 0, #PB_Absolute)
          AttachNodeObject(1, BillboardGroupID(0))
          MoveLight(1, 0, 35, 70, #PB_Absolute)
          AttachNodeObject(1, LightID(1))
          MoveParticleEmitter(Jet,  -15, 12, -5, #PB_Absolute)
          AttachNodeObject(1, ParticleEmitterID(Jet))
        EndIf

        If KeyboardPushed(#PB_Key_Left)
          MoveNode(1, -1, 0, 0)
          RotateNode(1, 0, 180, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_Right)
          MoveNode(1, 1, 0, 0)
          RotateNode(1, 0, 0, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          MoveNode(1, 0, 0, -1)
          RotateNode(1, 0, 90, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_Down)
          MoveNode(1, 0, 0, 1)
          RotateNode(1, 0, -90, 0)
          RobotMove = #True
        EndIf

      EndIf

      If RobotMove
        If EntityAnimationStatus(1, "Walk") = #PB_EntityAnimation_Stopped ; Loop
          StartEntityAnimation(1, "Walk")
        EndIf
      Else
        StopEntityAnimation(1, "Walk")
      EndIf

      CameraLookAt(0, EntityX(1), EntityY(1) + 40, EntityZ(1))

      RenderWorld()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


AudioCD.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Audio CD example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;
; 28/04/2001
;   First version. A full Audio-CD player with unlimited CDDrive support
;   coded in less than half an hour :-)
;

NbCDDrives = InitAudioCD()

If NbCDDrives = 0
  MessageRequester("Error", "No CD Audio drives found...", 0)
  End
EndIf

Global Null$

Procedure.s GetHourFormat(LengthInSeconds)
  Minutes = LengthInSeconds/60
  Seconds = LengthInSeconds-Minutes*60
  If Seconds < 10 : Null$ = "0" : Else : Null$ = "" : EndIf

  ProcedureReturn Str(Minutes)+":"+Null$+Str(Seconds)
EndProcedure

; Initialize constants for easier code reading
;
#GADGET_Play   = 0
#GADGET_Stop   = 1
#GADGET_Eject  = 2
#GADGET_Close  = 3
#GADGET_Select = 4
#GADGET_Status = 5
#GADGET_Time   = 6
#GADGET_AudioCDDrive = 7
#GADGET_SelectDrive  = 8

If OpenWindow(0, 100, 200, 265, 125, "PureBasic - AudioCD Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  ButtonGadget  (#GADGET_Play   ,  10, 10, 60 , 24, "Play")
  ButtonGadget  (#GADGET_Stop   ,  70, 10, 60 , 24, "Stop")
  ButtonGadget  (#GADGET_Eject  , 130, 10, 60 , 24, "Eject")
  ButtonGadget  (#GADGET_Close  , 190, 10, 60 , 24, "Close")
  ComboBoxGadget(#GADGET_Select ,  10, 43, 240, 21)
  TextGadget    (#GADGET_Status ,  10, 70, 180, 16, "Status: stopped")
  TextGadget    (#GADGET_Time   , 200, 70, 240, 16, "")

  TextGadget    (#GADGET_AudioCDDrive,  10, 94, 140,  24, "Select the CD-Audio drive :")
  ComboBoxGadget(#GADGET_SelectDrive , 150, 90,  40, 21)

  For k=1 To NbCDDrives
    UseAudioCD(k-1)
    AddGadgetItem(#GADGET_SelectDrive, -1, Left(AudioCDName(),2))
  Next
  SetGadgetState(#GADGET_SelectDrive, 0)
  UseAudioCD(0)

  If NbCDDrives = 1
    DisableGadget(#GADGET_SelectDrive, 1)
  EndIf

  Gosub RefreshCD

  Repeat
    Repeat
      Event = WindowEvent()  ; This time we use the WindowEvent(), non-blocking command to allow time refreshing

      If Event = #PB_Event_Gadget
        Select EventGadget()

          Case #GADGET_Play
            CurrentTrack = GetGadgetState(4)+1
            PlayAudioCD(CurrentTrack, CurrentTrack)

          Case #GADGET_Stop
            StopAudioCD()

          Case #GADGET_Eject
            EjectAudioCD(1)

          Case #GADGET_Close
            EjectAudioCD(0)

          Case #GADGET_SelectDrive
            UseAudioCD(GetGadgetState(#GADGET_SelectDrive))
            Gosub RefreshCD

        EndSelect

      Else
        If Event = #PB_Event_CloseWindow : Quit = 1 : EndIf
      EndIf
    Until Event = 0

    Delay(20) ; Wait 20 ms, which is a long period for the processor, to don't steal the whole CPU power
              ; for our little application :)

    CurrentTrack = AudioCDStatus()
    If CurrentTrack > 0
      SetGadgetText(#GADGET_Status, "Playing Track "+Str(CurrentTrack)+" (Length: "+GetHourFormat(AudioCDTrackLength(CurrentTrack))+")")
      SetGadgetText(#GADGET_Time, "Time: "+GetHourFormat(AudioCDTrackSeconds()))
      DisableGadget(#GADGET_Play, 1)
      DisableGadget(#GADGET_Stop, 0)
      DisableGadget(#GADGET_Select, 0)
    Else
      SetGadgetText(#GADGET_Status, "Status: Stopped")
      SetGadgetText(#GADGET_Time, "")
      DisableGadget(#GADGET_Play, 0)
      DisableGadget(#GADGET_Stop, 1)

      If CurrentTrack = -1 ; CD Drive not ready
        DisableGadget(#GADGET_Select, 1)
      Else
        DisableGadget(#GADGET_Select, 0)
      EndIf
    EndIf

  Until Quit = 1

EndIf

For k=0 To NbCDDrives-1    ; Stop all the CD drives, if some are playing together
  UseAudioCD(k)
  StopAudioCD()
Next

End

;-----------------------------------------------------------------
;  SubRoutines
;

RefreshCD:
  ClearGadgetItems(#GADGET_Select)

  NbAudioTracks = AudioCDTracks()
  For k=1 To NbAudioTracks
    AddGadgetItem(#GADGET_Select, -1, "Track "+Str(k))
  Next
  SetGadgetState(#GADGET_Select, 0)
Return


Billboard.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Billboard
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ; First create our material, with a little rotate effect
    ;
    CreateMaterial(0, LoadTexture(0, "clouds.jpg"))
    RotateMaterial(0, 0.05, 1)

    ; Then create the billboard group and use the previous material
    ;
    CreateBillboardGroup(0, MaterialID(0), 10, 10)

    AddBillboard(0, 0,   0, 0, -40)
    AddBillboard(1, 0, -20, 0, -40)
    AddBillboard(2, 0,  20, 0, -40)

    CreateCamera(0, 0, 0, 100, 100)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


BillboardGrass.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Billboard
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 2

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ; First create materials
    ;

    CreateMaterial(0, LoadTexture(0,"grass1.png"))
    MaterialBlendingMode(0, #PB_Material_AlphaBlend)
    CreateMaterial(1, LoadTexture(1,"Dirt.jpg"))

    ; Then create the billboard group and use the previous material
    ;
    ;-Billboard

    CreateBillboardGroup(0, MaterialID(0), 96, 96)
    For i = 0 To 600
      AddBillboard(#PB_Any, 0, Random(2000)-1000, Random(18) + 30, Random(2000) - 1000)
    Next i

    ; create ground

    CreatePlane(0, 2000, 2000, 40, 40, 4, 4)
    CreateEntity(0, MeshID(0), MaterialID(1))

    ; Add house
    LoadMesh(1, "tudorhouse.mesh")
    CreateEntity(1, MeshID(1), #PB_Material_None, 0, 280, 0)
    ScaleEntity(1, 0.5, 0.5, 0.5)

    ; SkyBox
    SkyBox("stevecube.jpg")

    ; create camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 200, 400, 900, #PB_Absolute)
    CameraLookAt(0, 0, 100, 0)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End#


Bridge.pb

;
; ------------------------------------------------------------
;
;   PureBasic - PointJoint (Bridge)
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

#CameraSpeed = 1
#NbPlanks = 30
Define.f KeyX, KeyY, MouseX, MouseY
Dim Plank(#NbPlanks)

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts",#PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    WorldShadows(#PB_Shadow_Modulative, -1, RGB(127, 127, 127))

    ;Materials
    ;
    CreateMaterial(0, LoadTexture(0, "Wood.jpg"))
    GetScriptMaterial(1, "SphereMap/SphereMappedRustySteel")
    CreateMaterial(2, LoadTexture(2, "Dirt.jpg"))
    GetScriptMaterial(3, "Scene/GroundBlend")

    ; Ground
    ;
    CreatePlane(3, 500, 500, 5, 5, 5, 5)
    CreateEntity(3,MeshID(3),MaterialID(3), 0, -50, 0)
    EntityRenderMode(3, 0)
    EntityPhysicBody(3, #PB_Entity_BoxBody, 0, 1, 1)

    ; Bridge
    CreateCube(1, 1.0)
    For i = 1 To #NbPlanks
      Plank(i)=CreateEntity(#PB_Any, MeshID(1), MaterialID(0))
      ScaleEntity(Plank(i), 2.8, 0.8, 20)
      MoveEntity(Plank(i), i * 3, 0, 0, #PB_Absolute)
      EntityPhysicBody(Plank(i), #PB_Entity_BoxBody, 1.0)
    Next i

    Pas.f = 1.5
    PointJoint(#PB_Any, EntityID(Plank(1)), -Pas, 0, -5)
    For i= 1 To #NbPlanks-2
      Joint=PointJoint(#PB_Any, EntityID(Plank(i+1)), -Pas, 0, -5, EntityID(Plank(i)), Pas, 0, -5)
    Next i
    PointJoint(#PB_Any, EntityID(Plank(#NbPlanks)),  Pas, 0, -5)
    PointJoint(#PB_Any, EntityID(Plank(#NbPlanks-1)),  Pas, 0, -5, EntityID(Plank(#NbPlanks)), -Pas, 0, -5)

    PointJoint(#PB_Any, EntityID(Plank(1)), -Pas, 0, 5)
    For i= 1 To #NbPlanks-2
      Joint=PointJoint(#PB_Any, EntityID(Plank(i+1)),  -Pas, 0, 5, EntityID(Plank(i)), Pas, 0, 5)
    Next i
    PointJoint(#PB_Any, EntityID(Plank(#NbPlanks)),  Pas, 0, 5)
    toto=PointJoint(#PB_Any, EntityID(Plank(#NbPlanks-1)),  Pas, 0, 5, EntityID(Plank(#NbPlanks)), -Pas, 0, 5)

    ; Objects
    ;
    CreateSphere(2, 2, 30, 30)

    C = Plank(1)
    For i = 1 To #NbPlanks/2
      Perso = CreateEntity(#PB_Any, MeshID(2), MaterialID(1), EntityX(C) +i * 5, EntityY(C)+ i * 2, EntityZ(C))
      EntityPhysicBody(Perso, #PB_Entity_SphereBody, 1.0, 0.3, 0.5)
    Next i

    For i = 1 To #NbPlanks/2
      Perso = CreateEntity(#PB_Any, MeshID(1), MaterialID(2), EntityX(C) +i * 5, EntityY(C)+ i * 4, EntityZ(C))
      ScaleEntity(Perso, 3, 3, 3)
      EntityPhysicBody(Perso, #PB_Entity_BoxBody, 1.0)
    Next i

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, -20, 30, -40, #PB_Absolute)
    CameraLookAt(0, EntityX(C) + 25, EntityY(C) + 10,  EntityZ(C))

    ; Skybox
    ;
    SkyBox("desert07.jpg")

    ; Light
    ;
    CreateLight(0, RGB(255, 255, 255), 100, 800, -500)
    AmbientColor(RGB(20, 20, 20))

    Plank = 1
    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()
        If KeyboardPushed(#PB_Key_Space)
          ApplyEntityImpulse(Plank(#NbPlanks/2), 0, 9, 0)
        EndIf
        If KeyboardReleased(#PB_Key_Return)

          If Plank <= #NbPlanks
            DisableEntityBody(Plank(Plank), 0)
            FreeEntityJoints(Plank(Plank))
            Plank + 1
          EndIf

        EndIf

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      MoveCamera  (0, KeyX, 0, KeyY)
      RotateCamera(0,  MouseY, MouseX, 0, #PB_Relative)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()

    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1

  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End#


Camera.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Camera
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    AmbientColor(RGB(0, 200, 0))  ; Green 'HUD' like color

    CreateMaterial(0, LoadTexture(0, "r2skin.jpg"))
    CreateEntity(0, LoadMesh(0, "robot.mesh"), MaterialID(0))
    StartEntityAnimation(0, "Walk")

    CreateCamera(0, 0, 0, 100, 50)  ; Front camera
    MoveCamera(0, 0, 20, 250, #PB_Absolute)
    CameraBackColor(0, RGB(55, 0, 0))

    CreateCamera(1, 0, 50, 100, 50) ; Back camera
    MoveCamera(1, 0, 20, -250, #PB_Absolute)
    CameraBackColor(1, RGB(25, 25, 25))
    RotateCamera(1, 180, 0, 0)

    CameraRenderMode(1, #PB_Camera_Wireframe)  ; Wireframe for this camera

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateEntity(0, 0, 0.1, 0, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RotateCamera(1, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (1, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


CameraProjection.pb

;
; ------------------------------------------------------------
;
;   PureBasic - CameraProjectionX/Y
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    LoadTexture(0, "flare.png")

    CreateMaterial(0, TextureID(0))
    DisableMaterialLighting(0, 1)
    MaterialBlendingMode   (0, #PB_Material_Add)

    CreateParticleEmitter(0, 10, 1, 1, 0)
    ParticleMaterial    (0, MaterialID(0))
    ParticleTimeToLive  (0, 2, 2)
    ParticleEmissionRate(0, 20)
    ParticleSize        (0, 30, 30)
    ParticleColorRange  (0, RGB(255, 255, 0), RGB(0, 255, 0))

    MoveParticleEmitter(0, -50, 0, 0)

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 0, 200, #PB_Absolute)

    LoadSprite(0, "Data/Textures/Geebee2.bmp")
    TransparentSpriteColor(0, RGB(255, 0, 255))

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateCamera(0, MouseY, MouseX, RollZ, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()

      x = CameraProjectionX(0, ParticleEmitterX(0), ParticleEmitterY(0), ParticleEmitterZ(0)) - SpriteWidth(0)/2
      y = CameraProjectionY(0, ParticleEmitterX(0), ParticleEmitterY(0), ParticleEmitterZ(0)) - SpriteHeight(0)/2
      DisplayTransparentSprite(0, x, y)

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


CameraTrack.pb

;
; ------------------------------------------------------------
;
;   PureBasic - CameraTrack
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

; Code adapted from this tutorial
; http://www.ogre3d.org/tikiwiki/3rd+person+camera+system+tutorial

IncludeFile "Screen3DRequester.pb"

#PlayerSpeed = 2

Enumeration
  #MainWindow
  #StMode
  #StFPS
  #Editor
EndEnumeration

Enumeration
  #ThirdPersonChase
  #ThirdPersonFixed
  #FirstPerson
EndEnumeration

Structure Vector3
  x.f
  y.f
  z.f
EndStructure

Structure s_Key
  Up.i
  Down.i
  Left.i
  Right.i
EndStructure

Structure s_Entity
  Entity.i
  elapsedTime.f
  Key.s_Key
  SightNode.i
  CameraNode.i
  DirectionNode.i
  Offset.Vector3 ; if needed for FirstPerson
EndStructure

Structure s_Camera
  Camera.i
  Mode.i
  Tightness.f
  CameraNode.i
  TargetNode.i
EndStructure

Macro GetNodePosition(Position, Node)
  Position\x = NodeX(Node)
  Position\y = NodeY(Node)
  Position\z = NodeZ(Node)
EndMacro

Macro GetEntityPosition(Position, Node)
  Position\x = EntityX(Node)
  Position\y = EntityY(Node)
  Position\z = EntityZ(Node)
EndMacro

Macro SetVector3(V, xx, yy, zz)
  V\x = xx
  V\y = yy
  V\z = zz
EndMacro

Macro AddVector3(V, V1, V2)
  V\x = V1\x + V2\x
  V\y = V1\y + V2\y
  V\z = V1\z + V2\z
EndMacro

Macro SubVector3(V, V1, V2)
  V\x = V1\x - V2\x
  V\y = V1\y - V2\y
  V\z = V1\z - V2\z
EndMacro

;-Declare
Declare HandleEntity(*Entity.s_Entity)
Declare CameraMode(*Camera.s_Camera, *Entity.s_Entity)
Declare CameraTrack(*Camera.s_Camera, *Entity.s_Entity)
Declare CameraInstantUpdate(*Camera.s_Camera, *CameraPosition.Vector3, *TargetPosition.Vector3)
Declare CameraUpdate(*Camera.s_Camera, *CameraPosition.Vector3, *TargetPosition.Vector3)

Define.f RatioX, RatioY
Define Robot.s_Entity
Define Camera.s_Camera

If InitEngine3D()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    Add3DArchive("Data/Textures"        , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Models"          , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/GUI"             , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)

    WorldShadows(#PB_Shadow_Modulative)

    ;Change the texture filtering mode for all materials
    MaterialFilteringMode(#PB_Default, #PB_Material_Anisotropic, 8)

    CreateTexture(1, 256, 256)
    StartDrawing(TextureOutput(1))
    Box(0, 0, 256, 256, RGB(0, 34, 85))
    DrawingMode(#PB_2DDrawing_Outlined)
    Box(0, 0, 256, 256, RGB(255, 255, 255))
    Box(10, 10, 236, 236, RGB(0, 255, 255))
    StopDrawing()

    CreateMaterial(0, LoadTexture(0, "r2skin.jpg"))
    CreateMaterial(1, TextureID(1))

    ;robot
    LoadMesh   (0, "robot.mesh")
    CreateEntity (0, MeshID(0), MaterialID(0));
    StartEntityAnimation(0, "Walk")

    ;Sol
    CreatePlane(1, 5000, 5000, 100, 100, 100,100)
    CreateEntity(1, MeshID(1), MaterialID(1))

    With Robot
      \Entity = 0
      \Key\Down  = #PB_Key_Down
      \Key\Left  = #PB_Key_Left
      \Key\Right = #PB_Key_Right
      \Key\Up    = #PB_Key_Up
      \Offset\x = 0
      \Offset\y = 50 ; Offset could be needed for FirstPerson
      \Offset\z = 0
      ; Entity use 3 nodes
      \SightNode=CreateNode(#PB_Any, 120, 20, 0) ; For cameraLookAt
      \CameraNode=CreateNode(#PB_Any, -140, 100, 0) ; Camera position
      \DirectionNode=CreateNode(#PB_Any, 1, 0, 0) ; Direction normalized

      AttachEntityObject(\Entity, "", NodeID(\SightNode))
      AttachEntityObject(\Entity, "", NodeID(\CameraNode))
      AttachEntityObject(\Entity, "", NodeID(\DirectionNode))
    EndWith

    ;-Camera
    CreateCamera(0, 0, 0, 100, 100)
    With Camera
      \Camera = 0
      \Mode = #ThirdPersonChase
      \Tightness = 0.01
      ; Camera use 2 nodes
      \CameraNode = CreateNode(#PB_Any, -3000, 700, 0) ; Camera position
      \TargetNode = CreateNode(#PB_Any) ; For cameraLookAt
      AttachNodeObject(\CameraNode, CameraID(\Camera))
    EndWith

    ;-Light
    CreateLight(0,RGB(125,125,125),700,500,0)
    AmbientColor(RGB(85,85,85))

    SkyBox("desert07.jpg")

    ;-GUI
    RatioX = CameraViewWidth(0) / 800
    RatioY = CameraViewHeight(0) / 600
    OpenWindow3D(#MainWindow, 0, 0, 280 * RatioX, 170 * RatioY, "Camera Track")
    StringGadget3D(#StFPS , 10 * RatioX, 10 * RatioY, 240 * RatioX, 30 * RatioY, "FPS")
    StringGadget3D(#StMode, 10 * RatioX, 45 * RatioY, 240 * RatioX, 30 * RatioY, "ThirdPersonChase")
    EditorGadget3D(#Editor, 10 * RatioX, 85 * RatioY, 240 * RatioX, 30 * RatioY, #PB_Editor3D_ReadOnly)
    SetGadgetText3D(#Editor, "Use F2, F3 or F4 to change Mode")

    ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor

    Repeat
      Screen3DEvents()

      If Engine3DFrameRate(#PB_Engine3D_Current)
        Robot\elapsedTime = 40/Engine3DFrameRate(#PB_Engine3D_Current)
      EndIf

      If ExamineMouse()
        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left), "", 0)
      EndIf

      If ExamineKeyboard()
        CameraMode(@Camera, @robot)
        HandleEntity(@Robot)
      EndIf

      Repeat
        Event3D = WindowEvent3D()
      Until Event3D = 0

      CameraTrack(@Camera, @Robot)

      SetGadgetText3D(#StFPS, "FPS = " + Str(Engine3DFrameRate(#PB_Engine3D_Current)))

      RenderWorld()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End

Procedure HandleEntity(*Entity.s_Entity)
  Protected Direction.Vector3, PosMain.Vector3, PosDir.Vector3
  Protected Speed.f, Speed2.f
  With *Entity
    GetEntityPosition(PosMain, \Entity)
    GetNodePosition(PosDir, \DirectionNode)
    SubVector3(Direction, PosDir, PosMain)
    Speed = #PlayerSpeed * \elapsedTime
    Speed2 = -Speed / 2
    If KeyboardPushed(\Key\Up)
      MoveEntity(\Entity, Direction\x * Speed, Direction\y * Speed, Direction\z * Speed)
    ElseIf KeyboardPushed(\Key\Down)
      MoveEntity(\Entity, Direction\x * Speed2, Direction\y * Speed2, Direction\z * Speed2)
    EndIf

    If KeyboardPushed(\Key\Left)
      RotateEntity(\Entity, 0,#PlayerSpeed/2 * \elapsedTime, 0, #PB_Relative)
    ElseIf KeyboardPushed(\Key\Right)
      RotateEntity(\Entity, 0, -#PlayerSpeed/2 * \elapsedTime, 0, #PB_Relative)
    EndIf
  EndWith
EndProcedure

Procedure CameraMode(*Camera.s_Camera, *Entity.s_Entity)
  Protected CameraPosition.Vector3, TargetPosition.Vector3, Temp.Vector3

  If KeyboardReleased(#PB_Key_F2)
    *Camera\Mode = #ThirdPersonChase
    HideEntity(*Entity\Entity, #False)
    GetNodePosition(CameraPosition, *Entity\CameraNode)
    GetNodePosition(TargetPosition, *Entity\SightNode)
    CameraInstantUpdate(*Camera, @CameraPosition, @TargetPosition)
    *Camera\Tightness = 0.01
    SetGadgetText3D(#StMode, "ThirdPersonChase")

  ElseIf KeyboardReleased(#PB_Key_F3)
    *Camera\Mode = #ThirdPersonFixed
    HideEntity(*Entity\Entity, #False)
    SetVector3(CameraPosition, 0, 200, 0)
    GetNodePosition(TargetPosition, *Entity\SightNode)
    CameraInstantUpdate(*Camera, @CameraPosition, @TargetPosition)
    *Camera\Tightness = 0.01
    SetGadgetText3D(#StMode, "ThirdPersonFixed")

  ElseIf KeyboardReleased(#PB_Key_F4)
    *Camera\Mode = #FirstPerson
    HideEntity(*Entity\Entity, #True)
    GetEntityPosition(Temp, *Entity\Entity)
    AddVector3(CameraPosition, Temp, *Entity\Offset)
    GetNodePosition(TargetPosition, *Entity\SightNode)
    CameraInstantUpdate(*Camera, @CameraPosition, @TargetPosition)
    *Camera\Tightness = 1
    SetGadgetText3D(#StMode, "FirstPerson")

  EndIf
EndProcedure

Procedure CameraTrack(*Camera.s_Camera, *Entity.s_Entity)
  Protected CameraPosition.Vector3, TargetPosition.Vector3, Temp.Vector3

  Select *Camera\Mode
    Case #ThirdPersonChase
      GetNodePosition(CameraPosition, *Entity\CameraNode)
      GetNodePosition(TargetPosition, *Entity\SightNode)
      CameraUpDate(*Camera, @CameraPosition, @TargetPosition)

    Case #ThirdPersonFixed
      SetVector3(CameraPosition, 0, 200, 0)
      GetNodePosition(TargetPosition, *Entity\SightNode)
      CameraUpDate(*Camera, @CameraPosition, @TargetPosition)

    Case #FirstPerson
      GetEntityPosition(Temp, *Entity\Entity)
      AddVector3(CameraPosition, Temp, *Entity\Offset)
      GetNodePosition(TargetPosition, *Entity\SightNode)
      CameraUpDate(*Camera, @CameraPosition, @TargetPosition)

  EndSelect
EndProcedure

Procedure CameraInstantUpdate(*Camera.s_Camera, *CameraPosition.Vector3, *TargetPosition.Vector3)
  Protected V1.Vector3, V2.Vector3

  MoveNode(*Camera\CameraNode, *CameraPosition\x, *CameraPosition\y, *CameraPosition\z, #PB_Absolute)

  MoveNode(*Camera\TargetNode, *TargetPosition\x, *TargetPosition\y, *TargetPosition\z, #PB_Absolute)

  CameraLookAt(*Camera\Camera, NodeX(*Camera\TargetNode), NodeY(*Camera\TargetNode), NodeZ(*Camera\TargetNode))
EndProcedure

Procedure CameraUpdate(*Camera.s_Camera, *CameraPosition.Vector3, *TargetPosition.Vector3)
  Protected V1.Vector3, V2.Vector3

  V1\x = (*CameraPosition\x - NodeX(*Camera\CameraNode)) *  *Camera\Tightness
  V1\y = (*CameraPosition\y - NodeY(*Camera\CameraNode)) *  *Camera\Tightness
  v1\z = (*CameraPosition\z - NodeZ(*Camera\CameraNode)) *  *Camera\Tightness
  MoveNode(*Camera\CameraNode, V1\x, V1\y, V1\z)

  V2\x = (*TargetPosition\x - NodeX(*Camera\TargetNode)) *  *Camera\Tightness
  V2\y = (*TargetPosition\y - NodeY(*Camera\TargetNode)) *  *Camera\Tightness
  V2\z = (*TargetPosition\z - NodeZ(*Camera\TargetNode)) *  *Camera\Tightness
  MoveNode(*Camera\TargetNode, V2\x, V2\y, V2\z)

  CameraLookAt(*Camera\Camera, NodeX(*Camera\TargetNode), NodeY(*Camera\TargetNode), NodeZ(*Camera\TargetNode))
EndProcedure


CameraView.pb

;
; ------------------------------------------------------------
;
;   PureBasic - CameraView
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, SpriteX, SpriteY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/Desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ;- Ground
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1500, 1500, 40, 40, 15, 15)
    CreateEntity(0,MeshID(0),MaterialID(0))
    EntityRenderMode(0, 0)

    CreateCube(1, 50)
    CreateEntity(1, MeshID(1), GetScriptMaterial(1, "Color/Blue"), 0, 50, 0)

    ;- Camera
    ;
    CreateCamera(1, 50, 50, 1, 1) ; J'ai ajouté et caché cette caméra pour que la caméra 0 ne soit pas zoomée ! Bug ogre ?

    CreateCamera(0, 25, 25, 50, 50)
    MoveCamera(0, 0, 120, 500, #PB_Absolute)
    CameraBackColor(0, $FF)

    ;- Light
    ;
    CreateLight(0, RGB(255, 255, 255), -40, 100, 80)
    AmbientColor(RGB(80, 80, 80))

    ;- Sprite
    ;
    UsePNGImageDecoder()
    LoadImage(0, "Data/Textures/viseur-jeux.png")
    ResizeImage(0, 30 * CameraViewWidth(0) / ImageWidth(0), 30 * CameraViewWidth(0) / ImageWidth(0)); Keep Size Ratio for all resolution

    CreateSprite(0, ImageWidth(0), ImageHeight(0))
    StartDrawing(SpriteOutput(0))
    DrawImage(ImageID(0), 0, 0)
    StopDrawing()

    TransparentSpriteColor(0, RGB(255, 255, 255))

    SpriteX = CameraViewX(0) + (CameraViewWidth(0)  - SpriteWidth(0))  / 2
    SpriteY = CameraViewY(0) + (CameraViewHeight(0) - SpriteHeight(0)) / 2

    Repeat

      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX()/10
        MouseY = -MouseDeltaY()/10
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -1
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = 1
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -1
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = 1
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()

      DisplayTransparentSprite(0, SpriteX, SpriteY)

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


CanvasGadget.pb

;
; ------------------------------------------------------------
;
;   PureBasic - CanvasGadget example file
;
;    (c) 2010 - Fantaisie Software
;
; ------------------------------------------------------------
;

Enumeration
  #IMAGE_Content  ; stores the previous CanvasGadget content while the mouse is down
  #IMAGE_Color
  #IMAGE_LoadSave
EndEnumeration

Enumeration
  #GADGET_Canvas
  #GADGET_Color
  #GADGET_Brush
  #GADGET_Line
  #GADGET_Box
  #GADGET_Circle
  #GADGET_Fill
  #GADGET_Clear
  #GADGET_Load
  #GADGET_Save
EndEnumeration

Global CurrentColor, CurrentMode, StartX, StartY

; Draw the mouse action result depending on the currently selected mode and event type
;
Procedure DrawAction(x, y, EventType)

  If StartDrawing(CanvasOutput(#GADGET_Canvas))
    Select CurrentMode

      Case #GADGET_Brush
        If EventType = #PB_EventType_LeftButtonDown Or EventType = #PB_EventType_MouseMove
          Circle(x, y, 5, CurrentColor)
        EndIf

      Case #GADGET_Line
        DrawImage(ImageID(#IMAGE_Content), 0, 0)
        LineXY(StartX, StartY, x, y, CurrentColor)

      Case #GADGET_Box
        DrawImage(ImageID(#IMAGE_Content), 0, 0)
        Box(StartX, StartY, x-StartX, y-StartY, CurrentColor)

      Case #GADGET_Circle
        DrawImage(ImageID(#IMAGE_Content), 0, 0)

        If x > StartX
          rx = x - StartX
        Else
          rx = StartX - x
        EndIf

        If y > StartY
          ry = y - StartY
        Else
          ry = StartY - y
        EndIf

        If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Modifiers) & #PB_Canvas_Control
          ry = rx
        EndIf

        Ellipse(StartX, StartY, rx, ry, CurrentColor)

      Case #GADGET_Fill
        If EventType = #PB_EventType_LeftButtonDown
          FillArea(x, y, -1, CurrentColor)
        EndIf

    EndSelect

    StopDrawing()
  EndIf

EndProcedure

UseJPEGImageDecoder()
UseJPEGImageEncoder()

CurrentColor = $000000
CurrentMode  = #GADGET_Brush
CreateImage(#IMAGE_Color, 35, 35, 24)
CreateImage(#IMAGE_Content, 380, 380, 24)

If OpenWindow(0, 0, 0, 460, 400, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(#GADGET_Canvas, 10, 10, 380, 380, #PB_Canvas_ClipMouse)

  ButtonImageGadget(#GADGET_Color, 400, 10, 50, 50, ImageID(#IMAGE_Color))

  ButtonGadget(#GADGET_Brush,  400, 100, 50, 25, "Brush",  #PB_Button_Toggle)
  ButtonGadget(#GADGET_Line,   400, 130, 50, 25, "Line",   #PB_Button_Toggle)
  ButtonGadget(#GADGET_Box,    400, 160, 50, 25, "Box",    #PB_Button_Toggle)
  ButtonGadget(#GADGET_Circle, 400, 190, 50, 25, "Circle", #PB_Button_Toggle)
  ButtonGadget(#GADGET_Fill,   400, 220, 50, 25, "Fill",   #PB_Button_Toggle)

  ButtonGadget(#GADGET_Clear,  400, 280, 50, 25, "Clear")

  ButtonGadget(#GADGET_Load,   400, 335, 50, 25, "Load")
  ButtonGadget(#GADGET_Save,   400, 365, 50, 25, "Save")

  SetGadgetState(#GADGET_Brush, 1)
  SetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Cursor, #PB_Cursor_Cross)

  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_Gadget

      Select EventGadget()

        Case #GADGET_Canvas
          X = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseX)
          Y = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseY)
          Type = EventType()

          Select EventType()

            Case #PB_EventType_LeftButtonDown
              ;
              ; This stores the current content of the CanvasGadget in #IMAGE_Content,
              ; so it can be re-drawn while the mouse moves
              ;
              If StartDrawing(ImageOutput(#IMAGE_Content))
                DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
                StopDrawing()
              EndIf

              StartX = X
              StartY = Y
              DrawAction(X, Y, EventType())

            Case #PB_EventType_LeftButtonUp
              DrawAction(X, Y, EventType())

            Case #PB_EventType_MouseMove
              If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
                DrawAction(X, Y, EventType())
              EndIf

          EndSelect

        Case #GADGET_Color
          CurrentColor = ColorRequester(CurrentColor)
          If StartDrawing(ImageOutput(#IMAGE_Color))
            Box(0, 0, 35, 35, CurrentColor)
            StopDrawing()
            SetGadgetAttribute(#GADGET_Color, #PB_Button_Image, ImageID(#IMAGE_Color))
          EndIf

        Case #GADGET_Brush, #GADGET_Line, #GADGET_Box, #GADGET_Circle, #GADGET_Fill
          EventGadget = EventGadget()
          For Gadget = #GADGET_Brush To #GADGET_Fill
            If Gadget = EventGadget
              SetGadgetState(Gadget, 1)
            Else
              SetGadgetState(Gadget, 0) ; unset the state of all other gadgets
            EndIf
          Next Gadget
          CurrentMode = EventGadget

        Case #GADGET_Clear
          If StartDrawing(CanvasOutput(#GADGET_Canvas))
            Box(0, 0, 380, 380, $FFFFFF)
            StopDrawing()
          EndIf

        Case #GADGET_Load
          File$ = OpenFileRequester("Load Image...", "", "JPEG Images|*.jpeg|All Files|*.*", 0)
          If File$
            If LoadImage(#IMAGE_LoadSave, File$)
              If StartDrawing(CanvasOutput(#GADGET_Canvas))
                Box(0, 0, 380, 380, $FFFFFF)
                DrawImage(ImageID(#IMAGE_LoadSave), 0, 0)
                StopDrawing()
              EndIf
              FreeImage(#IMAGE_LoadSave)
            Else
              MessageRequester("CanvasGadget", "Cannot load image: " + File$)
            EndIf
          EndIf

        Case #GADGET_Save
          File$ = SaveFileRequester("Save Image...", File$, "JPEG Images|*.jpeg|All Files|*.*", 0)
          If File$ And (FileSize(File$) = -1 Or MessageRequester("CanvasGadget", "Overwrite this file? " + File$, #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes)
            If CreateImage(#IMAGE_LoadSave, 380, 380, 24) And StartDrawing(ImageOutput(#IMAGE_LoadSave))
              DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
              StopDrawing()

              If SaveImage(#IMAGE_LoadSave, File$, #PB_ImagePlugin_JPEG) = 0
                MessageRequester("CanvasGadget", "Cannot save image: " + File$)
              EndIf

              FreeImage(#IMAGE_LoadSave)
            EndIf
          EndIf

      EndSelect

    EndIf

  Until Event = #PB_Event_CloseWindow

EndIf


CheckObjectVisibility2.pb

;
; ------------------------------------------------------------
;
;   PureBasic - CheckObjectVisibility
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, Speed = 1.0
Define.i RobotMove

#CameraSpeed = 2

If InitEngine3D()

  InitSprite()
  InitKeyboard()

  If Screen3DRequester()
    Add3DArchive("Data/Textures"        , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Models"          , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Scripts"         , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/fonts"           , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
    Parse3DScripts()

    WorldShadows(#PB_Shadow_Modulative, 3000, RGB(175, 175, 175))

    ;- Material
    ;
    GetScriptMaterial(1, "Color/Red")
    GetScriptMaterial(2, "Color/Green")
    GetScriptMaterial(3, "Color/Blue")
    GetScriptMaterial(4, "Color/Yellow")
    CreateMaterial(5, LoadTexture(5, "r2skin.jpg"))
    SetMaterialColor(5, #PB_Material_SelfIlluminationColor, RGB(75, 75, 75))

    ;- Ground
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 700, 700, 70, 70, 15, 15)
    CreateEntity(0,MeshID(0),MaterialID(0))
    EntityRenderMode(0, 0)

    ;- Mesh
    ;
    LoadMesh(1, "robot.mesh")
    CreateSphere(2, 10)

    ;- Entity
    ;
    CreateEntity(1, MeshID(1), MaterialID(5))
    CreateEntity(2, MeshID(2), MaterialID(1), -200, 10,  100)
    CreateEntity(3, MeshID(2), MaterialID(2),  200, 10, 0)
    CreateEntity(4, MeshID(2), MaterialID(3),  200, 10,  100)
    CreateEntity(5, MeshID(2), MaterialID(4), -200, 10, -100)

    ScaleEntity(3, 2, 2, 2)

    ;- Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 120, 400, #PB_Absolute)
    CameraLookAt(0, EntityX(1), EntityY(1) + 40, EntityZ(1))

    CreateCamera(1, 0, 0, 100, 100, 0)
    CameraFOV(1, 60)
    CameraLookAt(1,  EntityX(3), EntityY(3), EntityZ(3))

    ;- TextureRTT
    ;
    CreateRenderTexture(10, CameraID(1), 800, 600, 1)
    CreateMaterial(10, TextureID(10))
    SetMaterialColor(10, #PB_Material_SelfIlluminationColor, RGB(255, 255, 255))

    ;- Billboard group
    ;
    CreateBillboardGroup(0, MaterialID(10), 68, 48)
    AddBillboard(0, 0, 0, 0, 0)

    ;- Attach objects
    ;
    AttachEntityObject(1, "Joint1", CameraID(1), 0, 0, 0, 0, 0, 40)
    AttachEntityObject(1, "Joint1", BillboardGroupID(0), 0, 60, 0, 0, 0, 0)
    ;-Light
    ;
    CreateLight(0, RGB(255, 255, 255), -40, 100, 80)
    AmbientColor(RGB(80, 80, 80))

    ;- Skybox
    ;
    SkyBox("desert07.jpg")

    ;- Text3D
    CreateText3D(0, "")
    Text3DColor(0, RGBA(0, 255, 255, 255))
    Text3DAlignment(0, #PB_Text3D_HorizontallyCentered | #PB_Text3D_VerticallyCentered)

    AttachEntityObject(1, "Joint1", Text3DID(0))
    MoveText3D(0, 0, 30, 0)
    ScaleText3D(0, 6, 6, 0)

    Repeat
      Screen3DEvents()

      RobotMove = #False
      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          MoveEntity(1, -1 * Speed, 0, 0)
          RotateEntity(1, 0, 180, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_Right)
          MoveEntity(1, 1 * Speed, 0, 0)
          RotateEntity(1, 0, 0, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          MoveEntity(1, 0, 0, -1 * Speed)
          RotateEntity(1, 0, 90, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_Down)
          MoveEntity(1, 0, 0, 1 * Speed)
          RotateEntity(1, 0, -90, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_PageUp) And Speed < 2.0
          Speed + 0.05
        ElseIf KeyboardPushed(#PB_Key_PageDown) And Speed > 0.1
          Speed - 0.05
        EndIf

      EndIf

      If RobotMove
        If EntityAnimationStatus(1, "Walk") = #PB_EntityAnimation_Stopped ; Loop
          StartEntityAnimation(1, "Walk", #PB_EntityAnimation_Manual) ; Start the animation from the beginning
        EndIf
      Else
        StopEntityAnimation(1, "Walk")
      EndIf

      AddEntityAnimationTime(1, "Walk", TimeSinceLastFrame)

      CameraLookAt(0, EntityX(1), EntityY(1) + 40, EntityZ(1))

      ;Check Objects
      Object$ = ""

      If CheckObjectVisibility(1, EntityID(2))
        Object$ + "Red Sphere ! "
      EndIf
      If CheckObjectVisibility(1, EntityID(3))
        Object$ + "Green Sphere ! "
      EndIf
      If CheckObjectVisibility(1, EntityID(4))
        Object$ + "Blue Sphere ! "
      EndIf
      If CheckObjectVisibility(1, EntityID(5))
        Object$ + "Yellow Sphere ! "
      EndIf

      If Object$ = ""
        Object$ = "nothing !"
      EndIf

      Text3DCaption(0, "I can see " + Object$)

      TimeSinceLastFrame = RenderWorld() * Speed

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


CheckObjectVisibility.pb

;
; ------------------------------------------------------------
;
;   PureBasic - CheckObjectVisibility
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

#CameraSpeed = 0.4

Enumeration
  #MainWindow
  #Editor1
  #Editor2
  #Editor3
EndEnumeration

Define.f KeyX, KeyY, MouseX, MouseY, RatioX, RatioY, SpeedRotate

Declare IsOnScreen(Editor, object.s , objectID)

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ; First create materials
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    GetScriptMaterial(1, "Color/Blue")
    GetScriptMaterial(2, "Color/Green")
    GetScriptMaterial(3, "Color/Red")

    ; Meshes
    ;
    CreatePlane(0, 500, 500, 10, 10, 10, 10)
    CreateCube(1, 2)
    CreateSphere(2, 2)
    CreateCylinder(3, 1, 4)

    ; Entities
    ;
    CreateEntity(0, MeshID(0), MaterialID(0))
    CreateEntity(1, MeshID(1), MaterialID(1),   0, 1,  150)
    CreateEntity(2, MeshID(2), MaterialID(2), 150, 1,    0)
    CreateEntity(3, MeshID(3), MaterialID(3),   0, 2, -150)

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    CameraBackColor(0, RGB(30, 50, 70))
    MoveCamera(0, -1, 10, 15, #PB_Absolute)
    CameraLookAt(0, 100, 0, 0)

    ; Light
    ;
    CreateLight(0, RGB(255, 255, 255), 1560, 900, 500)
    AmbientColor(RGB(30, 30, 30))

    ;GUI
    ;
    RatioX = CameraViewWidth(0) / 1920
    RatioY = CameraViewHeight(0) / 1080
    OpenWindow3D(#MainWindow, 0, 0, 490 * RatioX, 190 * RatioY, "Who Is on Screen ?")
    StringGadget3D(#Editor1, 10 * RatioX,  20 * RatioY, 430 * RatioX, 40 * RatioY, "", #PB_String3D_ReadOnly)
    StringGadget3D(#Editor2, 10 * RatioX,  60 * RatioY, 430 * RatioX, 40 * RatioY, "", #PB_String3D_ReadOnly)
    StringGadget3D(#Editor3, 10 * RatioX, 100 * RatioY, 430 * RatioX, 40 * RatioY, "", #PB_String3D_ReadOnly)

    ShowGUI(128, 1)

    Repeat
      Screen3DEvents()

      Repeat
        Event3D = WindowEvent3D()
      Until Event3D = 0

      If ExamineMouse()
        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.5
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.5
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Space)
          Stop = 0
        Else
          Stop = 1
        EndIf
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf
      IsOnScreen(#Editor1, "Cube", EntityID(1))
      IsOnScreen(#Editor2, "Sphere", EntityID(2))
      IsOnScreen(#Editor3, "Cylinder", EntityID(3))

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End
Procedure IsOnScreen(Editor, object.s , objectID)
  If CheckObjectVisibility(0, objectID)
    SetGadgetText3D(Editor, object + " is on screen")
  Else
    SetGadgetText3D(Editor, object + " is not on screen")
  EndIf
EndProcedure


Cipher.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Cipher example file
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;
;

MessageRequester("CRC32 Test", "Should be 352441C2 : "+Hex(CRC32Fingerprint(@"abc", 3)), 0)

MessageRequester("MD5 Test"  , "Should be ed50deb5bb795508b8a5c8e50dafa954 : "+MD5Fingerprint(@"PureBasic", Len("PureBasic")), 0)

MessageRequester("DES Test"  , "Should be FrfWXJ4yTjycc : "+DESFingerprint("1Fr", "Fr"), 0)

*OutputBuffer = AllocateMemory(100)
Base64Encoder(@"PureBasic", Len("PureBasic"), *OutputBuffer, 100)
MessageRequester("Base64 Test", "Should be UHVyZUJhc2lj : "+PeekS(*OutputBuffer), 0)


Clipboard.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Clipboard example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

; Paste text to the clipboard..
SetClipboardText("PureBasic pasted text example.")

; Display the contents of the clipboard...
MessageRequester("Info", "Text in the clipboard"+#LF$+"'"+GetClipboardText()+"'", 0)

; Now paste an image...

If LoadImage(0, OpenFileRequester("Load a picture","","Bitmap (*.bmp)|*.bmp",0))
  If SetClipboardImage(0)

    MessageRequester("Info", "Image correctly pasted to the clipboard."+Chr(10)+"Open 'Paint' to test it !", 0)
  EndIf
EndIf


ConeJoint.pb

;
; ------------------------------------------------------------
;
;   PureBasic - ConeTwistJoint
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY
#CameraSpeed = 1

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models"  , #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts" , #PB_3DArchive_FileSystem)
  Parse3DScripts()
  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ; First create materials
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreateMaterial(1, LoadTexture(1, "Wood.jpg"))

    ; Meshes
    ;
    CreateCylinder(0, 0.5, 1)

    ; Entities
    ;
    CreateEntity(0, MeshID(0), MaterialID(0), 0,  0, 0)
    ScaleEntity(0, 1, 0.5, 1)
    CreateEntity(1, MeshID(0), MaterialID(1), 0, -4, 0)
    ScaleEntity(1, 1, 3, 1)
    CreateEntity(2, MeshID(0), MaterialID(1), 0, -8, 0)
    ScaleEntity(2, 1, 3, 1)
    ; Bodies
    ;
    EntityPhysicBody(0, #PB_Entity_StaticBody)
    EntityPhysicBody(1, #PB_Entity_BoxBody, 1.0)
    EntityPhysicBody(2, #PB_Entity_BoxBody, 1.0)

    ; ConeTwistJoint
    ;
    ConeTwistJoint(0, EntityID(0), 0, -1, 0, EntityID(1), 0, 1, 0)
    SetJointAttribute(0, #PB_ConeTwistJoint_SwingSpan, 0)
    SetJointAttribute(0, #PB_ConeTwistJoint_SwingSpan2, 0)
    SetJointAttribute(0, #PB_ConeTwistJoint_TwistSpan, 1)
    ConeTwistJoint(1, EntityID(1), 0, -2, 0, EntityID(2), 0, 2, 0)
    SetJointAttribute(1, #PB_ConeTwistJoint_SwingSpan, 1)
    SetJointAttribute(1, #PB_ConeTwistJoint_SwingSpan2, 0)
    SetJointAttribute(1, #PB_ConeTwistJoint_TwistSpan, 0)

    ApplyEntityImpulse(1, 0, 0, 1)

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 4, 22, #PB_Absolute)
    CameraLookAt(0, 0, 0, 0)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Space)
          ApplyEntityImpulse(1,  2, 0, 2)
          ApplyEntityImpulse(2,  2, 0, 2)
        EndIf

        If KeyboardReleased(#PB_Key_F)
          FreeJoint(1)
        EndIf

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Console.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Console example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;
    text$  = "Feel the Power of PureBasic!"        ; just a small text$ string
    dlay   = 4000                                  ; delay will set to 4000

;
;-------- Open our Console --------
;

    OpenConsole()                                  ; First we must open a console
    ConsoleTitle ("PureBasic - Console Example:")  ; Now we can give the opened console a Titlename ;)
    EnableGraphicalConsole(1)

;
;-------- Ask and display the UserName --------
;

    ConsoleLocate (18,12)                          ; x y position
    Print ("Please enter your name:   ")           ; Ask for name
    name$=Input()                                  ; Wait for user input

    ClearConsole()                                 ; This will clean the ConsoleScreen

    ConsoleLocate (24,10)                          ; x y position
    PrintN ("Welcome "+name$)                      ; Print our text and the UserName
    ConsoleLocate (24,12)                          ; x y position
    PrintN (text$)                                 ; Print our text

    Delay (dlay)                                   ; Waits for moment

;
;-------- Cls and Cycle the Text-BG-Color 0 to 15 --------
;

    ClearConsole()                                 ; This will clean the ConsoleScreen
                                                   ; Info: Standard colors are (8 for text, 0 for backround)
    For i = 0 To 15
        ConsoleColor (0,i)                         ; Change BackGround text color (max 15) in every loop
        ConsoleLocate (24,4+i)                     ; x y position
        Print (text$)                              ; Print our text
    Next i

    Delay (dlay)                                   ; Waits for moment

;
;-------- Cls and Cycle the Text-FG-Color 0 to 15 --------
;

    ConsoleColor(0,0)                              ; Set back to black (0,0) for complete background...
    ClearConsole()                                 ; This will clean the ConsoleScreen
                                                   ; Info: Standard colors are (8 for text, 0 for backround)
    For i = 0 To 15
        ConsoleColor (i,0)                         ; Change ForGround text color (max 15) in every loop
        ConsoleLocate (24,4+i)                     ; x y position
        Print (text$)                              ; Print our text
    Next i

    Delay (dlay)                                   ; Waits for moment

;
;-------- Cls and Cycle the Background-Color 0 to 15 --------
;

    For a = 1 To 15
        ConsoleColor(a,a)                          ; Cycle background color...
        ClearConsole()                             ; This will clean the ConsoleScreen
        ;                                          ; Info: Standard colors are (8 for text, 0 for backround)
        For i = 0 To 15
            ConsoleColor (i,a)                     ; Change ForGround text color (max 15) in every loop
            ConsoleLocate (24,4+i)                 ; x y position
            Print (text$)                          ; Print our text
        Next i
        ;
        Delay(dlay/10)                             ; Waits for moment
    Next a

    ;-------- Exit --------

    CloseConsole()
End¹


ConvertLocalToWorldPosition.pb

;
; ------------------------------------------------------------
;
;   PureBasic - ConvertLocalToWorldPosition
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"
#CameraSpeed = 1

Structure Vector3
  x.f
  y.f
  z.f
EndStructure

Define.f KeyX, KeyY, MouseX, MouseY, RollZ, sens = -1
Define.Vector3 Resultat, C1, C2

C1\x = -25 : C1\y = -25 : C1\z = -25
C2\x =  25 : C2\y =  25 : C2\z =  25

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    CreateCube(0, 50)
    CreateSphere(1, 8)

    CreateMaterial(0, LoadTexture(0, "dirt.jpg"))
    CreateMaterial(1, LoadTexture(1, "wood.jpg"))

    CreateEntity(0, MeshID(0), MaterialID(0))
    CreateEntity(1, MeshID(1), MaterialID(1))
    CreateEntity(2, MeshID(1), MaterialID(1))

    SkyBox("stevecube.jpg")

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 90, 80, 150, #PB_Absolute)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

      EndIf

      RotateEntity(0, 0, 0.4, 0, #PB_Relative)
      MoveEntity(0, 0, 0, -1, #PB_Local)

      ConvertLocalToWorldPosition(EntityID(0), C1\x, C1\y, C1\z)
      MoveEntity(1, GetX(), GetY(), GetZ(), #PB_Absolute)

      ConvertLocalToWorldPosition(EntityID(0), C2\x, C2\y, C2\z)
      MoveEntity(2, GetX(), GetY(), GetZ(), #PB_Absolute)
      RotateEntity(2, EntityPitch(0, 0), EntityYaw(0, 0), EntityRoll(0, 0))

      CameraLookAt(0, EntityX(0), EntityY(0), EntityZ(0))
      RenderWorld()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


ConvertWorldToLocalPosition.pb

;
; ------------------------------------------------------------
;
;   PureBasic - ConvertWorldToLocalPosition
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

; Button left to draw
; Button right to clear

Structure Vector3
  x.f
  y.f
  z.f
EndStructure

Declare DrawOnWhiteBoard()

Define.f KeyX, KeyY, MouseX, MouseY
Global Entity.i, P.Vector3

LoadFont(0, "Arial"  ,  8, #PB_Font_Bold)

#CameraSpeed  = 3

Macro InitImage()
  StartDrawing(ImageOutput(0))
  Box(0, 0, 160, 120, 0)
  DrawingMode(#PB_2DDrawing_Outlined)
  Box(0, 0, 160, 120, RGB(255, 255, 255))
  DrawingFont(FontID(0))
  DrawText(5, 10, "left button to draw", RGB(155, 80, 0), 0)
  DrawText(5, 40, "Right button to clear", RGB(155, 80, 0), 0)
  StopDrawing()
EndMacro

If InitEngine3D()

  InitSprite()
  InitKeyboard()
  InitMouse()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  If Screen3DRequester()

    CreateMesh(0)
    MeshVertexPosition(-1, 0,  1)
    MeshVertexNormal(0,-1,0)
    MeshVertexTextureCoordinate(1,0)
    MeshVertexPosition( 1, 0, 1)
    MeshVertexNormal(0,-1,0)
    MeshVertexTextureCoordinate(0,0)
    MeshVertexPosition( 1, 0, -1)
    MeshVertexNormal(0,-1,0)
    MeshVertexTextureCoordinate(0,1)
    MeshVertexPosition(-1, 0, -1)
    MeshVertexNormal(0,-1,0)
    MeshVertexTextureCoordinate(1,1)
    MeshFace(0, 1, 2)
    MeshFace(0, 2, 3)
    MeshFace(2, 1, 0)
    MeshFace(3, 2, 0)
    FinishMesh(1)

    CreateImage(0, 160, 120)
    InitImage()

    CreateTexture(0, 160, 120)

    CreateMaterial(0, TextureID(0))
    MaterialBlendingMode(0, #PB_Material_Add)
    DisableMaterialLighting(0, 1)
    MaterialCullingMode(0, 1)

    Entity = CreateEntity(#PB_Any, MeshID(0), MaterialID(0), 30, 40, 50)
    ScaleEntity(Entity, 80, 1, 60)

    CreateLight(0, RGB(0,0,255), 100.0, 0, 0)

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 10, 350, -150, #PB_Absolute)
    CameraLookAt(0, 30, 40, 50)
    CameraBackColor(0, RGB(0, 0, 90))

    ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor

    SkyBox("stevecube.jpg")

    MouseLocate(CameraViewWidth(0)/2, CameraViewHeight(0)/2)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05

        ; Test Mouse

        If MouseRayCast(0, MouseX(), MouseY(), -1) = Entity
          DrawOnWhiteBoard()
        EndIf
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateEntity(Entity, 0.1, 0.1, 0.1, #PB_Relative)

      StartDrawing(TextureOutput(0))
      DrawImage(ImageID(0), 0, 0)
      StopDrawing()

      CameraLookAt(0, 30, 40, 50)
      MoveCamera  (0, KeyX, 0, KeyY)
      RenderWorld()

      FlipBuffers()

    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf
End

Procedure DrawOnWhiteBoard()
  Protected x, y
  Static Mem, Memx, Memy
  StartDrawing(ImageOutput(0))
  If MouseButton(#PB_MouseButton_Left)

    ConvertWorldToLocalPosition(EntityID(Entity), PickX(), PickY(), PickZ())

    x = (1 - GetX()) * 80
    y = (1 - GetZ()) * 60

    If x>0 And x<160 And y>0 And y<120
      If mem = 0
        Memx = x
        Memy = y
        mem = 1
      EndIf
      LineXY(memx, memy, x, y, $FF)

      Memx = x
      Memy = y
    EndIf
  ElseIf MouseButton(#PB_MouseButton_Right)
    StopDrawing()
    InitImage()
  Else
    mem = 0
  EndIf
  StopDrawing()
EndProcedure


CopyAngle.pb

;
; ------------------------------------------------------------
;
;   PureBasic - CopyAngle
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, RollZ

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    LoadMesh(0, "robot.mesh")

    CreateMaterial(1, LoadTexture(1, "clouds.jpg"))
    CreateMaterial(2, LoadTexture(2, "r2skin.jpg"))

    CreateEntity(1, MeshID(0), MaterialID(1), -30, 0, 0)
    CreateEntity(2, MeshID(0), MaterialID(2),  30, 0, 0)

    SkyBox("stevecube.jpg")

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 40, 150, #PB_Absolute)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateEntity(1, 0.7, 1, 0.5, #PB_Relative)
      RotateEntity(2, EntityPitch(1,0), EntityYaw(1, 0), EntityRoll(1, 0))

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End,


CopyMaterial.pb

;
; ------------------------------------------------------------
;
;   PureBasic - CopyMaterial
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    CreateMaterial(0, LoadTexture(0, "clouds.jpg"))

    CreateSphere(0, 40, 50, 50)
    CreateEntity(0,MeshID(0), MaterialID(0), -60,   0,  0)

    ; Copy the Material
    CopyMaterial(0, 1)

    ; Create a cube with the new material
    CreateCube(1, 40)
    CreateEntity(1, MeshID(1), MaterialID(1), 60, 0, 0)

    ; Camera
    CreateCamera(0, 0, 0, 100, 100)
    CameraBackColor(0, $333333)
    MoveCamera(0,0,100,300, #PB_Absolute)
    CameraLookAt(0, 0, 0, 0)

    ; Light
    CreateLight(0, $FFFFFF, 1560, 900, 500)
    AmbientColor($330000)

    Repeat
      Screen3DEvents()

      ExamineKeyboard()

      RenderWorld()
      Screen3DStats()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

EndÁ


CreateLine3D.pb

;
; ------------------------------------------------------------
;
;   PureBasic - CreateLine3D
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  InitSprite()
  InitKeyboard()
  InitMouse()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/fonts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  If Screen3DRequester()

    ; Line3D
    ;
    CreateLine3D(0, 0, 0, 0, RGB(255,   0,   0), 10,  0,  0, RGB(255,   0,   0))  ; Axis X
    CreateLine3D(1, 0, 0, 0, RGB(  0, 255,   0),  0, 10,  0, RGB(  0, 255,   0))  ; Axis Y
    CreateLine3D(2, 0, 0, 0, RGB(  0,   0, 255),  0,  0, 10, RGB(  0,   0, 255))  ; Axis Z

    ;- Material
    CreateMaterial(0, LoadTexture(0, "White.jpg"))
    DisableMaterialLighting(0, #True)

    ;Mesh
    CreateMesh(3, #PB_Mesh_LineList, #False)
    MeshVertexPosition(0, 0, 0)
    MeshVertexColor(RGB(255, 100, 100))
    MeshVertexPosition(5, 0, 0)
    MeshVertexColor(RGB(255, 100, 100))
    MeshVertexPosition(0, 0, 0)
    MeshVertexColor(RGB(100, 255, 100))
    MeshVertexPosition(0, 5, 0)
    MeshVertexColor(RGB(100, 255, 100))
    MeshVertexPosition(0, 0, 0)
    MeshVertexColor(RGB(100, 100, 255))
    MeshVertexPosition(0, 0, 5)
    MeshVertexColor(RGB(100, 100, 255))
    FinishMesh(#False)

    SetMeshMaterial(3, MaterialID(0))
    CreateNode(0)
    AttachNodeObject(0, MeshID(3))
    ;RotateNode(0, 0, 0, 20)

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 5, 5, 5, #PB_Absolute)
    CameraLookAt(0, 0, 0, 0)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateNode(0, 0, 0, 1, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


CreateRenderTexture.pb

;
; ------------------------------------------------------------
;
;   PureBasic - CreateRenderTexture
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;
IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/Desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    WorldShadows(#PB_Shadow_Modulative, 3000, RGB(175, 175, 175))

    ;Ground
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1500, 1500, 40, 40, 15, 15)
    CreateEntity(0,MeshID(0),MaterialID(0))
    EntityRenderMode(0, 0)

    ;Mesh
    ;
    LoadMesh(1, "robot.mesh")

    ; Entity
    ;
    CreateEntity(1, MeshID(1), #PB_Material_None)

    ; Animation
    ;

    StartEntityAnimation(1, "Walk")

    ; Camera
    ;

    CreateCamera(1, 0, 0, 100, 100)
    MoveCamera(1, -100, 120, 190, #PB_Absolute)

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 90, 60, 0, #PB_Absolute)
    CameraLookAt(0, EntityX(1), EntityY(1) + 40, EntityZ(1))
    CameraFOV(0, 80)

    ;Miroir
    CreateRenderTexture(1, CameraID(0), 800, 600)
    CreateMaterial(1, TextureID(1))
    CreateMesh(5)
    MeshVertexPosition(-80, 0,  60)
    MeshVertexNormal(0,-1,0)
    MeshVertexTextureCoordinate(1,0)
    MeshVertexPosition( 80, 0,  60)
    MeshVertexNormal(0,-1,0)
    MeshVertexTextureCoordinate(0,0)
    MeshVertexPosition( 80, 0, -60)
    MeshVertexNormal(0,-1,0)
    MeshVertexTextureCoordinate(0,1)
    MeshVertexPosition(-80, 0, -60)
    MeshVertexNormal(0,-1,0)
    MeshVertexTextureCoordinate(1,1)
    MeshFace(0, 1, 2)
    MeshFace(0, 2, 3)
    MeshFace(2, 1, 0)
    MeshFace(3, 2, 0)
    FinishMesh(1)
    CreateEntity(5, MeshID(5), MaterialID(1), 100, 40, 0)
    RotateEntity(5, -90, -90, 0)

    CameraLookAt(1, EntityX(5), EntityY(5), EntityZ(5))

    CreateLight(0, RGB(255, 255, 255), -40, 100, 80)
    AmbientColor(RGB(80, 80, 80))

    ; Skybox
    ;
    SkyBox("desert07.jpg")

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX()/10
        MouseY = -MouseDeltaY()/10
      EndIf

      If ExamineKeyboard()

        If KeyboardReleased(#PB_Key_F5)
          No + 1
          SaveRenderTexture(1, "test" + Str(No) + ".png")
        EndIf

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -2
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = 2
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -2
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = 2
        Else
          KeyY = 0
        EndIf

      EndIf
       RotateEntity(1, 0, 1, 0, #PB_Relative)

      RotateCamera(1, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (1, KeyX, 0, KeyY)

      RenderWorld()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


CreateTexture2.pb

;
; ------------------------------------------------------------
;
;   PureBasic - CreateTexture
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/Desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    KeyboardMode(#PB_Keyboard_International)

    AmbientColor(RGB(255,255,255))

    ; Mesh
    ;
    CreateCube(0, 30)

    ; Texture
    ;
    For i = 0 To 2
      Read.i R : Read.i G : Read.i B: Read.i A
      Read.f x : Read.f y : Read.f z
      CreateTexture(i, 256, 256)
      StartDrawing(TextureOutput(i))
      DrawingMode(#PB_2DDrawing_AllChannels | #PB_2DDrawing_AlphaBlend)
      Box(0, 0, 256, 256, RGBA(0, 0, 0, 255))
      Box(4, 4, 248, 248, RGBA(R, G, B, A))
      Circle(127, 127, 50, RGBA(0, 0, 0, 0))
      StopDrawing()
      CreateMaterial(i, TextureID(i))
      MaterialBlendingMode(i, #PB_Material_AlphaBlend)
      CreateEntity(i, MeshID(0), MaterialID(i), x, y, z)
    Next

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 10, 150, #PB_Absolute)
    CameraLookAt(0, 0, 0, 1)

    ; SkyBox
    ;
    SkyBox("desert07.jpg")

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      For i = 0 To 2
        RotateEntity(i, 1, 1, 2-i, #PB_Relative)
      Next

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()

      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End

DataSection
  Data.i 255, 0, 0, 127
  Data.f -20, 0, 5
  Data.i 0, 0, 255, 127
  Data.f 20, 0, 5
  Data.i 0, 255, 0, 127
  Data.f 0, 40, -5
EndDataSection  )


CreateTexture.pb

;
; ------------------------------------------------------------
;
;   PureBasic - CreateTexture
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

LoadFont(0, "Arial", 28, #PB_Font_Bold)

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    AmbientColor(RGB(255,255,255))

    ; Texture
    ;
    CreateTexture(0, 256, 256)
    StartDrawing(TextureOutput(0))
      Box(0, 0, 256, 256, RGB(90, 40, 0))
      Box(6, 6, 244, 244, RGB(190, 140, 0))
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawingFont(FontID(0))
      DrawText(10, 110, "PureBasic", RGB(90, 40, 90))
    StopDrawing()

    CreateMaterial(0, TextureID(0))

    ; Cube
    ;
    CreateCube(0, 30)
    CreateEntity(0, MeshID(0), MaterialID(0))

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 0, 100, #PB_Absolute)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateEntity(0, 0, 1, 0, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()

      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Database.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Database example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

UseSQLiteDatabase()

Procedure CheckDatabaseUpdate(Database, Query$)
   Result = DatabaseUpdate(Database, Query$)
   If Result = 0
      Debug DatabaseError()
   EndIf

   ProcedureReturn Result
EndProcedure

DatabaseFile$ = GetTemporaryDirectory()+"/Database.sqlite"

If CreateFile(0, DatabaseFile$)
   CloseFile(0)

   If OpenDatabase(0, DatabaseFile$, "", "")

      CheckDatabaseUpdate(0, "CREATE TABLE food (name CHAR(50), weight INT)")

      CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('apple', '10')")
      CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('pear', '5')")
      CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('banana', '20')")

      If DatabaseQuery(0, "SELECT * FROM food WHERE weight > 7")

         While NextDatabaseRow(0)
            Debug GetDatabaseString(0, 0)
         Wend

         FinishDatabaseQuery(0)
      EndIf

      CloseDatabase(0)
   Else
      Debug "Can't open database !"
   EndIf
Else
   Debug "Can't create the database file !"
EndIf


Date.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Date example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

Date$ = FormatDate("%yyyy/%mm/%dd", Date())
Time$ = FormatDate("%hh:%ii:%ss", Date())

MessageRequester("PureBasic - Date Example", "Date: "+Date$+Chr(10)+"Time: "+Time$, 0)


Desktop.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Desktop example file
;
;    (c) 2004 - Fantaisie Software
;
; ------------------------------------------------------------
;

NbDesktops = ExamineDesktops()

MessageRequester("Information", "You have "+Str(NbDesktops)+" desktop(s)")

; Let's enumerate all the desktops found
;
For k=0 To NbDesktops-1

  Text$ = "Desktop n°"+Str(k+1)+#LF$+#LF$
  Text$ + "Size: "+Str(DesktopWidth(k))+"*"+Str(DesktopHeight(k))+#LF$
  Text$ + "Color depth: "+Str(DesktopDepth(k))+#LF$

  If DesktopFrequency(k) = 0
    Text$ + "Frequency: Default"+#LF$+#LF$
  Else
    Text$ + "Frequency: "+Str(DesktopFrequency(k))+" Hz"+#LF$+#LF$
  EndIf

  Text$ + "Name: "+DesktopName(k)

  MessageRequester("Information", Text$)

Next


DirectScreenDrawing.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Drawing via Direct Screen Access (DSA)
;
;    (c) 2006 - Fantaisie Software
;
; ------------------------------------------------------------
;
; Note: disable the debugger to run at full speed !
;

#ScreenWidth  = 800  ; Feel free to change this to see the pixel filling speed !
#ScreenHeight = 600

If InitSprite() = 0 Or InitKeyboard()=0
  MessageRequester("Error","DirectX 7+ is needed.",0)
EndIf

Structure Pixel
  Pixel.l
EndStructure

Procedure.f GSin(angle.f)
  ProcedureReturn Sin(angle*(2*3.14/360))
EndProcedure

; Pre-calculated values are faster than realtime calculated ones...
; ... so we save them in an array before starting gfx operations
Dim CosTable(#ScreenWidth*2)
Dim ColorTable(255)

For i = 0 To #ScreenWidth*2
  CosTable(i) = GSin(360*i/320)* 32 + 32
Next

If OpenScreen(#ScreenWidth, #ScreenHeight, 32, "PB Plasma")

  Repeat

    Wave+6
    If Wave > 320 : Wave = 0 : EndIf

    If StartDrawing(ScreenOutput())
      Buffer      = DrawingBuffer()             ; Get the start address of the screen buffer
      Pitch       = DrawingBufferPitch()        ; Get the length (in byte) took by one horizontal line
      PixelFormat = DrawingBufferPixelFormat()  ; Get the pixel format.

      If PixelFormat = #PB_PixelFormat_32Bits_RGB
        For i = 0 To 255
          ColorTable(i) = i << 16 ; Blue is at the 3th pixel
        Next
      Else                        ; Else it's 32bits_BGR
        For i = 0 To 255
          ColorTable(i) = i       ; Blue is at the 1th pixel
        Next
      EndIf

      For y = 0 To #ScreenHeight-1
        pos1 = CosTable(y+wave)

        *Line.Pixel = Buffer+Pitch*y

        For x = 0 To #ScreenWidth-1
          pos2 = (CosTable(x+Wave) + CosTable(x+y) + pos1)
          *Line\Pixel = ColorTable(pos2) ; Write the pixel directly to the memory !
          *Line+4
        Next
      Next

      StopDrawing()
    EndIf

    ExamineKeyboard()

    FlipBuffers()

  Until KeyboardPushed(#PB_Key_Escape)

Else
  MessageRequester("Error","Can't open the screen !",0)
EndIf

End


DLLSample.pb

;
; ------------------------------------------------------------
;
;   PureBasic - DLL example file
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;
; This example is a skeleton to build easely a DLL using PureBasic
; The dll is created in the 'Compilers' directory, under the
; 'purebasic.dll' name. An associated '.lib' is generated to use
; with VisualC++.
;
;
; Rules to follow:
;   - Never write code outside a procedure, except for variables
;   or structure declaration.
;
;   - DirectX Init routines must not be initialized in the the
;   AttachProcess() procedure
;
;   - There is 4 procedures automatically called: AttachProcess(),
;   DetachProcess(), AttachThread() and DetachThread(). If you don't
;   need them, just remove them.
;

#TESTDLL = 0

CompilerIf #TESTDLL = 0

  CompilerIf #PB_Compiler_OS = #PB_OS_Windows

    ; These 4 procedures are Windows specific
    ;

    ; This procedure is called once, when the program loads the library
    ; for the first time. All init stuffs can be done here (but not DirectX init)
    ;
    ProcedureDLL AttachProcess(Instance)
    EndProcedure

    ; Called when the program release (free) the DLL
    ;
    ProcedureDLL DetachProcess(Instance)
    EndProcedure

    ; Both are called when a thread in a program call or release (free) the DLL
    ;
    ProcedureDLL AttachThread(Instance)
    EndProcedure

    ProcedureDLL DetachThread(Instance)
    EndProcedure

  CompilerEndIf

  ; Real code start here..
  ;
  ProcedureDLL EasyRequester(Message$)

    MessageRequester("EasyRequester !", Message$)

  EndProcedure

CompilerElse

  If OpenLibrary(0, "PureBasic.dll") Or OpenLibrary(0, "PureBasic.so")
    CallFunction(0, "EasyRequester", @"Test")
  EndIf

CompilerEndIf


DragDrop.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Drag & Drop
;
;    (c) 2007 - Fantaisie Software
;
; ------------------------------------------------------------
;

#Window = 0

Enumeration    ; Images
  #ImageSource
  #ImageTarget
EndEnumeration

Enumeration    ; Gadgets
  #SourceText
  #SourceImage
  #SourceFiles
  #SourcePrivate
  #TargetText
  #TargetImage
  #TargetFiles
  #TargetPrivate1
  #TargetPrivate2
EndEnumeration

If OpenWindow(#Window, 0, 0, 760, 310, "Drag & Drop", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)

  ; Create some images for the image demonstration
  ;
  CreateImage(#ImageSource, 136, 136)
  If StartDrawing(ImageOutput(#ImageSource))
    Box(0, 0, 136, 136, $FFFFFF)
    DrawText(5, 5, "Drag this image", $000000, $FFFFFF)
    For i = 45 To 1 Step -1
      Circle(70, 80, i, Random($FFFFFF))
    Next i

    StopDrawing()
  EndIf

  CreateImage(#ImageTarget, 136, 136)
  If StartDrawing(ImageOutput(#ImageTarget))
    Box(0, 0, 136, 136, $FFFFFF)
    DrawText(5, 5, "Drop images here", $000000, $FFFFFF)
    StopDrawing()
  EndIf

  ; Create and fill the source gadgets
  ;
  ListIconGadget(#SourceText,       10, 10, 140, 140, "Drag Text here", 130)
  ImageGadget(#SourceImage,        160, 10, 140, 140, ImageID(#ImageSource), #PB_Image_Border)
  ExplorerListGadget(#SourceFiles, 310, 10, 290, 140, GetHomeDirectory(), #PB_Explorer_MultiSelect)
  ListIconGadget(#SourcePrivate,   610, 10, 140, 140, "Drag private stuff here", 260)

  AddGadgetItem(#SourceText, -1, "hello world")
  AddGadgetItem(#SourceText, -1, "The quick brown fox jumped over the lazy dog")
  AddGadgetItem(#SourceText, -1, "abcdefg")
  AddGadgetItem(#SourceText, -1, "123456789")

  AddGadgetItem(#SourcePrivate, -1, "Private type 1")
  AddGadgetItem(#SourcePrivate, -1, "Private type 2")

  ; Create the target gadgets
  ;
  ListIconGadget(#TargetText,  10, 160, 140, 140, "Drop Text here", 130)
  ImageGadget(#TargetImage,    160, 160, 140, 140, ImageID(#ImageTarget), #PB_Image_Border)
  ListIconGadget(#TargetFiles, 310, 160, 140, 140, "Drop Files here", 130)
  ListIconGadget(#TargetPrivate1, 460, 160, 140, 140, "Drop Private Type 1 here", 130)
  ListIconGadget(#TargetPrivate2, 610, 160, 140, 140, "Drop Private Type 2 here", 130)

  ; Now enable the dropping on the target gadgets
  ;
  EnableGadgetDrop(#TargetText,     #PB_Drop_Text,    #PB_Drag_Copy)
  EnableGadgetDrop(#TargetImage,    #PB_Drop_Image,   #PB_Drag_Copy)
  EnableGadgetDrop(#TargetFiles,    #PB_Drop_Files,   #PB_Drag_Copy)
  EnableGadgetDrop(#TargetPrivate1, #PB_Drop_Private, #PB_Drag_Copy, 1)
  EnableGadgetDrop(#TargetPrivate2, #PB_Drop_Private, #PB_Drag_Copy, 2)

  Repeat
    Event = WaitWindowEvent()

    ; DragStart event on the source gadgets, initiate a drag & drop
    ;
    If Event = #PB_Event_Gadget And EventType() = #PB_EventType_DragStart
      Select EventGadget()

        Case #SourceText
          Text$ = GetGadgetItemText(#SourceText, GetGadgetState(#SourceText))
          DragText(Text$)

        Case #SourceImage
          DragImage(ImageID(#ImageSource))

        Case #SourceFiles
          Files$ = ""
          For i = 0 To CountGadgetItems(#SourceFiles)-1
            If GetGadgetItemState(#SourceFiles, i) & #PB_Explorer_Selected
              Files$ + GetGadgetText(#SourceFiles) + GetGadgetItemText(#SourceFiles, i) + Chr(10)
            EndIf
          Next i
          If Files$ <> ""
            DragFiles(Files$)
          EndIf

        ; "Private" Drags only work within the program, everything else
        ; also works with other applications (Explorer, Word, etc)
        ;
        Case #SourcePrivate
          If GetGadgetState(#SourcePrivate) = 0
            DragPrivate(1)
          Else
            DragPrivate(2)
          EndIf

      EndSelect

    ; Drop event on the target gadgets, receive the dropped data
    ;
    ElseIf Event = #PB_Event_GadgetDrop
      Select EventGadget()

        Case #TargetText
          AddGadgetItem(#TargetText, -1, EventDropText())

        Case #TargetImage
          If EventDropImage(#ImageTarget)
            SetGadgetState(#TargetImage, ImageID(#ImageTarget))
          EndIf

        Case #TargetFiles
          Files$ = EventDropFiles()
          Count  = CountString(Files$, Chr(10)) + 1
          For i = 1 To Count
            AddGadgetItem(#TargetFiles, -1, StringField(Files$, i, Chr(10)))
          Next i

        Case #TargetPrivate1
          AddGadgetItem(#TargetPrivate1, -1, "Private type 1 dropped")

        Case #TargetPrivate2
          AddGadgetItem(#TargetPrivate2, -1, "Private type 2 dropped")

      EndSelect

    EndIf

  Until Event = #PB_Event_CloseWindow
EndIf

End


EnableManualEntityBoneControl.pb

;
; ------------------------------------------------------------
;
;   PureBasic - EnableManualEntityBoneControl
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, RollZ, sens = -1

Dim Bone.s(18)

Macro Text3D(No, Texte, Color, Alignment)
  CreateText3D(No, Texte)
  Text3DColor(No, Color)
  Text3DAlignment(No, Alignment)
EndMacro

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/fonts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    LoadMesh(0, "robot.mesh")

    CreateMaterial(0, LoadTexture(0, "r2skin.jpg"))
    MaterialShadingMode(0, #PB_Material_Wireframe)

    CreateEntity(0, MeshID(0), MaterialID(0))

    For i=1 To 18
      Bone$ = "Joint"+Str(i)
      Bone(i) = Bone$
      EnableManualEntityBoneControl(0, Bone$, #True, #True)
      Text3D(i, Str(i), RGBA(255, 0, 0, 255), #PB_Text3D_HorizontallyCentered | #PB_Text3D_VerticallyCentered)
      AttachEntityObject(0, Bone$, Text3DID(i))
      ScaleText3D(i, 4, 4, 0)
    Next

    RotateEntity(0, 0, -70, 0)

    SkyBox("stevecube.jpg")

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 40, 150, #PB_Absolute)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardReleased(#PB_Key_F5)
          EnableManualEntityBoneControl(0, Bone(0), #False, #True)
        EndIf

        If KeyboardPushed(#PB_Key_Left)
          RotateEntityBone(0, bone(10), 0, -1, 0, #PB_Relative)
        ElseIf KeyboardPushed(#PB_Key_Right)
          RotateEntityBone(0, bone(10), 0, 1, 0, #PB_Relative)
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          RotateEntityBone(0, bone(14), 0, 0, 1, #PB_Relative)
          RotateEntityBone(0, bone(17), 0, 0, 1, #PB_Relative)
        ElseIf KeyboardPushed(#PB_Key_Down)
          RotateEntityBone(0, bone(14), 0, 0, -1, #PB_Relative)
          RotateEntityBone(0, bone(17), 0, 0, -1, #PB_Relative)
        EndIf

        If KeyboardPushed(#PB_Key_PageUp)
          MoveEntityBone(0, bone(7), 1, 0, 0, #PB_Relative)
        ElseIf KeyboardPushed(#PB_Key_PageDown)
          MoveEntityBone(0, bone(7), -1, 0, 0, #PB_Relative)
        EndIf
      EndIf

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Entity.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Entity
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, RollZ

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    LoadMesh(0, "robot.mesh")

    CreateMaterial(0, LoadTexture(0, "clouds.jpg"))
    CopyMaterial(0, 1)
    CreateMaterial(2, LoadTexture(2, "r2skin.jpg"))
    MaterialShadingMode(0, #PB_Material_Wireframe)

    CreateEntity(0, MeshID(0), MaterialID(0))
    CreateEntity(1, MeshID(0), MaterialID(1), -60, 0, 0)
    CreateEntity(2, MeshID(0), MaterialID(2),  60, 0, 0)

    StartEntityAnimation(0, "Walk")

    EntityRenderMode(0, #PB_Entity_DisplaySkeleton)

    SkyBox("stevecube.jpg")

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 40, 150, #PB_Absolute)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateEntity(1, 0, 1, 0, #PB_Relative)
      RotateEntity(2, 0, 1, 0, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


EntityAnimation2.pb

;
; ------------------------------------------------------------
;
;   PureBasic - EntityAnimation
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;
;Cursor = Move Robot
;Speed animation = PageUp and PageDown

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, Speed = 1.0
Define.i RobotMove

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/Desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    WorldShadows(#PB_Shadow_Modulative, -1, RGB(75, 75, 75))

    ;Ground
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1500, 1500, 40, 40, 15, 15)
    CreateEntity(0,MeshID(0),MaterialID(0))
    EntityRenderMode(0, 0)

    ;Mesh
    ;
    LoadMesh(1, "robot.mesh")

    ; Entity
    ;
    CreateEntity(1, MeshID(1), #PB_Material_None)

    ; SkyBox
    ;
    SkyBox("Desert07.jpg")

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 50, 100, 180,#PB_Absolute)
    CameraLookAt(0, EntityX(1), EntityY(1) + 40, EntityZ(1))

    CreateLight(0, RGB(255, 255, 255), -40, 100, 80)
    AmbientColor(RGB(80, 80, 80))

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX()/10
        MouseY = -MouseDeltaY()/10
      EndIf

      RobotMove = #False
      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          MoveEntity(1, -1 * Speed, 0, 0)
          RotateEntity(1, 0, 180, 0)
          RobotMove = #True
        ElseIf KeyboardPushed(#PB_Key_Right)
          MoveEntity(1, 1 * Speed, 0, 0)
          RotateEntity(1, 0, 0, 0)
          RobotMove = #True
        ElseIf KeyboardPushed(#PB_Key_Up)
          MoveEntity(1, 0, 0, -1 * Speed)
          RotateEntity(1, 0, 90, 0)
          RobotMove = #True
        ElseIf KeyboardPushed(#PB_Key_Down)
          MoveEntity(1, 0, 0, 1 * Speed)
          RotateEntity(1, 0, -90, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_PageUp) And Speed < 1.0
          Speed + 0.05
        ElseIf KeyboardPushed(#PB_Key_PageDown) And Speed > 0.1
          Speed - 0.05
        EndIf

      EndIf

      If RobotMove
        If EntityAnimationStatus(1, "Walk") = #PB_EntityAnimation_Stopped ; Loop
          StartEntityAnimation(1, "Walk", #PB_EntityAnimation_Manual) ; Start the animation from the beginning
        EndIf
      Else
        StopEntityAnimation(1, "Walk")
      EndIf

      AddEntityAnimationTime(1, "Walk", TimeSinceLastFrame)

      RotateCamera(0, MouseY, MouseX, RollZ, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      TimeSinceLastFrame = RenderWorld() * Speed

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


EntityAnimation3.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Animation
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;
;Cursor = Move Robot
;Speed animation = PageUp and PageDown

IncludeFile "Screen3DRequester.pb"

#ANIM_FADE_SPEED = 7.5  ; animation crossfade speed in % of full weight per second

Enumeration 1
  #Idle
  #Walk
EndEnumeration

#NUM_ANIMS = 2 ; number of animations

Define.f KeyX, KeyY, MouseX, MouseY, Angle, Speed = 1.0, TimeSinceLastFrame
Global RobotMove, FadeIn, FadeOut, Anim

Global Dim Anim.s(#NUM_ANIMS)

Declare fadeAnimations(deltaTime.f)
Declare.f CurveAngle(Actuelle.f, Target.f, P.f)
Declare.f WrapPi(Angle.f)

Macro Clamp(num, min, max)
  If num<min
    num=min
  ElseIf num>max
    num=max
  EndIf
EndMacro

If InitEngine3D()

  Add3DArchive("Data/Textures"        , #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models"          , #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts"         , #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/Desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    WorldShadows(#PB_Shadow_Modulative, 0, RGB(180, 180, 255))

    ;Ground
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1500, 1500, 40, 40, 15, 15)
    CreateEntity(0,MeshID(0),MaterialID(0))
    EntityRenderMode(0, 0)

    ;Mesh
    ;
    LoadMesh(1, "Robot.mesh")

    ; Entity
    ;
    CreateEntity(1, MeshID(1), #PB_Material_None, 0, 0, -50)
    EntityAnimationBlendMode(1, #PB_EntityAnimation_Average)

    ; Animation
    ;
    animNames$ = "Idle,Walk"

    ; populate our animation List
    For i = 1 To #NUM_ANIMS
      Anim(i) = StringField(animNames$, i, ",")
      ;EnableEntityAnimation(1, Anim(i), #True, #False)
      Fadein  = #False
      FadeOut = #False
    Next

    ; SkyBox
    ;
    SkyBox("Desert07.jpg")

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 50, 100, 180, #PB_Absolute)
    CameraLookAt(0, EntityX(1), EntityY(1) + 40, EntityZ(1))

    CreateLight(0, RGB(255, 255, 255), -40, 100, 80)
    AmbientColor(RGB(80, 80, 80))

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX()/10
        MouseY = -MouseDeltaY()/10
      EndIf

      RobotMove = #False
      Angle = EntityYaw(1)
      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          MoveEntity(1, -1 * Speed, 0, 0)
          Angle = 180
          RobotMove = #True

        ElseIf KeyboardPushed(#PB_Key_Right)
          MoveEntity(1, 1 * Speed, 0, 0)
          Angle = 0
          RobotMove = #True

        ElseIf KeyboardPushed(#PB_Key_Up)
          MoveEntity(1, 0, 0, -1 * Speed)
          Angle = 90
          RobotMove = #True

        ElseIf KeyboardPushed(#PB_Key_Down)
          MoveEntity(1, 0, 0, 1 * Speed)
          Angle = -90
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_PageUp) And Speed < 1.0
          Speed + 0.05
        ElseIf KeyboardPushed(#PB_Key_PageDown) And Speed > 0.1
          Speed - 0.05
        EndIf

      EndIf

      RotateEntity(1, 0, CurveAngle(EntityYaw(1), Angle, 4 * TimeSinceLastFrame), 0)

      If RobotMove
        If Anim <> #Walk
          Anim = #Walk
          Fadein  = #Walk
          FadeOut = #Idle
          StartEntityAnimation(1, Anim(Anim), #PB_EntityAnimation_Manual)
        EndIf
      Else
        If Anim <> #Idle
          Anim = #Idle
          Fadein  = #Idle
          FadeOut = #Walk
          StartEntityAnimation(1, Anim(Anim), #PB_EntityAnimation_Manual)
        EndIf
      EndIf

      AddEntityAnimationTime(1, Anim(Anim), TimeSinceLastFrame)
      fadeAnimations(TimeSinceLastFrame / 1000.0)

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)

      TimeSinceLastFrame = RenderWorld() * Speed

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End

Procedure fadeAnimations(deltaTime.f)
  Protected.f newWeight

  If FadeIn

    ; slowly fade this animation in Until it has full weight
    newWeight = GetEntityAnimationWeight(1, Anim(FadeIn)) + deltaTime * #ANIM_FADE_SPEED
    Clamp(newWeight, 0, 1)
    SetEntityAnimationWeight(1, Anim(FadeIn), newWeight)
    If newWeight >= 1
      FadeIn = #False
    EndIf

  EndIf

  If FadeOut

    ; slowly fade this animation out Until it has no weight, And then disable it
    newWeight.f = GetEntityAnimationWeight(1, Anim(FadeOut)) - deltaTime * #ANIM_FADE_SPEED
    Clamp(newWeight, 0, 1)
    SetEntityAnimationWeight(1, Anim(FadeOut), newWeight)
    If newWeight <= 0
      StopEntityAnimation(1, Anim(FadeOut))
      FadeOut = #False
    EndIf
  EndIf

EndProcedure

Procedure.f WrapPi(Angle.f)
  Angle + 180
  Angle - Round(Angle * 1/360.0, #PB_Round_Down) * 360
  Angle - 180
  ProcedureReturn Angle
EndProcedure

Procedure.f CurveAngle(Actuelle.f, Target.f, P.f)
  Delta.f = WrapPi(Target-Actuelle)
  If P > 1000 : P = 1000 : EndIf
  Valeur.f = Actuelle + (Delta * P / 1000)
  ProcedureReturn WrapPi(Valeur)
EndProcedure


EntityAnimation.pb

;
; ------------------------------------------------------------
;
;   PureBasic - EntityAnimation
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

;Speed animation = PageUp and PageDown

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, Speed = 0.3

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/Desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    WorldShadows(#PB_Shadow_Modulative, -1, RGB(175, 175, 175))

    ;Ground
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1500, 1500, 40, 40, 15, 15)
    CreateEntity(0,MeshID(0),MaterialID(0))
    EntityRenderMode(0, 0)

    ;Mesh
    ;
    LoadMesh(1, "robot.mesh")

    ; Entity
    ;
    CreateEntity(1, MeshID(1), #PB_Material_None)

    ; Animation
    ;
    StartEntityAnimation(1, "Walk", #PB_EntityAnimation_Manual)

    ; SkyBox
    ;
    SkyBox("Desert07.jpg")

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 50, 100, 80, #PB_Absolute)
    CameraLookAt(0, EntityX(1), EntityY(1) + 40, EntityZ(1))

    CreateLight(0, RGB(255, 255, 255), -40, 100, 80)
    AmbientColor(RGB(80, 80, 80))
    KeyboardMode(#PB_Keyboard_International)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX()/10
        MouseY = -MouseDeltaY()/10
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -1
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = 1
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -1
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = 1
        Else
          KeyY = 0
        EndIf

        If KeyboardPushed(#PB_Key_PageUp) And Speed < 2.0
          Speed + 0.05
        ElseIf KeyboardPushed(#PB_Key_PageDown) And Speed > 0.1
          Speed - 0.05
        EndIf

      EndIf

      AddEntityAnimationTime(1, "Walk", TimeSinceLastFrame * Speed)

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      TimeSinceLastFrame = RenderWorld()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


EntityBonePosition2.pb

;
; ------------------------------------------------------------
;
;   PureBasic - EntityBoneX/Y/Z
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;
;Use keys Q,S,D,Z (Robot shoot)

IncludeFile "Screen3DRequester.pb"

Structure Vector3
  x.f
  y.f
  z.f
EndStructure

Structure Bullet
  Bullet.i
  timer.f
  Speed.f
  Life.l
EndStructure

Define.f KeyX, KeyY, MouseX, MouseY, Speed = 0.1
Define.i RobotMove,Time
Global NewList Bullets.Bullet()

#CameraSpeed = 2

Macro GetBonePosition(Position, Entity, Bone, x1, y1, z1)
  Position\x = EntityBoneX(Entity, Bone, x1, y1, z1)
  Position\y = EntityBoneY(Entity, Bone, x1, y1, z1)
  Position\z = EntityBoneZ(Entity, Bone, x1, y1, z1)
EndMacro

Macro SubVector3(V, V1, V2)
  V\x = V1\x - V2\x
  V\y = V1\y - V2\y
  V\z = V1\z - V2\z
EndMacro

;-Declare
Declare Normalize(*V.Vector3)
Declare AddShoot()
Declare Shootbullet()

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/Desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    KeyboardMode(#PB_Keyboard_International)

    WorldShadows(#PB_Shadow_Modulative, 3000, RGB(175, 175, 175))

    GetScriptMaterial(1, "Color/Red")
    GetScriptMaterial(2, "Color/Green")

    ;Ground
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1500, 1500, 40, 40, 15, 15)
    CreateEntity(0,MeshID(0),MaterialID(0))
    EntityRenderMode(0, 0)

    ;Mesh
    ;
    LoadMesh(1, "robot.mesh")
    CreateSphere(2, 1)

    ; Entity
    ;
    CreateEntity(1, MeshID(1), #PB_Material_None)

    ; SkyBox
    ;
    SkyBox("desert07.jpg")

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 50, 100, 180, #PB_Absolute)
    CameraLookAt(0, EntityX(1), EntityY(1) + 40, EntityZ(1))

    CreateLight(0, RGB(255, 255, 255), -40, 100, 80)
    AmbientColor(RGB(80, 80, 80))

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX()/10
        MouseY = -MouseDeltaY()/10
      EndIf

      RobotMove = #False
      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Q)
          RotateEntity(1, 0, 180, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_D)
          RotateEntity(1, 0, 0, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_Z)
          RotateEntity(1, 0, 90, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_S)
          RotateEntity(1, 0, -90, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

        If KeyboardPushed(#PB_Key_PageUp) And Speed < 1.0
          Speed + 0.05
        ElseIf KeyboardPushed(#PB_Key_PageDown) And Speed > 0.1
          Speed - 0.05
        EndIf

      EndIf

      If RobotMove
        If EntityAnimationStatus(1, "Shoot") = #PB_EntityAnimation_Stopped ; Loop
          StartEntityAnimation(1, "Shoot", #PB_EntityAnimation_Manual) ; Start the animation from the beginning
        EndIf
      Else
        StopEntityAnimation(1, "Shoot")
        SetEntityAnimationTime(1, "Shoot", 0)
      EndIf

      AddEntityAnimationTime(1, "Shoot", TimeSinceLastFrame)

      ;Add Shoot
      If GetEntityAnimationTime(1, "Shoot") > 280 And GetEntityAnimationTime(1, "Shoot") < 310 And ElapsedMilliseconds()-Time>500
        Time = ElapsedMilliseconds()
        AddShoot()
      EndIf

      Shootbullet()

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      TimeSinceLastFrame = RenderWorld() * Speed

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End

Procedure Normalize(*V.Vector3)
  Define.f magSq, oneOverMag

  magSq = *V\x * *V\x + *V\y * *V\y + *V\z * *V\z
  If magsq > 0
    oneOverMag = 1.0 / Sqr(magSq)
    *V\x * oneOverMag
    *V\y * oneOverMag
    *V\z * oneOverMag
  EndIf

EndProcedure

Procedure AddShoot()
  Protected.i Bullet
  Protected.Vector3 Bone1, Bone2, Direction
  Protected.f Angle

  GetBonePosition(Bone1, 1, "Joint17", 0, 0, 0)
  GetBonePosition(Bone2, 1, "Joint18", 0, 0, -5)
  SubVector3(Direction, Bone2, Bone1)
  Normalize(@Direction)

  For i=0 To 315 Step 45
    AddElement(Bullets())

    With Bullets()
      \Speed = 180
      \Life = ElapsedMilliseconds()
      ;\Bullet = CreateEntity(#PB_Any, MeshID(2), MaterialID(1), Bone2\x-2, Bone2\y+0.5, Bone2\z)
      If Int(EntityYaw(1))=90 Or Int(EntityYaw(1))=-90
        \Bullet = CreateEntity(#PB_Any, MeshID(2), MaterialID(1), 2.4*Cos(Radian(Angle))+Bone2\x+1.2, 2.4*Sin(Radian(Angle))+Bone2\y+0.7, Bone2\z)
      Else
        \Bullet = CreateEntity(#PB_Any, MeshID(2), MaterialID(1), Bone2\x, 2.4*Sin(Radian(Angle))+Bone2\y+0.7, 2.4*Cos(Radian(Angle))+Bone2\z+1.2)
      EndIf
      Angle + 45
      EntityPhysicBody(\Bullet, #PB_Entity_SphereBody, 1)
      ApplyEntityImpulse(\Bullet, Direction\x * \Speed, Direction\y * \Speed, Direction\z * \Speed)
    EndWith
  Next
EndProcedure

Procedure Shootbullet()
  ForEach Bullets()
    With Bullets()

      If ElapsedMilliseconds()-Bullets()\Life>3000
        If IsEntity(\Bullet)
          FreeEntity(\Bullet)
        EndIf
        DeleteElement(Bullets(), 1)
      EndIf
    EndWith
  Next
EndProcedure


EntityBonePosition.pb

;
; ------------------------------------------------------------
;
;   PureBasic - EntityBoneX/Y/Z
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Structure Vector3
  x.f
  y.f
  z.f
EndStructure

Define.f KeyX, KeyY, MouseX, MouseY, Speed = 1.0
Define.i RobotMove
Define.Vector3 Bone1, Bone2

Macro GetBonePosition(Position, Entity, Bone, x1, y1, z1)
  Position\x = EntityBoneX(Entity, Bone, x1, y1, z1)
  Position\y = EntityBoneY(Entity, Bone, x1, y1, z1)
  Position\z = EntityBoneZ(Entity, Bone, x1, y1, z1)
EndMacro

Macro SubVector3(V, V1, V2)
  V\x = V1\x - V2\x
  V\y = V1\y - V2\y
  V\z = V1\z - V2\z
EndMacro

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/Desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    WorldShadows(#PB_Shadow_Modulative, 3000, RGB(175, 175, 175))

    GetScriptMaterial(1, "Color/Red")
    GetScriptMaterial(2, "Color/Green")

    ;Ground
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1500, 1500, 40, 40, 15, 15)
    CreateEntity(0,MeshID(0),MaterialID(0))
    EntityRenderMode(0, 0)

    ;Mesh
    ;
    LoadMesh(1, "robot.mesh")
    CreateSphere(2, 10)

    ; Entity
    ;
    CreateEntity(1, MeshID(1), #PB_Material_None)
    CreateEntity(2, MeshID(2), MaterialID(1))
    CreateEntity(3, MeshID(2), MaterialID(2))

    ; SkyBox
    ;
    SkyBox("Desert07.jpg")

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 120, 500, #PB_Absolute)
    CameraLookAt(0, EntityX(1), EntityY(1) + 40, EntityZ(1))

    CreateLight(0, RGB(255, 255, 255), -40, 100, 80)
    AmbientColor(RGB(80, 80, 80))

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX()/10
        MouseY = -MouseDeltaY()/10
      EndIf

      RobotMove = #False
      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          MoveEntity(1, -1 * Speed, 0, 0)
          RotateEntity(1, 0, 180, 0)
          RobotMove = #True
        ElseIf KeyboardPushed(#PB_Key_Right)
          MoveEntity(1, 1 * Speed, 0, 0)
          RotateEntity(1, 0, 0, 0)
          RobotMove = #True
        ElseIf KeyboardPushed(#PB_Key_Up)
          MoveEntity(1, 0, 0, -1 * Speed)
          RotateEntity(1, 0, 90, 0)
          RobotMove = #True
        ElseIf KeyboardPushed(#PB_Key_Down)
          MoveEntity(1, 0, 0, 1 * Speed)
          RotateEntity(1, 0, -90, 0)
          RobotMove = #True
        EndIf

        If KeyboardPushed(#PB_Key_PageUp) And Speed < 2.0
          Speed + 0.05
        ElseIf KeyboardPushed(#PB_Key_PageDown) And Speed > 0.1
          Speed - 0.05
        EndIf

      EndIf

      If RobotMove
        If EntityAnimationStatus(1, "Walk") = #PB_EntityAnimation_Stopped ; Loop
          StartEntityAnimation(1, "Walk", #PB_EntityAnimation_Manual) ; Start the animation from the beginning
        EndIf
      Else
        StopEntityAnimation(1, "Walk")
      EndIf

      AddEntityAnimationTime(1, "Walk", TimeSinceLastFrame)

      GetBonePosition(Bone1, 1, "Joint18", 10, -8, -5)
      GetBonePosition(Bone2, 1, "Joint15", 10, -8, 0)
      MoveEntity(2, Bone1\x, Bone1\y, Bone1\z, #PB_Absolute)
      MoveEntity(3, Bone2\x, Bone2\y, Bone2\z, #PB_Absolute)

      RotateCamera(0, MouseY, MouseX, RollZ, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      TimeSinceLastFrame = RenderWorld() * Speed

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


EntityBoundingBox.pb

;
; ------------------------------------------------------------
;
;   PureBasic - EntityBoundingBox
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

;Speed animation = PageUp and PageDown

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, Speed = 0.3
Define.f x1, y1, z1, x2, y2, z2
Define Color = RGB(255, 0, 0)

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/Desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ; Entity
    ;
    CreateEntity(1, LoadMesh(1, "robot.mesh"), #PB_Material_None)

    ; Animation
    ;
    StartEntityAnimation(1, "Walk", #PB_EntityAnimation_Manual)

    ; SkyBox
    ;
    SkyBox("Desert07.jpg")

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 50, 100, 80, #PB_Absolute)
    CameraLookAt(0, EntityX(1), EntityY(1) + 40, EntityZ(1))

    CreateLight(0, RGB(255, 255, 255), -40, 100, 80)
    AmbientColor(RGB(80, 80, 80))
    KeyboardMode(#PB_Keyboard_International)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX()/10
        MouseY = -MouseDeltaY()/10
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -1
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = 1
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -1
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = 1
        Else
          KeyY = 0
        EndIf

        If KeyboardPushed(#PB_Key_PageUp) And Speed < 2.0
          Speed + 0.05
        ElseIf KeyboardPushed(#PB_Key_PageDown) And Speed > 0.1
          Speed - 0.05
        EndIf

      EndIf

      AddEntityAnimationTime(1, "Walk", TimeSinceLastFrame * Speed)

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      TimeSinceLastFrame = RenderWorld()
      RotateEntity(1, 0, 1, 0, #PB_Relative)

      ;BoudingBox
      x1 = EntityBoundingBox(1, #PB_Entity_MinBoundingBoxX)
      y1 = EntityBoundingBox(1, #PB_Entity_MinBoundingBoxY)
      z1 = EntityBoundingBox(1, #PB_Entity_MinBoundingBoxZ)
      x2 = EntityBoundingBox(1, #PB_Entity_MaxBoundingBoxX)
      y2 = EntityBoundingBox(1, #PB_Entity_MaxBoundingBoxY)
      z2 = EntityBoundingBox(1, #PB_Entity_MaxBoundingBoxZ)

      ;Bottom
      CreateLine3D(10, x1, y1, z1, Color, x2, y1, z1, Color)
      CreateLine3D(11, x2, y1, z1, Color, x2, y1, z2, Color)
      CreateLine3D(12, x2, y1, z2, Color, x1, y1, z2, Color)
      CreateLine3D(13, x1, y1, z2, Color, x1, y1, z1, Color)
      ;Top
      CreateLine3D(14, x1, y2, z1, Color, x2, y2, z1, Color)
      CreateLine3D(15, x2, y2, z1, Color, x2, y2, z2, Color)
      CreateLine3D(16, x2, y2, z2, Color, x1, y2, z2, Color)
      CreateLine3D(17, x1, y2, z2, Color, x1, y2, z1, Color)
      ;Edge
      CreateLine3D(18, x1, y1, z1, Color, x1, y2, z1, Color)
      CreateLine3D(19, x2, y1, z1, Color, x2, y2, z1, Color)
      CreateLine3D(20, x2, y1, z2, Color, x2, y2, z2, Color)
      CreateLine3D(21, x1, y1, z2, Color, x1, y2, z2, Color)

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


EntityCollide.pb

;
; ------------------------------------------------------------
;
;   PureBasic - EntityCollide
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 0.4
#Speed = 60

Enumeration
  #MainWindow
  #Editor
EndEnumeration

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, RatioX, RatioY
Define.i Shoot

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ;- Materials
    GetScriptMaterial(0, "Color/Blue")
    GetScriptMaterial(1, "Color/Green")
    GetScriptMaterial(2, "Color/Red")
    GetScriptMaterial(3, "Color/Yellow")
    CreateMaterial(4, LoadTexture(0, "Dirt.jpg"))

    ;- Meshes
    CreateCube(0, 2)
    CreateSphere(1, 1)
    CreateCylinder(2, 1, 4)

    ;- Entities
    CreateEntity(0, MeshID(0), MaterialID(0),  4,  1.0, 0)
    CreateEntity(1, MeshID(1), MaterialID(1), -4,  0.5, 0)
    CreateEntity(2, MeshID(2), MaterialID(2),  0, -1.0, 0)
    CreateEntity(4, MeshID(0), MaterialID(4),  0, -4.0, 0)
    ScaleEntity(4, 5, 0.5, 5)

    ;- Body
    EntityPhysicBody(0, #PB_Entity_BoxBody, 1)
    EntityPhysicBody(1, #PB_Entity_SphereBody, 1)
    EntityPhysicBody(2, #PB_Entity_CylinderBody, 1)
    EntityPhysicBody(4, #PB_Entity_BoxBody, 0)

    ;- Camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, -1, 8, 25, #PB_Absolute)
    CameraLookAt(0, -1, 0, 0)

    ;- Light
    CreateLight(0, $FFFFFF, 1560, 900, 500)
    AmbientColor($330000)

    ;- GUI
    RatioX = CameraViewWidth(0) / 1920
    RatioY = CameraViewHeight(0) / 1080
    OpenWindow3D(#MainWindow, 0, 0, 390 * RatioX, 110 * RatioY, "EntityCollide")
    StringGadget3D(#Editor, 10 * RatioX, 20 * RatioY, 350 * RatioX, 40 * RatioY, "Clic somewhere", #PB_String3D_ReadOnly)

    ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor

    Repeat
      Screen3DEvents()

      Repeat
        Event3D = WindowEvent3D()
      Until Event3D = 0

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05

        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))

        If MouseButton(#PB_MouseButton_Left)
          If Clic = 0
            If PointPick(0, MouseX(), MouseY())
              Clic = 1
              Shoot = CreateEntity(#PB_Any, MeshID(1), MaterialID(3), CameraX(0), CameraY(0), CameraZ(0))
              ScaleEntity(Shoot, 0.3, 0.3, 0.3)
              EntityPhysicBody(Shoot, #PB_Entity_SphereBody, 1)
              ApplyEntityImpulse(Shoot, PickX() * #Speed, PickY() * #Speed, PickZ() * #Speed)
            EndIf
          EndIf
        Else
          Clic = 0
        EndIf
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      If Shoot
        For i=0 To 2
          If EntityCollide(Shoot, i)
            FreeEntity(Shoot)
            FreeEntity(i)
            Shoot = 0
            Break
          EndIf
        Next
      EndIf

      CameraLookAt(0, 0, 0, 0)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


FetchOrientation.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Orientation
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Structure Vector3
  x.f
  y.f
  z.f
EndStructure

Structure Quaternion
  x.f
  y.f
  z.f
  w.f
EndStructure

Declare ConvertLocalToWorld(*N.Vector3, *P.Vector3, *Orientation.Quaternion, *Position.Vector3)

Define.f KeyX, KeyY, MouseX, MouseY, RollZ, sens = -1
Define Pos.Vector3, Orientation.Quaternion
Define.Vector3 Resultat, C1, C2

C1\x = -25 : C1\y = -25 : C1\z = -25
C2\x =  25 : C2\y =  25 : C2\z =  25

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    CreateCube(0, 50)
    CreateSphere(1, 5)

    CreateMaterial(0, LoadTexture(0, "dirt.jpg"))
    CreateMaterial(1, LoadTexture(1, "wood.jpg"))

    CreateEntity(0, MeshID(0), MaterialID(0))
    CreateEntity(1, MeshID(1), MaterialID(1))
    CreateEntity(2, MeshID(1), MaterialID(1))

    SkyBox("stevecube.jpg")

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 90, 80, 150, #PB_Absolute)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

      EndIf

      RotateEntity(0, 0, 0.4, 0, #PB_Relative)
      MoveEntity(0, 0, 0, -1, #PB_Local)

      Pos\x = EntityX(0) : Pos\y = EntityY(0) :Pos\z = EntityZ(0)

      FetchOrientation(EntityID(0))
      Orientation\x = GetX()
      Orientation\y = GetY()
      Orientation\z = GetZ()
      Orientation\w = GetW()

      ConvertLocalToWorld(@Resultat, @C1, @Orientation, @Pos)
      MoveEntity(1, Resultat\x, Resultat\y, Resultat\z, #PB_Absolute)
      ConvertLocalToWorld(@Resultat, @C2, @Orientation, @Pos)
      MoveEntity(2, Resultat\x, Resultat\y, Resultat\z, #PB_Absolute)

      CameraLookAt(0, Pos\x, Pos\y, Pos\z)
      RenderWorld()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End

Macro CROSS_PRODUCT(N, V1, V2)
  N\x = ((V1\y * V2\z) - (V1\z * V2\y))
  N\y = ((V1\z * V2\x) - (V1\x * V2\z))
  N\z = ((V1\x * V2\y) - (V1\y * V2\x))
EndMacro

Procedure QuaternionVector3(*R.Vector3, *Q.Quaternion, *P.Vector3)
  ; nVidia SDK implementation
  Protected.Vector3 uv, uuv
  CROSS_PRODUCT(uv, *Q, *P)
  CROSS_PRODUCT(uuv, *Q, uv)
  uv\x * (2.0 * *Q\w) : uv\y * (2.0 * *Q\w) : uv\z * (2.0 * *Q\w)
  uuv\x * 2.0 : uuv\y * 2.0 : uuv\z * 2.0
  *R\x = *P\x + uv\x + uuv\x
  *R\y = *P\y + uv\y + uuv\y
  *R\z = *P\z + uv\z + uuv\z
EndProcedure

Procedure ConvertLocalToWorld(*N.Vector3, *P.Vector3, *Orientation.Quaternion, *Position.Vector3)
  Protected.Vector3 R
  QuaternionVector3(@R, *Orientation, *P)
  *N\x = R\x + *Position\x
  *N\y = R\y + *Position\y
  *N\z = R\z + *Position\z
EndProcedure


File.pb

;
; ------------------------------------------------------------
;
;   PureBasic - File example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

MessageRequester("PureBasic", "Welcome !"+Chr(13)+"PureBasic will write a file named: PureBasicTestFile.pb", 0)

If CreateFile(0, "PureBasicTestFile.txt")
  WriteStringN(0, "         This is a PureBasic file test")
  WriteString(0, "Now it's on ")
  WriteString(0, "the same line.")

  CloseFile(0)
Else
  MessageRequester("PureBasic", "Error: can't write the file", 0)
  End
EndIf

If ReadFile(0, "PureBasicTestFile.txt")

  First$ =  Trim(ReadString(0))
  MessageRequester("PureBasic", "Line read: "+First$, 0)

  CloseFile(0)
Else
  MessageRequester("PureBasic", "Error: Can't read the file", 0)
EndIf

End


FileSystem.pb

;
; ------------------------------------------------------------
;
;   PureBasic - FileSystem example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

If OpenWindow(0, 100, 200, 290, 200, "PureBasic - FileSystem Example")

  StringGadget  (0,  10, 10, 202, 24, GetHomeDirectory())
  ButtonGadget  (1, 220, 10, 60 , 24, "List")
  ListViewGadget(2,  10, 40, 270, 150)

  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_Gadget
      If EventGadget() = 1 ; Read

        ClearGadgetItems(2)  ; Clear all the items found in the ListView

        If ExamineDirectory(0, GetGadgetText(0), "*.*")

          While NextDirectoryEntry(0)

            FileName$ = DirectoryEntryName(0)
            If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory
              FileName$ = "[DIR] "+FileName$
            EndIf

            AddGadgetItem(2, -1, FileName$)

          Wend

        Else
          MessageRequester("Error","Can't examine this directory: "+GetGadgetText(0),0)
        EndIf

      EndIf
    EndIf

  Until Event = #PB_Event_CloseWindow

EndIf

End


Font.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Font example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;
; NOTE: This file doesn't compile with the demo version !
;

LoadFont (0, "Courier", 15)            ; Load Courrier Font, Size 15
LoadFont (1, "Arial", 30)              ; Load Arial Font, Size 30

;
;-------- Open our Window --------
;

If OpenWindow(0, 100, 200, 460, 148, "Font Test") = 0
  MessageRequester("Error", "Can't open Window", 0)
  End
EndIf

If CreateImage(0, 450, 130)

  If StartDrawing(ImageOutput(0))           ;
    Box(0, 0, 450, 130, RGB(255, 255, 255)) ; White background

    DrawingMode(1)                          ; Transparent TextBackground

    DrawingFont(FontID(0))                 ; Use the 'Courier' font
    DrawText(10,10, "Font: Courier - Size: 15 - Red", RGB(255, 0, 0))    ; Print our text

    DrawingFont(FontID(1))                 ; Use the Arial font
    DrawText(10,40, "Font: Arial - Size: 30", RGB(0, 0, 0))      ; Print our text

    StopDrawing()                          ; This is absolutely needed when the drawing operations are
  EndIf                                    ; finished !!! Never forget it !

EndIf

; Display the image on the window
;
ImageGadget(0, 5, 10, 450, 130, ImageID(0))

;
; This is the 'event loop'. All the user actions are processed here.
; It's very easy to understand: when an action occurs, the Event
; isn't 0 and we just have to see what have happened...
;

Repeat

  Event = WaitWindowEvent()

Until Event = #PB_Event_CloseWindow    ; If the user has pressed on the close button

End                                      ; All the opened windows are closed automatically by PureBasic
  (


Ftp.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Ftp example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

InitNetwork()

If OpenFTP(0, "127.0.0.1", "test", "test", 0)

  Result = SendFTPFile(0, OpenFileRequester("Choose a file to send", "", "*.*", 0), "purebasic_sent.file", 1)

  Repeat
    Debug FTPProgress(0)
    Delay(300)
  Until FTPProgress(0) = -3 Or FTPProgress(0) = -2

  Debug "finished"

Else
  MessageRequester("Error", "Can't connect to the FTP server")
EndIf


Gadget3D.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Gadget 3D
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

Enumeration ; Window3D
  #MainWindow
  #SecondWindow
EndEnumeration

Enumeration ; Gadget3D
  #ActiveWindowLabel
  #CloseButton
  #ProgressBar
  #ComboBox
  #Panel
  #ListView
  #Image
  #Image2
  #ScrollArea
  #ScrollBar
  #String
  #Spin
  #Container
  #CheckBox
  #Editor
  #Option1
  #Option2
  #Option3
  #Button
EndEnumeration

If InitEngine3D()

  Add3DArchive("Data", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    SkyBox("desert07.jpg")

        CreateCamera(0, 0, 0, 100, 100)  ; Front camera
    MoveCamera(0, 0, 0, 100, #PB_Absolute)

    OpenWindow3D(#MainWindow, 50, 20, 280, 400, "Hello in 3D !", #PB_Window3D_SizeGadget)

    Top = 10
    TextGadget3D(#ActiveWindowLabel, 10, Top, 250, 25, "Active window: ") : Top + 30

    ;- ProgressBar
    TextGadget3D(#PB_Any, 10, Top, 100, 25, "Progress bar: ")
    ProgressBarGadget3D(#ProgressBar, 110, Top, 150, 25, 0, 100) : Top + 30
    SetGadgetState3D(#ProgressBar, 30)
    GadgetToolTip3D(#ProgressBar, "I'm a progress bar")

    ;- ComboBox
    TextGadget3D(#PB_Any, 10, Top, 100, 25, "Combo box: ")
    ComboBoxGadget3D(#ComboBox, 110, Top, 150, 25) : Top + 30
    GadgetToolTip3D(#ComboBox, "Combobox tooltip !")
    AddGadgetItem3D(#ComboBox, -1, "Item 1")
    AddGadgetItem3D(#ComboBox, -1, "Item 2")
    AddGadgetItem3D(#ComboBox, -1, "Item 3")
    AddGadgetItem3D(#ComboBox, -1, "Item 4")

     ;- ScrollBar
    TextGadget3D(#PB_Any, 10, Top, 100, 25, "Scroll bar: ")
    ScrollBarGadget3D(#ScrollBar, 110, Top+7, 150, 10, 0, 100, 20) : Top + 30
    SetGadgetState3D(#ScrollBar, 30)

    ;- String
    TextGadget3D(#PB_Any, 10, Top, 100, 25, "String: ")
    StringGadget3D(#String, 110, Top, 150, 25, "Modify me") : Top + 30
    GadgetToolTip3D(#String, "I'm a string gadget")

    ;- CheckBox
    TextGadget3D(#PB_Any, 10, Top, 100, 25, "Check box: ")
    CheckBoxGadget3D(#CheckBox, 110, Top, 150, 25, "Enable something") : Top + 30
    GadgetToolTip3D(#CheckBox, "I'm a checkbox !")
    SetGadgetState3D(#CheckBox, 1)

    ;- Spinner
    TextGadget3D(#PB_Any, 10, Top, 100, 25, "Spinner: ")
    SpinGadget3D(#Spin, 110, Top, 150, 25, 0, 100) : Top + 30
    GadgetToolTip3D(#Spin, "I'm a spinner !")

    ;- Options
    TextGadget3D(#PB_Any, 10, Top, 100, 25, "Options: ")
    OptionGadget3D(#Option1, 110, Top, 150, 25, "Choice 1") : Top + 30
    OptionGadget3D(#Option2, 110, Top, 150, 25, "Choice 2") : Top + 30
    OptionGadget3D(#Option3, 110, Top, 150, 25, "Choice 3") : Top + 30
    GadgetToolTip3D(#Option1, "I'm option 1 !")
    SetGadgetState3D(#Option2, 1)

    ;- Button
    TextGadget3D(#PB_Any, 10, Top, 100, 25, "Button: ")
    ButtonGadget3D(#Button, 110, Top, 150, 25, "Click me !") : Top + 30
    GadgetToolTip3D(#Button, "I'm a button !")

    OpenWindow3D(#SecondWindow, 400, 150, 400, 400, "More gadgets", #PB_Window3D_SizeGadget)

    PanelGadget3D(#Panel, 10, 10, 370, 350)
      GadgetToolTip3D(#Panel, "Panel tooltip !")
      AddGadgetItem3D(#Panel, -1, "First")
        ListViewGadget3D(#ListView, 10, 10, 200, 200, #PB_ListView3D_Multiselect)
          For k = 0 To 20
            AddGadgetItem3D(#ListView, -1, "Item "+Str(k))
          Next

      AddGadgetItem3D(#Panel, -1, "Second")
        ContainerGadget3D(#Container, 0, 0, 400, 400)
          GadgetToolTip3D(#Container, "Container tooltip !")

          LoadTexture(0, "clouds.jpg")
          ImageGadget3D(#Image, 10, 10, 128, 128, TextureID(0))

          ScrollAreaGadget3D(#ScrollArea, 10, 150, 100, 100, 256, 256, 30)
          GadgetToolTip3D(#ScrollArea, "Scroll area tooltip !")
            ImageGadget3D(#Image2, 10, 10, 256, 256, TextureID(0))
          CloseGadgetList3D()

        CloseGadgetList3D()

      AddGadgetItem3D(#Panel, -1, "Third")
        EditorGadget3D(#Editor, 10, 10, 300, 200)
        SetGadgetText3D(#Editor, "Multi" + #LF$ + "Line" + #LF$ + "Editor !")

    CloseGadgetList3D()

    Repeat
      Screen3DEvents()

      If ExamineKeyboard() And ExamineMouse()
        Input$ = KeyboardInkey()

        SpecialKey = 0
        If     KeyboardPushed(#PB_Key_Back)   :  SpecialKey = #PB_Key_Back
        ElseIf KeyboardPushed(#PB_Key_Return) : SpecialKey = #PB_Key_Return
        ElseIf KeyboardPushed(#PB_Key_Left)   : SpecialKey = #PB_Key_Left
        ElseIf KeyboardPushed(#PB_Key_Right)  : SpecialKey = #PB_Key_Right
        ElseIf KeyboardPushed(#PB_Key_Up)     : SpecialKey = #PB_Key_Up
        ElseIf KeyboardPushed(#PB_Key_Down)   : SpecialKey = #PB_Key_Down
        ElseIf KeyboardPushed(#PB_Key_Delete) : SpecialKey = #PB_Key_Delete
        EndIf

        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left), Input$, SpecialKey)
      EndIf

      ; Handle the GUI 3D events, it's similar to regular GUI events
      ;
      Repeat
          Event = WindowEvent3D()

          SetGadgetText3D(#ActiveWindowLabel, "Active #Window3D: "+Str(GetActiveWindow3D()))

          Select Event
              Case #PB_Event3D_Gadget
                If EventGadget3D() = #CloseButton
                  CloseWindow3D(#MainWindow)
                EndIf

          EndSelect
      Until Event = 0

      RenderWorld()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf


Gadget.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Gadget example file
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

#WindowWidth  = 390
#WindowHeight = 350

If OpenWindow(0, 100, 200, #WindowWidth, #WindowHeight, "PureBasic - Gadget Demonstration", #PB_Window_MinimizeGadget)

  Top = 10
  GadgetHeight = 24

  Frame3DGadget(#PB_Any, 10, Top, 370, 290, "Player...") : Top+20

  StringGadget(0,  20, Top, 200, GadgetHeight, "")
  ButtonGadget(1, 223, Top,  72, GadgetHeight, "Play")
  ButtonGadget(2, 295, Top,  72, GadgetHeight, "Stop")  : Top+35
  DisableGadget(2,1)

  GadgetToolTip(1,"Play the current song")

  PanelGadget(3, 20, Top, #WindowWidth-50, #WindowHeight-Top-60)
    AddGadgetItem(3, 0, "MP3 PlayList")
      ListViewGadget(4, 6, 10, 230, 148)

      For k=0 To 30
        AddGadgetItem(4, -1, "Music Song n° "+Str(k))
      Next

      ButtonGadget(5,  250, 10, 80, GadgetHeight, "Add")
      ButtonGadget(6,  250, 38, 80, GadgetHeight, "Remove")
      ButtonGadget(7,  250, 66, 80, GadgetHeight, "Select")
      GadgetToolTip(7, "Select the current song")

      TrackBarGadget(17, 10, 168, 310, 25, 0, 100)

    AddGadgetItem(3, 1, "Options")
      Top = 10
      CheckBoxGadget(10, 10, Top, 250, GadgetHeight, "Enable low-pass filter") : Top+30
      CheckBoxGadget(11, 10, Top, 250, GadgetHeight, "Enable visual plug-in")  : Top+30
      ComboBoxGadget(12, 10, Top, 250, 21) : Top+30
        AddGadgetItem(12, -1, "FireWorks")
        AddGadgetItem(12, -1, "OpenGL spectrum")
        AddGadgetItem(12, -1, "Bump bass")
      SetGadgetState(12,0)
      DisableGadget(12,1)

      OptionGadget(13, 10, Top, 80, GadgetHeight, "640*480") : Top+20
      OptionGadget(14, 10, Top, 80, GadgetHeight, "800*600") : Top+20
      OptionGadget(15, 10, Top, 80, GadgetHeight, "1024*768")
      SetGadgetState(13, 1)

      ButtonGadget(16, 150, Top, 80, GadgetHeight, "Info")
  CloseGadgetList()

  TextGadget  (9, 10, #WindowHeight-30, 250, 24, "PureBasic - Gadget demonstration")
  ButtonGadget(8, #WindowWidth-100, #WindowHeight-36, 80, 24, "Quit")

  SetGadgetState(3, 0)

  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_Gadget

      Select EventGadget()
        Case 0
          If EventType() = #PB_EventType_ReturnKey
            MessageRequester("Info", "Return key pressed", 0)
            SetActiveGadget(0)
          EndIf

        Case 1 ; Play
          DisableGadget(2,0)  ; Enable the 'Stop' gadget
          DisableGadget(1,1)  ; Disable the 'Play' Gadget

        Case 2 ; Stop
          DisableGadget(1,0)  ; Enable the 'Play' gadget
          DisableGadget(2,1)  ; Disable the 'Stop' Gadget

        Case 4
          If EventType() = 2
            SetGadgetText(0, GetGadgetText(4)) ; Get the current item from the ListView..
          EndIf

        Case 5 ; Add
          AddGadgetItem(4, -1, "New Item Added...")

        Case 6 ; Remove
          RemoveGadgetItem(4, GetGadgetState(4)) ; Remove the current element of the ListView

        Case 7 ; Select
          SetGadgetText(0, GetGadgetText(4)) ; Get the current item from the ListView..

        Case 8 ; Quit...
          Event = #PB_Event_CloseWindow

        Case 11 ; Enable PlugIn..
          DisableGadget(12, 1-GetGadgetState(11))

        Case 16 ;
          If GetGadgetState(13) : Result$ = GetGadgetText(13) : EndIf
          If GetGadgetState(14) : Result$ = GetGadgetText(14) : EndIf
          If GetGadgetState(15) : Result$ = GetGadgetText(15) : EndIf

          MessageRequester("Info", "Selected screen mode: "+Result$, 0)

        Case 17
          SetGadgetText(0, Str(GetGadgetState(17)))

      EndSelect

    EndIf

  Until Event = #PB_Event_CloseWindow

EndIf

End


GadgetAdvanced.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Gadget example file
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

#WindowWidth  = 450
#WindowHeight = 305

; Load our images..
;
LoadImage(0, "Data/Drive.bmp")
LoadImage(1, "Data/File.bmp")
LoadImage(2, "Data/PureBasic.bmp")

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  ; Only Windows supports .ico file format
  LoadImage(3, "Data/CdPlayer.ico")
CompilerElse
  LoadImage(3, "Data/Drive.bmp")
CompilerEndIf

CreatePopupMenu(0)
  MenuItem(0, "Popup !")

If OpenWindow(0, 100, 200, #WindowWidth, #WindowHeight, "PureBasic - Advanced Gadget Demonstration", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)

  ListIconGadget(5, 170, 50, 265, 200, "Column 1", 131)
  AddGadgetColumn(5, 1, "Column 2", 300)
  AddGadgetColumn(5, 2, "Column 3", 80)

  TextGadget(4, 10, 16, 180, 24, "Please wait while initializing...")

  ProgressBarGadget(3, 10, 260, #WindowWidth-25, 20, 0, 100)

  ; Update the ProgressBar, just for fun !
  ;
  For k=0 To 100
    SetGadgetState(3, k)
    Delay(10)
  Next

  ImageGadget      (0, 200, 5, 0, 0, ImageID(2))
  ButtonImageGadget(1, 384, 5, 50, 36, ImageID(3))

  TreeGadget    (2,  10, 50, 150, 200)

  SetGadgetText(4, "Initialize Ok... Welcome !")

  ; Fill Up the Tree gadget with lot of entries (including the image)
  ;

  For k=0 To 10
    AddGadgetItem(2, -1, "General "+Str(k), ImageID(1))
    AddGadgetItem(2, -1, "ScreenMode", ImageID(1))
      AddGadgetItem(2, -1, "640*480", ImageID(1), 1)
      AddGadgetItem(2, -1, "800*600", ImageID(3), 1)
      AddGadgetItem(2, -1, "1024*768", ImageID(1), 1)
      AddGadgetItem(2, -1, "1600*1200", ImageID(1), 1)
    AddGadgetItem(2, -1, "Joystick", ImageID(1))
  Next

  ; Fill Up the ListIcon gadget. Notice than the column are separated by Chr(10) (NewLine) character
  ;
  For k=0 To 100
    AddGadgetItem(5, -1, "Element "+Str(k)+Chr(10)+"C 2"+Chr(10)+"Comment 3", ImageID(3))
  Next

  SetGadgetState(5, 8)

  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_Gadget

      Select EventGadget()
        Case 1
          MessageRequester("Information", "You did it !", 0)

        Case 2
          SetGadgetText(4, "Tree Gadget. Item selected: "+Str(GetGadgetState(2)))

          If EventType() = 2
            MessageRequester("Information", "Doubleclick: item"+Str(GetGadgetState(2))+", Text: "+GetGadgetText(2), 0)
          ElseIf EventType() = 1
            DisplayPopupMenu(0, WindowID(0))
          EndIf

        Case 5
          SetGadgetText(4, "ListIcon Gadget. Item selected: "+Str(GetGadgetState(5)))

          If EventType() = 2
            MessageRequester("Information", "Doubleclick: item"+Str(GetGadgetState(5))+", Text: "+GetGadgetText(5), 0)
          ElseIf EventType() = 1
            DisplayPopupMenu(0, WindowID(0))
          EndIf

     EndSelect

    EndIf

  Until Event = #PB_Event_CloseWindow
EndIf

End


GadgetSplitter.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Gadget example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#WindowWidth  = 640
#WindowHeight = 480

If OpenWindow(0, 100, 120, #WindowWidth, #WindowHeight, "PureBasic - Gadget Demonstration", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)

  HyperLinkGadget(7, 10, 5, 180, 30, "This is a green hyperlink", RGB(0,255,0))
  HyperLinkGadget(8, 200, 5, 220, 30, "This is a red hyperlink", RGB(255,0,0))

  SetGadgetFont(8, LoadFont(0, "courier", 10, #PB_Font_Underline | #PB_Font_Bold))

  ListIconGadget(0, 115, 10, 100, 190, "Test", 100)
  For k=0 To 10
    AddGadgetItem(0, -1, "Element "+Str(k))
  Next

  ExplorerListGadget(1, 115, 10, 100, 190, GetHomeDirectory(), #PB_Explorer_AlwaysShowSelection|#PB_Explorer_FullRowSelect|#PB_Explorer_MultiSelect)

  TreeGadget(3, 115, 10, 100, 190)

  For k=0 To 10
    AddGadgetItem(3, -1, "Hello "+Str(k))
  Next

  PanelGadget(6, 0, 0, 400, 400)
    For k=0 To 5
      AddGadgetItem(6, -1, "Line "+Str(k))
      ButtonGadget(12+k, 10, 10, 100, 20, "Test"+Str(k))
    Next
  CloseGadgetList()

  SplitterGadget(2, 0, 0, #WindowWidth/2, #WindowHeight/2, 1, 0)
  SplitterGadget(4, 0, 0, #WindowWidth, #WindowHeight, 3, 2, #PB_Splitter_Vertical | #PB_Splitter_Separator)
  SplitterGadget(5, 5, 40, #WindowWidth-10, #WindowHeight-45, 4, 6, #PB_Splitter_Vertical)

  SetGadgetState(5, 500)

  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_Gadget

      Select EventGadget()

        Case 8
          SetGadgetState(5, 333)
          SetGadgetState(2, 333)

      EndSelect

    ElseIf Event = #PB_Event_SizeWindow
      ResizeGadget(5, #PB_Ignore, #PB_Ignore, WindowWidth(0)-10, WindowHeight(0)-45) ; Our 'master' splitter gadget

    EndIf

  Until Event = #PB_Event_CloseWindow

EndIf

End  (


GadgetSplitterAdvanced.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Gadget example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#WindowWidth  = 640
#WindowHeight = 480

If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight, "PureBasic - Gadget Demonstration", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)

  TextGadget(7, 10, 5, 700, 15, "PureBasic splitter demonstation with Editor, ScrollArea, ExplorerTree and Web gadgets. Feel the power...")

  WebGadget(0, 10, 10, 300, 20, "http://www.purebasic.com")

  EditorGadget(1, 115, 10, 100, 190)
  For k=1 To 10
    AddGadgetItem(1, k-1, "Line "+Str(k))
  Next

  ExplorerTreeGadget(3, 115, 10, 100, 190, GetHomeDirectory(), #PB_Explorer_AlwaysShowSelection|#PB_Explorer_FullRowSelect|#PB_Explorer_MultiSelect)

  ScrollAreaGadget(6, 0, 0, 400, 400, 1000, 1000, 1)
    ButtonGadget(20, 20, 20, 200, 200, "Scroll Area !")
  CloseGadgetList()

  SplitterGadget(2, 0, 0, #WindowWidth/2, #WindowHeight/2, 1, 0)
  SplitterGadget(4, 0, 0, #WindowWidth, #WindowHeight, 3, 2, #PB_Splitter_Vertical)
  SplitterGadget(5, 0, 25, #WindowWidth, #WindowHeight-25, 4, 6, #PB_Splitter_Vertical)

  SetGadgetState(5, 500)

  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_Gadget

      Select EventGadget()

        Case 8
          SetGadgetState(5, 333)
          SetGadgetState(2, 333)
          SetGadgetState(11, 5)

        Case 20
          Debug "OK"

      EndSelect

    ElseIf Event = #PB_Event_SizeWindow
      ResizeGadget(5, #PB_Ignore, #PB_Ignore, WindowWidth(0), WindowHeight(0)-25) ; Our 'master' splitter gadget

    EndIf

  Until Event = #PB_Event_CloseWindow

EndIf

End  ,


GetEntityMaterial.pb

;
; ------------------------------------------------------------
;
;   PureBasic - GetEntityMaterial
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    CreateMaterial(0, LoadTexture(0, "clouds.jpg"))

    CreateSphere(0, 40, 50, 50)
    CreateEntity(0,MeshID(0), MaterialID(0), -60, 0, 0)

    ; Get the MaterialID
    MaterialID = GetEntityMaterial(0)

    ; Create a cube with materialID
    CreateCube(1, 40)
    CreateEntity(1, MeshID(1), MaterialID, 60, 0, 0)

    ; Camera
    CreateCamera(0, 0, 0, 100, 100)
    CameraBackColor(0, $333333)
    MoveCamera(0,0, 100, 300, #PB_Absolute)
    CameraLookAt(0, 0, 0, 0)

    ; Light
    CreateLight(0, $FFFFFF, 1560, 900, 500)
    AmbientColor($330000)

    Repeat
      Screen3DEvents()

      ExamineKeyboard()

      RenderWorld()
      Screen3DStats()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


GetScriptMaterial.pb

;
; ------------------------------------------------------------
;
;   PureBasic - GetScriptMaterial
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    Red = GetScriptMaterial(#PB_Any, "Color/Red")
    Blue = GetScriptMaterial(#PB_Any, "Color/Blue")
    Yellow = GetScriptMaterial(#PB_Any, "Color/Yellow")
    Green = GetScriptMaterial(#PB_Any, "Color/Green")

    CreateSphere(0, 40, 50, 50)
    CreateEntity(0,MeshID(0), MaterialID(Red)   , -60,   0,  0)
    CreateEntity(1,MeshID(0), MaterialID(Blue)  ,  60,   0,  0)
    CreateEntity(2,MeshID(0), MaterialID(Yellow),   0,  60,  0)
    CreateEntity(3,MeshID(0), MaterialID(Green) ,   0, -60,  0)

    ; Camera
    CreateCamera(0, 0, 0, 100, 100)
    CameraBackColor(0, RGB(50, 50, 50))
    MoveCamera(0,0, 100, 300, #PB_Absolute)
    CameraLookAt(0, 0, 0, 0)

    ; Light
    CreateLight(0, RGB(255, 255, 255), 1560, 900, 500)
    AmbientColor(RGB(50,50,50))

    Repeat
      Screen3DEvents()

      ExamineKeyboard()

      RenderWorld()
      Screen3DStats()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End,


GetScriptParticle.pb

;
; ------------------------------------------------------------
;
;   PureBasic - GetScriptParticle
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 10
#MAX = 20

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    Add3DArchive("Data/Textures"            , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Models"              , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Scripts"             , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Particles"           , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/OPE/material_scripts", #PB_3DArchive_FileSystem)
    Add3DArchive("Data/OPE/textures"        , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/OPE/particle_scripts", #PB_3DArchive_FileSystem)
    Parse3DScripts()

    KeyboardMode(#PB_Keyboard_International)

    ; Particles
    ;
    Restore Particles
    For i = 0 To #MAX
      Read.s Particle$
      GetScriptParticleEmitter(i, Particle$)
      HideParticleEmitter(i, 1)
    Next

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 0, 100, #PB_Absolute)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.005
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.005
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      If ElapsedMilliseconds() - Time > 2500
        Time = ElapsedMilliseconds()
        HideParticleEmitter(Particle, 1)
        Particle + 1
        If Particle > #MAX
          Particle = 0
        EndIf
        HideParticleEmitter(Particle, 0)
      EndIf

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End

DataSection
  Particles:
  Data.s "Examples/Smoke"
  Data.s "Examples/GreenyNimbus"
  Data.s "Examples/PurpleFountain"
  Data.s "Examples/Rain"
  Data.s "Examples/JetEngine1"
  Data.s "Examples/Aureola"
  Data.s "Examples/JetEngine2"
  Data.s "Examples/Swarm"
  Data.s "Examples/Snow"
  Data.s "Examples/Fireworks"
  Data.s "PEExamples/blast"
  Data.s "PEExamples/blast2"
  Data.s "PEExamples/erruption"
  Data.s "PEExamples/pentagram"
  Data.s "PEExamples/flow"
  Data.s "PEExamples/flame"
  Data.s "PEExamples/floatyGreeny"
  Data.s "PEExamples/ringOfFire"
  Data.s "PEExamples/space"
  Data.s "PEExamples/bounce"
  Data.s "PEExamples/point_rendering"

EndDataSection"


Help.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Help example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

OpenHelp("..\..\PureBasic.chm", "MainGuide\history.html")

MessageRequester("Information", "Click to close the PureBasic help and open another old .hlp file", 0)
CloseHelp()

OpenHelp(OpenFileRequester("Choose an .hlp file", "", "WinHelp files (*.hlp)|*.hlp", 0), "")


HingeJoint.pb

;
; ------------------------------------------------------------
;
;   PureBasic - HingeJoint
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

#CameraSpeed = 1

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)
  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ; First create materials
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreateMaterial(1, LoadTexture(1, "Wood.jpg"))

    ; Meshes
    ;
    CreateCube(0, 1.0)
    CreateSphere(1, 0.66)

    ; Entities
    ;
    CreateEntity(0, MeshID(0), MaterialID(0), 0, 0, 0)
    ScaleEntity(0, 2, 4, 0.5)
    CreateEntity(1, MeshID(0), MaterialID(1), 3, 0, 0)
    ScaleEntity(1, 2, 4, 0.5)

    ; Bodies
    ;

    EntityPhysicBody(0, #PB_Entity_StaticBody)
    EntityPhysicBody(1, #PB_Entity_BoxBody, 1.0)

    ; HingeJoint
    ;
    HingeJoint(0, EntityID(0), 1.0, 0.5, 0.25, 0, 1, 0, EntityID(1), -1.0, 0.5, 0.25, 0, 1, 0)
    SetJointAttribute(0, #PB_HingeJoint_LowerLimit, 0)
    ;SetJointAttribute(0, #PB_HingeJoint_UpperLimit, Degree(#PI/4))

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 12, 15, #PB_Absolute)
    CameraLookAt(0, 0, 0, 0)

   Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Space)
           ApplyEntityImpulse(1, 0, 0, -1)
        EndIf

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Http.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Http example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

InitNetwork()

URL$ = "http://user:pass@www.purebasic.com:1024/subdirectory/index.php?year=2008&month=12&day=3"
Debug GetURLPart(URL$, "year")
Debug GetURLPart(URL$, #PB_URL_Site)
Debug GetURLPart(URL$, #PB_URL_Port)
Debug GetURLPart(URL$, #PB_URL_Parameters)
Debug GetURLPart(URL$, #PB_URL_Path)
Debug GetURLPart(URL$, #PB_URL_User)
Debug GetURLPart(URL$, #PB_URL_Password)

Debug "-------"
Debug SetURLPart(URL$, #PB_URL_Site, "forums.purebasic.fr")
Debug SetURLPart(URL$, #PB_URL_Port, "80")
Debug SetURLPart(URL$, #PB_URL_User, "bericko")
Debug SetURLPart(URL$, #PB_URL_Password, "password")


Image.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Image example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

If OpenWindow(0, 100, 100, 500, 300, "PureBasic - Image")

  If CreateImage(0, 255, 255)

    StartDrawing(ImageOutput(0))

    For k=0 To 255
      FrontColor(RGB(k,0, k))  ; a rainbow, from black to pink
      Line(0, k, 255, 1)
    Next

    DrawingMode(#PB_2DDrawing_Transparent)
    FrontColor(RGB(255,255,255)) ; print the text to white !
    DrawText(40, 50, "An image easily created !")

    StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !

  EndIf

  CopyImage(0, 1)
  ResizeImage(1, 100, 100)

  GrabImage(0, 2, 100, 60, 150, 40)

  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_Repaint
      StartDrawing(WindowOutput(0))
        DrawImage(ImageID(0), 20, 10)
        DrawImage(ImageID(1), 320, 80)
        DrawImage(ImageID(2), 320, 200)
      StopDrawing()
    EndIf

  Until Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button

EndIf

End   ; All the opened windows are closed automatically by PureBasic


ImagePlugin.pb

;
; ------------------------------------------------------------
;
;   PureBasic - ImagePlugin example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

; Enable all the decoders than PureBasic actually supports
;
UseJPEGImageDecoder()
UseTGAImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()

; Enable all the encoders than PureBasic actually supports
;
UseJPEGImageEncoder()
UsePNGImageEncoder()

If OpenWindow(0, 0, 0, 250, 130, "PureBasic - Image Converter", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  ImageGadget(0, 0, 28, WindowWidth(0), WindowHeight(0), 0, #PB_Image_Border)

  CreateToolBar(0, WindowID(0))
    ToolBarStandardButton(0, #PB_ToolBarIcon_Open)
    ToolBarStandardButton(1, #PB_ToolBarIcon_Save)
    DisableToolBarButton(0, 1, 1)    ; disable the save button

  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_Menu  ; ToolBar are acting as menu

      Select EventMenu()

        Case 0  ; Open

          Filename$ = OpenFileRequester("Choose a picture", "", "All Images Formats|*.bmp;*.jpg;*.png;*.tif;*.tga", 0)
          If Filename$

            If LoadImage(0, Filename$)
              SetGadgetState(0, ImageID(0))  ; change the picture in the gadget
              DisableToolBarButton(0, 1, 0)    ; enable the save button
              ResizeWindow(0, #PB_Ignore, #PB_Ignore, ImageWidth(0)+4, ImageHeight(0)+34)
            EndIf

          EndIf

        Case 1  ; Save

          Filename$ = SaveFileRequester("Save a picture", Left(Filename$, Len(Filename$)-Len(GetExtensionPart(Filename$))-1), "BMP Format|*.bmp|JPEG Format|*.jpg|PNG Format|*.png", 0)
          If Filename$

            Select SelectedFilePattern()

              Case 0  ; BMP
                ImageFormat = #PB_ImagePlugin_BMP
                Extension$  = "bmp"

              Case 1  ; JPEG
                ImageFormat = #PB_ImagePlugin_JPEG
                Extension$  = "jpg"

              Case 2  ; PNG
                ImageFormat = #PB_ImagePlugin_PNG
                Extension$  = "png"

            EndSelect

            If LCase(GetExtensionPart(Filename$)) <> Extension$
              Filename$ + "." + Extension$
            EndIf

            If SaveImage(0, Filename$, ImageFormat)
              MessageRequester("Information", "Image saved successfully", 0)
            EndIf

          EndIf

      EndSelect

    EndIf

  Until Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button

EndIf

End   ; All is automatically freed by PureBasic


Joint.pb

;
; ------------------------------------------------------------
;
;   PureBasic - SliderJoint & HingeJoint
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;
IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY
Define Direction = 0, Time = ElapsedMilliseconds()

#CameraSpeed = 1

Macro DoorClosed()
  (EntityX(1) > -1.07)
EndMacro

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ; First create materials
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreateMaterial(1, LoadTexture(1, "Wood.jpg"))
    GetScriptMaterial(2, "Color/Green")
    GetScriptMaterial(3, "Color/Red")

    ; Meshes
    ;
    CreateCube(0, 1.0)
    CreateSphere(1, 0.5)

    ; Entities
    ;
    CreateEntity(0, MeshID(0), MaterialID(0),  1, 0.1, 0)
    ScaleEntity(0, 2, 4, 0.5)
    CreateEntity(1, MeshID(0), MaterialID(1), -3, 0.1, 0)
    ScaleEntity(1, 2, 4, 0.5)

    CreateEntity(3, MeshID(1), MaterialID(3), -1, -1.25, 0.23)

    CreateEntity(4, MeshID(0), MaterialID(0),  -2, -2.3, -1.0)
    ScaleEntity(4, 8, 0.5, 4)
    CreateEntity(5, MeshID(0), MaterialID(1), -2, -2.3, 3)
    ScaleEntity(5, 8, 0.5, 4)

    ; Bodies
    ;
    EntityPhysicBody(0, #PB_Entity_StaticBody)
    EntityPhysicBody(1, #PB_Entity_BoxBody, 1.0)

    EntityPhysicBody(3, #PB_Entity_SphereBody, 0.5)

    EntityPhysicBody(4, #PB_Entity_StaticBody)
    EntityPhysicBody(5, #PB_Entity_BoxBody, 0.1)

    ; SliderJoint
    ;
    SliderJoint  (0, EntityID(0), -1, 0, 0, EntityID(1), 1, 0, 0)
    SetJointAttribute(0, #PB_SliderJoint_LowerLimit, -3)
    SetJointAttribute(0, #PB_SliderJoint_UpperLimit,  0)

    ; HingeJoint
    ;
    HingeJoint(1, EntityID(4), 4, 0.1, 2.01, 1, 0, 0, EntityID(5), 4, 0.1, -2, 1, 0, 0)

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 10, 6, 19, #PB_Absolute)
    CameraLookAt(0, 0, 0, 0)

    ; Light
    CreateLight(0, $FFFFFF, 1560, 900, 500)
    AmbientColor($330000)

    Repeat
      Screen3DEvents()

       If ElapsedMilliseconds() - Time > 1500 And Not DoorClosed()
         Direction = 1 - Direction
         Time = ElapsedMilliseconds()
       EndIf

      If Direction = 1
        ApplyEntityImpulse(1, 0.3, 0, 0)
      Else
        ApplyEntityImpulse(1, -0.3, 0, 0)
      EndIf

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardReleased(#PB_Key_Space)
          direction = 0
          DisableEntityBody(1, 0)
          ApplyEntityImpulse(1, -10, 0, 0)
          Time = ElapsedMilliseconds()
          FreeEntity(3)
          CreateEntity(3, MeshID(1), MaterialID(3), -1, 15, 0.23)
          EntityPhysicBody(3, #PB_Entity_SphereBody, 0.5)
        EndIf

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Joystick.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Joystick example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

NbJoysticks = InitJoystick()

If NbJoysticks = 0
  MessageRequester("Error", "No joysticks are availables.", 0)
  End
EndIf

If OpenWindow(0, 100, 100, 300, 260, "PureBasic - Joystick Demo")

  MessageRequester("Information", "This will test the joystick in a window.", 0)

  x = WindowWidth(0)/2
  y = WindowHeight(0)/2-20

  Repeat

    Repeat
      Event = WindowEvent()
      If Event = #PB_Event_CloseWindow : Quit = 1 : EndIf
    Until Event = 0

    Delay(20) ; a little delay (20 milli seconds -> 50 fps)

    If ExamineJoystick(0)
      x+JoystickAxisX(0)
      y+JoystickAxisY(0)

      If JoystickButton(0, 1)
        MessageRequester("Info", "Button 1 has been pressed", 0)
      EndIf

      If JoystickButton(0, 2)
        MessageRequester("Info", "Button 2 has been pressed", 0)
      EndIf

      If StartDrawing(WindowOutput(0)) ; Set the drawing output to our window
        FrontColor(RGB(255,0,0))      ; Use the RED colour
        Box(x, y, 10, 10)         ; Draw a little box
        StopDrawing()             ;
      EndIf
    EndIf

  Until Quit = 1

EndIf

End


Keyboard.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Keyboard example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitKeyboard() = 0 Or InitSprite() = 0
  MessageRequester("Error", "Can't initialize the sprite system.", 0)
  End
EndIf

MessageRequester("Information", "This will test the fast keyboard access..."+#LF$+"Press 'ESC' to quit!", 0)

If OpenScreen(800, 600, 32, "Keyboard")

  x = 100
  y = 100

  LoadSprite(0, "Data/PureBasic.bmp", 0)

  Repeat

    FlipBuffers()

    ClearScreen(RGB(0,0,0))

    ExamineKeyboard()

    If KeyboardPushed(#PB_Key_Left)
      x-1
    EndIf

    If KeyboardPushed(#PB_Key_Right)
      x+1
    EndIf

    If KeyboardPushed(#PB_Key_Up)
      y-1
    EndIf

    If KeyboardPushed(#PB_Key_Down)
      y+1
    EndIf

    For OffsetY=0 To 600 Step 70
      For OffsetX=0 To 800 Step 200
        DisplaySprite(0, OffsetX+x, y+OffsetY)
      Next

      For OffsetX=0 To 800 Step 200
        DisplaySprite(0, OffsetX+x+90, y+OffsetY+35)
      Next
    Next

  Until KeyboardPushed(#PB_Key_Escape)

Else
  MessageRequester("Error", "Impossible to open a 800*600 32 bit screen",0)
EndIf

End


Library.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Library
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

CompilerSelect #PB_Compiler_OS

  CompilerCase #PB_OS_Windows

      If OpenLibrary(0, "USER32.DLL")

        *MessageBox = GetFunction(0, "MessageBoxA")
        If *MessageBox
          CallFunctionFast(*MessageBox, 0, @"Body", @"Title", 0)
        EndIf

        CloseLibrary(0)
      EndIf

  CompilerCase #PB_OS_Linux

      If OpenLibrary(0, "libc.so")

        *MAlloc = GetFunction(0, "malloc")
        If *MAlloc
          *Buffer = CallCFunctionFast(*MAlloc, 128)
          If *Buffer
            Debug "Buffer allocated"

            CallCFunction(0, "free", *Buffer)

          EndIf
        EndIf

        CloseLibrary(0)
      EndIf

CompilerEndSelect


Light.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Light
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    LoadMesh   (0, "robot.mesh")
    LoadTexture(0, "r2skin.jpg")

    CreateEntity (0, MeshID(0), CreateMaterial(0, TextureID(0)))
    StartEntityAnimation(0, "Walk")

    CreateLight(0, RGB(0, 0, 255),  100.0, 0, 0)  ; Blue light
    CreateLight(1, RGB(255, 0, 0), -100.0, 0, 0)  ; Red light

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 40, 150, #PB_Absolute)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateEntity(0, 0, 1, 0, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


LightAttenuation.pb

;
; ------------------------------------------------------------
;
;   PureBasic - LightAttenuation
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY
Define DebugBody

#CameraSpeed = 1

If InitEngine3D(#PB_Engine3D_DebugLog | #PB_Engine3D_DebugOutput)

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts",#PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    KeyboardMode(#PB_Keyboard_International)

    WorldShadows(#PB_Shadow_Modulative, -1, RGB(155, 0, 0))

    ;Materials
    ;
    CreateMaterial(1, LoadTexture(1, "Wood.jpg"))
    CreateMaterial(2, LoadTexture(2, "Dirt.jpg"))

    ; Ground
    ;
    CreatePlane(0, 100, 100, 10, 10, 15, 15)
    CreateEntity(0, MeshID(0), MaterialID(2))
    EntityRenderMode(0, 0)

    ; Meshes
    ;
    CreateCube(1, 2)
    CreateSphere(2, 2, 50, 50)
    CreateCylinder(3, 1, 4)

    ; Entities
    ;
    CreateEntity(1, MeshID(1), MaterialID(1), -5, 1, -5)
    CreateEntity(2, MeshID(2), MaterialID(1),  0, 2,  0)
    CreateEntity(3, MeshID(3), MaterialID(1),  5, 2,  5)

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 10, 10, -50, #PB_Absolute)
    CameraLookAt(0, 0, 0, 0)

    ; Light
    ;
    CreateLight(0, RGB(255, 127, 0), 3, 8, -10)
    SetLightColor(0, #PB_Light_SpecularColor, RGB(255, 255, 0))
    LightAttenuation(0, 100, 1.0)

    AmbientColor(RGB(0, 0, 0))

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      MoveCamera  (0, KeyX, 0, KeyY)
      RotateCamera(0,  MouseY, MouseX, 0, #PB_Relative)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()

    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1

  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


LightDirectionXYZ.pb

;
; ------------------------------------------------------------
;
;   PureBasic - LightDirectionX/Y/Z
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

#PB_Material_SelfIlluminationColor = 3

IncludeFile "Screen3DRequester.pb"

Define.f x, y, z, Distance = 1500

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts"             , #PB_3DArchive_FileSystem)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    KeyboardMode(#PB_Keyboard_International)

    ; Ground
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1000, 1000, 50, 50, 1, 1)
    CreateEntity (0, MeshID(0), MaterialID(0))

    ; Light
    CreateLight(0, RGB(255, 255, 255), 0, 400, 0, #PB_Light_Spot)
    SpotLightRange(0, 1, 30, 3)
    AmbientColor(0)

    ; spot
    CreateSphere(1, 20, 50, 50)
    GetScriptMaterial(1, "Color/Yellow")
    SetMaterialColor(1, #PB_Material_SelfIlluminationColor, RGB(185, 155, 65))
    CreateEntity(1, MeshID(1), MaterialID(1), LightX(0), LightY(0), LightZ(0))

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 900, 1000, #PB_Absolute)
    CameraLookAt(0, 0, 0, 0)
    CameraBackColor(0, RGB(0, 0, 30))

    ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor

    Repeat
      Screen3DEvents()

      If ExamineMouse()

        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))

        If MousePick(0, MouseX(), MouseY()) >= 0
          LightLookAt(0, PickX(), PickY(), PickZ())
        EndIf

      EndIf

      ExamineKeyboard()

      x = LightX(0) + LightDirectionX(0) * Distance
      y = LightY(0) + LightDirectionY(0) * Distance
      z = LightZ(0) + LightDirectionZ(0) * Distance
      CreateLine3D(10, LightX(0), LightY(0), LightZ(0),  RGB(0, 255, 0), x, y, z, RGB(0, 255, 0))

      RenderWorld()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf


LightLookAt.pb

;
; ------------------------------------------------------------
;
;   PureBasic - LightLookAt
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ;- Ground
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1000, 1000, 50, 50, 1, 1)
    CreateEntity (0, MeshID(0), MaterialID(0))

    ;- Light
    CreateLight(0, RGB(255, 255, 255), 0, 900, 0, #PB_Light_Spot)
    SpotLightRange(0, 1, 30, 3)
    AmbientColor(0)

    ;- Camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 900, 1200, #PB_Absolute)
    CameraLookAt(0, 0, 0, 0)
    CameraBackColor(0, RGB(0, 0, 30))

    ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor

    Repeat
      Screen3DEvents()

      If ExamineMouse()

        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))

        If MousePick(0, MouseX(), MouseY()) >= 0
          LightLookAt(0, PickX(), PickY(), PickZ())
        EndIf

      EndIf

       If ExamineKeyboard()
        Input$ = KeyboardInkey()
      EndIf

      RenderWorld()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf(


LinkedList.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Linked list example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

Structure BasicStructure
    Field1.b
    Field2.w
    Field3.l
EndStructure

Structure ComplexStructure
    Field1.b
   *Basic.BasicStructure              ; Pointer to a BasicStructure object
    Basic2.BasicStructure             ; Creation of the BasicStructure object inside this structure
   *Next.ComplexStructure             ; Pointer to another ComplexStructure object
EndStructure

NewList TestList.BasicStructure()

;
;-------- Add Elements and TestLists --------
;

AddElement(TestList())
TestList()\Field2 = 1

AddElement(TestList())
TestList()\Field2 = 2

AddElement(TestList())
TestList()\Field2 = 3

AddElement(TestList())
TestList()\Field2 = 4

;
;-------- MessageRequester("Number of elements in the list:", Str(TestList()\Field2), 0) --------
;

MessageRequester("Number of elements in the list:", Str(ListSize(TestList())), 0)

; First way to list all the elements
;
ResetList(TestList())               ; Reset the list index before the first element.

While NextElement(TestList())       ; Process all the elements...
  MessageRequester("List elements :", "Field2 value : "+Str(TestList()\Field2), 0)
Wend

; Second way, with the help of ForEach
;
ForEach TestList()       ; Process all the elements...
  MessageRequester("List elements :", "Field2 value : "+Str(TestList()\Field2), 0)
Next

SelectElement(TestList(), 2)  ; Go directly to the 3rd element
MessageRequester("3rd Element", "Field2 value : "+Str(TestList()\Field2), 0)

MessageRequester("Linked List - Example", "Finished", 0)

End


Mail.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Mail example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

InitNetwork()

If CreateMail(0, "fred@purebasic.com", "Hello !")

  SetMailBody(0, "Hello !" + #CRLF$ +
                 "This is a multi-" + #CRLF$ +
                 "line mail !")

  AddMailAttachment(0, "My description", "brook_3d.png")
  AddMailAttachment(0, "My description 2", "test.bmp")

  AddMailRecipient(0, "test@yourdomain.com", #PB_Mail_To)
  AddMailRecipient(0, "test2@yourdomain.com", #PB_Mail_Cc)

  Result = SendMail(0, "smtp.free.fr", 25, 1)

  Repeat
    Progress = MailProgress(0)
    Delay(300)
  Until Progress = #PB_Mail_Finished Or Progress = #PB_Mail_Error

  If Progress = #PB_Mail_Finished
    MessageRequester("Information", "Mail correctly sent !")
  Else
    MessageRequester("Error", "Can't sent the mail !")
  EndIf

EndIf


Material.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Material
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    AmbientColor(RGB(255,255,255))

    LoadMesh   (0, "robot.mesh")
    CreateMaterial(0, LoadTexture(0, "r2skin.jpg"))

    CreateMaterial(1, LoadTexture(1, "clouds.jpg"))
    MaterialBlendingMode(1, #PB_Material_AlphaBlend)  ; Alphablending for this texture

    CreateEntity  (0, MeshID(0), MaterialID(1))
    CreateEntity  (1, MeshID(0), MaterialID(0))

    MoveEntity(1, 60, 0, 0)

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 40, 150, #PB_Absolute)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateEntity(0, 0, -0.5, 0, #PB_Relative)
      RotateEntity(1, 0, 0.5, 0, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


MaterialFog.pb

;
; ------------------------------------------------------------
;
;   PureBasic - MaterialFog
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

If InitEngine3D()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()
    Add3DArchive("Data/"                , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Textures"        , #PB_3DArchive_FileSystem)

    ; Material
    ;
    CreateMaterial(0, LoadTexture(0, "MRAMOR6X6.jpg"))
    MaterialFog(0, RGB(255, 175, 175), 1, 0, 700)

    CreatePlane(0, 300, 300, 10, 10, 1, 1)
    CreateEntity(0, MeshID(0), MaterialID(0), -16, 0, 0)

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 150, 300, #PB_Absolute)
    CameraLookAt(0, 0, 0, 0)
    CameraBackColor(0, RGB(0, 0, 30))

    ;- Light
    ;
    AmbientColor(RGB(75, 75, 75))
    CreateLight(0, RGB(255, 255, 255), 0, 500, 0)

    ;Fog(RGB(55, 55, 175), 1, 0, 1000)

    Repeat
      Screen3DEvents()

      ExamineKeyboard()
      RenderWorld()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape)

    End

  EndIf
Else
  MessageRequester("Error","Can't initialize engine3D")
EndIf


MaterialTransparent.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Material Transparent
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, RollZ, Blend, Pas = 0.2

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    CreateCube(0, 50)
    CreateSphere(1, 5)

    CreateMaterial(0, LoadTexture(0, "dirt.jpg"))
    MaterialBlendingMode(0, #PB_Material_AlphaBlend)

    CreateEntity(0, MeshID(0), MaterialID(0))

    SkyBox("stevecube.jpg")

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 90, 80, 150, #PB_Absolute)

    Repeat
      Screen3DEvents()

      ExamineKeyboard()

      Blend + pas
      If blend >= 255 Or Blend <= 0
        pas = -pas
      EndIf

      SetMaterialColor(0, #PB_Material_DiffuseColor, RGBA(255, 255, 255, Blend))

      RotateEntity(0, 0, 0.4, 0, #PB_Relative)
      MoveEntity(0, 0, 0, -1, #PB_Local)

      CameraLookAt(0, EntityX(0), EntityY(0), EntityZ(0))
      RenderWorld()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Math.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Math example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If OpenWindow(0, 200, 200, 400, 400, "Test")

  ImageGadget(0, 0, 0, 400, 400, 0)

  CreateImage(0, 400, 400)

  X.f = Random(80)
  Y.f = X

  Repeat
    Event = WaitWindowEvent(10)

    If Event = 0
      a.f+0.01

      If StartDrawing(ImageOutput(0))

        FrontColor(RGB(0, Random(255), Random(255)))

        x2.f = X*Cos(a) + Y*Sin(a)
        y2.f = X*Sin(a) - Y*Cos(a)

        Plot(200+x2, 200+y2)
        Plot(100+x2, 200+y2)

        Delay(10)

        StopDrawing()
      EndIf

      SetGadgetState(0, ImageID(0))
    EndIf

  Until Event = #PB_Event_CloseWindow

EndIf


MDI_ImageViewer.pb

;
; ------------------------------------------------------------
;
;   PureBasic - MDI example file
;
;    (c) 2004 - Fantaisie Software
;
; ------------------------------------------------------------
;

Structure MDIWindow
  ; info about the loaded image
  Image.i
  ImageWidth.l
  ImageHeight.l

  ; Our MDI Window
  Window.i

  ; gadget numbers
  ScrollAreaGadget.i
  ImageGadget.i
EndStructure

Global NewList MDIWindow.MDIWindow()

#WINDOW = 0
#TOOLBAR = 0
#MENU = 0

#MDI_Base = 1

Enumeration
  #MENU_Open
  #MENU_Close
  #MENU_CloseAll
  #MENU_Quit

  #MENU_TileV
  #MENU_TileH
  #MENU_Cascade
  #MENU_Arrange
  #MENU_Previous
  #MENU_Next

  #MENU_FirstMDI
EndEnumeration

UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()

Procedure SelectMDIWindow(Window)

  ForEach MDIWindow()
    If MDIWindow()\Window = Window
      ProcedureReturn 1
    EndIf
  Next

EndProcedure

#GADGET_MDI = 0

#WindowFlags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget

If OpenWindow(#WINDOW, 0, 0, 800, 600, "MDI ImageViewer", #WindowFlags)
  If CreateMenu(#MENU, WindowID(#WINDOW))
    MenuTitle("File")
      MenuItem(#MENU_Open, "Open")
      MenuItem(#MENU_Close, "Close")
      MenuItem(#MENU_CloseAll, "Close All")
      MenuBar()
      MenuItem(#MENU_QUit, "Quit")
    MenuTitle("Windows")
      MenuItem(#MENU_TileV, "Tile vertically")
      MenuItem(#MENU_TileH, "Tile horizontally")
      MenuItem(#MENU_Cascade, "Cascade")
      MenuItem(#MENU_Previous, "Previous")
      MenuItem(#MENU_Next, "Next")

      ; MDI subwindows will get added here
  EndIf

  If CreateToolBar(#TOOLBAR, WindowID(#WINDOW))
    ToolBarStandardButton(#MENU_Open, #PB_ToolBarIcon_Open)
    ToolBarStandardButton(#MENU_Close, #PB_ToolBarIcon_Delete)
    ToolBarSeparator()
    ToolBarStandardButton(#MENU_Previous, #PB_ToolBarIcon_Undo)
    ToolBarStandardButton(#MENU_Next, #PB_ToolBarIcon_Redo)
  EndIf

  MDIGadget(#GADGET_MDI, 0, 0, 0, 0, 1, #MENU_FirstMDI, #PB_MDI_AutoSize)

  Quit = 0
  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_CloseWindow
      Window = EventWindow()

      If Window = #WINDOW ; Out main window is closed, just quit
        Quit = 1

      Else ; It's one of our MDI children

        If SelectMDIWindow(Window) ; Check if it's one of our MDI window
          CloseWindow(Window)
          FreeImage(MDIWindow()\Image)
          DeleteElement(MDIWindow())
        EndIf

      EndIf

    ElseIf Event = #PB_Event_Menu
      Select EventMenu()
        Case #MENU_Open
          FileName$ = OpenFileRequester("Open Image", DefautFile$, "Image Files (*.bmp,*.jpg,*.tiff,*.png,*.tga)|*.bmp;*.jpg;*.tiff;*.png;*.tga|All Files (*.*)|*.*", 0, #PB_Requester_MultiSelection)
          While FileName$
            DefaultFile$ = FileName$

            Image = LoadImage(#PB_Any, FileName$)
            If Image

              LastElement(MDIWindow())
              AddElement(MDIWindow())

              Item = ListIndex(MDIWindow())

              MDIWindow()\Image       = Image
              MDIWIndow()\ImageWidth  = ImageWidth(Image)  ; ***
              MDIWindow()\ImageHeight = ImageHeight(Image)

              MDIWindow()\Window = AddGadgetItem(#GADGET_MDI, -1, FileName$)

                Width  = WindowWidth (MDIWindow()\Window)
                Height = WindowHeight(MDIWindow()\Window)

                MDIWindow()\ScrollAreaGadget = ScrollAreaGadget(#PB_Any, 0, 0, Width, Height, MDIWindow()\ImageWidth, MDIWindow()\ImageHeight, 10)
                  MDIWindow()\ImageGadget = ImageGadget(#PB_Any, 0, 0, MDIWindow()\ImageWidth, MDIWindow()\ImageHeight, ImageID(Image))
                CloseGadgetList()

            Else
              MessageRequester("Image Viewer","Could not load image: "+FileName$)
            EndIf

            FileName$ = NextSelectedFileName()
          Wend

        Case #MENU_Close
          Window = GetGadgetState(#GADGET_MDI)
          If Window <> -1
            CloseWindow(Window)

            SelectMDIWindow(Window)
            FreeImage(MDIWindow()\Image)
            DeleteElement(MDIWindow())
          EndIf

        Case #MENU_CloseAll

          ForEach MDIWindow()
            CloseWindow(MDIWindow()\Window)
            FreeImage(MDIWindow()\Image)
          Next
          ClearList(MDIWindow())

        Case #MENU_Quit
          Quit = 1

        Case #MENU_TileV
          SetGadgetState(#GADGET_MDI, #PB_MDI_TileVertically)

        Case #MENU_TileH
          SetGadgetState(#GADGET_MDI, #PB_MDI_TileHorizontally)

        Case #MENU_Cascade
          SetGadgetState(#GADGET_MDI, #PB_MDI_Cascade)

        Case #MENU_Arrange
          SetGadgetState(#GADGET_MDI, #PB_MDI_Arrange)

        Case #MENU_Previous
          SetGadgetState(#GADGET_MDI, #PB_MDI_Previous)

        Case #MENU_Next
          SetGadgetState(#GADGET_MDI, #PB_MDI_Next)

      EndSelect

    ElseIf Event = #PB_Event_SizeWindow

      Window = EventWindow()

      If SelectMDIWindow(Window)
        ResizeGadget(MDIWindow()\ScrollAreaGadget, 0, 0, WindowWidth(Window), WindowHeight(Window))
      EndIf

    EndIf

  Until Quit = 1
EndIf


MemoryBank.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Memory example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

*MemoryID = AllocateMemory(1000)

*Pointer = *MemoryID
CopyMemoryString("Hello ", @*Pointer)
CopyMemoryString("World")

*NewMemoryID = ReAllocateMemory(*MemoryID, 2000) ; need more memory
If *NewMemoryID
  ; work with *NewMemoryID now with size 2000
  ;
  Debug "The old content is still here:"
  Debug PeekS(*NewMemoryID)
  FreeMemory(*NewMemoryID)
Else
  ; resizing failed, keep working with *MemoryID (size 1000)
  ;
  FreeMemory(*MemoryID)
EndIf


Menu.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Menu example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

;
; We just have to open a window and see when an event happen on the menu
;

If OpenWindow(0, 100, 150, 195, 260, "PureBasic - Menu")

  ;
  ; Create the menu. The indent is very important here for a good lisibility
  ;

  If CreateMenu(0, WindowID(0))
    MenuTitle("File")
      MenuItem( 1, "&Load...")
      MenuItem( 2, "Save")
      MenuItem( 3, "Save As...")
      MenuBar()
      OpenSubMenu("Recents")
        MenuItem( 5, "Pure.png")
        MenuItem( 6, "Basic.jpg")
        OpenSubMenu("Even more !")
          MenuItem( 12, "Yeah")
        CloseSubMenu()
        MenuItem( 13, "Rocks.tga")
      CloseSubMenu()
      MenuBar()
      MenuItem( 7, "&Quit")

    MenuTitle("Edition")
      MenuItem( 8, "Cut")
      MenuItem( 9, "Copy")
      MenuItem(10, "Paste")

    MenuTitle("?")
      MenuItem(11, "About")

  EndIf

  DisableMenuItem(0, 3, 1)
  DisableMenuItem(0, 13, 1)

  ;
  ; This is the 'event loop'. All the user actions are processed here.
  ; It's very easy to understand: when an action occurs, the Event
  ; isn't 0 and we just have to see what have happened...
  ;

  Repeat

    Select WaitWindowEvent()

      Case #PB_Event_Menu

        Select EventMenu()  ; To see which menu has been selected

          Case 11 ; About
            MessageRequester("About", "Cool Menu example", 0)

          Default
            MessageRequester("Info", "MenuItem: "+Str(EventMenu()), 0)

        EndSelect

      Case #PB_Event_CloseWindow
        Quit = 1

    EndSelect

  Until Quit = 1

EndIf

End


Mesh.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Mesh (Skeleton Animation)
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

#PB_Material_SpecularColor = 1
#PB_Material_AmbientColor  = 2

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

#CameraSpeed  = 1
#RobotMesh    = 0
#RobotTexture = 0
#Robot        = 0

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    LoadMesh   (#RobotMesh   , "robot.mesh")
    LoadTexture(#RobotTexture, "clouds.jpg")

    CreateMaterial(0, TextureID(#RobotTexture))

    CreateEntity(#Robot, MeshID(#RobotMesh), MaterialID(0))
    SetEntityMaterial(#Robot, MaterialID(0))

    StartEntityAnimation(#Robot, "Walk")

    DisableMaterialLighting(0, 1)

    SetMaterialColor(0, #PB_Material_AmbientColor, RGB(100, 100, 100))
    SetMaterialColor(0, #PB_Material_SpecularColor, RGB(255, 255, 255))
    ScrollMaterial(0, 0.15, 0, 1)

    CreateLight(0, RGB(0,0,255), 100.0, 0, 0)
    SetLightColor(0, #PB_Light_SpecularColor, RGB(255, 0, 0))

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 40, 150)
    CameraBackColor(0, RGB(0, 0, 128))

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateEntity(#Robot, 0, 1, 0, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


MeshManual2.pb

;
; ------------------------------------------------------------
;
;   PureBasic - MeshManual
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1
#scale = 3

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/fonts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ;- Material
    CreateMaterial(0, LoadTexture(0, "White.jpg"))
    DisableMaterialLighting(0, #True)

    ;- Mesh Plane
    CreateMesh(0, #PB_Mesh_LineStrip, #False)
    MeshVertexPosition(-10, 0, -10)
    MeshVertexColor(RGB(255,0,0))
    MeshVertexPosition(-10, 0,  10)
    MeshVertexColor(RGB(255,255,0))
    MeshVertexPosition( 10, 0,  10)
    MeshVertexColor(RGB(255,0,255))
    MeshVertexPosition( 10, 0, -10)
    MeshVertexColor(RGB(0,255,0))
    MeshVertexPosition(-10, 0, -10)
    MeshVertexColor(RGB(255,0,0))
    FinishMesh(#False)

    SetMeshMaterial(0, MaterialID(0))
    Plane = CreateNode(#PB_Any, -40, 0, 0)
    AttachNodeObject(Plane, MeshID(0))

    ;- Mesh Stars
    CreateMesh(1, #PB_Mesh_PointList, #False)
    For i = 0 To 10000
      MeshVertexPosition(Random(200)-100, Random(200)-100, Random(200)-100)
      MeshVertexColor(RGB(255,255,0))
    Next i
    FinishMesh(#False)

    SetMeshMaterial(1, MaterialID(0))

    Stars = CreateNode(#PB_Any)
    AttachNodeObject(Stars, MeshID(1))

    ;- Mesh Box
    CreateMesh(2, #PB_Mesh_LineStrip, #False)
    MeshVertexPosition(-10, -10, -10)
    MeshVertexPosition(-10, -10,  10)
    MeshVertexPosition( 10, -10,  10)
    MeshVertexPosition( 10, -10, -10)
    MeshVertexPosition(-10, -10, -10)
    AddSubMesh(#PB_Mesh_LineStrip)
    MeshVertexPosition(-10,  10, -10)
    MeshVertexPosition(-10,  10,  10)
    MeshVertexPosition( 10,  10,  10)
    MeshVertexPosition( 10,  10, -10)
    MeshVertexPosition(-10,  10, -10)
    AddSubMesh(#PB_Mesh_LineList)
    MeshVertexPosition(-10, -10, -10)
    MeshVertexPosition(-10,  10, -10)
    MeshVertexPosition(-10, -10,  10)
    MeshVertexPosition(-10,  10,  10)
    MeshVertexPosition( 10, -10,  10)
    MeshVertexPosition( 10,  10,  10)
    MeshVertexPosition( 10, -10, -10)
    MeshVertexPosition( 10,  10, -10)
    FinishMesh(#False)

    SetMeshMaterial(2, MaterialID(0))
    Box = CreateNode(#PB_Any, 40, 0, 0)
    AttachNodeObject(Box, MeshID(2))

    ;- Mesh Grid
    CreateMesh(3, #PB_Mesh_LineList, #False)
    For i=0 To 20
      MeshVertexPosition(-20, 0, (i-10)*-2)
      MeshVertexColor(RGB(55,155,255))
      MeshVertexPosition(20, 0, (i-10)*-2)
      MeshVertexColor(RGB(55,155,255))
    Next
    For i=0 To 20
      MeshVertexPosition((i-10)*-2, 0, -20)
      MeshVertexColor(RGB(255,155,55))
      MeshVertexPosition((i-10)*-2, 0,  20)
      MeshVertexColor(RGB(255,155,55))
    Next
    FinishMesh(#False)

    SetMeshMaterial(3, MaterialID(0))
    Grid = CreateNode(#PB_Any, 0, 0, 0)
    AttachNodeObject(Grid, MeshID(3))

    ;- Mesh Plane (using MeshIndex)
    CreateMesh(4, #PB_Mesh_LineStrip, #False)

    ; Define vertex position of index 0..3
    MeshVertexPosition(-10, 0, -10)
    MeshVertexPosition(-10, 0,  10)
    MeshVertexPosition( 10, 0,  10)
    MeshVertexPosition( 10, 0, -10)

    ; Define usage of vertices by refering To the indexes
    MeshIndex(0)
    MeshIndex(1)
    MeshIndex(2)
    MeshIndex(3)
    MeshIndex(0)
    FinishMesh(#False)

    SetMeshMaterial(4, MaterialID(0))
    Plane2 = CreateNode(#PB_Any, 0, 30, 0)
    AttachNodeObject(Plane2, MeshID(4))

    ;- Mesh Box (using MeshIndex)
    CreateMesh(5, #PB_Mesh_LineList, #False)

    ; Define vertex position of index 0..7
    MeshVertexPosition(-10, -10, -10)
    MeshVertexPosition(-10, -10,  10)
    MeshVertexPosition( 10, -10,  10)
    MeshVertexPosition( 10, -10, -10)
    MeshVertexPosition(-10,  10, -10)
    MeshVertexPosition(-10,  10,  10)
    MeshVertexPosition( 10,  10,  10)
    MeshVertexPosition( 10,  10, -10)

    ; Define usage of vertices by refering To the indexes
    MeshIndex(0)
    MeshIndex(1)
    MeshIndex(1)
    MeshIndex(2)
    MeshIndex(2)
    MeshIndex(3)
    MeshIndex(0)
    MeshIndex(3)

    MeshIndex(4)
    MeshIndex(5)
    MeshIndex(5)
    MeshIndex(6)
    MeshIndex(6)
    MeshIndex(7)
    MeshIndex(4)
    MeshIndex(7)

    MeshIndex(0)
    MeshIndex(4)
    MeshIndex(1)
    MeshIndex(5)
    MeshIndex(2)
    MeshIndex(6)
    MeshIndex(3)
    MeshIndex(7)

    FinishMesh(#False)

    SetMeshMaterial(5, MaterialID(0))
    Box2 = CreateNode(#PB_Any, 0, -30, 0)
    AttachNodeObject(Box2, MeshID(5))

    ;-Camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 40, 150, #PB_Absolute)
    CameraFOV(0, 40)
    CameraLookAt(0, NodeX(Grid),  NodeY(Grid),  NodeZ(Grid))
    CameraBackColor(0, RGB(0, 0, 40))

    ;-Light
    CreateLight(0, RGB(255,255,255), -10, 60, 10)
    AmbientColor(RGB(90, 90, 90))

    Repeat
      Screen3DEvents()

      ExamineKeyboard()

      RotateNode(Plane, 0.3, -0.3, -0.3, #PB_Relative)
      RotateNode(Stars, 0.1, 0.05, 0.05, #PB_Relative)
      RotateNode(Box, 0.3, 0.3, 0.3, #PB_Relative)
      RotateNode(Grid, 0.3, 0.3, 0.3, #PB_Relative)
      RotateNode(Plane2, 0.3, -0.3, -0.3, #PB_Relative)
      RotateNode(Box2, 0.3, 0.3, 0.3, #PB_Relative)
      RenderWorld()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


MeshManual.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Manual Mesh
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1
#PB_Mesh_PointList     = 1 ; A List of points, 1 vertex per point
#PB_Mesh_LineList      = 2 ; A List of lines, 2 vertices per line
#PB_Mesh_LineStrip     = 3 ; A strip of connected lines, 1 vertex per line plus 1 start vertex
#PB_Mesh_TriangleList  = 4 ; A List of triangles, 3 vertices per triangle
#PB_Mesh_TriangleStrip = 5 ; A strip of triangles, 3 vertices For the first triangle, And 1 per triangle after that
#PB_Mesh_TriangleFan   = 6 ; A fan of triangles, 3 vertices For the first triangle, And 1 per triangle after that

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

Define.f x, y, z, nx, ny, nz, u, v
Define.l Co
Define.w t1, t2, t3

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ; Create a pyramid, manually.. See the DataSection, for more precisions
    ;

    Restore Pyramid

    CreateMesh(0, #PB_Mesh_TriangleList)

    ;Base
    For i = 0 To 3
      Read.f x : Read.f y : Read.f z
      Read.l Co
      Read.f u : Read.f v
      MeshVertexPosition(x, y, z)
      MeshVertexNormal(0, 0, 0)
      MeshVertexColor(Co)
      MeshVertexTextureCoordinate(u, v)
    Next

    For i = 0 To 1
      Read.w t1 : Read.w t2 : Read.w t3
      MeshFace(t1, t2, t3)
    Next

    ;Side
    For k=0 To 3

      AddSubMesh(#PB_Mesh_TriangleList)
      For i = 0 To 2
        Read.f x : Read.f y : Read.f z
        Read.l Co
        Read.f u : Read.f v
        MeshVertexPosition(x, y, z)
        MeshVertexNormal(0, 0, 0)
        MeshVertexColor(Co)
        MeshVertexTextureCoordinate(u, v)
      Next i
      Read.w t1 : Read.w t2 : Read.w t3
      MeshFace(t1, t2, t3)

    Next

    FinishMesh(#True)
    NormalizeMesh(0)

    UpdateMeshBoundingBox(0)

    CreateMaterial(0, LoadTexture(0, "Geebee2.bmp"))
    ;SetMaterialColor(0, #PB_Material_AmbientColors, #PB_Material_AmbientColor)

    CreateEntity(0, MeshID(0), MaterialID(0))
    ScaleEntity(0, 400, 200, 400)

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 0, 1000, #PB_Absolute)

    CreateLight(0, RGB(255,255,255), 300, 600, -100)
    AmbientColor(RGB(80, 80, 80))

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateEntity(0, 1, 1, 1, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End

DataSection
  Pyramid:
  ;Base
  Data.f -0.5,-0.5,0.5  ; position
  Data.l $FF            ; color
  Data.f 0,0            ; UVCoordinate

  Data.f 0.5,-0.5,0.5   ; position
  Data.l $FF            ; color
  Data.f 0,1            ; UVCoordinate

  Data.f 0.5,-0.5,-0.5  ; position
  Data.l $FF            ; color
  Data.f 1,1            ; UVCoordinate

  Data.f -0.5,-0.5,-0.5 ; position
  Data.l $FF            ; color
  Data.f 1,0            ; UVCoordinate

  Data.w 2,1,0          ; Face
  Data.w 0,3,2          ; Face

  ;-Front
  Data.f 0.5,-0.5,0.5   ; position
  Data.l $FFFFFF        ; color
  Data.f 1,0            ; UVCoordinate

  Data.f 0.0,0.5,0.0
  Data.l $FFFFFF
  Data.f 0.5,0.5

  Data.f -0.5,-0.5,0.5
  Data.l $FFFFFF
  Data.f 0,0

  Data.w 0,1,2         ; Face

  ;-Back
  Data.f -0.5,-0.5,-0.5
  Data.l $FFFFFF
  Data.f 0,1

  Data.f 0.0,0.5,0.0
  Data.l $FFFFFF
  Data.f 0.5,0.5

  Data.f 0.5,-0.5,-0.5
  Data.l $FFFFFF
  Data.f 1,1

  Data.w 0,1,2

  ;-Left
  Data.f -0.5,-0.5,0.5
  Data.l $FFFFFF
  Data.f 0,0

  Data.f 0.0,0.5,0.0
  Data.l $FFFFFF
  Data.f 0.5,0.5

  Data.f -0.5,-0.5,-0.5
  Data.l $FFFFFF
  Data.f 0,1

  Data.w 0,1,2

  ;-Right
  Data.f 0.5,-0.5,-0.5
  Data.l $FFFFFF
  Data.f 1,1

  Data.f 0.0,0.5,0.0
  Data.l $FFFFFF
  Data.f 0.5,0.5

  Data.f 0.5,-0.5,0.5
  Data.l $FFFFFF
  Data.f 1,0

  Data.w 0,1,2

EndDataSection


MeshManualCube.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Manul Mesh
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;
#PB_Material_AmbientColor  = 2

#CameraSpeed = 3
#SQRT13 = 0.57735026

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ; Create a cube manually
    ;

    ; Define all the vertices and their attributes
    CreateMesh(0)
    MeshVertexPosition(-100, 100, -100)
    MeshVertexNormal(-#SQRT13,#SQRT13,-#SQRT13)
    MeshVertexColor(RGB(255, 0, 0))

    MeshVertexPosition(100, 100, -100)
    MeshVertexNormal(#SQRT13,#SQRT13,-#SQRT13)
    MeshVertexColor(RGB(255, 0, 0))

    MeshVertexPosition(100, -100, -100)
    MeshVertexNormal(#SQRT13,-#SQRT13,-#SQRT13)
    MeshVertexColor(RGB(255, 0, 0))

    MeshVertexPosition(-100, -100, -100)
    MeshVertexNormal(-#SQRT13,-#SQRT13,-#SQRT13)
    MeshVertexColor(RGB(255, 0, 255))

    MeshVertexPosition(-100, 100, 100)
    MeshVertexNormal(-#SQRT13,#SQRT13,#SQRT13)
    MeshVertexColor(RGB(255, 0, 0))

    MeshVertexPosition(100, 100, 100)
    MeshVertexNormal(#SQRT13,#SQRT13,#SQRT13)
    MeshVertexColor(RGB(255, 0, 255))

    MeshVertexPosition(100, -100, 100)
    MeshVertexNormal(#SQRT13,-#SQRT13,#SQRT13)
    MeshVertexColor(RGB(255, 0, 0))

    MeshVertexPosition(-100, -100, 100)
    MeshVertexNormal(-#SQRT13,-#SQRT13,#SQRT13)
    MeshVertexColor(RGB(255, 0, 0))

    ; Define all the faces, based on the vertex index
    ;
    MeshFace(0, 2, 3)
    MeshFace(0, 1, 2)
    MeshFace(1, 6, 2)
    MeshFace(1, 5, 6)
    MeshFace(4, 6, 5)
    MeshFace(4, 7, 6)
    MeshFace(0, 7, 4)
    MeshFace(0, 3, 7)
    MeshFace(0, 5, 1)
    MeshFace(0, 4, 5)
    MeshFace(2, 7, 3)
    MeshFace(2, 6, 7)

    FinishMesh(1)

    CreateMaterial(0, LoadTexture(0, "clouds.jpg"))
    SetMaterialColor(0, #PB_Material_AmbientColor, #PB_Material_AmbientColors)

    CreateEntity(0, MeshID(0), MaterialID(0))

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 0, 1000, #PB_Absolute)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateEntity(0, 1, 1, 1, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


Misc.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Misc example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

a$ = "Speed'n'Compactness rulez !"
a.l = 10

PeekL(@a)

b$ = PeekS(@a$)  ; Note: this is useless to do a such thing, it's for example only

MessageRequester("PureBasic", "PeekS result: "+b$, 0)

End


Module.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Module example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitSound() = 0
  MessageRequester("Error", "Sound system not available.") : End
EndIf

FileName$ = OpenFileRequester("","","Modules (*.mod, *.xm, *.it)|*.mod;*.xm", 0)
If FileName$
  If LoadModule(0, FileName$)
    PlayModule(0)
    MessageRequester("PureBasic - Module player", "Playing the module...")

    ; Now, perform a nice fading...
    ;
    For k=100 To 0 Step -1
      Delay(20)
      ModuleVolume(0, k)
    Next

  Else
    MessageRequester("Error", "Can't load the module or bad module format.")
  EndIf
EndIf


Mouse.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Mouse example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitMouse() = 0 Or InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "Can't open DirectX 7", 0)
  End
EndIf

;
;-------- MessageReq and OpenScreen --------
;

MessageRequester("Information", "This will test the fast mouse access..."+Chr(10)+"Press any mouse button to quit!", 0)

If OpenScreen(800, 600, 16, "Mouse") = 0
  MessageRequester("Error", "Impossible to open a 800*600 16 bit screen",0)
  End
EndIf

;
;-------- Init and Load Stuff --------
;

x = 100
y = 100

LoadSprite(0, "Data/PureBasic.bmp", 0)   ; Load nice small Logo

;
;-------- MainLoop --------
;

Repeat
  FlipBuffers()                        ; Flip for DoubleBuffering
  ClearScreen(RGB(0,0,0))                   ; CleanScreen, black

  ExamineKeyboard()
  ExamineMouse()

  x = MouseX()                         ; Returns actual x pos of our mouse
  y = MouseY()                         ; Returns actual y pos of our mouse

  x+MouseWheel()*10

  If MouseButton(#PB_MouseButton_Middle)
    MouseLocate(400, 300)
  EndIf

  DisplaySprite(0, x-SpriteWidth(0)/2, y-SpriteHeight(0)/2)

Until MouseButton(#PB_MouseButton_Left) Or MouseButton(#PB_MouseButton_Right)

End


MousePick.pb

;
; ------------------------------------------------------------
;
;   PureBasic - MousePick
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 0.4

Enumeration
  #MainWindow
  #Editor
EndEnumeration

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ; First create materials
    ;
    GetScriptMaterial(0, "Color/Blue")
    GetScriptMaterial(1, "Color/Green")
    GetScriptMaterial(2, "Color/Red")
    GetScriptMaterial(3, "Color/Yellow")
    CreateMaterial(4, LoadTexture(0, "Dirt.jpg"))

    ; Meshes
    ;
    CreateCube(0, 2)
    CreateSphere(1, 1)
    CreateCylinder(2, 1, 4)
    CreatePlane(3, 20, 20, 1, 1, 1, 1)

    ; Entities
    ;
    CreateEntity(0, MeshID(0), MaterialID(0),  4, 1, 0)
    CreateEntity(1, MeshID(1), MaterialID(1), -4, 1, 0)
    CreateEntity(2, MeshID(2), MaterialID(2),  0, 2, 0)
    CreateEntity(4, MeshID(3), MaterialID(4))

    CreateEntity(3, MeshID(1), MaterialID(3))
    ScaleEntity(3, 0.1, 0.1, 0.1)

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, -1, 8, 15, #PB_Absolute)
    CameraLookAt(0, -1, 0, 0)

    ; Light
    ;
    CreateLight(0, $FFFFFF, 1560, 900, 500)
    AmbientColor($330000)

    ;GUI
    ;
    OpenWindow3D(#MainWindow, 10, 10, 340, 75, "MousePick")
    StringGadget3D(#Editor, 20, 10, 300, 30, "Clic somewhere", #PB_String3D_ReadOnly)

    ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor

    Repeat
      Screen3DEvents()

      Repeat
        Event3D = WindowEvent3D()
      Until Event3D = 0

       If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05

        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))

        If MouseButton(#PB_MouseButton_Left)
          Entity = MousePick(0, MouseX(), MouseY())
          If Entity>=0 And Entity<>3
            MoveEntity(3, PickX(), PickY(), PickZ(), #PB_Absolute)
            SetGadgetText3D(#Editor, "Entity = " + Str(Entity))
          EndIf
        EndIf
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      CameraLookAt(0, 0, 0, 0)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


MouseRayCast.PB

;
; ------------------------------------------------------------
;
;   PureBasic - MouseRayCast
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

#CameraSpeed = 0.4
#N = 2
Enumeration
  #MainWindow
  #Editor
EndEnumeration

Define.f KeyX, KeyY, MouseX, MouseY, RatioX, RatioY, SpeedRotate

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    KeyboardMode(#PB_Keyboard_International)

    WorldDebug(#PB_World_DebugEntity)

    ;-Materials
    ;
    GetScriptMaterial(0, "Color/Blue")
    GetScriptMaterial(1, "Color/Green")
    GetScriptMaterial(2, "Color/Red")
    GetScriptMaterial(3, "Color/Yellow")
    CreateMaterial(4, LoadTexture(0, "Dirt.jpg"))

    ;-Meshes
    ;
    CreateCube(0, 2)
    CreateSphere(1, 1)
    CreateCylinder(2, 1, 4)
    CreatePlane(3, 20, 20, 1, 1, 1, 1)
    LoadMesh(10, "robot.mesh")
    LoadMesh(11, "ninja.mesh")

    ;-Entities
    ;

    CreateEntity(1, MeshID(1), MaterialID(1), -4,  1,  0)
    CreateEntity(2, MeshID(2), MaterialID(2),  0,  2, -4)
    CreateEntity(3, MeshID(0), MaterialID(3), 10,  1, 13)
    CreateEntity(5, MeshID(1), MaterialID(2),  0,  0,  0)
    CreateEntity(6, MeshID(0), MaterialID(0), 14,  1,  0)

    ScaleEntity(3, 8, 1, 1)
    RotateEntity(3, 0, 34, 0)
    ScaleEntity(5, 0.5, 0.5, 0.5)

    ;-Robot
    CreateEntity(10, MeshID(10), #PB_Material_None, -1, -1.5, 5)
    ScaleEntity(10, 0.05, 0.05, 0.05)
    StartEntityAnimation(10, "Walk")

    ;-Ninja
    CreateEntity(11, MeshID(11), #PB_Material_None, 6, -1.5, 12)
    ScaleEntity(11, 0.02, 0.02, 0.02)
    RotateEntity(11,0, 70, 0)
    StartEntityAnimation(11, "Walk")

    ;-Nodes
    ;
    CreateNode(0, 3, 0, 0)
    AttachNodeObject(0, EntityID(5))

    CreateNode(1, 0, 0, 1)
    AttachNodeObject(0, NodeID(1))
    MoveNode(0, 0, 1, 0)

    ;-Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    CameraBackColor(0, RGB(40, 30, 60))
    MoveCamera(0, -1, 8, 15, #PB_Absolute)
    CameraLookAt(0, -1, 0, 0)

    ;-Light
    ;
    CreateLight(0, RGB(255, 255, 255), 1560, 900, 500)
    AmbientColor(RGB(50, 50, 50))

    ;-GUI
    ;
    RatioX = CameraViewWidth(0) / 1920
    RatioY = CameraViewHeight(0) / 1080
    OpenWindow3D(#MainWindow, 0, 0, 420 * RatioX, 110 * RatioY, "MouseRayCast")
    StringGadget3D(#Editor, 10 * RatioX, 20 * RatioY, 360 * RatioX, 40 * RatioY, "", #PB_String3D_ReadOnly)

    ShowGUI(128, 1)

    MouseLocate(CameraViewWidth(0)/2, CameraViewHeight(0)/2)

    Repeat
      Screen3DEvents()

      Repeat
        Event3D = WindowEvent3D()
      Until Event3D = 0

      If ExamineMouse()
        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.5
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.5
        Mx = MouseX()
        My = MouseY()
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Space)
          Stop = 0
        Else
          Stop = 1
        EndIf
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      Entity = MouseRayCast(0, Mx, My,-1)

      If Entity>0

        CreateLine3D(11, PickX(), PickY(), PickZ(), RGB(255,0,0),
                         PickX() + NormalX()*#N,
                         PickY() + NormalY()*#N,
                         PickZ() + NormalZ()*#N, RGB(255,0,0))

        SetGadgetText3D(#Editor, "Entity = " + Str(Entity))
        SpeedRotate = 0.1
      Else
        SetGadgetText3D(#Editor, "I'm looking...")
        SpeedRotate = 0.5
      EndIf

      RotateNode(0, 0, SpeedRotate * Stop, 0, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


Movie.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Movie example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitMovie() = 0
  MessageRequester("Error", "Can't initialize movie playback !", 0)
  End
EndIf

MovieName$ = OpenFileRequester("Choose the movie to play", "", "Movie/Audio files|*.avi;*.mpg;*.asf;*.mp3;*.wav|All Files|*.*", 0)
If MovieName$
  If LoadMovie(0, MovieName$)

    OpenWindow(0, 100, 150, MovieWidth(0), MovieHeight(0), "PureBasic - Movie")
    PlayMovie(0, WindowID(0))

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  Else
    MessageRequester("Error", "Can't load the movie...", 0)
  EndIf
EndIf


MovieSprite.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Movie sprite
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitMovie() And InitSprite() And InitSprite3D() And InitMouse() And InitKeyboard()

  File$ = OpenFileRequester("","","MPEG video files (*.mpg)|*.mpg;*.mpeg",0)

  If File$
    If OpenScreen(800, 600, 32,"movie")

      Surface = CreateSprite(1, 320, 200, #PB_Sprite_Texture)
      CreateSprite3D(0, 1)

      If LoadMovie(0, File$)

        PlayMovie(0, #PB_Movie_Rendered)

        MouseLocate(160, 100)

        Repeat

          FlipBuffers()
          ClearScreen(RGB(0,0,0))

          ExamineKeyboard()
          ExamineMouse()

          RenderMovieFrame(0, Surface) ; Yeah, render the movie directly on our texture...

          DisplaySprite(1, 0, 0)

          DisplaySprite(1, 320, 200)

          Start3D()
            DisplaySprite3D(0, MouseX(), MouseY(), 128)
          Stop3D()

        Until KeyboardPushed(#PB_Key_All)
      EndIf
    EndIf
  EndIf
EndIf


NetworkClient.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Network (Client) example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 6832

ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
If ConnectionID
  MessageRequester("PureBasic - Client", "Client connected to server...", 0)

  SendNetworkString(ConnectionID, "An hello from a client !!! :-)")

  MessageRequester("PureBasic - Client", "A string has been sent to the server, please check it before quit...", 0)

  CloseNetworkConnection(ConnectionID)
Else
  MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf

End


NetworkServer.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Network (Server) example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 6832
*Buffer = AllocateMemory(1000)

If CreateNetworkServer(0, Port)

  MessageRequester("PureBasic - Server", "Server created (Port "+Str(Port)+").", 0)

  Repeat

    SEvent = NetworkServerEvent()

    If SEvent

      ClientID = EventClient()

      Select SEvent

        Case #PB_NetworkEvent_Connect
          MessageRequester("PureBasic - Server", "A new client has connected !", 0)

        Case #PB_NetworkEvent_Data
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a packet !", 0)
          ReceiveNetworkData(ClientID, *Buffer, 1000)
          MessageRequester("Info", "String: "+PeekS(*Buffer), 0)

        Case #PB_NetworkEvent_Disconnect
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has closed the connection...", 0)
          Quit = 1

      EndSelect
    EndIf

  Until Quit = 1

  MessageRequester("PureBasic - Server", "Click to quit the server.", 0)

  CloseNetworkServer(0)
Else
  MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf

End


Node.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Node
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

#CameraSpeed = 1
#NBNode      = 3
#NbBranche   = 7

Define.l i, j
Define.f KeyX, KeyY, MouseX, MouseY

Dim entity(#NbBranche, #NBNode)
Dim Node(#NbBranche, #NBNode)

If InitEngine3D()

  Add3DArchive("Data"                 , #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Textures"        , #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))

    CreateSphere(0, 1)

    d=3

    For j = 0 To #NbBranche

      Node(j, 0) = CreateNode(#PB_Any, 0, 0, 0)
      Entity(j, 0) = CreateEntity(#PB_Any, MeshID(0), MaterialID(0))
      ScaleEntity(Entity(j, 0), 1, 1, 2)
      AttachNodeObject(Node(j, 0), EntityID(Entity(j, 0)))
      MoveEntity(entity(j, 0), 0, 0, d)

      For i = 1 To #NBNode
        Node(j, i) = CreateNode(#PB_Any,0,0,0)
        MoveNode(Node(j, i), 0, 0, d)
        AttachNodeObject(Node(j, i - 1), NodeID(Node(j, i)))
        entity(j, i) = CreateEntity(#PB_Any, MeshID(0), MaterialID(0))
        ScaleEntity(Entity(j, i), 1, 1, 2)
        AttachNodeObject(Node(j, i), EntityID(Entity(j, i)))
        MoveEntity(entity(j, i), 0, 0, d)
      Next

    Next

    ;-Camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 30, 30, #PB_Absolute)
    CameraLookAt(0,NodeX(Node(0, 0)), NodeY(Node(0, 0)), NodeZ(Node(0, 0)))

    ;-Skybox
    SkyBox("stevecube.jpg")

    ;-Light
    CreateLight(0, RGB(255, 255, 255), 0, 500, 100)
    AmbientColor(RGB(85, 85, 85))

    Repeat

      Screen3DEvents()

      If  ExamineMouse()

        For j = 0 To #NbBranche
          RotateNode(Node(j, 0), (45-(MouseY()/8)), 360.0/(#NbBranche+1) * j + (MouseX()/2),0, #PB_Absolute)
          For i = 1 To #NBNode
            RotateNode(Node(j, i), 45-(MouseY()/8), 0, 0, #PB_Absolute)
          Next
        Next

      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Up)
          MoveCamera(0, 0, 0, -#CameraSpeed)
        ElseIf KeyboardPushed(#PB_Key_Down)
          MoveCamera(0, 0, 0, #CameraSpeed)
        EndIf

        If KeyboardPushed(#PB_Key_Left)
          MoveCamera(0, #CameraSpeed, 0, 0)
        ElseIf KeyboardPushed(#PB_Key_Right)
          MoveCamera(0, -#CameraSpeed, 0, 0)
        EndIf

      EndIf

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


NodeAnimation2.pb

;
; ------------------------------------------------------------
;
;   PureBasic - NodeAnimation
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

; Try to play with 'Weight' (and look at cylinder with red ribbon)
#Weight = 1 ; try different values btw 0 to 1

IncludeFile "Screen3DRequester.pb"

Declare AddPath0(No)
Declare AddPath1(No)
Declare AddPath2(No, Weight.f)
Declare AddPath3(No, Weight.f)

If InitEngine3D()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()
    Add3DArchive("Data/"                , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Textures"        , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Models"          , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Scripts"         , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)
    Parse3DScripts()

    WorldShadows(#PB_Shadow_Additive)

    ;- Ground
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1200, 1200, 1, 1, 5, 5)
    CreateEntity(0, MeshID(0), MaterialID(0), 500, 0, -500)

    ;- Cube
    CreateCube(1, 100)
    CreateEntity(1, MeshID(1), #PB_Material_None)

    ;- Sphere
    CreateSphere(2, 50, 50, 50)
    CreateEntity(2, MeshID(2), #PB_Material_None)

    ;- Cylinder
    CreateCylinder(3, 5, 50)
    CreateEntity(3, MeshID(3), #PB_Material_None)

    ;- Cylinder - check point
    CreateCylinder(3, 15, 150)
    CreateEntity(4, MeshID(3), #PB_Material_None, 50,  50,   50)
    CreateEntity(5, MeshID(3), #PB_Material_None, 50,  50, -950)
    CreateEntity(6, MeshID(3), #PB_Material_None, 950, 50, -950)
    CreateEntity(7, MeshID(3), #PB_Material_None, 950, 50,   50)
    CreateEntity(8, MeshID(3), #PB_Material_None, 450, 50, -450)

    ;- Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 500, 1500, 1450, #PB_Absolute)
    CameraFOV(0, 25)
    CameraBackColor(0,$846748)
    CameraLookAt(0, 500, 0, -500)

    ;- Node
    ;
    CreateNode(0)
    AttachNodeObject(0, EntityID(1))

    ;- Light
    ;
    AmbientColor(RGB(25, 25, 25))
    CreateLight(0, RGB(215, 190, 40), -750, 750, -750)

    ;create 3 ribbon trails, just For fun
    ;
    GetScriptMaterial(1, "Examples/LightRibbonTrail")
    CreateRibbonEffect(0, MaterialID(1), 1, 80, 1800)
    RibbonEffectColor(0, 0, RGBA(255*0.8, 255*0.8, 0, 255), RGBA(1, 255, 255, 5))
    RibbonEffectWidth(0, 0, 8, 3)
    AttachRibbonEffect(0, EntityParentNode(3))

    CreateRibbonEffect(1, MaterialID(1), 1, 80, 1800)
    RibbonEffectColor(1, 0, RGBA(0, 255*0.8, 255*0.8, 255), RGBA(0, 255, 0, 5));RGBA(255, 255, 1, 5))
    RibbonEffectWidth(1, 0, 8, 3)
    AttachRibbonEffect(1, EntityParentNode(2))

    CreateRibbonEffect(2, MaterialID(1), 1, 80, 1800)
    RibbonEffectColor(2, 0, RGBA(0, 255, 0, 255), RGBA(1, 1, 1, 5))
    RibbonEffectWidth(2, 0, 8, 3)
    AttachRibbonEffect(2, EntityParentNode(1))

    ;- NodeAnimation
    ;
    AddPath0(0)
    AddPath1(1)

    ;Test Weight
    ;
    AddPath2(2, #Weight)
    AddPath3(3, 1.0 - #Weight)

    Repeat

      Screen3DEvents()

      ExamineKeyboard()

      AddNodeAnimationTime(0, TimeSinceLastFrame * 2)
      AddNodeAnimationTime(1, TimeSinceLastFrame * 2)
      AddNodeAnimationTime(2, TimeSinceLastFrame * 2)
      AddNodeAnimationTime(3, TimeSinceLastFrame * 2)

      EntityLookAt(1, 450, EntityY(1), -450)

      TimeSinceLastFrame = RenderWorld()
      FlipBuffers()

    Until KeyboardPushed(#PB_Key_Escape)

    End

  EndIf
Else
  MessageRequester("Error","Can't initialize engine3D")
EndIf

Procedure AddPath0(NodeAnimation)
  Duration = 15000
  Time = Duration / 5 ; 5 keyFrame
  CreateNodeAnimation(NodeAnimation, NodeID(0), Duration, #PB_NodeAnimation_Spline, #PB_NodeAnimation_LinearRotation)

  ;Animation Cube
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 0.00,  50,  50,   50); key 0
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 1.25, 950,  50,   50); key 1
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 2.50, 950,  50, -950); key 2
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 3.75,  50,  50, -950); key 3
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 5.00,  50,  50,   50); key 4

  StartNodeAnimation(NodeAnimation)
EndProcedure

Procedure AddPath1(NodeAnimation)
  Duration = 15000
  Time = Duration / 5 ; 5 keyFrame
  CreateNodeAnimation(NodeAnimation, EntityParentNode(2), Duration, #PB_NodeAnimation_Spline, #PB_NodeAnimation_LinearRotation)

  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 0.0,  50, 280,   50); key 0
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 1.0,  50,  50, -950); key 1
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 2.0, 950, 280, -950); key 2
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 4.0, 950,  50,   50); key 3
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 4.5, 450,  50, -450); key 4
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 5.0,  50, 280,   50); key 5

  StartNodeAnimation(NodeAnimation)

EndProcedure

Procedure AddPath2(NodeAnimation, Weight.f)
  Duration = 35000
  Time = Duration / 8
  CreateNodeAnimation(NodeAnimation, EntityParentNode(3), Duration, #PB_NodeAnimation_Spline, #PB_NodeAnimation_LinearRotation)

  ;Animation Cylinder
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 0.00, EntityX(4), EntityY(4)      , EntityZ(4))
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 1.00, EntityX(8), EntityY(8) + 200, EntityZ(8))
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 2.00, EntityX(5), EntityY(5)      , EntityZ(5))
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 3.00, EntityX(8), EntityY(8) + 200, EntityZ(8))
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 4.00, EntityX(6), EntityY(6)      , EntityZ(6))
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 5.00, EntityX(8), EntityY(8) + 200, EntityZ(8))
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 6.00, EntityX(7), EntityY(7)      , EntityZ(7))
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 7.00, EntityX(8), EntityY(8) + 200, EntityZ(8))
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 8.00, EntityX(4), EntityY(4)      , EntityZ(4))

  StartNodeAnimation(NodeAnimation)
  SetNodeAnimationWeight(NodeAnimation, Weight)
EndProcedure

Procedure AddPath3(NodeAnimation, Weight.f)
  Duration = 15000
  Time = Duration / 5 ; 5 keyFrame
  CreateNodeAnimation(NodeAnimation, EntityParentNode(3), Duration, #PB_NodeAnimation_Spline, #PB_NodeAnimation_SphericalRotation)

  ;Animation Cylinder
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 0.0,  50,  50,   50); key 0
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 1.0,  50,  50, -950); key 1
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 2.0, 950, 250, -950); key 2
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 4.0, 950,  50,   50); key 3
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 4.5, 450,  50, -450); key 4
  CreateNodeAnimationKeyFrame(NodeAnimation, Time * 5.0,  50,  50,   50); key 5

  StartNodeAnimation(NodeAnimation)
  SetNodeAnimationWeight(NodeAnimation, Weight)
EndProcedure


NodeAnimation.pb

;
; ------------------------------------------------------------
;
;   PureBasic - NodeAnimation
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;
;An example of using AnimationTracks To make a node smoothly
;follow a predefined path With spline interpolation.

IncludeFile "Screen3DRequester.pb"

Declare AddPath(NodeAnimation)
Define.f Duration = 10000, Time = Duration / 4

If InitEngine3D()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()
    Add3DArchive("Data/"                , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Textures"        , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Models"          , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Scripts"         , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
    Parse3DScripts()

    ;- Barrel
    CreateEntity(1, LoadMesh(1, "Barrel.mesh"), #PB_Material_None)
    ScaleEntity(1, 9, 9, 9)

    ;- Camera
    CreateCamera(0, 0, 0, 100, 100)

    ;- Node
    CreateNode(0)
    AttachNodeObject(0, CameraID(0))

    ;- Light
    AmbientColor(RGB(75, 75, 75))
    CreateLight(0, RGB(235, 253, 126), -750, 750, -750)

    ;- SkyBox
    SkyBox("desert07.jpg")

    ;- NodeAnimation
    NodeAnimation = CreateNodeAnimation(#PB_Any, NodeID(0), Duration, #PB_NodeAnimation_Spline, #PB_NodeAnimation_LinearRotation)

    CreateNodeAnimationKeyFrame(NodeAnimation, Time * 0,  200,   0,    0); key 0
    CreateNodeAnimationKeyFrame(NodeAnimation, Time * 1,    0, -50,  100); key 1
    CreateNodeAnimationKeyFrame(NodeAnimation, Time * 2, -500, 100,    0); key 2
    CreateNodeAnimationKeyFrame(NodeAnimation, Time * 3,    0, 200, -300); key 3
    CreateNodeAnimationKeyFrame(NodeAnimation, Time * 4,  200,   0,    0); key 4

    StartNodeAnimation(NodeAnimation)

    Repeat
      Screen3DEvents()

      ExamineKeyboard()
      AddNodeAnimationTime(NodeAnimation, TimeSinceLastFrame)
      CameraLookAt(0, EntityX(1), EntityY(1), EntityZ(1))

      TimeSinceLastFrame = RenderWorld()
      FlipBuffers()

    Until KeyboardPushed(#PB_Key_Escape)

    End

  EndIf
Else
  MessageRequester("Error","Can't initialize engine3D")
EndIf


OnError.pb

;
; ------------------------------------------------------------
;
;   PureBasic - OnError example file
;
;    (c) 2008 - Fantaisie Software
;
; ------------------------------------------------------------
;

Procedure ErrorHandler()

  ErrorMessage$ = "A program error was detected:" + Chr(13)
  ErrorMessage$ + Chr(13)
  ErrorMessage$ + "Error Message:   " + ErrorMessage()      + Chr(13)
  ErrorMessage$ + "Error Code:      " + Str(ErrorCode())    + Chr(13)
  ErrorMessage$ + "Code Address:    " + Str(ErrorAddress()) + Chr(13)

  If ErrorCode() = #PB_OnError_InvalidMemory
    ErrorMessage$ + "Target Address:  " + Str(ErrorTargetAddress()) + Chr(13)
  EndIf

  If ErrorLine() = -1
    ErrorMessage$ + "Sourcecode line: Enable OnError lines support to get code line information." + Chr(13)
  Else
    ErrorMessage$ + "Sourcecode line: " + Str(ErrorLine()) + Chr(13)
    ErrorMessage$ + "Sourcecode file: " + ErrorFile() + Chr(13)
  EndIf

  ErrorMessage$ + Chr(13)
  ErrorMessage$ + "Register content:" + Chr(13)

  CompilerSelect #PB_Compiler_Processor
    CompilerCase #PB_Processor_x86
      ErrorMessage$ + "EAX = " + Str(ErrorRegister(#PB_OnError_EAX)) + Chr(13)
      ErrorMessage$ + "EBX = " + Str(ErrorRegister(#PB_OnError_EBX)) + Chr(13)
      ErrorMessage$ + "ECX = " + Str(ErrorRegister(#PB_OnError_ECX)) + Chr(13)
      ErrorMessage$ + "EDX = " + Str(ErrorRegister(#PB_OnError_EDX)) + Chr(13)
      ErrorMessage$ + "EBP = " + Str(ErrorRegister(#PB_OnError_EBP)) + Chr(13)
      ErrorMessage$ + "ESI = " + Str(ErrorRegister(#PB_OnError_ESI)) + Chr(13)
      ErrorMessage$ + "EDI = " + Str(ErrorRegister(#PB_OnError_EDI)) + Chr(13)
      ErrorMessage$ + "ESP = " + Str(ErrorRegister(#PB_OnError_ESP)) + Chr(13)

    CompilerCase #PB_Processor_x64
      ErrorMessage$ + "RAX = " + Str(ErrorRegister(#PB_OnError_RAX)) + Chr(13)
      ErrorMessage$ + "RBX = " + Str(ErrorRegister(#PB_OnError_RBX)) + Chr(13)
      ErrorMessage$ + "RCX = " + Str(ErrorRegister(#PB_OnError_RCX)) + Chr(13)
      ErrorMessage$ + "RDX = " + Str(ErrorRegister(#PB_OnError_RDX)) + Chr(13)
      ErrorMessage$ + "RBP = " + Str(ErrorRegister(#PB_OnError_RBP)) + Chr(13)
      ErrorMessage$ + "RSI = " + Str(ErrorRegister(#PB_OnError_RSI)) + Chr(13)
      ErrorMessage$ + "RDI = " + Str(ErrorRegister(#PB_OnError_RDI)) + Chr(13)
      ErrorMessage$ + "RSP = " + Str(ErrorRegister(#PB_OnError_RSP)) + Chr(13)
      ErrorMessage$ + "Display of registers R8-R15 skipped."         + Chr(13)

    CompilerCase #PB_Processor_PowerPC
      ErrorMessage$ + "r0 = " + Str(ErrorRegister(#PB_OnError_r0)) + Chr(13)
      ErrorMessage$ + "r1 = " + Str(ErrorRegister(#PB_OnError_r1)) + Chr(13)
      ErrorMessage$ + "r2 = " + Str(ErrorRegister(#PB_OnError_r2)) + Chr(13)
      ErrorMessage$ + "r3 = " + Str(ErrorRegister(#PB_OnError_r3)) + Chr(13)
      ErrorMessage$ + "r4 = " + Str(ErrorRegister(#PB_OnError_r4)) + Chr(13)
      ErrorMessage$ + "r5 = " + Str(ErrorRegister(#PB_OnError_r5)) + Chr(13)
      ErrorMessage$ + "r6 = " + Str(ErrorRegister(#PB_OnError_r6)) + Chr(13)
      ErrorMessage$ + "r7 = " + Str(ErrorRegister(#PB_OnError_r7)) + Chr(13)
      ErrorMessage$ + "Display of registers r8-R31 skipped."       + Chr(13)

  CompilerEndSelect

  MessageRequester("OnError example", ErrorMessage$)
  End

EndProcedure

; Setup the error handler.
;
OnErrorCall(@ErrorHandler())

MessageRequester("OnError example", "Executing some code with errors. The debugger should be turned off.")

; Write to protected memory
;
PokeS(123, "The quick brown fox jumped over the lazy dog.")

; Division by zero
;
a = 0
a = 1 / a

; Generate an error manually
;
RaiseError(#PB_OnError_IllegalInstruction)

; This should not be displayed
;
MessageRequester("OnError example", "Execution finished normally.")
End


Packer.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Compressor example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

UseBriefLZPacker() ; Small and fast packer

If ReadFile(0, OpenFileRequester("Choose a file to compress", "", "*.*", 0))
  FileLength = Lof(0)

  ; Allocate the 2 memory buffers needed for compression..
  ;
  *Source = AllocateMemory(FileLength)
  *Target = AllocateMemory(FileLength)
  If FileLength And *Source And *Target
    ReadData(0, *Source, FileLength) ; Read the whole file in the memory buffer

    ; Compress the file, which is in memory (and use a timer to see the time spend by compression..)
    ;
    CompressedLength = CompressMemory(*Source, FileLength, *Target, FileLength)
    If CompressedLength

      DecompressedLength = UncompressMemory(*Target, CompressedLength, *Source, FileLength)
      If DecompressedLength = FileLength
        MessageRequester("Info", "De/Compression succeded:"+#LF$+#LF$+"Old size: "+Str(FileLength)+#LF$+"New size: "+Str(CompressedLength))
      EndIf
    Else
      MessageRequester("Error", "Can't compress the file")
    EndIf

    FreeMemory(*Source)
    FreeMemory(*Target)

  EndIf

  CloseFile(0)
EndIf

End


Palette.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Palette example file
;
;    (c) 2004 - Fantaisie Software
;
; ------------------------------------------------------------
;
CompilerIf Subsystem("directx7") = 0
  CompilerError "This example only works with the DirectX7 subsystems"
CompilerEndIf

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitPalette() = 0
  MessageRequester("Error", "Can't open DirectX 7 or later", 0)
  End
EndIf

If OpenScreen(800, 600, 8, "PureBasic - Palette Example")
  LoadSprite(0, "Data\AlphaChannel.bmp", 0)

  ; Build 256 precalculated palette to do a nice cycling effect !
  ;
  For Palette = 0 To 255
    CreatePalette(Palette)
      For Index = 1 To 255  ; Let the first color always Black
        Color = Index+Palette
        If Color > 255
          Color - 256
        EndIf

        SetPaletteColor(Palette, Index, Color << 8)
      Next
  Next

  Palette = 0
  Repeat
    FlipBuffers()                                 ; Flip for DoubleBuffering
    ClearScreen(RGB(0, 0, 0))

    DisplayPalette(Palette)
    DisplaySprite(0, 100, 100)

    Palette+1
    If Palette > 255 : Palette = 0 : EndIf

    ExamineKeyboard()
  Until KeyboardPushed(#PB_Key_Escape)
EndIf

End


Particle.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Particle
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    LoadTexture(0, "flare.png")

    CreateMaterial(0, TextureID(0))
      DisableMaterialLighting(0, 1)
      MaterialBlendingMode   (0, #PB_Material_Add)

    CreateParticleEmitter(0, 10, 1, 1, 0)
      ParticleMaterial    (0, MaterialID(0))
      ParticleTimeToLive  (0, 2, 2)
      ParticleEmissionRate(0, 20)
      ParticleSize        (0, 30, 30)
      ParticleColorRange  (0, RGB(255,0,0), RGB(255, 0, 255))

    CreateParticleEmitter(1, 10, 1, 1, 0)
      ParticleMaterial    (1, MaterialID(0))
      ParticleTimeToLive  (1, 2, 2)
      ParticleEmissionRate(1, 20)
      ParticleSize        (1, 30, 30)
      ParticleColorRange  (1, RGB(255, 255, 0), RGB(0, 255, 0))

    MoveParticleEmitter(1, -50, 0, 0)

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 0, 100, #PB_Absolute)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


Pendulum.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Pendulum waves experiment
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
; Thanks to kelebrindae for this nice code.

#PB_Material_AmbientColor  = 2

IncludeFile "Screen3DRequester.pb"

#CameraSpeed = 0.4

If InitEngine3D()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ; Texture
    ;
    CreateTexture(0, 128, 128)
    StartDrawing(TextureOutput(0))
      Box(0, 0, 128, 128, $FFFFFF)
      StopDrawing()

    CreateTexture(1, 128, 128)
    StartDrawing(TextureOutput(1))
      Box(0, 0, 64, 64, $BBBBBB)
      Box(64, 64, 64, 64, $BBBBBB)
    StopDrawing()

    ; Materials
    ;
    CreateMaterial(1, TextureID(1))
    SetMaterialColor(1, #PB_Material_AmbientColor, #PB_Material_AmbientColors)
    CreateMaterial(2, TextureID(0))
    SetMaterialColor(2, #PB_Material_AmbientColor, $D0B86B)
    CreateMaterial(3, TextureID(0))
    SetMaterialColor(3, #PB_Material_AmbientColor, $0077FF)

    ; Entities
    ;
    CreatePlane(1, 40, 40, 20, 20, 15, 15)
    sol = CreateEntity(#PB_Any, MeshID(1), MaterialID(1))
    EntityPhysicBody(sol, #PB_Entity_StaticBody)

    CreateCube(2, 1)
    support = CreateEntity(#PB_Any, MeshID(2), MaterialID(3))
    ScaleEntity(support, 20, 0.3, 0.3)
    MoveEntity(support, 0, 10, 0, #PB_Absolute)
    EntityPhysicBody(support, #PB_Entity_StaticBody)

    support2 = CreateEntity(#PB_Any, MeshID(2), MaterialID(3))
    ScaleEntity(support2, 0.4, 12, 0.4)
    RotateEntity(support2, 30, 0, 0)
    MoveEntity(support2, 10, 5, -3, #PB_Absolute)
    EntityPhysicBody(support2, #PB_Entity_StaticBody)

    support3 = CreateEntity(#PB_Any, MeshID(2), MaterialID(3))
    ScaleEntity(support3, 0.4, 12, 0.4)
    RotateEntity(support3, -30, 0, 0)
    MoveEntity(support3, 10, 5, 3, #PB_Absolute)
    EntityPhysicBody(support3, #PB_Entity_StaticBody)

    support4 = CreateEntity(#PB_Any, MeshID(2), MaterialID(3))
    ScaleEntity(support4, 0.4, 12, 0.4)
    RotateEntity(support4, 30, 0, 0)
    MoveEntity(support4,-10,5,-3, #PB_Absolute)
    EntityPhysicBody(support2, #PB_Entity_StaticBody)

    support5 = CreateEntity(#PB_Any, MeshID(2), MaterialID(3))
    ScaleEntity(support5, 0.4, 12, 0.4)
    RotateEntity(support5, -30, 0, 0)
    MoveEntity(support5, -10, 5, 3, #PB_Absolute)
    EntityPhysicBody(support5, #PB_Entity_StaticBody)

    ; Pendulums
    #NBPENDULUM = 16
    Global Dim sph.i(#NBPENDULUM + 1)
    Global position.f, stringLength.f
    CreateSphere(3, 0.5)
    For i=1 To #NBPENDULUM

      stringLength = 980.6 * Pow(15 / ( 2 * #PI * (24 + i) ), 2)
      position = -9.3 + i * 1.10

      ; Create a sphere
      sph(i) = CreateEntity(#PB_Any, MeshID(3), MaterialID(2))
      MoveEntity(sph(i), EntityX(support) + position, EntityY(support) - stringLength,EntityZ(support), #PB_Absolute)
      EntityPhysicBody(sph(i), #PB_Entity_SphereBody)

      ; Attach the support and the sphere
      PointJoint(#PB_Any, EntityID(support), position, 0, 0, EntityID(sph(i)), 0, stringLength, 0)
      CreateLine3D(100 + i, EntityX(support) + position, EntityY(support), EntityZ(support), $77FF00, EntityX(sph(i)), EntityY(sph(i)), EntityZ(sph(i)), $77FF00)

      ; Gently push the sphere
      ApplyEntityImpulse(sph(i),0,0,4)
    Next

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 12, 20, #PB_Absolute)
    CameraLookAt(0, 0, 5, 0)

    ; Light
    ;
    AmbientColor(RGB(105, 105, 105))
    CreateLight(0,RGB(160, 160, 255), 0, 300, 0)
    WorldShadows(#PB_Shadow_Additive)

    ;- Main loop
    angle.f = 0
    angle2.f = 0

    Repeat
      Screen3DEvents()

      ;- F1, F2 : Change view
      If ExamineKeyboard()
        If KeyboardReleased(#PB_Key_F2)
          MoveCamera(0, -15, 2.5, 0, #PB_Absolute)
          CameraLookAt(0, 0, 3, 0)
        EndIf
        If KeyboardReleased(#PB_Key_F3)
          MoveCamera(0, 0, 12, 20, #PB_Absolute)
          CameraLookAt(0, 0, 5, 0)
        EndIf

        ;- Return : Display FPS
        If KeyboardReleased(#PB_Key_Return)
          MessageRequester("Infos", "FPS = " + Str(Engine3DFrameRate(#PB_Engine3D_Average)))
        EndIf

      EndIf

      ; Redraw the line3D to  figure the prendulums' strings
      For i=1 To #NBPENDULUM
        position = -9.3 + i * 1.10
        CreateLine3D(100 + i, EntityX(support) + position, EntityY(support), EntityZ(support), $77FF00, EntityX(sph(i)), EntityY(sph(i)), EntityZ(sph(i)), $77FF00)
      Next i

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf)


PointJoint.pb

;
; ------------------------------------------------------------
;
;   PureBasic - PointJoint
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ; First create materials
    ;
    CreateMaterial(0, LoadTexture(0, "Wood.jpg"))
    CreateMaterial(1, LoadTexture(1, "Dirt.jpg"))

    ; Meshes
    ;
    CreateCube(0, 1.0)
    CreateSphere(1, 0.66)

    ; Entities
    ;
    CreateEntity(0, MeshID(0), MaterialID(0), 2,  0, 0)
    CreateEntity(1, MeshID(0), MaterialID(0), 2, -3, 0)
    CreateEntity(2, MeshID(1), MaterialID(0), 2, -6, 0)
    ;
    CreateEntity(3, MeshID(0), MaterialID(1), 5,  4, 0)
    ScaleEntity (3, 10, 1, 10)

    ; Bodies
    ;
    EntityPhysicBody(0, #PB_Entity_BoxBody   , 1.0)
    EntityPhysicBody(1, #PB_Entity_BoxBody   , 1.0)
    EntityPhysicBody(2, #PB_Entity_SphereBody, 1.0)
    EntityPhysicBody(3, #PB_Entity_StaticBody)

    ; PointJoint
    ;
    PointJoint(0, EntityID(3), -5, -1, 0, EntityID(0), 0, 1, 0)
    PointJoint(1, EntityID(0),  0, -1, 0, EntityID(1), 0, 1, 0)
    PointJoint(2, EntityID(1),  0, -1, 0, EntityID(2), 0, 1, 0)

    For i=0 To 2
      SetJointAttribute(i, #PB_PointJoint_Tau, 10)
    Next

    ApplyEntityImpulse(0,  10, 0, 0)

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 2, 25, #PB_Absolute)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Space)
          FreeJoint(1)
        EndIf

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


PointPick.pb

;
; ------------------------------------------------------------
;
;   PureBasic - PointPick
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 0.4
#Speed = 60

Enumeration
  #MainWindow
  #Editor
EndEnumeration

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, RatioX, RatioY
Define DebugBody

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ;- Materials

    GetScriptMaterial(0, "Color/Blue")
    GetScriptMaterial(1, "Color/Green")
    GetScriptMaterial(2, "Color/Red")
    GetScriptMaterial(3, "Color/Yellow")
    CreateMaterial(4, LoadTexture(0, "Dirt.jpg"))

    ;- Meshes
    CreateCube(0, 2)
    CreateSphere(1, 1)
    CreateCylinder(2, 1, 4)

    ;- Entities
    CreateEntity(0, MeshID(0), MaterialID(0),  4,  1.0, 0)
    CreateEntity(1, MeshID(1), MaterialID(1), -4,  0.5, 0)
    CreateEntity(2, MeshID(2), MaterialID(2),  0,  0.0, 0)
    CreateEntity(4, MeshID(0), MaterialID(4),  0, -4.0, 0)
    ScaleEntity(4, 5, 0.5, 5)

    ;- Body
    EntityPhysicBody(0, #PB_Entity_BoxBody, 1)
    EntityPhysicBody(1, #PB_Entity_SphereBody, 1)
    EntityPhysicBody(2, #PB_Entity_CylinderBody, 1)
    EntityPhysicBody(4, #PB_Entity_BoxBody, 0)

    ;- Camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, -1, 8, 25, #PB_Absolute)
    CameraLookAt(0, -1, 0, 0)

    ;- Light
    CreateLight(0, RGB(255, 255, 255), 1560, 900, 500)
    AmbientColor(RGB(30, 30, 30))

    ;- GUI
    RatioX = CameraViewWidth(0) / 1920
    RatioY = CameraViewHeight(0) / 1080
    OpenWindow3D(#MainWindow, 0, 0, 340 * RatioX, 110 * RatioY, "PointPick")
    StringGadget3D(#Editor, 10 * RatioX, 20 * RatioY, 300 * RatioX, 40 * RatioY, "Clic somewhere", #PB_String3D_ReadOnly)

    ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor

    Repeat
      Screen3DEvents()

      Repeat
        Event3D = WindowEvent3D()
      Until Event3D = 0

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05

        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))

        If MouseButton(#PB_MouseButton_Left)
          If Clic = 0
            If PointPick(0, MouseX(), MouseY())
              Clic = 1
              Shoot = CreateEntity(#PB_Any, MeshID(1), MaterialID(3), CameraX(0), CameraY(0), CameraZ(0))
              ScaleEntity(Shoot, 0.3, 0.3, 0.3)
              EntityPhysicBody(Shoot, #PB_Entity_SphereBody, 1)
              ApplyEntityImpulse(Shoot, PickX() * #Speed, PickY() * #Speed, PickZ() * #Speed)
            EndIf
          EndIf
        Else
          Clic = 0
        EndIf

      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      CameraLookAt(0, 0, 0, 0)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


PointPick_2D3D.pb

;
; ------------------------------------------------------------
;
;   PureBasic - PointPick 2D->3D
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, Depth = 150

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    LoadTexture(0, "flare.png")

    CreateMaterial(0, TextureID(0))
    DisableMaterialLighting(0, 1)
    MaterialBlendingMode   (0, #PB_Material_Add)

    CreateParticleEmitter(0, 10, 1, 1, 0)
    ParticleMaterial    (0, MaterialID(0))
    ParticleTimeToLive  (0, 2, 2)
    ParticleEmissionRate(0, 20)
    ParticleSize        (0, 30, 30)
    ParticleColorRange  (0, RGB(255, 255, 0), RGB(0, 255, 0))

    ParticleEmitterDirection(0, 0, -1, 0)

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 0, 200, #PB_Absolute)

    LoadSprite(0, "Data/Textures/Geebee2.bmp")
    TransparentSpriteColor(0, RGB(255, 0, 255))

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        Depth + MouseWheel() * 10
        Mx = MouseX()
        My = MouseY()

        If PointPick(0, Mx, My)
          MoveParticleEmitter(0, CameraX(0) + PickX() * Depth,
                                 CameraY(0) + PickY() * Depth,
                                 CameraZ(0) + PickZ() * Depth, #PB_Absolute)
        EndIf
      EndIf

      ExamineKeyboard()

      RenderWorld()

      DisplayTransparentSprite(0, Mx - SpriteWidth(0)/2, My - SpriteHeight(0)/2)

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


PopupMenu.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Menu example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

;
; Create the popup menu. The indent is important here for a good lisibility
;

If CreatePopupMenu(0)
  MenuItem(1, "Cut")
  MenuItem(2, "Copy")
  MenuItem(3, "Paste")
  MenuBar()
  OpenSubMenu("Options")
    MenuItem(4, "Window...")
    MenuItem(5, "Gadget...")
  CloseSubMenu()
  MenuBar()
  MenuItem( 6, "Quit")
EndIf

;
; We just have to open a window and see when an event happen on the menu
;
If OpenWindow(0, 100, 100, 300, 260, "PureBasic - PopupMenu Example")

  ListIconGadget(0, 10, 10, 280, 240, "Tools", 200)
    AddGadgetItem(0, -1, "Hammer")
    AddGadgetItem(0, -1, "Screwdriver")

  Repeat

    Select WaitWindowEvent()

      Case #PB_Event_Gadget
        If EventGadget() = 0 And EventType() = #PB_EventType_RightClick
          DisplayPopupMenu(0, WindowID(0))
        EndIf

      Case #PB_Event_Menu

        Select EventMenu()  ; To see which menu has been selected

          Case 1 ; Cut
            MessageRequester("PureBasic", "Cut", 0)

          Case 2 ; Copy
            MessageRequester("PureBasic", "Copy", 0)

          Case 3 ; Paste
            MessageRequester("PureBasic", "Paste", 0)

          Case 6 ; Quit
            Quit = 1

        EndSelect

      Case #PB_Event_CloseWindow
        Quit = 1

    EndSelect

  Until Quit = 1

EndIf

End


Preference.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Preference example file
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

If CreatePreferences("Preferences.prefs")
  PreferenceGroup("Global")
    WritePreferenceString("ApplicationName", "MP3 Player")
    WritePreferenceString("Version", "1.1b")

  PreferenceComment(" This is the Window dimension")
  PreferenceComment("")

  PreferenceGroup("Window")
    WritePreferenceLong ("WindowX", 123)
    WritePreferenceLong ("WindowY", 124)
    WritePreferenceFloat("WindowZ", -125.5)

  ClosePreferences()
EndIf

OpenPreferences("Preferences.prefs")

  PreferenceGroup("Window")
    Debug ReadPreferenceLong ("WindowX", 0)
    Debug ReadPreferenceLong ("WindowY", 0)
    Debug ReadPreferenceFloat("WindowZ", 0)

  PreferenceGroup("Global")
    Debug ReadPreferenceString("ApplicationName", "")
    Debug ReadPreferenceString("Version", "")

ClosePreferences()


Printer.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Printer example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

If PrintRequester()

  If StartPrinting("PureBasic Test")

    LoadFont(0, "Arial", 30)
    LoadFont(1, "Arial", 100)

    If StartDrawing(PrinterOutput())

      DrawingFont(FontID(0))

      DrawText(100, 100, "PureBasic Printer Test")

      DrawingFont(FontID(1))

      DrawText(100, 400, "PureBasic Printer Test 2")

      If LoadImage(0, "Data/PureBasic.bmp")
        DrawImage(ImageID(0), 200, 600)
      Else
        MessageRequester("Error","Can't load the image")
      EndIf

      FrontColor(RGB(100,100,100))
      Box(200, 600, 100, 100)

      StopDrawing()
    EndIf

    StopPrinting()
  EndIf
EndIf


RayPick.pb

;
; ------------------------------------------------------------
;
;   PureBasic - RayPick
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

#CameraSpeed = 0.4

Enumeration
  #MainWindow
  #Editor
EndEnumeration

Define.f KeyX, KeyY, MouseX, MouseY, SpeedRotate
Define MaskSphere = 1 ; RayPick() ignore this entity

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    KeyboardMode(#PB_Keyboard_International)

    WorldShadows(#PB_Shadow_Additive)

    ;WorldDebug(#PB_World_DebugEntity)

    ; First create materials
    ;
    GetScriptMaterial(0, "Color/Blue")
    GetScriptMaterial(1, "Color/Green")
    GetScriptMaterial(2, "Color/Red")
    GetScriptMaterial(3, "Color/Yellow")
    CreateMaterial(4, LoadTexture(0, "Dirt.jpg"))
    CreateMaterial(10, LoadTexture(10, "r2skin.jpg"))

    ;- Meshes
    CreateCube(0, 2)
    CreateSphere(1, 1, 300, 300)
    CreateCylinder(2, 1, 4)
    CreatePlane(3, 20, 20, 1, 1, 1, 1)
    LoadMesh(10, "robot.mesh")

    ;- Entities
    CreateEntity(0, MeshID(0), MaterialID(0),  4, 1,  0)
    CreateEntity(1, MeshID(1), MaterialID(1), -4, 1,  0)
    CreateEntity(2, MeshID(2), MaterialID(2),  0, 2, -4)
    CreateEntity(3, MeshID(0), MaterialID(3),  0, 1, -7, 1)
    CreateEntity(4, MeshID(3), MaterialID(4))
    CreateEntity(5, MeshID(1), MaterialID(2), 0, 0, 0, MaskSphere)

    ScaleEntity(3, 8, 1, 1)
    ScaleEntity(5, 0.5, 0.5, 0.5)

    ;- Robot
    CreateEntity(10, MeshID(10), MaterialID(10), -1, 0, 5)
    ScaleEntity(10, 0.05, 0.05, 0.05)
    StartEntityAnimation(10, "Walk")

    ;- Nodes
    CreateNode(0)
    AttachNodeObject(0, EntityID(5))

    CreateNode(1, 0, 0, 1)
    AttachNodeObject(0, NodeID(1))
    MoveNode(0, 0, 1, 0)

    ;- Camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, -1, 8, 15, #PB_Absolute)
    CameraLookAt(0, -1, 0, 0)

    ;- Light
    CreateLight(0, RGB(255, 255, 255), 1560, 900, 500)
    AmbientColor(0)

    ;- GUI
    RatioX.f = CameraViewWidth(0) / 1920
    RatioY.f = CameraViewHeight(0) / 1080
    OpenWindow3D(#MainWindow, 10, 10, 380 * RatioX, 120 * RatioY, "RayPick")
    StringGadget3D(#Editor, 20 * RatioX, 20 * RatioY, 300 * RatioX, 50 * RatioY, "", #PB_String3D_ReadOnly)

    ShowGUI(155, 0)

    Repeat
      Screen3DEvents()

      Repeat
        Event3D = WindowEvent3D()
      Until Event3D = 0

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.5
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.5
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      Entity = RayPick(NodeX(0), NodeY(0), NodeZ(0), NodeX(1)-NodeX(0), 0, NodeZ(1)-NodeZ(0), $FFFFFFFE)
      CreateLine3D(10, NodeX(0), NodeY(0), NodeZ(0), RGB(255, 255, 255), NodeX(1), NodeY(1), NodeZ(1), RGB(255, 255, 255))

      If Entity>=0
        CreateLine3D(10, NodeX(0), NodeY(0), NodeZ(0), RGB(255, 0, 0), PickX(), PickY(), PickZ(), RGB(255, 0, 0))
        SetGadgetText3D(#Editor, "Entity = " + Str(Entity))
      Else
        SetGadgetText3D(#Editor, "I'm looking...")
      EndIf

      If entity = 10
        SpeedRotate = 0.1
      Else
        SpeedRotate = 1
      EndIf
      RotateNode(0, 0, SpeedRotate, 0, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


RayPick_LightDirection.pb

;
; ------------------------------------------------------------
;
;   PureBasic - RayPick & LightDirection
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define.f x, y, z, Speed = 1
Define MaskSphere = 0 ; RayPick() ignore this entity

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts" , #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    KeyboardMode(#PB_Keyboard_International)

    ; Ground
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1000, 1000, 50, 50, 1, 1)
    CreateEntity (0, MeshID(0), MaterialID(0))

    ; Light
    AmbientColor(0)
    CreateLight(0, RGB(255, 255, 255), 0, 400, 0, #PB_Light_Spot)
    SpotLightRange(0, 1, 30, 3)
    LightDirection(0, 0.2, -1, 0.5)

    ; spot
    CreateSphere(1, 20, 50, 50)
    GetScriptMaterial(1, "Color/Yellow")
    GetScriptMaterial(5, "Color/Red")
    SetMaterialColor(1, #PB_Material_SelfIlluminationColor, RGB(255, 255, 55))
    SetMaterialColor(5, #PB_Material_SelfIlluminationColor, RGB(255, 55, 55))
    CreateEntity(1, MeshID(1), MaterialID(1), LightX(0), LightY(0), LightZ(0), MaskSphere)

    ;Cube
    CreateCube(2, 50)
    GetScriptMaterial(2, "Color/Blue")
    CreateEntity(2, MeshID(2), MaterialID(2), 180, 25, 80)

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 900, 1000, #PB_Absolute)
    CameraLookAt(0, 0, 0, 0)
    CameraBackColor(0, RGB(0, 0, 30))

    Repeat
      Screen3DEvents()

      ExamineKeyboard()

      RotateLight(0, 0, Speed, 0, #PB_Relative)

      Entity = RayPick(LightX(0), LightY(0), LightZ(0), LightDirectionX(0), LightDirectionY(0), LightDirectionZ(0))

      If Entity
        SetEntityMaterial(1, MaterialID(5))   ;Cube detected
        Speed = 0.1
        CreateLine3D(10, LightX(0), LightY(0), LightZ(0), RGB(255, 0, 0), PickX(), PickY(), PickZ(), RGB(255, 0, 0))
      Else
        SetEntityMaterial(1, MaterialID(1))   ;Nothing
        Speed = 1
        FreeMesh(10)
      EndIf

      RenderWorld()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf


RegularExpression.pb

;
; ------------------------------------------------------------
;
;   PureBasic - RegularExpression example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

; Will match every word of 3 letters, lowercase with a 'b' as middle letter
;
If CreateRegularExpression(0, "[a-z]b[a-z]")

  Dim Result$(0)

  a = ExtractRegularExpression(0, " abc it won't match abz", result$())

  MessageRequester("Info", "Nb strings found: "+Str(a))

  For k=0 To a-1
    MessageRequester("Info", Result$(k))
  Next

Else
  MessageRequester("Error", RegularExpressionError())
EndIf


ReloadMaterial.pb

;
; ------------------------------------------------------------
;
;   PureBasic - ReloadMaterial
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;
;Use [F5]

IncludeFile "Screen3DRequester.pb"

Declare CreateMaterialScript()

If InitEngine3D()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()
    Add3DArchive("Data/Models"  , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Scripts" , #PB_3DArchive_FileSystem)
    Parse3DScripts()

    ;- Mesh
    LoadMesh(0, "Robot.mesh")

    ;- Entity
    CreateEntity(0, MeshID(0), #PB_Material_None)

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 120, 90, 90, #PB_Absolute)
    CameraLookAt(0, 0, 50, 0)
    CameraBackColor(0, RGB(0, 0, 30))

    ;- Light
    ;
    AmbientColor(RGB(75, 75, 75))
    CreateLight(0, RGB(255, 255, 255), 0, 500, 0)

    Repeat
      Screen3DEvents()

      If ExamineKeyboard()
        If KeyboardReleased(#PB_Key_F5)
          CreateMaterialScript()
          ReloadMaterial("Test", "ReloadMaterial.material", #True)
          GetScriptMaterial(0, "Test")
          SetEntityMaterial(0, MaterialID(0))
        EndIf
      EndIf

      RenderWorld()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape)

    End

  EndIf
Else
  MessageRequester("Error","Can't initialize engine3D")
EndIf

Procedure CreateMaterialScript()
  If CreateFile(0, "Data\Scripts\ReloadMaterial.material")
    Restore Material
    Line$ = "material Test"
    While Line$<> "END"
      WriteStringN(0, Line$)
      Read.s Line$
    Wend
    CloseFile(0)
  Else
    MessageRequester("Information","may not create the file!")
  EndIf
EndProcedure

DataSection
Material:
Data.s "{"
Data.s "	technique"
Data.s "	{"
Data.s "		pass"
Data.s "		{"
Data.s "			texture_unit"
Data.s "			{"
Data.s "				texture nskingr.jpg"
Data.s "			}"
Data.s "		}"
Data.s "	}"
Data.s "}"
Data.s "END"
EndDataSection


Requester.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Requester example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

If OpenWindow(0, 100, 200, 300, MenuHeight(), "PureBasic - Requesters example")

  If CreateMenu(0, WindowID(0))
    MenuTitle("Test")
      MenuItem(0, "Open")
      MenuItem(1, "Save")
      MenuItem(6, "Path")
      MenuBar()
      MenuItem(2, "Choose a color")
      MenuItem(3, "Choose a font")
      MenuBar()
      MenuItem(4, "Simple message")
      MenuBar()
      MenuItem(5, "Quit")
  EndIf

  Repeat
    Event = WaitWindowEvent()

    Select Event

      Case #PB_Event_Menu  ; A Menu item has been selected

        Select EventMenu()

          Case 0  ; OpenFileRequester
            File$ = OpenFileRequester("PureBasic - Open", "Pure.txt", "Text (*.txt)|*.txt;*.bat|(PureBasic (*.pb)|*.pb", 0)
            If File$+File$
              MessageRequester("Information", "Selected File: "+File$, 0);
            EndIf

          Case 1  ; SaveFileRequester
            File$ = SaveFileRequester("PureBasic - Save", "Basic.pb", "Text (*.txt)|*.txt|(PureBasic (*.pb)|*.pb", 1)
            If File$
              MessageRequester("Information", "Selected File: "+File$, 0);
            EndIf

          Case 2  ; ColorRequester
            Colour = ColorRequester()
            If Colour > -1
              MessageRequester("Info", "Colour choosen: Red: "+Str(Red(Colour))+", Green: "+Str(Green(Colour))+", Blue: "+Str(Blue(Colour)), 0);
            EndIf

          Case 3  ; FontRequester
            If FontRequester("Courier", -13, 0)
              MessageRequester("Info", "Selected font: "+SelectedFontName()+Chr(10)+"Font size: "+Str(SelectedFontSize()), 0)
            EndIf

          Case 4  ; MessageRequester
            MessageRequester("Information", "Simple Message"+Chr(13)+"Line 2"+Chr(13)+"Line 3", 0)

          Case 5  ; Quit
            Quit = 1

          Case 6
            Path$ = PathRequester("Choose a path...","C:\")
            If Path$
              MessageRequester("Information", "Selected Path: "+Path$, 0)
            EndIf

        EndSelect

      Case #PB_Event_CloseWindow  ; If the user has pressed on the close button
        Quit = 1

    EndSelect

  Until Quit = 1

EndIf

End   ; All the opened windows are closed automatically by PureBasic


ResetMaterial.pb

;
; ------------------------------------------------------------
;
;   PureBasic - ResetMaterial
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;
;Use [F5]

IncludeFile "Screen3DRequester.pb"

Declare CreateMaterialScript(texture.s)

CreateMaterialScript("r2skin.jpg")

#PB_Engine3D_Entity = 2
#PB_Engine3D_BillboardGroup = 4

If InitEngine3D(#PB_Engine3D_DebugOutput)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()
    Add3DArchive("Data/Models"  , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Textures" , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Scripts"  , #PB_3DArchive_FileSystem)
    Parse3DScripts()

    ;- Material
    GetScriptMaterial(0, "TestReset")

    ;- Mesh
    LoadMesh(0, "Robot.mesh")

    ;- Entity
    CreateEntity(0, MeshID(0), MaterialID(0), -60, 0, 0)
    CreateEntity(1, MeshID(0), MaterialID(0))
    CreateEntity(2, MeshID(0), MaterialID(0),  60, 0, 0)

    ;This one will keep his material
    CreateEntity(3, MeshID(0), #PB_Material_None, -60, 0, 60)

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 150, 90, 150, #PB_Absolute)
    CameraLookAt(0, 0, 50, 0)
    CameraBackColor(0, RGB(0, 0, 30))

    ;- Light
    ;
    AmbientColor(RGB(75, 75, 75))
    CreateLight(0, RGB(255, 255, 255), 0, 500, 0)

    Repeat
      Screen3DEvents()

      If ExamineKeyboard()
        If KeyboardReleased(#PB_Key_F5)
          CreateMaterialScript("nskingr.jpg") ; Change texture
          ReloadMaterial("TestReset", "ResetMaterial.material", #True)
          GetScriptMaterial(0, "TestReset")
          ResetMaterial(#PB_Engine3D_Entity)
         EndIf
      EndIf

      RenderWorld()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape)

    End

  EndIf
Else
  MessageRequester("Error","Can't initialize engine3D")
EndIf

Procedure CreateMaterialScript(texture.s)
  If CreateFile(0, "Data\Scripts\ResetMaterial.material")
    Restore Material
    Line$ = "material TestReset"
    While Line$<> "END"
      If FindString(Line$, "MyTextureHere", 1)
        Line$ = ReplaceString(Line$, "MyTextureHere", texture)
      EndIf
      WriteStringN(0, Line$)
      Read.s Line$
    Wend
    CloseFile(0)
  Else
    MessageRequester("Information","may not create the file!")
  EndIf
EndProcedure

DataSection
Material:
Data.s "{"
Data.s "	technique"
Data.s "	{"
Data.s "		pass"
Data.s "		{"
Data.s "			texture_unit"
Data.s "			{"
Data.s "				texture MyTextureHere"
Data.s "			}"
Data.s "		}"
Data.s "	}"
Data.s "}"
Data.s "END"
EndDataSection


Ribbon.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Ribbon
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define yaw.f, X.f, Y.f, Z.f, FOV.f, Timer.i

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()
  If Screen3DRequester()

    ; Ground
    ;
    GetScriptMaterial(0, "Scene/GroundBlend")
    CreatePlane(0, 10000, 10000, 100, 100, 50, 50)
    CreateEntity(0, MeshID(0), MaterialID(0))

    ; Node for Ribbon and Billboard
    ;
    CreateNode(0, 0, 500, 0)

    ;Ribbon
    ;
    GetScriptMaterial(1, "Scene/RibbonTrail")
    CreateRibbonEffect(0, MaterialID(1), 1, 80, 1750)
    RibbonEffectColor(0, 0, RGBA(255, 255, 255, 255), RGBA(0, 0, 255, 255))
    RibbonEffectWidth(0, 0, 50, 3)
    AttachRibbonEffect(0, NodeID(0))

    ; Billboard
    ;
    GetScriptMaterial(2, "Scene/burst")
    CreateBillboardGroup(0, MaterialID(2), 512, 512)
    AddBillboard(0, 0, 0, 0, 0)

    AttachNodeObject(0, BillboardGroupID(bGrp))

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 2000, 100, 2000, #PB_Absolute)
    CameraLookAt(0, 0, 1500, 0)
    CameraFOV(0, 60)

    ; Skybox
    ;
    SkyBox("desert07.jpg")

    Repeat
      Screen3DEvents()

      If Timer < ElapsedMilliseconds()
        Timer = ElapsedMilliseconds() + 5
        yaw + 0.1
      EndIf

      ;Ribbon
      X = 1000 + 500 * Cos(ElapsedMilliseconds() / 250)
      Y = 1500 + 750 * Cos(ElapsedMilliseconds() / 350)
      Z = 500  + 250 * Cos(ElapsedMilliseconds() / 750)
      MoveNode(0, X, Y, Z, #PB_Absolute)

      ;Camera
      FOV = 60 - 30 * Cos(ElapsedMilliseconds() / 2500)
      RotateCamera(0, 0, yaw, 0)
      CameraFOV(0, FOV)
      CameraLookAt(0, X, Y, Z)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()

    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1

  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


RotateLight.pb

;
; ------------------------------------------------------------
;
;   PureBasic - RotateLight
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define.f x, y, z, Distance = 1500

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts" , #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    KeyboardMode(#PB_Keyboard_International)

    ; Ground
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1000, 1000, 50, 50, 1, 1)
    CreateEntity (0, MeshID(0), MaterialID(0))

    ; Light
    AmbientColor(0)
    CreateLight(0, RGB(255, 255, 255), 0, 400, 0, #PB_Light_Spot)
    SpotLightRange(0, 1, 30, 3)
    LightDirection(0, 0.2, -1, 0.5)

    ; spot
    CreateSphere(1, 20, 50, 50)
    GetScriptMaterial(1, "Color/Yellow")
    SetMaterialColor(1, #PB_Material_SelfIlluminationColor, RGB(185, 155, 65))
    CreateEntity(1, MeshID(1), MaterialID(1), LightX(0), LightY(0), LightZ(0))

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 900, 1000, #PB_Absolute)
    CameraLookAt(0, 0, 0, 0)
    CameraBackColor(0, RGB(0, 0, 30))

    Repeat
      Screen3DEvents()

      ExamineKeyboard()

      RotateLight(0, 0, 1, 0, #PB_Relative)

      x = LightX(0) + LightDirectionX(0) * Distance
      y = LightY(0) + LightDirectionY(0) * Distance
      z = LightZ(0) + LightDirectionZ(0) * Distance
      CreateLine3D(10, LightX(0), LightY(0), LightZ(0), RGB(0, 255, 0), x, y, z, RGB(0, 255, 0))

      RenderWorld()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf(


SaveRenderTexture.pb

;
; ------------------------------------------------------------
;
;   PureBasic - SaveTexture
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;
IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/Desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    WorldShadows(#PB_Shadow_Modulative, -1, RGB(175, 175, 175))

    ;Ground
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1500, 1500, 40, 40, 15, 15)
    CreateEntity(0,MeshID(0),MaterialID(0))
    EntityRenderMode(0, 0)

    ;Mesh
    ;
    LoadMesh(1, "robot.mesh")

    ; Entity
    ;
    CreateEntity(1, MeshID(1), #PB_Material_None)

    ; Animation
    ;

    StartEntityAnimation(1, "Walk")

    ; SkyBox
    ;
    SkyBox("desert07.jpg")

    ; Camera
    ;

    CreateCamera(1, 0, 0, 100, 100)
    MoveCamera(1, -100, 120, 190, #PB_Absolute)
    CameraLookAt(1, EntityX(1), EntityY(1), EntityZ(1))

    ;SaveScreen
    ;
    CreateRenderTexture(1, CameraID(1), CameraViewWidth(1), CameraViewHeight(1), #PB_Texture_CameraViewPort)
    CreateMaterial(1, TextureID(1))

    ; Light
    ;
    CreateLight(0, RGB(255, 255, 255), -40, 100, 80)
    AmbientColor(RGB(80, 80, 80))

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX()/10
        MouseY = -MouseDeltaY()/10
      EndIf

      If ExamineKeyboard()

        If KeyboardReleased(#PB_Key_F5)
          No + 1
          SaveRenderTexture(1, "test" + Str(No) + ".png")
        EndIf

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -2
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = 2
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -2
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = 2
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateEntity(1, 0, 1, 0, #PB_Relative)

      RotateCamera(1, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (1, KeyX, 0, KeyY)

      RenderWorld()

      FlipBuffers()

    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


ScaleMaterial.pb

;
; ------------------------------------------------------------
;
;   PureBasic - ScaleMaterial
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

If InitEngine3D()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()
    Add3DArchive("Data/"                , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Textures"        , #PB_3DArchive_FileSystem)

    ; Material
    ;
    CreateMaterial(0, LoadTexture(0, "MRAMOR6X6.jpg"))

    ; Scaled Material
    ;
    CopyMaterial(0, 1)
    ScaleMaterial(1, 1, 3)

    ;- Mesh
    CreatePlane(0, 30, 10, 1, 1, 1, 1)

    ;- Entity without material scaled
    CreateEntity(0, MeshID(0), MaterialID(0), -16, 0, 0)

    ;-Entity with Material scaled
    CreateEntity(1, MeshID(0), MaterialID(1),  16, 0, 0)

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 50, 2, #PB_Absolute)
    CameraLookAt(0, 0, 0, 0)
    CameraBackColor(0, RGB(0, 0, 30))

    ;- Light
    ;
    AmbientColor(RGB(75, 75, 75))
    CreateLight(0, RGB(255, 255, 255), 0, 500, 0)

    Repeat
      Screen3DEvents()

      ExamineKeyboard()
      RenderWorld()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape)

    End

  EndIf
Else
  MessageRequester("Error","Can't initialize engine3D")
EndIf


Screen3DRequester.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Common 3D functions
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#WINDOW_Screen3DRequester = 0

#GADGET_FullScreen        = 1
#GADGET_Windowed          = 2
#GADGET_ScreenModesLabel  = 3
#GADGET_WindowedModes     = 4
#GADGET_Launch            = 5
#GADGET_Cancel            = 6
#GADGET_Logo              = 7
#GADGET_Frame             = 8
#GADGET_ScreenModes       = 9
#GADGET_Antialiasing      = 10
#GADGET_AntialiasingModes = 11

Global Screen3DRequester_FullScreen, Screen3DRequester_ShowStats

UsePNGImageDecoder()

Procedure Screen3DRequester()

  OpenPreferences(GetHomeDirectory()+"PureBasicDemos3D.prefs")
    FullScreen          = ReadPreferenceLong  ("FullScreen"        , 0)
    FullScreenMode$     = ReadPreferenceString("FullScreenMode"    , "800x600")
    WindowedScreenMode$ = ReadPreferenceString("WindowedScreenMode", "800x600")
    AAMode              = ReadPreferenceLong  ("Antialiasing"      , 0)

  If ExamineDesktops()
    ScreenX = DesktopWidth(0)
    ScreenY = DesktopHeight(0)
    ScreenD = DesktopDepth(0)
    ScreenF = DesktopFrequency(0)
  EndIf

  If OpenWindow(#WINDOW_Screen3DRequester, 0, 0, 396, 230, "PureBasic - 3D Demos", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_Invisible)

    Top = 6

    ImageGadget  (#GADGET_Logo, 6, Top, 0, 0, LoadImage(0,"Data/PureBasic3DLogo.png"), #PB_Image_Border) : Top+76

    Frame3DGadget(#GADGET_Frame, 6, Top, 384, 105, "", 0) : Top+20

    OptionGadget(#GADGET_FullScreen, 70, Top, 100, 20, "Fullscreen")        : Top+25
    OptionGadget(#GADGET_Windowed  , 70, Top, 100, 20, "Windowed")          : Top+25
    TextGadget(#GADGET_Antialiasing, 70, Top+5, 100, 20, "Antialiasing mode") : Top - 50

    ComboBoxGadget (#GADGET_ScreenModes  , 190, Top, 150, 21)     : Top+25
    ComboBoxGadget (#GADGET_WindowedModes, 190, Top, 150, 21)     : Top+25
    ComboBoxGadget (#GADGET_AntialiasingModes, 190, Top, 150, 21) : Top+45

    ButtonGadget (#GADGET_Launch,   6, Top, 180, 25, "Launch", #PB_Button_Default)
    ButtonGadget (#GADGET_Cancel, 200, Top, 190, 25, "Cancel")

    AddGadgetItem(#GADGET_AntialiasingModes,-1,"None")
    AddGadgetItem(#GADGET_AntialiasingModes,-1,"FSAA x2")
    AddGadgetItem(#GADGET_AntialiasingModes,-1,"FSAA x4")
    AddGadgetItem(#GADGET_AntialiasingModes,-1,"FSAA x6")

    SetGadgetState(#GADGET_AntialiasingModes,AAMode)

    If ExamineScreenModes()

      Position = 0
      While NextScreenMode()

        Position + 1
        Width       = ScreenModeWidth()
        Height      = ScreenModeHeight()
        Depth       = ScreenModeDepth()
        RefreshRate = ScreenModeRefreshRate()

        If Depth > 8
          AddGadgetItem(#GADGET_ScreenModes, -1, Str(Width)+"x"+Str(Height)+"x"+Str(Depth)+"@"+Str(RefreshRate))
          If ScreenX = Width And ScreenY = Height And ScreenD = Depth And ScreenF = RefreshRate
            SetGadgetState(#GADGET_ScreenModes, Position)
            FullScreenMode$ = Str(Width)+"x"+Str(Height)+"x"+Str(Depth)+"@"+Str(RefreshRate)
          EndIf
        EndIf

      Wend

    EndIf

    ExamineDesktops()
    NbScreenModes = 7

    Restore WindowedScreenDimensions

    Repeat
      Read.l CurrentWidth
      Read.l CurrentHeight

      If CurrentWidth < DesktopWidth(0) And CurrentHeight < DesktopHeight(0)
        AddGadgetItem(#GADGET_WindowedModes, -1, Str(CurrentWidth)+ "x"+Str(CurrentHeight))
        NbScreenModes - 1
      Else
        NbScreenModes = 0
      EndIf

    Until NbScreenModes = 0

    SetGadgetState(#GADGET_FullScreen, FullScreen)
    SetGadgetState(#GADGET_Windowed  , 1-FullScreen)

    SetGadgetText (#GADGET_ScreenModes  , FullScreenMode$)
    SetGadgetText (#GADGET_WindowedModes, WindowedScreenMode$)

    DisableGadget (#GADGET_ScreenModes  , 1-FullScreen)
    DisableGadget (#GADGET_WindowedModes, FullScreen)

    HideWindow(#WINDOW_Screen3DRequester, 0)

    Repeat

      Event = WaitWindowEvent()

      Select Event

      Case #PB_Event_Gadget

        Select EventGadget()

        Case #GADGET_Launch
          Quit = 2

        Case #GADGET_Cancel
          Quit = 1

        Case #GADGET_FullScreen
          DisableGadget(#GADGET_ScreenModes  , 0)
          DisableGadget(#GADGET_WindowedModes, 1)

        Case #GADGET_Windowed
          DisableGadget(#GADGET_ScreenModes  , 1)
          DisableGadget(#GADGET_WindowedModes, 0)

        EndSelect

      Case #PB_Event_CloseWindow
        Quit = 1

      EndSelect

    Until Quit > 0

    FullScreen          = GetGadgetState(#GADGET_FullScreen)
    FullScreenMode$     = GetGadgetText (#GADGET_ScreenModes)
    WindowedScreenMode$ = GetGadgetText (#GADGET_WindowedModes)
    AAMode              = GetGadgetState(#GADGET_AntialiasingModes)

    CloseWindow(#WINDOW_Screen3DRequester)

  EndIf

  If Quit = 2 ; Launch button has been pressed

    CreatePreferences(GetHomeDirectory()+"PureBasicDemos3D.prefs")
      WritePreferenceLong  ("FullScreen"        , FullScreen)
      WritePreferenceString("FullScreenMode"    , FullScreenMode$)
      WritePreferenceString("WindowedScreenMode", WindowedScreenMode$)
      WritePreferenceLong  ("Antialiasing"      , AAMode)

    If FullScreen
      ScreenMode$ = FullScreenMode$
    Else
      ScreenMode$ = WindowedScreenMode$
    EndIf

    RefreshRate = Val(StringField(ScreenMode$, 2, "@"))

    ScreenMode$ = StringField(ScreenMode$, 1, "@") ; Remove the refresh rate info, so we can parse it easily

    ScreenWidth  = Val(StringField(ScreenMode$, 1, "x"))
    ScreenHeight = Val(StringField(ScreenMode$, 2, "x"))
    ScreenDepth  = Val(StringField(ScreenMode$, 3, "x"))

    Screen3DRequester_FullScreen = FullScreen ; Global variable, for the Screen3DEvents

    Select AAMode
      Case 0:
        AntialiasingMode(#PB_AntialiasingMode_None)
      Case 1:
        AntialiasingMode(#PB_AntialiasingMode_x2)
      Case 2:
        AntialiasingMode(#PB_AntialiasingMode_x4)
      Case 3:
        AntialiasingMode(#PB_AntialiasingMode_x6)
    EndSelect

    If FullScreen
      Result = OpenScreen(ScreenWidth, ScreenHeight, ScreenDepth, "3D Demos", #PB_Screen_WaitSynchronization, RefreshRate)
    Else
      If OpenWindow(0, 0, 0, ScreenWidth, ScreenHeight+MenuHeight(), "PureBasic - 3D Demos", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

        CreateMenu(0, WindowID(#WINDOW_Screen3DRequester))
          MenuTitle("Project")
          MenuItem(0, "Quit")

          MenuTitle("About")
          MenuItem(1, "About...")

        Result = OpenWindowedScreen(WindowID(#WINDOW_Screen3DRequester), 0, 0, ScreenWidth, ScreenHeight, 0, 0, 0)
      EndIf
    EndIf

  EndIf

  ProcedureReturn Result
EndProcedure

Procedure Screen3DEvents()

  If Screen3DRequester_FullScreen = 0 ; Handle all the events relatives to the window..

    Repeat
      Event = WindowEvent()

      Select Event

        Case #PB_Event_Menu
          Select EventMenu()

            Case 0
              Quit = 1

            Case 2
              MessageRequester("Info", "Windowed 3D in PureBasic !", 0)

          EndSelect

        Case #PB_Event_CloseWindow
          Quit = 1

      EndSelect

      If Quit = 1 : End : EndIf  ; Quit the app immediately
    Until Event = 0

  EndIf

  If ExamineKeyboard()
    If KeyboardReleased(#PB_Key_F1)
      Screen3DRequester_ShowStats = 1-Screen3DRequester_ShowStats ; Switch the ShowStats on/off
    EndIf
  EndIf

EndProcedure

Procedure Screen3DStats()
  If Screen3DRequester_ShowStats
    ; Nothing printed for now
  EndIf
EndProcedure

DataSection
  WindowedScreenDimensions:
    Data.l  320, 240
    Data.l  512, 384
    Data.l  640, 480
    Data.l  800, 600
    Data.l 1024, 768
    Data.l 1280, 1024
    Data.l 1600, 1200
EndDataSection


SerialPort.pb

;
; ------------------------------------------------------------
;
;   PureBasic - SerialPort example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  Port$ = "COM1"
CompilerElse
  Port$ = "/dev/ttyS0"
CompilerEndIf

If OpenSerialPort(0, Port$, 300, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)

    MessageRequester("Information", "SerialPort opened with success")

Else
    MessageRequester("Error", "Can't open the serial port: "+Port$)
EndIf


SetMeshMaterial.pb

;
; ------------------------------------------------------------
;
;   PureBasic - SetMeshMaterial
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    MaterialFilteringMode(#PB_Default, #PB_Material_Anisotropic, 8)

    ;- Material
    CreateMaterial(0, LoadTexture(0, "ValetCoeur.jpg"))
    ;SetMaterialColor(0, #PB_Material_SelfIlluminationColor, RGB(255, 255, 255))
    CreateMaterial(1, LoadTexture(1, "DosCarte.png"))

    ;- Create a mesh manually

    ; Define all the vertices and their attributes

    CreateMesh(0)

    ; Recto
    AddMeshVertex(-0.5,0,-0.5)
    MeshVertexTextureCoordinate(0,0)
    AddMeshVertex(0.5,0,-0.5)
    MeshVertexTextureCoordinate(0,1)
    AddMeshVertex(0.5,0,0.5)
    MeshVertexTextureCoordinate(1,1)
    AddMeshVertex(-0.5,0,0.5)
    MeshVertexTextureCoordinate(1,0)

    ; Define all the faces, based on the vertex index
    AddMeshFace(2,1,0)
    AddMeshFace(0,3,2)

    ; Verso
    AddSubMesh()
    AddMeshVertex(-0.5,0,-0.5)
    MeshVertexTextureCoordinate(0,0)
    AddMeshVertex(0.5,0,-0.5)
    MeshVertexTextureCoordinate(0,1)
    AddMeshVertex(0.5,0,0.5)
    MeshVertexTextureCoordinate(1,1)
    AddMeshVertex(-0.5,0,0.5)
    MeshVertexTextureCoordinate(1,0)

    AddMeshFace(0,1,2)
    AddMeshFace(2,3,0)

    FinishMesh()
    ;NormalizeMesh(0)

    ;UpdateMeshBoundingBox(0)

    SetMeshMaterial(0, MaterialID(0), 0)
    SetMeshMaterial(0, MaterialID(1), 1)

    ;-Entity
    CreateEntity(0, MeshID(0), #PB_Material_None)
    ScaleEntity(0, 300, 1, 200)

    ;-Camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 0, 500, #PB_Absolute)
    CameraBackColor(0, RGB(80, 20, 20))

    Repeat
      Screen3DEvents()

      ExamineMouse()

      ExamineKeyboard()

      RotateEntity(0, 1.1, 0.3, 1.0, #PB_Relative)

      RenderWorld()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End,


SetOrientation.pb

;
; ------------------------------------------------------------
;
;   PureBasic - SetOrientation
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, RollZ

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    LoadMesh(0, "robot.mesh")

    CreateMaterial(1, LoadTexture(1, "clouds.jpg"))
    CreateMaterial(2, LoadTexture(2, "r2skin.jpg"))

    CreateEntity(1, MeshID(0), MaterialID(1), -30, 0, 0)
    CreateEntity(2, MeshID(0), MaterialID(2),  30, 0, 0)

    SkyBox("stevecube.jpg")

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 40, 150, #PB_Absolute)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateEntity(1, 0.7, 1, 0.5, #PB_Relative)

      FetchOrientation(EntityID(1))
      SetOrientation(EntityID(2), GetX(), GetY(), GetZ(), GetW())

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


SkyBox.pb

;
; ------------------------------------------------------------
;
;   PureBasic - SkyBox
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;
; Thanks to Steve 'Sinbad' Streeting for the nice SkyBox !
;

; Use [F2]/[F3] to change SkyBox's texture
; Use [F4] to disable SkyBox

#CameraSpeed = 1

Enumeration
  #MainWindow
  #Editor
EndEnumeration

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, RatioX, RatioY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
  Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()
    ;-Material
    CreateMaterial(0, LoadTexture(0, "r2skin.jpg"))

    ;-Entity
    CreateEntity(0, LoadMesh(0, "robot.mesh"), MaterialID(0))

    ;-Camera
    CreateCamera(0,0,0,100,100)
    MoveCamera(0,0,0,100, #PB_Absolute)
    CameraBackColor(0, RGB(19, 34, 49))

    ;-GUI
    RatioX = CameraViewWidth(0) / 1920
    RatioY = CameraViewHeight(0) / 1080

    OpenWindow3D(#MainWindow, 10, 10, 570 * RatioX, 180 * RatioY, "SkyBox")
    EditorGadget3D(#Editor, 10 * RatioX, 20 * RatioY, 530 * RatioX, 90 * RatioY, #PB_Editor3D_ReadOnly)
    SetGadgetText3D(#Editor, "[F2]/[F3] = Change SkyBox " + Chr(10) + "[F4] = Disable SkyBox")

    ShowGUI(155, 0)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardReleased(#PB_Key_F2)
          SkyBox("stevecube.jpg")
        ElseIf KeyboardReleased(#PB_Key_F3)
          SkyBox("desert07.jpg")
        ElseIf KeyboardReleased(#PB_Key_F4)
          SkyBox("")
        EndIf

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


SkyDome.pb

;
; ------------------------------------------------------------
;
;   PureBasic - SkyDome
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

#CameraSpeed = 1

Enumeration
  #MainWindow
  #Editor
EndEnumeration

Define.f KeyX, KeyY, MouseX, MouseY, RatioX, RatioY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    AmbientColor(RGB(255, 255, 255))

    CreateMaterial(0, LoadTexture(0, "r2skin.jpg"))
    CreateEntity  (0, LoadMesh(0, "robot.mesh"), MaterialID(0), -1, -2, -3)

    ;- Camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 70, 400, #PB_Absolute)
    CameraBackColor(0, RGB(19, 34, 49))

    ;-GUI
    RatioX = CameraViewWidth(0) / 1920
    RatioY = CameraViewHeight(0) / 1080

    OpenWindow3D(#MainWindow, 10, 10, 570 * RatioX, 180 * RatioY, "SkyDome")
    EditorGadget3D(#Editor, 10 * RatioX, 20 * RatioY, 530 * RatioX, 90 * RatioY, #PB_Editor3D_ReadOnly)
    SetGadgetText3D(#Editor, "[F2]/[F3] = Change SkyDome " + Chr(10) + "[F4] = Disable SkyDome")

    ShowGUI(128, 1)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardReleased(#PB_Key_F2)
          SkyDome("clouds.jpg", 30)
        ElseIf KeyboardReleased(#PB_Key_F3)
          SkyDome("wood.jpg", 30)
        ElseIf KeyboardReleased(#PB_Key_F4)
          SkyDome("", 0)
        EndIf

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


SliderJoint.pb

;
; ------------------------------------------------------------
;
;   PureBasic - sliderJoint
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;
IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY
#CameraSpeed = 1

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ; First create materials
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreateMaterial(1, LoadTexture(1, "Wood.jpg"))
    GetScriptMaterial(2, "Color/Green")
    GetScriptMaterial(3, "Color/Red")

    ; Meshes
    ;
    CreateCube(0, 1.0)
    CreateSphere(1, 0.5)

    ; Entities
    ;
    CreateEntity(0, MeshID(0), MaterialID(0),  1, 0, 0)
    ScaleEntity(0, 2, 4, 0.5)
    CreateEntity(1, MeshID(0), MaterialID(1), -3, 0, 0)
    ScaleEntity(1, 2, 4, 0.5)

    CreateEntity(2, MeshID(0), MaterialID(2), -1, -2.1, 0)
    ScaleEntity(2, 10, 0.1, 4)

    CreateEntity(3, MeshID(1), MaterialID(3), -1, 1, 0.23)

    ; Bodies
    ;
    EntityPhysicBody(0, #PB_Entity_StaticBody)
    EntityPhysicBody(1, #PB_Entity_BoxBody, 1.0)
    EntityPhysicBody(2, #PB_Entity_StaticBody)
    EntityPhysicBody(3, #PB_Entity_SphereBody, 0.5)

    ; SliderJoint
    ;
    SliderJoint(0, EntityID(0), -1, 0, 0, EntityID(1), 1, 0, 0)
    SetJointAttribute(0, #PB_SliderJoint_LowerLimit, -3)
    SetJointAttribute(0, #PB_SliderJoint_UpperLimit,  0)

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, -1, 8, 5, #PB_Absolute)
    CameraLookAt(0, -1, 0, 0)

    ; Light
    CreateLight(0, $FFFFFF, 1560, 900, 500)
    AmbientColor($330000)

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_PageUp)
          ApplyEntityImpulse(1, 0.1, 0, 0)
        ElseIf KeyboardPushed(#PB_Key_PageDown)
          ApplyEntityImpulse(1, -0.1, 0, 0)
        EndIf

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


Sort_(Numeric).pb

;
; ------------------------------------------------------------
;
;   PureBasic - Sort (Numerical) example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

; Change the number of elements here, to see the speed of the sort routine :)
;
#NbElements = 20

Dim Array.b(#NbElements)

For k=0 To #NbElements
  Array(k) = Random(10000)
Next

; Fill the array with lot of random number
;

For k=0 To #NbElements
  Debug Array(k)
Next

; Sort the whole array !
;
SortArray(Array(), #PB_Sort_Ascending)

Debug "----------------"

For k=0 To #NbElements
  Debug Array(k)
Next

MessageRequester("Sort Example", "Sort finished.")


Sort_(String).pb

;
; ------------------------------------------------------------
;
;   PureBasic - Sort (String) example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

; Don't change the number of elements without add them in the data below !
;
#NbElements = 8

Dim Array.s(#NbElements)

For k=0 To #NbElements
  Read.s Array(k)
Next

For k=0 To #NbElements
  Debug Array(k)
Next

SortArray(Array(), #PB_Sort_Ascending | #PB_Sort_NoCase)

Debug "---------------------"

For k=0 To #NbElements
  Debug Array(k)
Next

MessageRequester("Information", "Sort finished !", 0)

End

DataSection
  Data.s "Hello", "This", "is", "a", "Nice", "test", "Isn't", "it ?", "Haha !"
EndDataSection


Sound3D.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Sound3D
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ;- Mesh
    CreateCube(0, 100)
    CreateSphere(1, 50)

    ;- Material
    GetScriptMaterial(0, "Color/Blue")
    GetScriptMaterial(1, "Color/Red")

    ;- Entity
    CreateEntity(0, MeshID(0), MaterialID(0))
    CreateEntity(1, MeshID(1), MaterialID(1))

    ;- Sound3D
    If LoadSound3D(0, "roar.wav") ; Linux : Work with files 'ogg'
      SoundVolume3D(0, 50)
      SoundRange3D(0, 1, 500)
      PlaySound3D(0, #PB_Sound3D_Loop)
    EndIf

    If LoadSound3D(1, "siren.wav") ; Linux : Work with files 'ogg'
      SoundVolume3D(1, 50)
      SoundRange3D(1, 1, 500)
      PlaySound3D(1, #PB_Sound3D_Loop)
    EndIf

    ;- Node
    ; Create a node, so we can link the entity and the sound
    CreateNode(0, -400, 0, 0)
      AttachNodeObject(0, SoundID3D(0))
      AttachNodeObject(0, EntityID(0))

    ; Create a node, so we can link the entity and the sound
    CreateNode(1, 400, 0, 0)
      AttachNodeObject(1, SoundID3D(1))
      AttachNodeObject(1, EntityID(1))

    ;- Camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, -550, 70, 10, #PB_Absolute)
    CameraLookAt(0, NodeX(1), NodeY(1), NodeZ(1))

    ;- Light
    AmbientColor(0)
    CreateLight(0, RGB(255, 255, 255), 0, 700, 0)

    ;- Sky
    SkyBox("desert07.jpg")

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      SoundListenerLocate(CameraX(0), CameraY(0), CameraZ(0)) ; The 'ear' follows the camera

      RenderWorld()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


Sound.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Sound example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitSound() = 0
  MessageRequester("Error", "Sound system is not available",  0)
  End
EndIf

SoundFileName$ = OpenFileRequester("Choose a .wav file", "", "Wave files|*.wav",0)
If SoundFileName$
  If LoadSound(0, SoundFileName$)
    PlaySound(0, #PB_Sound_Loop)
    MessageRequester("Sound", "Playing the sound (loop)..."+#LF$+"Click to quit..", 0)
  Else
    MessageRequester("Error", "Can't load the sound.", 0)
  EndIf
EndIf
End


SoundPlugin.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Sound example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitSound() = 0
  MessageRequester("Error", "Can't open DirectX 7 or no sound card is available",  0)
  End
EndIf

UseOGGSoundDecoder()

SoundFileName$ = OpenFileRequester("Choose a sound file", "", "Wave or OGG files|*.wav;*.ogg",0)
If SoundFileName$
  If LoadSound(0, SoundFileName$)
    PlaySound(0,#PB_Sound_Loop)
    MessageRequester("Sound", "Playing the sound (loop)..."+Chr(10)+"Click to quit..", 0)
  Else
    MessageRequester("Error", "Can't load the sound.", 0)
  EndIf
EndIf
End


Spline.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Spline
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;
;An example of using SimpleSpline To make an Entity smoothly
;follow a predefined path With spline interpolation.

IncludeFile "Screen3DRequester.pb"

Define.f Time, TimeN, pas = 1, x, y, z, TimeSinceLastFrame

If InitEngine3D()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()
    Add3DArchive("Data/"                , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Textures"        , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Models"          , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Scripts"         , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)
    Parse3DScripts()

    WorldShadows(#PB_Shadow_Modulative, 0, RGB(175, 175, 175))

    ;- Ground
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1200, 1200, 1, 1, 5, 5)
    CreateEntity(0, MeshID(0), MaterialID(0), 500, 0, -500)

    ;- Cylinder - check point
    CreateCylinder(3, 10, 100)
    CreateEntity(4, MeshID(3), #PB_Material_None, 50,  0,   50)
    CreateEntity(5, MeshID(3), #PB_Material_None, 50,  0, -950)
    CreateEntity(6, MeshID(3), #PB_Material_None, 950, 0, -950)
    CreateEntity(7, MeshID(3), #PB_Material_None, 950, 0,   50)
    CreateEntity(8, MeshID(3), #PB_Material_None, 450, 0, -450)

    ;- Robot
    ;
    LoadMesh(1, "robot.mesh")
    CreateEntity(1, MeshID(1), #PB_Material_None, 0, 0, 0)
    ScaleEntity(1, 3, 3, 3)
    StartEntityAnimation(1, "Walk")

    ;- Ninja
    ;
    LoadMesh(2, "ninja.mesh")
    CreateEntity(2, MeshID(2), #PB_Material_None, 500, 0, 400)
    ScaleEntity(2, 1.4, 1.4, 1.4)
    StartEntityAnimation(2, "Walk", #PB_EntityAnimation_Manual)

    ;- Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 500, 1500, 1450, #PB_Absolute)
    CameraFOV(0, 28)
    CameraBackColor(0,$846748)
    CameraLookAt(0, 500, 0, -500)

    ;- Light
    ;
    AmbientColor(RGB(25, 25, 25))
    CreateLight(0, RGB(200, 200, 200), -750, 750, -750)

    ;- Spline Robot
    ;
    spline = CreateSpline(#PB_Any)
    AddSplinePoint(spline, EntityX(4), 0, EntityZ(4))
    AddSplinePoint(spline, EntityX(8), 0, EntityZ(8))
    AddSplinePoint(spline, EntityX(5), 0, EntityZ(5))
    AddSplinePoint(spline, EntityX(6), 0, EntityZ(6))
    AddSplinePoint(spline, EntityX(8), 0, EntityZ(8))
    AddSplinePoint(spline, EntityX(7), 0, EntityZ(7))
    AddSplinePoint(spline, EntityX(4), 0, EntityZ(4))

    ;- Spline Ninja
    ;
    splineN = CreateSpline(#PB_Any)
    AddSplinePoint(splineN, EntityX(2), EntityY(2), EntityZ(2))
    AddSplinePoint(splineN, EntityX(1), EntityY(1), EntityZ(1))

    Repeat
      Screen3DEvents()

      ExamineKeyboard()

      ; Robot
      ComputeSpline(spline, time) ; Should be called before using SplineX(); SplineY() and SplineZ()
      x = SplineX(spline)
      y = SplineY(spline)
      z = SplineZ(spline)

      EntityLookAt(1, x, EntityY(1), z, 1, 0, 0)
      MoveEntity(1, x, y, z, #PB_Absolute)

      time + pas * TimeSinceLastFrame / 35

      If time > 1
        Time = 0
      EndIf

      ; Ninja
      ComputeSpline(splineN, TimeSinceLastFrame/2) ; Should be called before using SplineX(); SplineY() and SplineZ()
      x = SplineX(splineN)
      y = SplineY(splineN)
      z = SplineZ(splineN)

      EntityLookAt(2, x, EntityY(2), z)
      MoveEntity(2, x, y, z, #PB_Absolute)
      AddEntityAnimationTime(2, "Walk", TimeSinceLastFrame*1000 / 2)

      UpdateSplinePoint(splineN, 0, EntityX(2), EntityY(2), EntityZ(2))
      UpdateSplinePoint(splineN, 1, EntityX(1), EntityY(1), EntityZ(1))

      TimeSinceLastFrame = RenderWorld() / 1000

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape)

    End

  EndIf
Else
  MessageRequester("Error","Can't initialize engine3D")
EndIf


Sprite3D.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Sprite example file
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "Sprite system can't be initialized", 0)
  End
EndIf

If InitSprite3D() = 0
  MessageRequester("Error", "Sprite3D system can't be initialized correctly", 0)
  End
EndIf

;
; Now, open a 800*600 - 32 bit screen
;

If OpenScreen(800, 600, 32, "Sprite")

  ; Load our 16 bit sprite (which is a 24 bit picture in fact, as BMP doesn't support 16 bit format)
  ;
  LoadSprite(0, "Data/Geebee2.bmp", #PB_Sprite_Texture)
  CreateSprite3D(0, 0)
  CreateSprite3D(1, 0)
  CreateSprite3D(2, 0)

  Sprite3DQuality(1)

  TransparentSpriteColor(0, RGB(255, 0, 255)) ; Our pink is transparent :)

  Repeat

    ; Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)

    FlipBuffers()

    ClearScreen(RGB(0,50,128))

    ; Draw our sprite
    ;
    If Start3D()
      DisplaySprite3D(0, 0, 30)
      DisplaySprite3D(0, x+100, 100, x)
      DisplaySprite3D(0, x*2, 100, x)

      ; Zoom..
      ;
      ZoomSprite3D(1, x, x)
      RotateSprite3D(1, x, 0)
      DisplaySprite3D  (1, 0, 100, x/2)
      DisplaySprite3D  (1, x*2, 100, x)
      DisplaySprite3D  (1, 0, 100, x/2)
      DisplaySprite3D  (1, x*2, 200+x, x)

      Stop3D()
    EndIf

    ExamineKeyboard()

    x+1
  Until KeyboardPushed(#PB_Key_Escape)

Else
  MessageRequester("Error", "Can't open a 640*480 - 16 bit screen !", 0)
EndIf

End


Sprite.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Sprite example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "Sprite system can't be initialized", 0)
  End
EndIf

;
; Now, open a 800*600 - 32 bits screen
;
If OpenScreen(800, 600, 32, "Sprite")

  ; Load our 16 bit sprite (which is a 24 bit picture in fact, as BMP doesn't support 16 bit format)
  ;
  LoadSprite(0, "Data/PureBasic.bmp", 0)
  CopySprite(0,1,0)

  Repeat

    ; Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)

    FlipBuffers()

    ClearScreen(RGB(0,0,0))

    ; Draw our sprite

    ClipSprite(0, 0, 0, x, x/8)

    DisplaySprite(0, x, 100)
    DisplaySprite(1, x, x)
    DisplaySprite(0, 600-x, x)

    x+1

    ExamineKeyboard()
  Until KeyboardPushed(#PB_Key_Escape)

Else
  MessageRequester("Error", "Can't open a 640*480 - 16 bit screen !", 0)
EndIf

End


Sprite_SpecialFX.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Sprite SpecialFX example file
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

    If InitSprite() = 0
        MessageRequester("Error", "Can't open DirectX 7 Or later", 0)
        End
    EndIf

    If InitKeyboard() = 0 Or InitMouse() = 0
        MessageRequester("Error", "Can't open DirectX 7 or Mouse not found..", 0)
        End
    EndIf

    TranslucideStep = 1
    FilterX = -100

    ;
    ;-------- MessageReq and OpenScreen ---------
    ;

    MessageRequester("Information", "This is a little demo of PureBasic real-time 2D effects:"+Chr(10)+Chr(10)+"F1: Enable/Disable RGB Filters"+Chr(10)+"F2: Enable/Disable AlphaChannel"+Chr(10)+"F3: Enable/Disable Shadow"+Chr(10)+"F4: Start screen fading"+Chr(10)+"F5: Enable/Disable AlphaChannel color rotation"+Chr(10)+"+/-: Add/Remove PureBasic AlphaBlending sprite"+Chr(10)+Chr(10)+"Use the mouse :)... Enjoy !")

    If OpenScreen(800, 600, 32, "SpecialFX") = 0
       MessageRequester("Error", "Can't open a 800*600 - 32 bit screen !", 0)
       End
    EndIf

    ;
    ;-------- Load needed Stuff --------
    ;

    LoadSprite(0, "Data\Background.bmp"  )
    LoadSprite(1, "Data\PureBasic.bmp"   )
    LoadSprite(2, "Data\AlphaChannel.bmp", #PB_Sprite_Alpha)

    ;
    ;-------- Helper procedure --------
    ;
    Procedure$ GetOnOffText(Text$, State)
      If State
        Text$ + "On"
      Else
        Text$ + "Off"
      EndIf

      ProcedureReturn Text$
    EndProcedure

    ;
    ;-------- MainLoop --------
    ;

Repeat

    StartSpecialFX()

    For x=0 To 800 Step 256
        For y=0 To 600 Step 256
            DisplaySprite(0, x, y)
        Next
    Next

    ExamineMouse()

    ; --------------------------------- Translucide -----------------------------------------

    For k=0 To NbSprites
        DisplayTranslucentSprite(1, MouseX(), MouseY()+k*40, TranslucideValue)
        ;DisplayTransparentSprite(1, MouseX(), MouseY()+k*40)
    Next

    TranslucideValue+TranslucideStep

    If TranslucideValue > 255
        TranslucideStep = -1 : TranslucideValue = 255
    EndIf

    If TranslucideValue < 0
        TranslucideStep = 1 : TranslucideValue = 0
    EndIf

    ; --------------------------------- Alpha Channel ---------------------------------------

    If EnableAlpha
      ;
      DisplayAlphaSprite(2, 100, AlphaY)

      If EnableAlphaColor
          ChangeAlphaIntensity(AlphaRed/4, 0, AlphaRed/2)
          AlphaRed+1
          If AlphaRed > 400 : AlphaRed = 0 : EndIf
      EndIf
    EndIf

    AlphaY+1
    If AlphaY > 600 : AlphaY = -100 : EndIf

    ; ------------------------------------ Shadow -------------------------------------------

    If EnableShadow
        DisplayShadowSprite(2, 50, 120)
        DisplayShadowSprite(2, 300, 320)
    EndIf

    ; ---------------------------------- RGB Filters ----------------------------------------

    If EnableRGBFilters
        DisplayRGBFilter(FilterX   , 100, 100, 100, 255, 120, 0)
        DisplayRGBFilter(FilterX+30, 300, 100, 100, 0, 120, 100)
        DisplayRGBFilter(FilterX+40, 350, 100, 100, 0, 0, 255)
    EndIf

    FilterX+1
    If FilterX > 800 : FilterX = -100 : EndIf

    ; ---------------------------------- Gamma Fading ----------------------------------------

    If EnableGamma
      Fade+FadeStep

      If Fade >= 255
        FadeStep = -1
      EndIf

      ChangeGamma(Fade, Fade, Fade)

      If Fade = 0
        FadeStep = 1
      EndIf
    EndIf

    StopSpecialFX()

    If StartDrawing(ScreenOutput())
      DrawingMode(1)

      DrawText(10, 10, GetOnOffText("F1: RGB Filters: ", EnableRGBFilters))
      DrawText(10, 30, GetOnOffText("F2: AphaChannel: ", EnableAlpha))
      DrawText(10, 50, GetOnOffText("F3: AphaCycle  : ", EnableAlphaColor))
      DrawText(10, 70, GetOnOffText("F4: SoftShadows: ", EnableShadow))
      DrawText(10, 90, GetOnOffText("F5: FadeIn/Out : ", EnableGamma))

      StopDrawing()
    EndIf

    ExamineKeyboard()

    If KeyboardReleased(#PB_Key_Add) : NbSprites+1 : EndIf
    If KeyboardReleased(#PB_Key_Subtract) And NbSprites>0 : NbSprites-1 : EndIf

    If KeyboardReleased(#PB_Key_F1) : EnableRGBFilters = 1-EnableRGBFilters : EndIf
    If KeyboardReleased(#PB_Key_F2) : EnableAlpha      = 1-EnableAlpha      : EndIf
    If KeyboardReleased(#PB_Key_F3) : EnableAlphaColor = 1-EnableAlphaColor : EndIf
    If KeyboardReleased(#PB_Key_F4) : EnableShadow     = 1-EnableShadow     : EndIf
    If KeyboardReleased(#PB_Key_F5) : EnableGamma      = 1-EnableGamma      : EndIf

    ;---- Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)

    FlipBuffers()

Until MouseButton(1) Or MouseButton(2) Or KeyboardPushed(#PB_Key_Escape)

End   #


StaticGeometry.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Static Geometry
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY
Define nx.f, nz.f, Boost.f = 10, Yaw.f, Pitch.f

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts",#PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    WorldShadows(#PB_Shadow_Additive)

    AmbientColor(0)

    ; node for Light and Billboard (Sun)
    CreateNode(0, 0, 3000, 0)

    ;Create light
    CreateLight(0, RGB(90, 105, 132), 0, 3000, 0)
    AttachNodeObject(0, LightID(0))

    ; Create flare
    GetScriptMaterial(0, "Scene/burst")
    CreateBillboardGroup(0, MaterialID(0), 2048, 2048)
    AddBillboard(0, 0, 0, 3000, 0)
    AttachNodeObject(0, BillboardGroupID(0))

    ; Static geometry
    ;

    ; Create Entity
    CreateCube(0, 1)
    CreateEntity(0, MeshID(0), #PB_Material_None)

    ; Create Static geometry
    CreateStaticGeometry(0, 1000, 1000, 1000, #True)

    For z = -10 To 10
      For x = -10 To 10
        AddStaticGeometryEntity(0, EntityID(0), x * 1000, 0, z * 1000, 1000,  10, 1000, 0, 0, 0)
        Height.f = 200 + Random(800)
        AddStaticGeometryEntity(0, EntityID(0), x * 1000, Height/2, z * 1000,  200, Height, 200, 0, Random(360), 0)
      Next
    Next

    ; Build the static geometry
    BuildStaticGeometry(0)

    FreeEntity(0)

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 2000, 2000, 2000, #PB_Absolute)
    CameraLookAt(0, 0, 0, 0)
    CameraRange (0, 2, 5000)
    CameraFOV   (0, 90)
    CameraBackColor(0, RGB(90, 105, 132))

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        Yaw   = -MouseDeltaX() * 0.05
        Pitch = -MouseDeltaY() * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Up)
          MoveCamera(0,  0, 0, -2 * Boost)
        ElseIf KeyboardPushed(#PB_Key_Down)
          MoveCamera(0,  0, 0,  2 * Boost)
        EndIf

        If KeyboardPushed(#PB_Key_Left)
          MoveCamera(0, -2 * Boost, 0, 0)
        ElseIf KeyboardPushed(#PB_Key_Right)
          MoveCamera(0,  2 * Boost, 0, 0)
        EndIf

      EndIf

      ; Sun
      nx = 10000 * Cos(ElapsedMilliseconds() / 2500)
      nz = 10000 * Sin(ElapsedMilliseconds() / 2500)
      MoveNode(0, nx, 3000, nz, #PB_Absolute)

      RotateCamera(0, Pitch, Yaw, 0, #PB_Relative)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


StatusBar.pb

;
; ------------------------------------------------------------
;
;   PureBasic - StatusBar example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If OpenWindow(0, 100, 150, 300, 100, "PureBasic - StatusBar Example", #PB_Window_SystemMenu | #PB_Window_SizeGadget)

  If CreateStatusBar(0, WindowID(0))
    AddStatusBarField(100)
    AddStatusBarField(50)
    AddStatusBarField(100)
  EndIf

  StatusBarText(0, 0, "Area 1")
  StatusBarText(0, 1, "Area 2", #PB_StatusBar_BorderLess)
  StatusBarText(0, 2, "Area 3", #PB_StatusBar_Right | #PB_StatusBar_Raised)

  Repeat

  Until WaitWindowEvent() = #PB_Event_CloseWindow

EndIf


String.pb

;
; ------------------------------------------------------------
;
;   PureBasic - String example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

c$ = "Test"
a$ = Left(c$,1)
a$ = Mid(c$,3, 1)

a.l = Val("-121212")

MessageRequester("PureBasic", "Welcome: "+Mid(Str(a),2,3)+" "+a$, 0)


System.pb

;
; ------------------------------------------------------------
;
;   PureBasic - System example file
;
;    (c) 2013 - Fantaisie Software
;
; ------------------------------------------------------------
;

MessageRequester("System information", "User: " + UserName() + #LF$ +
                                       "Computer name: " + ComputerName() + #LF$ +
                                       "NbCPUs: " + CountCPUs() + #LF$ +
                                       "Physical memory (MB): " + Str(MemoryStatus(#PB_System_TotalPhysical) / (1024 * 1024)))


Systray.pb

;
; ------------------------------------------------------------
;
;   PureBasic - SysTray example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If OpenWindow(0, 100, 150, 300, 100, "PureBasic - SysTray Example", #PB_Window_SystemMenu)

  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    ; .ico format is available only on Windows
    IconName$ = "Data\CdPlayer.ico"
  CompilerElse
    IconName$ = "Data/Drive.bmp"
  CompilerEndIf

  AddSysTrayIcon(1, WindowID(0), LoadImage(0, IconName$))
  AddSysTrayIcon(2, WindowID(0), LoadImage(1, IconName$))
  SysTrayIconToolTip(1, "Icon 1")
  SysTrayIconToolTip(2, "Icon 2")

  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_SysTray
      If EventType() = #PB_EventType_LeftDoubleClick
        MessageRequester("SysTray", "Left DoubleClick on SysTrayIcon "+Str(EventGadget()),0)

        ChangeSysTrayIcon (EventGadget(), LoadImage(0, IconName$))
        SysTrayIconToolTip(EventGadget(), "Changed !")
      EndIf

    EndIf
  Until Event = #PB_Event_CloseWindow

EndIf


Terrain.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Terrain : Create 9 terrains in one TerrainGroup
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;
; It can take few minutes to build all terrains (it will be more faster after saving it)
MessageRequester("Warning !", "It can take a few minutes to build all terrains...", 0)

IncludeFile "Screen3DRequester.pb"

#CameraSpeed = 2
#TerrainMiniX = -1
#TerrainMiniY = -1
#TerrainMaxiX =  1
#TerrainMaxiY =  1

Define.f KeyX, KeyY, MouseX, MouseY
Declare InitBlendMaps()

; OpenGL needs to have CG enabled to work (Linux and OS X have OpenGL by default)
;
CompilerIf #PB_Compiler_OS <> #PB_OS_Windows Or Subsystem("OpenGL")
  Flags = #PB_Engine3D_EnableCG
CompilerEndIf

If InitEngine3D(Flags)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()
    Add3DArchive("Data/Textures/", #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Textures/nvidia", #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)

    ;- Light
    ;
    light = CreateLight(#PB_Any ,RGB(190, 190, 190), 4000, 1200, 1000,#PB_Light_Directional)
    SetLightColor(light, #PB_Light_SpecularColor, RGB(255*0.4, 255*0.4,255*0.4))
    LightDirection(light ,0.55, -0.3, -0.75)
    AmbientColor(RGB(255*0.2, 255*0.2,255*0.2))

    ;- Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0,  800, 400, 80, #PB_Absolute)
    CameraBackColor(0, RGB(5, 5, 10))

    ;- Terrain definition
    SetupTerrains(LightID(Light), 3000, #PB_Terrain_NormalMapping)
    ; initialize terrain
    CreateTerrain(0, 513, 12000, 600, 3, "terrain01", "Dat")
    ; set all texture will be use when terrrain will be constructed
    AddTerrainTexture(0,  0, 100, "dirt_grayrocky_diffusespecular.dds",  "dirt_grayrocky_normalheight.dds")
    AddTerrainTexture(0,  1,  30, "grass_green-01_diffusespecular.dds", "grass_green-01_normalheight.dds")
    AddTerrainTexture(0,  2, 200, "growth_weirdfungus-03_diffusespecular.dds", "growth_weirdfungus-03_normalheight.dds")

    ; Build terrains
    For ty = #TerrainMiniY To #TerrainMaxiY
      For tx = #TerrainMiniX To #TerrainMaxiX
        imported = DefineTerrainTile(0, tx, ty, "terrain513.png", ty % 2, tx % 2)
      Next
    Next
    BuildTerrain(0)

    If imported = #True
      InitBlendMaps()
      UpdateTerrain(0)
      SaveTerrain(0, #False)
    EndIf

    ; SkyBox
    ;
    SkyBox("desert07.jpg")

    Repeat
      Screen3DEvents()

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf
      MoveCamera(0, CameraX(0), TerrainHeight(0, CameraX(0), CameraZ(0)) + 20, CameraZ(0), #PB_Absolute)
      MoveCamera  (0, KeyX, 0, KeyY)
      RotateCamera(0,  MouseY, MouseX, 0, #PB_Relative)

      RenderWorld()
      FlipBuffers()

    Until KeyboardPushed(#PB_Key_Escape)

    End

  EndIf
Else
  MessageRequester("Error","Can't initialize engine3D")
EndIf

Procedure Clamp(*var.float, min.f, max.f)
  If *var\f < min
    *var\f = min
  ElseIf *var\f > max
    *var\f = max
  EndIf
EndProcedure

Procedure InitBlendMaps()
  minHeight1.f = 70
  fadeDist1.f = 40
  minHeight2.f = 70
  fadeDist2.f = 15
  For ty = #TerrainMiniY To #TerrainMaxiY
    For tx = #TerrainMiniX To #TerrainMaxiX
      Size = TerrainTileLayerMapSize(0, tx, ty)
      For y = 0 To Size-1
        For x = 0 To Size-1
          Height.f = TerrainTileHeightAtPosition(0, tx, ty, 1, x, y)

          val.f = (Height - minHeight1) / fadeDist1
          Clamp(@val, 0, 1)
          SetTerrainTileLayerBlend(0, tx, ty, 1, x, y, val)

          val.f = (Height - minHeight2) / fadeDist2
          Clamp(@val, 0, 1)
          SetTerrainTileLayerBlend(0, tx, ty, 2, x, y, val)
        Next
      Next
      UpdateTerrainTileLayerBlend(0, tx, ty, 1)
      UpdateTerrainTileLayerBlend(0, tx, ty, 2)
    Next
  Next
EndProcedure


TerrainBlend.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Terrain : Terrain Blend change
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

; Use left button to select an area, then use PageUp or PageDown to change terrain's blend map

IncludeFile "Screen3DRequester.pb"

#CameraSpeed = 1
#TerrainMiniX = 0
#TerrainMiniY = 0
#TerrainMaxiX = 0
#TerrainMaxiY = 0

#NbSommet = 36
#SizeCircle = 70

Define.f KeyX, KeyY, MouseX, MouseY, TimeSinceLastFrame
Define Selected

Declare InitBlendMaps()
Declare Clamp(*var.float, min.f, max.f)
Declare AffichePolygone(Px.f, Py.f, Pz.f, Rayon.f)
Declare DoTerrainModify(tx, ty, wx.f, wy.f, wz.f, mBrushSizeTerrainSpace.f, height.f)

; OpenGL needs to have CG enabled to work (Linux and OS X have OpenGL by default)
;
CompilerIf #PB_Compiler_OS <> #PB_OS_Windows Or Subsystem("OpenGL")
  Flags = #PB_Engine3D_EnableCG
CompilerEndIf

If InitEngine3D(Flags)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()
    Add3DArchive("Data/Textures/", #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Textures/nvidia", #PB_3DArchive_FileSystem)
    Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
    Parse3DScripts()

    MaterialFilteringMode(#PB_Default, #PB_Material_Anisotropic, 8)

    ;- Light
    ;

    light = CreateLight(#PB_Any ,RGB(185, 185, 185),4000,1200, 1000,#PB_Light_Directional)
    SetLightColor(light, #PB_Light_SpecularColor, RGB(255*0.4, 255*0.4,255*0.4))
    LightDirection(light, 0.55, -0.3, -0.75)

    AmbientColor(RGB(5, 5,5))

    ;- Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0,  2000, 100, 1700, #PB_Absolute)
    CameraRange(0, 1, 0)

    ;----------------------------------
    ; terrain definition
    SetupTerrains(LightID(Light), 3000, #PB_Terrain_NormalMapping)
    ; initialize terrain
    CreateTerrain(0, 513, 12000, 600, 3, "Terrain03", "Dat")
    ; set all texture will be use when terrrain will be constructed
    AddTerrainTexture(0,  0, 100, "dirt_grayrocky_diffusespecular.dds",  "dirt_grayrocky_normalheight.dds")
    AddTerrainTexture(0,  1,  30, "grass_green-01_diffusespecular.dds", "grass_green-01_normalheight.dds")
    AddTerrainTexture(0,  2, 200, "growth_weirdfungus-03_diffusespecular.dds", "growth_weirdfungus-03_normalheight.dds")

    ;- define terrains
    For ty = #TerrainMiniY To #TerrainMaxiY
      For tx = #TerrainMiniX To #TerrainMaxiX
        imported = DefineTerrainTile(0, tx, ty, "terrain513.png", ty % 2, tx % 2)
      Next
    Next
    BuildTerrain(0)

    If imported = #True
      InitBlendMaps()
      UpdateTerrain(0)
      SaveTerrain(0, #False)
    EndIf

    ; SkyBox
    ;
    SkyBox("desert07.jpg")

    ShowGUI(128, 1)

    Repeat

      Screen3DEvents()

      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)
        MouseY = -(MouseDeltaY()/10)
        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))

        TerrainMousePick(0, CameraID(0), MouseX(),  MouseY())

        If MouseButton(#PB_MouseButton_Left)
          ShowGUI(128, 1)
          AffichePolygone(PickX(), PickY(), PickZ(), 100)
          Selected = #True
        Else
          ShowGUI(128, 0)
          MoveCamera  (0, KeyX, 0, KeyY)
          AffichePolygone(PickX(), PickY(), PickZ(), 0)
          Selected = #False
          If CameraY(0) < TerrainHeight(0, CameraX(0), CameraZ(0)) + 10
            MoveCamera(0, CameraX(0), TerrainHeight(0, CameraX(0), CameraZ(0)) + 10, CameraZ(0), #PB_Absolute)
          EndIf
          RotateCamera(0,  MouseY, MouseX, 0, #PB_Relative)

        EndIf

      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

        Modify = 0
        If KeyboardPushed(#PB_Key_PageUp)
          Modify = 1
        ElseIf  KeyboardPushed(#PB_Key_PageDown)
          Modify = -1
        EndIf
      EndIf

      If Modify And Selected

        For ty = #TerrainMiniY To #TerrainMaxiY
          For tx = #TerrainMiniX To #TerrainMaxiX
            DoTerrainModify(tx, ty, PickX(), PickY(), PickZ(), 0.02, TimeSinceLastFrame * Modify)
          Next
        Next
      EndIf

      TimeSinceLastFrame = RenderWorld() / 1000
      FlipBuffers()

    Until KeyboardPushed(#PB_Key_Escape)

    End

  EndIf
Else
  MessageRequester("Error","Can't initialize engine3D")
EndIf

Procedure InitBlendMaps()
  minHeight0.f = 70
  fadeDist0.f = 40
  minHeight1.f = 70
  fadeDist1.f = 15
  For ty = #TerrainMiniY To #TerrainMaxiY
    For tx = #TerrainMiniX To #TerrainMaxiX
      Size = TerrainTileLayerMapSize(0, tx, ty)
      For y = 0 To Size-1
        For x = 0 To Size-1
          Height.f = TerrainTileHeightAtPosition(0, tx, ty, 1, x, y)
          val.f = (Height - minHeight0) / fadeDist0
          Clamp(@val, 0, 1)
          ;SetTerrainTileLayerBlend(0, tx, ty, 1, x, y, val)
          val.f = (Height - minHeight1) / fadeDist1
          Clamp(@val, 0, 1)
          SetTerrainTileLayerBlend(0, tx, ty, 2, x, y, val)
        Next
      Next
      ;UpdateTerrainTileLayerBlend(0, tx, ty, 1)
      UpdateTerrainTileLayerBlend(0, tx, ty, 2)
    Next
  Next
EndProcedure

Procedure Clamp(*var.float, min.f, max.f)
  If *var\f < min
    *var\f = min
  ElseIf *var\f > max
    *var\f = max
  EndIf
EndProcedure

Procedure.f Min(a.f, b.f)
  If a < b
    ProcedureReturn a
  Else
    ProcedureReturn b
  EndIf
EndProcedure

Procedure.f Max(a.f, b.f)
  If a > b
    ProcedureReturn a
  Else
    ProcedureReturn b
  EndIf
EndProcedure

Procedure DoTerrainModify(tx, ty, wx.f, wy.f, wz.f, mBrushSizeTerrainSpace.f, TimeElapsed.f)
  imgSize.f = TerrainTileLayerMapSize(0, tx, ty)
  Pointx.f = TerrainTilePointX(0, tx, ty, wx, wy, wz)
  Pointy.f = TerrainTilePointY(0, tx, ty, wx, wy, wz)

  startx = (Pointx - mBrushSizeTerrainSpace) * imgSize
  starty = (Pointy - mBrushSizeTerrainSpace) * imgSize
  endx   = (Pointx + mBrushSizeTerrainSpace) * imgSize
  endy   = (Pointy + mBrushSizeTerrainSpace) * imgSize

  startx = Max(startx, 0)
  starty = Max(starty, 0)
  endx   = Min(endx, imgSize)
  endy   = Min(endy, imgSize)

  For y = starty To endy
    For x = startx To endx

      tsXdist.f = (x / imgSize) - Pointx
      tsYdist.f = (y / imgSize) - Pointy

      weight.f = Min(1.0,	Sqr(tsYdist * tsYdist + tsXdist * tsXdist) / (0.5 * mBrushSizeTerrainSpace))
      weight = 1.0 - (weight * weight)
      paint.f = weight * TimeElapsed
      imgY = imgSize - y
      val.f = GetTerrainTileLayerBlend(0, tx, ty, 1, x, imgY) + paint
      Clamp(@val, 0, 1)
      SetTerrainTileLayerBlend(0, tx, ty, 1, x, imgY, val)

    Next x
  Next y
  UpdateTerrainTileLayerBlend(0, tx, ty, 1)
EndProcedure

Procedure AffichePolygone(Px.f, Py.f, Pz.f, Rayon.f)
  Define.l i, Color = RGB(255, 255, 0)
  Define.f Angle, Sx, Sy, Sz, Sx1, Sy1, Sz1, Py1, Delta = 2

  For i = 0 To #NbSommet-2
    Sx = Cos(Angle) * Rayon
    Sz = Sin(Angle) * Rayon
    Angle + 2.0 * #PI / #NbSommet
    Sx1 = Cos(Angle) * Rayon
    Sz1 = Sin(Angle) * Rayon
    Py = TerrainHeight(0, Px + Sx, Pz + Sz) + Delta
    Py1 = TerrainHeight(0, Px + Sx1, Pz + Sz1) + Delta
    CreateLine3D(i, Px + Sx, Py, Pz + Sz, Color, Px + Sx1, Py1, Pz + Sz1, Color)
  Next i
  Py = TerrainHeight(0, Px + Cos(0) * Rayon, Pz + Sin(0) * Rayon) + Delta
  CreateLine3D(i, Px + Sx1, Py1, Pz + Sz1, Color, Px + Cos(0) * Rayon, Py, Pz + Sin(0) * Rayon, Color)
EndProcedure


TerrainHeight.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Terrain : Terrain Height change
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

; Use left button to select an area, then use PageUp or PageDown to change terrain's height
; Use [F5] to init BlendMaps

IncludeFile "Screen3DRequester.pb"

#CameraSpeed = 1
#TerrainMiniX = 0
#TerrainMiniY = 0
#TerrainMaxiX = 0
#TerrainMaxiY = 0

#NbSommet = 36

Define.f KeyX, KeyY, MouseX, MouseY, TimeSinceLastFrame
Define Selected

Declare InitBlendMaps()
Declare Clamp(*var.float, min.f, max.f)
Declare DisplayPolygon(Px.f, Py.f, Pz.f, Rayon.f)
Declare DoTerrainModify(tx, ty, wx.f, wy.f, wz.f, mBrushSizeTerrainSpace.f, height.f)

; OpenGL needs to have CG enabled to work (Linux and OS X have OpenGL by default)
;
CompilerIf #PB_Compiler_OS <> #PB_OS_Windows Or Subsystem("OpenGL")
  Flags = #PB_Engine3D_EnableCG
CompilerEndIf

If InitEngine3D(Flags)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()
    Add3DArchive("Data/Textures/", #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Textures/nvidia", #PB_3DArchive_FileSystem)
    Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
    Parse3DScripts()

    ;- Light
    ;

    light = CreateLight(#PB_Any ,RGB(185, 185, 185), 4000, 1200, 1000, #PB_Light_Directional)
    SetLightColor(light, #PB_Light_SpecularColor, RGB(255*0.4, 255*0.4,255*0.4))
    LightDirection(light ,0.55, -0.3, -0.75)
    AmbientColor(RGB(5, 5,5))

    ;- Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0,  0, 500, -50, #PB_Absolute)
    CameraRange(0, 1, 0)

    ;----------------------------------
    ; terrain definition
    SetupTerrains(LightID(Light), 3000, #PB_Terrain_NormalMapping)
    ; initialize terrain
    CreateTerrain(0, 513, 12000, 600, 3, "Terrain04", "Dat")
    ; set all texture will be use when terrrain will be constructed
    AddTerrainTexture(0,  0, 100, "dirt_grayrocky_diffusespecular.dds",  "dirt_grayrocky_normalheight.dds")
    AddTerrainTexture(0,  1,  30, "grass_green-01_diffusespecular.dds", "grass_green-01_normalheight.dds")
    AddTerrainTexture(0,  2, 200, "growth_weirdfungus-03_diffusespecular.dds", "growth_weirdfungus-03_normalheight.dds")

    ;- define terrains
    For ty = #TerrainMiniY To #TerrainMaxiY
      For tx = #TerrainMiniX To #TerrainMaxiX
        imported = DefineTerrainTile(0, tx, ty, "terrain513.png", ty % 2, tx % 2)
      Next
    Next
    BuildTerrain(0)

    If imported = #True
      InitBlendMaps()
      UpdateTerrain(0)
      SaveTerrain(0, #False)
    EndIf

    ; SkyBox
    ;
    SkyBox("desert07.jpg")

    ShowGUI(128, 1)

    Repeat

      Screen3DEvents()

      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)
        MouseY = -(MouseDeltaY()/10)
        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left), "F", 0)

        TerrainMousePick(0, CameraID(0), MouseX(),  MouseY())

        If MouseButton(#PB_MouseButton_Left)
          ShowGUI(128, 1)
          DisplayPolygon(PickX(), PickY(), PickZ(), 50)
          Selected = #True
        Else
          ShowGUI(128, 0)
          MoveCamera  (0, KeyX, 0, KeyY)
          DisplayPolygon(PickX(), PickY(), PickZ(), 0)
          Selected = #False
          If CameraY(0) < TerrainHeight(0, CameraX(0), CameraZ(0)) + 10
            MoveCamera(0, CameraX(0), TerrainHeight(0, CameraX(0), CameraZ(0)) + 10, CameraZ(0), #PB_Absolute)
          EndIf
          RotateCamera(0,  MouseY, MouseX, 0, #PB_Relative)

        EndIf

      EndIf

      If ExamineKeyboard()
        If KeyboardReleased(#PB_Key_F5)
          InitBlendMaps()
        EndIf
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

        Modify = 0
        If KeyboardPushed(#PB_Key_PageUp)
          Modify = 1
        ElseIf  KeyboardPushed(#PB_Key_PageDown)
          Modify = -1
        EndIf
      EndIf

      If Modify And Selected

        For ty = #TerrainMiniY To #TerrainMaxiY
          For tx = #TerrainMiniX To #TerrainMaxiX
            DoTerrainModify(tx, ty, PickX(), PickY(), PickZ(), 0.02, TimeSinceLastFrame * Modify)
          Next
        Next
        UpdateTerrain(0)
      EndIf

      TimeSinceLastFrame = RenderWorld() * 0.2 / 1000
      FlipBuffers()

    Until KeyboardPushed(#PB_Key_Escape)

    End

  EndIf
Else
  MessageRequester("Error","Can't initialize engine3D")
EndIf

Procedure InitBlendMaps()
  minHeight1.f = 70
  fadeDist1.f = 40
  minHeight2.f = 70
  fadeDist2.f = 15
  For ty = #TerrainMiniY To #TerrainMaxiY
    For tx = #TerrainMiniX To #TerrainMaxiX
      Size = TerrainTileLayerMapSize(0, tx, ty)
      For y = 0 To Size-1
        For x = 0 To Size-1
          Height.f = TerrainTileHeightAtPosition(0, tx, ty, 1, x, y)

          val.f = (Height - minHeight1) / fadeDist1
          Clamp(@val, 0, 1)
          SetTerrainTileLayerBlend(0, tx, ty, 1, x, y, val)

          val.f = (Height - minHeight2) / fadeDist2
          Clamp(@val, 0, 1)
          SetTerrainTileLayerBlend(0, tx, ty, 2, x, y, val)
        Next
      Next
      UpdateTerrainTileLayerBlend(0, tx, ty, 1)
      UpdateTerrainTileLayerBlend(0, tx, ty, 2)
    Next
  Next
EndProcedure

Procedure Clamp(*var.float, min.f, max.f)
  If *var\f < min
    *var\f = min
  ElseIf *var\f > max
    *var\f = max
  EndIf
EndProcedure

Procedure.f Min(a.f, b.f)
  If a < b
    ProcedureReturn a
  Else
    ProcedureReturn b
  EndIf
EndProcedure

Procedure.f Max(a.f, b.f)
  If a > b
    ProcedureReturn a
  Else
    ProcedureReturn b
  EndIf
EndProcedure

Procedure DoTerrainModify(tx, ty, wx.f, wy.f, wz.f, mBrushSizeTerrainSpace.f, TimeElapsed.f)
  terrainSize.f = TerrainTileSize(0, tx, ty) - 1
  Pointx.f = TerrainTilePointX(0, tx, ty, wx, wy, wz)
  Pointy.f = TerrainTilePointY(0, tx, ty, wx, wy, wz)

  startx = (Pointx - mBrushSizeTerrainSpace) * terrainSize
  starty = (Pointy - mBrushSizeTerrainSpace) * terrainSize
  endx   = (Pointx + mBrushSizeTerrainSpace) * terrainSize
  endy   = (Pointy + mBrushSizeTerrainSpace) * terrainSize
  startx = Max(startx, 0)
  starty = Max(starty, 0)
  endx   = Min(endx, terrainSize)
  endy   = Min(endy, terrainSize)

  For y = starty To endy
    For x = startx To endx

      tsXdist.f = (x / terrainSize) - Pointx
      tsYdist.f = (y / terrainSize) - Pointy

      weight.f = Min(1.0,	Sqr(tsYdist * tsYdist + tsXdist * tsXdist) / (0.5 * mBrushSizeTerrainSpace))
      weight = 1.0 - (weight * weight)
      addedHeight.f = weight * 250.0 * TimeElapsed

      newheight.f = GetTerrainTileHeightAtPoint(0, tx, ty, x, y) + addedHeight
      SetTerrainTileHeightAtPoint(0, tx, ty, x, y, newheight)

    Next x
  Next y
EndProcedure

Procedure DisplayPolygon(Px.f, Py.f, Pz.f, Rayon.f)
  Define.l i, Color = RGB(255, 255, 0)
  Define.f Angle, Sx, Sy, Sz, Sx1, Sy1, Sz1, Py1, Delta = 2

  For i = 0 To #NbSommet-2
    Sx = Cos(Angle) * Rayon
    Sz = Sin(Angle) * Rayon
    Angle + 2.0 * #PI / #NbSommet
    Sx1 = Cos(Angle) * Rayon
    Sz1 = Sin(Angle) * Rayon
    Py = TerrainHeight(0, Px + Sx, Pz + Sz) + Delta
    Py1 = TerrainHeight(0, Px + Sx1, Pz + Sz1) + Delta
    CreateLine3D(i, Px + Sx, Py, Pz + Sz, Color, Px + Sx1, Py1, Pz + Sz1, Color)
  Next i
  Py = TerrainHeight(0, Px + Cos(0) * Rayon, Pz + Sin(0) * Rayon) + Delta
  CreateLine3D(i, Px + Sx1, Py1, Pz + Sz1, Color, Px + Cos(0) * Rayon, Py, Pz + Sin(0) * Rayon, Color)
EndProcedure


TerrainPhysic.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Terrain : Physic
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

#TerrainMiniX = 0
#TerrainMiniY = 0
#TerrainMaxiX = 0
#TerrainMaxiY = 0
#PlayerSpeed = 60
#CameraSpeed = 10

Define.f KeyX, KeyY, MouseX, MouseY, TimeSinceLastFrame
Declare InitBlendMaps()

Structure Vector3
  x.f
  y.f
  z.f
EndStructure

Structure s_Key
  Up.i
  Down.i
  Left.i
  Right.i
  StrafeLeft.i
  StrafeRight.i
  Jump.i
EndStructure

Structure s_Entity
  Entity.i
  EntityBody.i
  BodyOffsetY.f
  elapsedTime.f
  Key.s_Key
  MainNode.i
  SightNode.i
  CameraNode.i
  ForwardNode.i
  StrafeNode.i
EndStructure

Structure s_Camera
  Camera.i
  Tightness.f
  CameraNode.i
  TargetNode.i
EndStructure

Macro GetNodePosition(Position, Node)
  Position\x = NodeX(Node)
  Position\y = NodeY(Node)
  Position\z = NodeZ(Node)
EndMacro

Macro SubVector3(V, V1, V2)
  V\x = V1\x - V2\x
  V\y = V1\y - V2\y
  V\z = V1\z - V2\z
EndMacro

;-Declare
Declare HandleEntity(*Entity.s_Entity)
Declare CameraTrack(*Camera.s_Camera, *Entity.s_Entity)
Declare OnGround(*Entity.s_Entity)

Define Robot.s_Entity
Define Camera.s_Camera

; OpenGL needs to have CG enabled to work (Linux and OS X have OpenGL by default)
;
CompilerIf #PB_Compiler_OS <> #PB_OS_Windows Or Subsystem("OpenGL")
  Flags = #PB_Engine3D_EnableCG
CompilerEndIf

If InitEngine3D(Flags)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()
    Add3DArchive("Data/Textures/"       , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Models"          , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Scripts"         , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Textures/nvidia" , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
    Parse3DScripts()

    WorldShadows(#PB_Shadow_Modulative, 0, RGB(120, 120, 120))

    MaterialFilteringMode(#PB_Default, #PB_Material_Anisotropic, 8)

    ;- Light
    ;
    light = CreateLight(#PB_Any ,RGB(185, 185, 185), 4000, 1200, 1000, #PB_Light_Directional)
    SetLightColor(light, #PB_Light_SpecularColor, RGB(255*0.4, 255*0.4,255*0.4))
    LightDirection(light ,0.55, -0.3, -0.75)
    AmbientColor(RGB(5, 5,5))

    ;- Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    CameraBackColor(0, RGB(5, 5, 10))

    ;----------------------------------
    ;-terrain definition
    SetupTerrains(LightID(Light), 3000, #PB_Terrain_NormalMapping)
    ;-initialize terrain
    CreateTerrain(0, 513, 12000, 600, 3, "TerrainPhysic", "Dat")
    ;-set all texture will be use when terrrain will be constructed
    AddTerrainTexture(0,  0, 100, "dirt_grayrocky_diffusespecular.dds",  "dirt_grayrocky_normalheight.dds")
    AddTerrainTexture(0,  1,  30, "grass_green-01_diffusespecular.dds", "grass_green-01_normalheight.dds")
    AddTerrainTexture(0,  2, 200, "growth_weirdfungus-03_diffusespecular.dds", "growth_weirdfungus-03_normalheight.dds")

    ;-Construct terrains
    For ty = #TerrainMiniY To #TerrainMaxiY
      For tx = #TerrainMiniX To #TerrainMaxiX
        imported = DefineTerrainTile(0, tx, ty, "terrain513.png", ty % 2, tx % 2)
      Next
    Next
    BuildTerrain(0)

    If imported = #True
      InitBlendMaps()
      UpdateTerrain(0)
      SaveTerrain(0, #False)
    EndIf

    ; enable shadow terrain
    TerrainRenderMode(0, 0)

    ;Add Physic
    TerrainPhysicBody(0, 0.1, 1)
    ;Texture
    CreateTexture(1, 256, 256)
    StartDrawing(TextureOutput(1))
    Box(0, 0, 256, 256, $002255)
    DrawingMode(#PB_2DDrawing_Outlined)
    Box(0, 0, 256, 256, $FFFFFF)
    Box(10, 10, 236, 236, $FFFF)
    StopDrawing()

    ;Material
    CreateMaterial(0, LoadTexture(0, "r2skin.jpg"))
    CreateMaterial(1, TextureID(1))
    CreateMaterial(2, LoadTexture(2, "Dirt.jpg"))
    CreateMaterial(3, LoadTexture(3, "Wood.jpg"))
    GetScriptMaterial(4, "Scene/GroundBlend")

    ;Robot
    LoadMesh   (0, "robot.mesh")
    CreateEntity (0, MeshID(0), #PB_Material_None);
    StartEntityAnimation(0, "Walk")

    ;Robot Body
    CreateEntity(1, MeshID(0), #PB_Material_None, 0, 426, 0)
    HideEntity(1, 1)

    ;Body
    EntityPhysicBody(1, #PB_Entity_CapsuleBody, 1, 0, 0)

    ; Skybox
    SkyBox("desert07.jpg")

    ;
    With Robot
      \Entity = 0
      \EntityBody = 1
      \BodyOffsetY = 43

      \Key\Down        = #PB_Key_Down
      \Key\Left        = #PB_Key_Left
      \Key\Right       = #PB_Key_Right
      \Key\Up          = #PB_Key_Up
      \Key\StrafeLeft  = #PB_Key_X
      \Key\StrafeRight = #PB_Key_C
      \Key\Jump        = #PB_Key_Space

      \MainNode    = CreateNode(#PB_Any) ; Entity position
      \SightNode   = CreateNode(#PB_Any,  120,  20,  0) ; For cameraLookAt
      \CameraNode  = CreateNode(#PB_Any, -140, 100,  0) ; Camera position
      \ForwardNode = CreateNode(#PB_Any,    1,   0,  0) ; Direction normalized
      \StrafeNode  = CreateNode(#PB_Any,    0,   0, -1) ; Direction normalized

      AttachNodeObject(\MainNode, NodeID(\SightNode))
      AttachNodeObject(\MainNode, NodeID(\CameraNode))
      AttachNodeObject(\MainNode, NodeID(\ForwardNode))
      AttachNodeObject(\MainNode, NodeID(\StrafeNode))
      AttachNodeObject(\MainNode, EntityID(\Entity))
    EndWith

    ;-Camera
    With Camera
      \Camera = 0
      \Tightness = 0.035
      ; Camera use 2 nodes
      \CameraNode = CreateNode(#PB_Any, -3000, 700, 0) ; Camera position
      \TargetNode = CreateNode(#PB_Any) ; For cameraLookAt
      AttachNodeObject(\CameraNode, CameraID(\Camera))
    EndWith

    ;==================================
    ; create material
    Red = GetScriptMaterial(#PB_Any, "Color/Red")
    Blue = GetScriptMaterial(#PB_Any, "Color/Blue")
    Yellow = GetScriptMaterial(#PB_Any, "Color/Yellow")
    Green = GetScriptMaterial(#PB_Any, "Color/Green")

    ;==================================
    ; create Sphere
    MeshSphere = CreateSphere(#PB_Any, 10.0)
    For i = 0 To 5
      Entity=CreateEntity(#PB_Any, MeshID(MeshSphere), MaterialID(Green))
      MoveEntity(Entity, Random(2000)-1000, 800, Random(4000)-2000, #PB_Absolute)
      ; create bodies
      EntityPhysicBody(Entity, #PB_Entity_SphereBody, 5.0)
    Next

    ;==================================
    ; create Cylinder
    MeshCylinder = CreateCylinder(#PB_Any, 10.0, 60)
    For i = 0 To 5
      Entity=CreateEntity(#PB_Any, MeshID(MeshCylinder), MaterialID(Red))
      MoveEntity(Entity, Random(2000)-1000, 800, Random(4000)-2000, #PB_Absolute)
      ; create bodies
      EntityPhysicBody(Entity, #PB_Entity_CylinderBody, 10.0, 0, 1)
    Next

    ;==================================
    ; create Cuber
    MeshCube = CreateCube(#PB_Any, 25.0)
    For i = 0 To 5
      Entity=CreateEntity(#PB_Any, MeshID(MeshCube), MaterialID(Yellow))
      MoveEntity(Entity, Random(2000)-1000, 800, Random(4000)-2000, #PB_Absolute)
      ; create bodies
      EntityPhysicBody(Entity, #PB_Entity_BoxBody, 5.0)
    Next

    Repeat

      Screen3DEvents()

      Robot\elapsedTime = TimeSinceLastFrame

      HandleEntity(@Robot)

      CameraTrack(@Camera, @Robot)

      TimeSinceLastFrame = RenderWorld(60) * 40 / 1000
      FlipBuffers()

    Until KeyboardPushed(#PB_Key_Escape)

    End

  EndIf
Else
  MessageRequester("Error","Can't initialize engine3D")
EndIf

Procedure Clamp(*var.float, min.f, max.f)
  If *var\f < min
    *var\f = min
  ElseIf *var\f > max
    *var\f = max
  EndIf
EndProcedure

Procedure InitBlendMaps()
  minHeight1.f = 70
  fadeDist1.f = 40
  minHeight2.f = 70
  fadeDist2.f = 15
  For ty = #TerrainMiniY To #TerrainMaxiY
    For tx = #TerrainMiniX To #TerrainMaxiX
      Size = TerrainTileLayerMapSize(0, tx, ty)
      For y = 0 To Size-1
        For x = 0 To Size-1
          Height.f = TerrainTileHeightAtPosition(0, tx, ty, 1, x, y)

          val.f = (Height - minHeight1) / fadeDist1
          Clamp(@val, 0, 1)
          SetTerrainTileLayerBlend(0, tx, ty, 1, x, y, val)

          val.f = (Height - minHeight2) / fadeDist2
          Clamp(@val, 0, 1)
          SetTerrainTileLayerBlend(0, tx, ty, 2, x, y, val)
        Next
      Next
      UpdateTerrainTileLayerBlend(0, tx, ty, 1)
      UpdateTerrainTileLayerBlend(0, tx, ty, 2)
    Next
  Next
EndProcedure

Procedure OnGround(*Entity.s_Entity)
  With *Entity
    ProcedureReturn RayCollide(NodeX(\MainNode),  NodeY(\MainNode)+1, NodeZ(\MainNode), NodeX(\MainNode), NodeY(\MainNode)-2,  NodeZ(\MainNode))
  EndWith
EndProcedure

Procedure HandleEntity(*Entity.s_Entity)
  Protected.Vector3 Forward, Strafe, PosMain, PosDir, PosStrafe
  Protected.f Speed, Speed2, x, y, MouseX, MouseY
  Static Jump.f, MemJump.i, Rot.Vector3, Trans.Vector3, Clic

  With *Entity
    GetNodePosition(PosMain, \MainNode)
    GetNodePosition(PosDir, \ForwardNode)
    GetNodePosition(PosStrafe, \StrafeNode)
    SubVector3(Forward, PosDir, PosMain)
    SubVector3(Strafe, PosStrafe, PosMain)

    Speed = #PlayerSpeed * \elapsedTime
    Speed2 = Speed / 2

    If ExamineKeyboard()

      If KeyboardReleased(#PB_Key_F5)
        WorldDebug(#PB_World_DebugBody)
      ElseIf KeyboardReleased(#PB_Key_F6)
        WorldDebug(#PB_World_DebugEntity)
      ElseIf KeyboardReleased(#PB_Key_F7)
        WorldDebug(#PB_World_DebugNone)
      EndIf

      If KeyboardPushed(\Key\Jump) And OnGround(*Entity)
        Jump = 18
        MemJump = 1
      EndIf

      Rot\x * 0.30
      Rot\y * 0.30
      Rot\z * 0.30
      Trans\x * 0.20
      Trans\y = Jump
      Trans\z * 0.20

      If KeyboardPushed(\Key\Up)
        Trans\x + Forward\x * Speed
        Trans\z + Forward\z * Speed
      ElseIf KeyboardPushed(\Key\Down)
        Trans\x + Forward\x * -Speed2
        Trans\z + Forward\z * -Speed2
      EndIf

      If KeyboardPushed(\Key\Left)
        Rot\y + 2 * \elapsedTime
      ElseIf KeyboardPushed(\Key\Right)
        Rot\y - 2 * \elapsedTime
      EndIf

      If KeyboardPushed(\Key\StrafeLeft)
        Trans\x + Strafe\x * Speed2
        Trans\z + Strafe\z * Speed2
      ElseIf KeyboardPushed(\Key\StrafeRight)
        Trans\x + Strafe\x * -Speed2
        Trans\z + Strafe\z * -Speed2
      EndIf

      If OnGround(*Entity)
        Jump = 0
      ElseIf MemJump
        Jump + 20 * \elapsedTime
        If Jump > 100
          MemJump = 0
        EndIf
      Else
        Jump - 9
      EndIf

    EndIf

    MoveEntity  (\EntityBody, Trans\x, Trans\y, Trans\z)
    RotateEntity(\EntityBody, 0, Rot\y, 0, #PB_Relative)

    MoveNode(\MainNode, EntityX(\EntityBody), EntityY(\EntityBody)-\BodyOffsetY, EntityZ(\EntityBody), #PB_Absolute)
    RotateNode(\MainNode, 0, EntityYaw(\EntityBody), 0)
  EndWith
EndProcedure

Procedure CameraTrack(*Camera.s_Camera, *Entity.s_Entity)
  Protected.Vector3 CameraPosition, TargetPosition
  Protected.f x, y, z

  GetNodePosition(CameraPosition, *Entity\CameraNode)
  GetNodePosition(TargetPosition, *Entity\SightNode)
  x = NodeX(*Camera\CameraNode)
  y = NodeY(*Camera\CameraNode)
  z = NodeZ(*Camera\CameraNode)
  x = (CameraPosition\x - x) *  *Camera\Tightness
  y = (CameraPosition\y - y) *  *Camera\Tightness
  z = (CameraPosition\z - z) *  *Camera\Tightness
  MoveNode(*Camera\CameraNode, x, y, z)

  x = NodeX(*Camera\TargetNode)
  y = NodeY(*Camera\TargetNode)
  z = NodeZ(*Camera\TargetNode)
  x = (TargetPosition\x - x) *  *Camera\Tightness
  y = (TargetPosition\y - y) *  *Camera\Tightness
  z = (TargetPosition\z - z) *  *Camera\Tightness
  MoveNode(*Camera\TargetNode, x, y, z)

  CameraLookAt(*Camera\Camera, NodeX(*Camera\TargetNode), NodeY(*Camera\TargetNode), NodeZ(*Camera\TargetNode))

EndProcedure


TerrainShadow.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Terrain : Shadow
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

#CameraSpeed = 2
#TerrainMiniX = 0
#TerrainMiniY = 0
#TerrainMaxiX = 0
#TerrainMaxiY = 0
Define.f KeyX, KeyY, MouseX, MouseY

Procedure Clamp(*var.float, min.f, max.f)
  If *var\f < min
    *var\f = min
  ElseIf *var\f > max
    *var\f = max
  EndIf
EndProcedure

; OpenGL needs to have CG enabled to work (Linux and OS X have OpenGL by default)
;
CompilerIf #PB_Compiler_OS <> #PB_OS_Windows Or Subsystem("OpenGL")
  Flags = #PB_Engine3D_EnableCG
CompilerEndIf

If InitEngine3D(Flags)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()
    Add3DArchive("Data/Textures/"       , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Textures/nvidia" , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Scripts"         , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/GUI"           , #PB_3DArchive_FileSystem)
    Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
    Parse3DScripts()

    WorldShadows(#PB_Shadow_Modulative, -1, RGB(105, 105, 105))

    ;- Light
    ;
    light.l = CreateLight(#PB_Any ,RGB(255, 255, 255), 4000, 1200, 1000,#PB_Light_Directional)
    SetLightColor(light, #PB_Light_SpecularColor, RGB(255*0.4, 255*0.4,255*0.4))
    LightDirection(light ,0.55, -0.3, -0.75)
    AmbientColor(RGB(255*0.2, 255*0.2,255*0.2))

    ;- Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0,  800, 400, 80, #PB_Absolute)
    CameraBackColor(0, RGB(5, 5, 10))

    ;----------------------------------
    ; terrain definition
    SetupTerrains(LightID(Light), 3000, #PB_Terrain_NormalMapping)
    ; initialize terrain
    CreateTerrain(0, 513, 12000, 600, 4, "terrain02", "Dat")
    ; set all texture will be use when terrrain will be constructed
    AddTerrainTexture(0,  0, 100, "dirt_grayrocky_diffusespecular.dds",  "dirt_grayrocky_normalheight.dds")
    AddTerrainTexture(0,  1,  30, "grass_green-01_diffusespecular.dds", "grass_green-01_normalheight.dds")
    AddTerrainTexture(0,  2, 200, "growth_weirdfungus-03_diffusespecular.dds", "growth_weirdfungus-03_normalheight.dds")

    ; construct terrains
    For ty = #TerrainMiniY To #TerrainMaxiY
      For tx = #TerrainMiniX To #TerrainMaxiX
        DefineTerrainTile(0, tx, ty, "terrain513.png", ty % 2, tx % 2)
      Next
    Next
    BuildTerrain(0)

    ;InitBlendMaps
    minHeight1.f = 70
    fadeDist1.f = 40
    minHeight2.f = 70
    fadeDist2.f = 15
    For ty = #TerrainMiniY To #TerrainMaxiY
      For tx = #TerrainMiniX To #TerrainMaxiX
        Size = TerrainTileLayerMapSize(0, tx, ty)
        For y = 0 To Size-1
          For x = 0 To Size-1
            Height.f = TerrainTileHeightAtPosition(0, tx, ty, 1, x, y)

            val.f = (Height - minHeight1) / fadeDist1
            Clamp(@val, 0, 1)
            SetTerrainTileLayerBlend(0, tx, ty, 1, x, y, val)

            val.f = (Height - minHeight2) / fadeDist2
            Clamp(@val, 0, 1)
            SetTerrainTileLayerBlend(0, tx, ty, 2, x, y, val)
          Next
        Next
        UpdateTerrainTileLayerBlend(0, tx, ty, 1)
        UpdateTerrainTileLayerBlend(0, tx, ty, 2)
      Next
    Next

    ; enable shadow terrain
    TerrainRenderMode(0, 0)

    ; create sphere for test
    CreateSphere(1, 20.0, 50, 50)
    Global ball =CreateEntity(#PB_Any, MeshID(1), #Null)
    MoveEntity(ball, 300,60,0, #PB_Absolute)
    EntityRenderMode(ball, #PB_Entity_CastShadow)

    ; SkyBox
    ;
    SkyBox("desert07.jpg")

    ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor

    Repeat
      Screen3DEvents()

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05

        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))

        If MouseButton(#PB_MouseButton_Left)
          TerrainMousePick(0,  CameraID(0), MouseX(),  MouseY())
          MoveEntity(ball, PickX(), PickY()+20, PickZ(), #PB_Absolute)
        EndIf

      EndIf
      ;CameraLocate(0, CameraX(0), PBO_GetTerrainHeight(0, CameraX(0), CameraZ(0)) + 20, CameraZ(0))
      MoveCamera  (0, KeyX, 0, KeyY)
      RotateCamera(0,  MouseY, MouseX, 0, #PB_Relative)

      RenderWorld()
      FlipBuffers()

    Until KeyboardPushed(#PB_Key_Escape)

    End

  EndIf
Else
  MessageRequester("Error","Can't initialize engine3D")
EndIf


Text3D.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Text3D
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/fonts", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    CreateCube(0, 2)

    CreateMaterial(0, LoadTexture(0, "Caisse.png"))

    CreateEntity(0, MeshID(0), MaterialID(0))

    CreateText3D(0, "Hello world")
    Text3DColor(0, RGBA(255, 0, 0, 255))
    Text3DAlignment(0, #PB_Text3D_Left)
    AttachEntityObject(0, "", Text3DID(0))
    MoveText3D(0, 0, 2, 2)

    RotateEntity(0, 0, -70, 0)

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 0, 10, #PB_Absolute)

    Repeat
      Screen3DEvents()

      ExamineKeyboard()

      RotateEntity(0, 1, 1, 1, #PB_Relative)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Texture.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Texture
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    AmbientColor(RGB(255, 255, 255))

    LoadMesh   (0, "robot.mesh")
    CreateMaterial(0, LoadTexture(0, "r2skin.jpg"))

    CreateMaterial(1, LoadTexture(1, "r2skin.jpg"))
    AddMaterialLayer(1,LoadTexture(2, "clouds.jpg"),#PB_Material_AlphaBlend)
    MaterialBlendingMode(1, #PB_Material_AlphaBlend)  ; Alphablending for this texture

    CreateEntity (0, MeshID(0), MaterialID(1))
    CreateEntity (1, MeshID(0), MaterialID(0))

    MoveEntity(1, 100, 0, 0)

    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 0, 100, #PB_Absolute)

    Repeat
      Screen3DEvents()

      ClearScreen(RGB(0, 0, 0))

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateEntity(0, 0, 1, 0, #PB_Relative)
      RotateEntity(1, 0, 0.5, 0, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()

      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


Thread.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Thread example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

Procedure AlertThread(Parameter)

  Repeat
    Debug "Alert !"
    Delay(3000)
  ForEver

EndProcedure

CreateThread(@AlertThread(), 154)

MessageRequester("Info", "It will display an alert every 3 seconds."+#LF$+"Click To finish the program", 0)


ToolBar.pb

;
; ------------------------------------------------------------
;
;   PureBasic - ToolBar example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

If OpenWindow(0, 100, 200, 195, 260, "ToolBar example", #PB_Window_SystemMenu | #PB_Window_SizeGadget)

  If CreateToolBar(0, WindowID(0))
    ToolBarStandardButton(0, #PB_ToolBarIcon_New)
    ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
    ToolBarStandardButton(2, #PB_ToolBarIcon_Save)

    ToolBarSeparator()

    ToolBarStandardButton(3, #PB_ToolBarIcon_Print)
    ToolBarToolTip(0, 3, "Print")

    ToolBarStandardButton(4, #PB_ToolBarIcon_Find)
    ToolBarToolTip(0, 4, "Find a document")

    ToolBarSeparator()

    CompilerIf #PB_Compiler_OS = #PB_OS_Windows
      ; The .ico format is available only on Windows
      ToolBarImageButton(5, LoadImage(0, "Data/CdPlayer.ico"))
    CompilerEndIf
  EndIf

  If CreateMenu(0, WindowID(0))
    MenuTitle("Project")
      MenuItem(0, "New")
      MenuItem(1, "Open")
      MenuItem(2, "Save")
  EndIf

  ;
  ; Attach our previously created ToolBar to this window
  ;

  DisableToolBarButton(0, 2, 1) ; Disable the button '2'

  ;
  ; The event loop. A ToolBar event is like a Menu event (as tools are shortcut for menu the most
  ; of the time). This is handy, as if the ToolBar buttons and the MenuItem have the same ID, then
  ; the same operation can be done on both action without any adds..
  ;

  Repeat
    Event = WaitWindowEvent()

    Select Event

      Case #PB_Event_Menu
        MessageRequester("Information", "ToolBar or Menu ID: "+Str(EventMenu()), 0)

      Case #PB_Event_CloseWindow  ; If the user has pressed on the close button
        Quit = 1

    EndSelect

  Until Quit = 1

EndIf

End   ; All the opened windows are closed automatically by PureBasic
   -


VertexAnimation.pb

;
; ------------------------------------------------------------
;
;   PureBasic - VertexAnimation
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;
; shapekey.mesh + shapekey.material done by blendman, thanks :)

;Use [PageUp] and [PageDown]

IncludeFile "Screen3DRequester.pb"

Define.f MouseX, MouseY, Pose

#Mesh = 1

Macro Clamp(num, min, max)
  If num<min
    num=min
  ElseIf num>max
    num=max
  EndIf
EndMacro

If InitEngine3D(3)

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/Desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    WorldShadows(#PB_Shadow_Modulative)

    ;Ground
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1500, 1500, 40, 40, 15, 15)
    CreateEntity(0,MeshID(0),MaterialID(0))

    ;- Mesh

    LoadMesh(#Mesh, "shapekey.mesh")

    ; Create a animation state For each vertex pose, using the pose name
    Track     = 0
    KeyFrame  = 0
    PoseIndex = 0
    Animation$ = MeshPoseName(#Mesh, PoseIndex)

    CreateVertexAnimation(#Mesh, Animation$, 0)                 ; Create animation just for this pose
    CreateVertexTrack(#Mesh, Animation$, Track)                 ; Create track for this pose
    CreateVertexPoseKeyFrame(#Mesh, Animation$, Track, KeyFrame); Create a keyframe for this pose.

    ;- Entity
    CreateEntity(1, MeshID(#Mesh), #PB_Material_None, 0, 50, 0)
    ScaleEntity(1, 3, 3, 3)
    StartEntityAnimation(1, Animation$)

    ;- SkyBox
    SkyBox("Desert07.jpg")

    ;- Camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 10, EntityY(1) + 4, -10, #PB_Absolute)
    CameraLookAt(0, EntityX(1), EntityY(1), EntityZ(1))

    ;- Light
    CreateLight(0, RGB(255, 255, 255), -40, 100, 80)
    AmbientColor(RGB(80, 80, 80))

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX()/10
        MouseY = -MouseDeltaY()/10
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_PageDown) And Pose < 1
          Pose + 0.01
          Clamp(Pose, 0, 1)
        ElseIf KeyboardPushed(#PB_Key_PageUp) And Pose > 0
          Pose - 0.01
          Clamp(Pose, 0, 1)
        EndIf

      EndIf

      ; update the pose reference
      UpdateVertexPoseReference(#Mesh, Animation$, Track, KeyFrame, PoseIndex, Pose)

      ; update animation state since we're fudging this manually
      UpdateEntityAnimation(1, Animation$)

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)

      RenderWorld()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


VisibilityMask.pb

;
; ------------------------------------------------------------
;
;   PureBasic - VisibilityMask
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, SpriteX, SpriteY

LoadFont(0, "Verdana", 24, #PB_Font_Bold)

#Mask1 = 1 << 0
#Mask2 = 1 << 1
#Mask3 = 1 << 2

Macro CreateTexture2(No, Color, Texte)
  CreateTexture(No, 256, 256)
  StartDrawing(TextureOutput(No))
  Box(0, 0, 256, 256, Color)
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(0))
  DrawText(30, 128, Texte, RGB(255, 255, 255))
  StopDrawing()
EndMacro

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/Desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    WorldShadows(#PB_Shadow_Modulative)

    ;-Ground
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1500, 1500, 40, 40, 15, 15)
    CreateEntity(0,MeshID(0),MaterialID(0)); Always visible (visibility mask = $FFFF FFFF)
    EntityRenderMode(0, 0)

    ;-Mesh
    CreateCube(1, 100)

    ;-Material
    GetScriptMaterial(1, "Color/Blue")
    GetScriptMaterial(2, "Color/Green")
    GetScriptMaterial(3, "Color/Red")

    ;-Entity
    CreateEntity(1, MeshID(1), MaterialID(1), -100, 50, 0, -1, #Mask1) ; Visible by camera 0
    CreateEntity(2, MeshID(1), MaterialID(2),    0, 50, 0, -1, #Mask2) ; Visible by camera 1
    CreateEntity(3, MeshID(1), MaterialID(3),  100, 50, 0, -1, #Mask3) ; Visible by camera 2

    ;-BillBoard
    CreateTexture2(11, RGB(  0,   0, 255), "Player 1")
    CreateMaterial(11, TextureID(11))
    CreateTexture2(12, RGB(  0, 255,   0), "Player 2")
    CreateMaterial(12, TextureID(12))
    CreateTexture2(13, RGB(255,   0,   0), "Player 3")
    CreateMaterial(13, TextureID(13))
    CreateBillboardGroup(1, MaterialID(11), 100, 100, 0, 0, 0, #Mask1)
    AddBillboard(0, 1, -100, 180, 0)
    CreateBillboardGroup(2, MaterialID(12), 100, 100, 0, 0, 0, #Mask2)
    AddBillboard(0, 2,    0, 180, 0)
    CreateBillboardGroup(3, MaterialID(13), 100, 100, 0, 0, 0, #Mask3)
    AddBillboard(0, 3,  100, 180, 0)

    ;- Camera
    CreateCamera(0,  0,  0, 50, 50, #Mask1) ; Entity 1 visible
    MoveCamera(0, 0, 120, 500, #PB_Absolute)

    CreateCamera(1, 50,  0, 50, 50, #Mask2); Entity 2 visible
    MoveCamera(1, 0, 120, 500, #PB_Absolute)

    CreateCamera(2,  0, 50, 50, 50, #Mask3); Entity 3 visible
    MoveCamera(2, 0, 120, 500, #PB_Absolute)

    CreateCamera(3, 50, 50, 50, 50, #Mask1 | #Mask3) ; entities 1 & 3 visibles
    MoveCamera(3, 0, 120, 500, #PB_Absolute)

    ;- Light
    CreateLight(0, RGB(255, 255, 255), -40, 300, 80)
    AmbientColor(RGB(80, 80, 80))

    ;- SkyBox
    SkyBox("Desert07.jpg")

    Repeat
      Screen3DEvents()

      ExamineMouse()

      ExamineKeyboard()

      RenderWorld()
      FlipBuffers()

    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Water.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Water
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 1

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Water", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)

  InitSprite()
  InitKeyboard()
  InitMouse()

  For k = 0 To 0

  If Screen3DRequester()

    WorldShadows(#PB_Shadow_TextureAdditive)

    SkyBox("desert07.jpg")
    Fog(RGB(128,128,128), 10, 10, 10000)

    CreateCamera(0,0,0,100,100)
    MoveCamera(0,0, 30 ,100, #PB_Absolute)

    ;-Water
    CreateWater(0, 0, -15, 0, 0, #PB_World_WaterLowQuality | #PB_World_WaterCaustics | #PB_World_WaterSmooth | #PB_World_WaterFoam | #PB_World_WaterGodRays)
    Sun(10000, 10000, -100000, RGB(238, 173, 148))

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1

  EndIf

  Next

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


WebBrowser.pb

;
; ------------------------------------------------------------
;
;   PureBasic - MiniBrowser
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;
; This program requiers the Microsoft freely distribuable
; ATL.dll shared library.
;

Procedure ResizeWebWindow()
  ResizeGadget(10, #PB_Ignore, #PB_Ignore, WindowWidth(0), WindowHeight(0)-52)
  ResizeGadget(4, #PB_Ignore, #PB_Ignore, WindowWidth(0)-185, #PB_Ignore)
  ResizeGadget(5, WindowWidth(0)-25, #PB_Ignore, #PB_Ignore, #PB_Ignore)
  ResizeGadget(6, #PB_Ignore, #PB_Ignore, WindowWidth(0), #PB_Ignore)
EndProcedure

If OpenWindow(0, 100, 200, 500, 300, "PureBasic MiniBrowser v1.0", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)

  CreateStatusBar(0, WindowID(0))
    AddStatusBarField(#PB_Ignore)
    StatusBarText(0, 0, "Welcome to the world's smallest Browser ! :)", 0)

  ButtonGadget(1,   0, 0, 50, 25, "Back")
  ButtonGadget(2,  50, 0, 50, 25, "Next")
  ButtonGadget(3, 100, 0, 50, 25, "Stop")

  StringGadget(4, 155, 5, 0, 20, "http://www.purebasic.com")

  ButtonGadget(5, 0, 0, 25, 25, "Go")

  Frame3DGadget(6, 0, 30, 0, 2, "", 2) ; Nice little separator

  If WebGadget(10, 0, 31, 0, 0, "http://www.purebasic.com") = 0 : MessageRequester("Error", "ATL.dll not found", 0) : End : EndIf

  AddKeyboardShortcut(0, #PB_Shortcut_Return, 0)

  ResizeWebWindow()

  Repeat
    Event = WaitWindowEvent()

    Select Event
      Case #PB_Event_Gadget

        Select EventGadget()
          Case 1
            SetGadgetState(10, #PB_Web_Back)

          Case 2
            SetGadgetState(10, #PB_Web_Forward)

          Case 3
            SetGadgetState(10, #PB_Web_Stop)

          Case 5
            SetGadgetText(10, GetGadgetText(4))

        EndSelect

      Case #PB_Event_Menu ; We only have one shortcut
        SetGadgetText(10, GetGadgetText(4))

      Case #PB_Event_SizeWindow
        ResizeWebWindow()

    EndSelect

  Until Event = #PB_Event_CloseWindow

EndIf


Win32_API.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Win32 API example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;
; NOTE: This file doesn't compile with the demo version ! (API Calls)
;

;
; Now, open a window, and do some stuff with it...
;

If OpenWindow(0, 100, 100, 195, 260, "PureBasic Window")

  ;
  ; This is the 'event loop'. All the user actions are processed here.
  ; It's very easy to understand: when an action occurs, the Event
  ; isn't 0 and we just have to see what have happened...
  ;

  Repeat
    Event = WaitWindowEvent()

    ;
    ; Here we use directly the Windows API to draw an ellipse.
    ; All the Windows® functions are supported !
    ;

    *DC = GetDC_(WindowID(0))          ; Get the output pointer
    Ellipse_(*DC, 10, 10, 100, 100)   ; Draw a filled ellipse
    ReleaseDC_(WindowID(0), *DC)       ; Release the drawing output

    If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf

  Until Quit = 1

EndIf

End   ; All the opened windows are closed automatically by PureBasic


Window3D.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Window 3D
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

#MainWindow = 0
#CloseButton = 0

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    SkyBox("desert07.jpg")

    CreateCamera(0, 0, 0, 100, 100)  ; Front camera
    MoveCamera(0,0,100,100, #PB_Absolute)

    OpenWindow3D(#MainWindow, 100, 100, 300, 100, "Hello in 3D !")

            ButtonGadget3D(#CloseButton, 150, 40, 120, 25, "Quit")

      ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor

    Repeat
      Screen3DEvents()

      If ExamineKeyboard() And ExamineMouse()
        Input$ = KeyboardInkey()

        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left), Input$, 0)
      EndIf

      ; Handle the GUI 3D events, it's similar to regular GUI events
      ;
      Repeat
          Event = WindowEvent3D()

          Select Event
              Case #PB_Event3D_CloseWindow
                If EventWindow3D() = #MainWindow
                  CloseWindow3D(#MainWindow)
                EndIf

              Case #PB_Event3D_Gadget
                If EventGadget3D() = #CloseButton
                  Quit = 1
                EndIf

          EndSelect
         Until Event = 0

      RenderWorld()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf


Window.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Window example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

;
; Open a window, and do some stuff with it...
;

If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)

  MessageRequester("Information", "Click to move the Window", 0)
  ResizeWindow(0, 200, 200, #PB_Ignore, #PB_Ignore)   ; Move the window to the coordinate 200,200

  MessageRequester("Information", "Click to resize the Window", 0)
  ResizeWindow(0, #PB_Ignore, #PB_Ignore, 320, 200) ; Resize the window to 320,200

  ;
  ; This is the 'event loop'. All the user actions are processed here.
  ; It's very easy to understand: when an action occurs, the Event
  ; isn't 0 and we just have to see what have happened...
  ;

  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf

  Until Quit = 1

EndIf

End   ; All the opened windows are closed automatically by PureBasic


WindowedScreen.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Windowed Screen example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Error", "Can't open the sprite system", 0)
  End
EndIf

If OpenWindow(0, 0, 0, 340, 285, "Gadget and sprites!", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  ButtonGadget(1, 10,  10, 100, 25, "Grab input")
  ButtonGadget(2, 120,  10, 100, 25, "Button 2")
  ButtonGadget(3, 230,  10, 100, 25, "Button 3")
  TextGadget  (4, 10, 40, 300, 30, "Press 'F1' to ungrab keyboard and mouse")

  If OpenWindowedScreen(WindowID(0), 10, 70, 320, 200, 0, 0, 0)
    LoadSprite(0, "Data/PureBasicLogo.bmp")
  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
    End
  EndIf

EndIf

direction = 1
playerX = 1
playerY = 1

Repeat
  Repeat
    ; Always process all the events to flush the queue at every frame
    Event = WindowEvent()

    Select Event
      Case #PB_Event_CloseWindow
        Quit = 1

      Case #PB_Event_Gadget

        ; Do the normal application management here
        Gadget = EventGadget()

        Select Gadget
          Case 1
            InputReleased = 0
            ReleaseMouse(#False)
            SetGadgetText(4, "Press 'F1' to ungrab keyboard and mouse")

          Case 2, 3
            SetGadgetText(4, "Button "+Str(Gadget)+" pressed.")
        EndSelect

    EndSelect

  Until Event = 0 ; Quit the event loop only when no more events are available

  If InputReleased = 0

    ExamineMouse()

    ; do the sprite & screen management at every frame
    ExamineKeyboard()
    If KeyboardPushed(#PB_Key_Up)    And playerY > 0   : playerY -3 : EndIf
    If KeyboardPushed(#PB_Key_Down)  And playerY < 280 : playerY +3 : EndIf
    If KeyboardPushed(#PB_Key_Left)  And playerX > 0   : playerX -3 : EndIf
    If KeyboardPushed(#PB_Key_Right) And playerX < 300 : playerX +3 : EndIf

    If KeyboardPushed(#PB_Key_F1)
      ReleaseMouse(#True)
      InputReleased = 1
    EndIf
  EndIf

  ; Clear the screen and draw our sprites
  ClearScreen(RGB(0,0,0))
  ClipSprite(0, 0, 0, x, x/8)
  DisplaySprite(0, x, 100)
  DisplaySprite(0, x, x)
  DisplaySprite(0, 300-x, x)
  DisplaySprite(0, playerX, playerY)

  x + direction
  If x > 300 : direction = -1 : EndIf   ; moving back to the left with negative value
  If x < 0   : direction =  1 : EndIf   ; moving to the right with positive value

  FlipBuffers()       ; Inverse the buffers (the back become the front (visible)... and we can do the rendering on the back

Until  Quit Or KeyboardPushed(#PB_Key_Escape)


WorldDebug.pb

;
; ------------------------------------------------------------
;
;   PureBasic - WorldDebug
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 0.4
#Speed = 60

Enumeration
  #MainWindow
  #Editor
EndEnumeration

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, RatioX, RatioY
Define DebugBody

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    EnableWorldCollisions(1)

    ;- Materials
    GetScriptMaterial(0, "Color/Blue")
    GetScriptMaterial(1, "Color/Green")
    GetScriptMaterial(2, "Color/Red")
    GetScriptMaterial(3, "Color/Yellow")
    CreateMaterial(4, LoadTexture(0, "Dirt.jpg"))

    ;- Meshes
    CreateCube(0, 2)
    CreateSphere(1, 1)
    CreateCylinder(2, 1, 4)

    ;- Entities
    CreateEntity(0, MeshID(0), MaterialID(0),  4, 1.0, 0)
    CreateEntity(1, MeshID(1), MaterialID(1), -4, 0.5, 0)
    CreateEntity(2, MeshID(2), MaterialID(2),  0, 3.0, 0)
    CreateEntity(4, MeshID(0), MaterialID(4), 0, -4, 0)
    ScaleEntity(4, 5, 0.5, 5)

    ;- Body
    EntityPhysicBody(0, #PB_Entity_BoxBody, 1)
    EntityPhysicBody(1, #PB_Entity_SphereBody, 1)
    EntityPhysicBody(2, #PB_Entity_CylinderBody, 1)
    EntityPhysicBody(4, #PB_Entity_StaticBody)

    ;- Camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, -1, 8, 25, #PB_Absolute)
    CameraLookAt(0, -1, 0, 0)

    ;- Light
    CreateLight(0, RGB(255, 255, 255), 1560, 900, 500)
    AmbientColor($330000)

    ;- GUI
    RatioX = CameraViewWidth(0) / 1920
    RatioY = CameraViewHeight(0) / 1080
    OpenWindow3D(#MainWindow, 10, 10, 380 * RatioX, 180 * RatioY, "WorldDebug")
    EditorGadget3D(#Editor, 10 * RatioX, 20 * RatioY, 340 * RatioX, 110 * RatioY, #PB_Editor3D_ReadOnly)
    SetGadgetText3D(#Editor, "F2 : Debug Entity" + Chr(10) + "F3 : Debug Body"  + Chr(10) + "F4 : Debug none")

    ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor

    Repeat
      Screen3DEvents()

      Repeat
        Event3D = WindowEvent3D()
      Until Event3D = 0

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05

        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))

      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_F2)
          WorldDebug(#PB_World_DebugEntity)
        ElseIf KeyboardPushed(#PB_Key_F3)
          WorldDebug(#PB_World_DebugBody)
        ElseIf KeyboardPushed(#PB_Key_F4)
          WorldDebug(#PB_World_DebugNone)
        EndIf

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      CameraLookAt(0, 0, 0, 0)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


WorldShadows.pb

;
; ------------------------------------------------------------
;
;   PureBasic - ShadowColor
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY
Define DebugBody

#CameraSpeed = 1

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts",#PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    KeyboardMode(#PB_Keyboard_International)

    WorldShadows(#PB_Shadow_Modulative, -1, RGB(0, 0, 255))

    ;Materials
    ;
    CreateMaterial(1, LoadTexture(1, "Wood.jpg"))
    CreateMaterial(2, LoadTexture(2, "Dirt.jpg"))

    ; Ground
    ;
    CreatePlane(0, 100, 100, 10, 10, 15, 15)
    CreateEntity(0, MeshID(0), MaterialID(2))
    EntityRenderMode(0, 0)

    ; Meshes
    ;
    CreateCube(1, 2)
    CreateSphere(2, 2)
    CreateCylinder(3, 1, 4)

    ; Entities
    ;
    CreateEntity(1, MeshID(1), MaterialID(1), -5, 1, -5)
    CreateEntity(2, MeshID(2), MaterialID(1),  0, 2,  0)
    CreateEntity(3, MeshID(3), MaterialID(1),  5, 2,  5)

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 10, 20, #PB_Absolute)

    ;SkyBox
    ;
    SkyBox("desert07.jpg")

    ; Light
    ;
    CreateLight(0, RGB(255, 255, 255), 300, 90, -300)

    AmbientColor(RGB(20, 20, 20))

    Repeat
      Screen3DEvents()

      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      MoveCamera  (0, KeyX, 0, KeyY)
      RotateCamera(0,  MouseY, MouseX, 0, #PB_Relative)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()

    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1

  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Xml.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Xml
;
;    (c) 2007 - Fantaisie Software
;
; ------------------------------------------------------------
;

#Window     = 0
#TreeGadget = 0
#XML        = 0

; This procedure fills our TreeGadget, by adding the current node
; and then exploring all childnodes by recursively calling itself.
;
Procedure FillTree(*CurrentNode, CurrentSublevel)

  ; Ignore anything except normal nodes. See the manual for
  ; XMLNodeType() for an explanation of the other node types.
  ;
  If XMLNodeType(*CurrentNode) = #PB_XML_Normal

    ; Add this node to the tree. Add name and attributes
    ;
    Text$ = GetXMLNodeName(*CurrentNode) + " (Attributes: "

    If ExamineXMLAttributes(*CurrentNode)
      While NextXMLAttribute(*CurrentNode)
        Text$ + XMLAttributeName(*CurrentNode) + "=" + Chr(34) + XMLAttributeValue(*CurrentNode) + Chr(34) + " "
      Wend
    EndIf

    Text$ + ")"

    AddGadgetItem(#TreeGadget, -1, Text$, 0, CurrentSublevel)

    ; Now get the first child node (if any)
    ;
    *ChildNode = ChildXMLNode(*CurrentNode)

    ; Loop through all available child nodes and call this procedure again
    ;
    While *ChildNode <> 0
      FillTree(*ChildNode, CurrentSublevel + 1)
      *ChildNode = NextXMLNode(*ChildNode)
    Wend

  EndIf

EndProcedure

FileName$ = OpenFileRequester("Choose XML file...", "", "XML files (*.xml)|*.xml|All files (*.*)|*.*", 0)
If FileName$ <> ""

  If LoadXML(#XML, FileName$)

    ; Note:
    ;   The LoadXML() succeed if the file could be read. This does not mean that
    ;   there was no error in the XML though. To check this, XMLStatus() can be
    ;   used.
    ;
    ; Display an error message if there was a markup error
    ;
    If XMLStatus(#XML) <> #PB_XML_Success
      Message$ = "Error in the XML file:" + Chr(13)
      Message$ + "Message: " + XMLError(#XML) + Chr(13)
      Message$ + "Line: " + Str(XMLErrorLine(#XML)) + "   Character: " + Str(XMLErrorPosition(#XML))
      MessageRequester("Error", Message$)
    EndIf

    ; Note:
    ;   Even if there was an error in the XML, all nodes before the error position
    ;   are still accessible, so open the window and show the tree anyway.
    ;
    If OpenWindow(#Window, 0, 0, 500, 500, "XML Example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
      TreeGadget(#TreeGadget, 10, 10, 480, 480)

      ; Get the main XML node, and call the FillTree() procedure with it
      ;
      *MainNode = MainXMLNode(#XML)
      If *MainNode
        FillTree(*MainNode, 0)
      EndIf

      ; Expand all nodes for a nicer view
      ;
      For i = 0 To CountGadgetItems(#TreeGadget) - 1
        SetGadgetItemState(#TreeGadget, i, #PB_Tree_Expanded)
      Next i

      ; Wait for the window close event.
      ;
      Repeat
        Event = WaitWindowEvent()
      Until Event = #PB_Event_CloseWindow
    EndIf

  Else
    MessageRequester("Error", "The file cannot be opened.")
  EndIf

EndIf


Changements

Changements bibliothèques de v3.94 à v4.00

Image

Supprimé: UseImage() - changez UseImage(#Image) par ImageID(#Image) quand l'ID est nécessaire.

Ajouté: CreateImage(#Image, Largeur, Hauteur [, Profondeur]) - nouveau paramètre
Ajouté: LoadImage(#Image, FichierImage$ [, Options]) - nouveau paramètre
Ajouté: CatchImage(#Image, AdresseMemoire [, Options])) - nouveau paramètres

Changé: ImageDepth(#Image) - nouveau paramètre
Changé: ImageHeight(#Image) - nouveau paramètre
Changé: ImageWidth(#Image) - nouveau paramètre
Changé: ImageID(#Image) - nouveau paramètre
Changé: ImageOutput(#Image) - nouveau paramètre

String

Ajouté: StrD(Valeur.d [, NombreDeDecimales])
Ajouté: StrQ(Valeur.q)
Ajouté: HexQ(Valeur.q)
Ajouté: BinQ(Valeur.q)
Ajouté: StrU(Valeur, Type): Ajout de l'option #PB_Quad
Ajouté: ValD(String$), ValQ(String$)
Ajouté: StringByteLength(Chaine$ [, Format]) - Renvoie le nombre d'octets de la chaîne de caractères en fonction du 'Format' spécifié.

Math

Ajouté: IntQ(valeur.d)

Thread

Ajouté: IsThread(Thread) - teste si le thread existe.
Ajouté: CreateMutex() - Crée un nouveau mutex.
Ajouté: FreeMutex(Mutex) - Supprime le 'Mutex' et sa mémoire associée.
Ajouté: LockMutex(Mutex) - Demande le verrouillage d'un mutex
Ajouté: TryLockMutex(Mutex) - Essaye de verrouiller le 'Mutex' spécifié, sinon renvoie 0 immédiatement
Ajouté: UnlockMutex(Mutex) - Déverrouille le mutex , les autres threads peuvent le verrouiller

Process (Nouveau)

Ajouté: GetEnvironmentVariable(Nom$) - Renvoie le contenu de la Variable d'environnement spécifiée
Ajouté: SetEnvironmentVariable(Nom$, Valeur$) - Crée une nouvelle variable d'environnement avec le 'Nom$' et la 'Valeur$' specifiés.
Ajouté: RemoveEnvironmentVariable(Nom$) - Supprime la Variable d'environnement spécifiée
Ajouté: ExamineEnvironmentVariables() - Initialise l'énumération des variables d'environnement disponibles
Ajouté: NextEnvironmentVariable() - Passe à la variable d'environnement suivante
Ajouté: EnvironmentVariableName() - Renvoie le nom de la variable d'environnement
Ajouté: EnvironmentVariableValue() - Renvoie la valeur de la variable d'environnement
Ajouté: ProgramFileName() - Renvoie le chemin complet et le nom du programme
Ajouté: CountProgramParameters() - Renvoie le nombre de paramètres qui ont été passés
Ajouté: IsProgram(Programme) - Teste si le 'Programme' préalablement lancé avec RunProgram() est correctement initialisé
Ajouté: ProgramID(Programme) - Renvoie l'identifiant système unique du 'Programme'.
Ajouté: ProgramRunning(Programme) - Teste si le 'Programme' est toujours en cours d'exécution.
Ajouté: WaitProgram(Programme [, Minuteur]) - Attend que le 'Programme' spécifié se termine, ou que le minuteur expire
Ajouté: KillProgram(Programme) - Termine immédiatement l'exécution du programme spécifié
Ajouté: ProgramExitCode(Programme) - Renvoie le code de retour du 'Programme' quand il s'est terminé
Ajouté: CloseProgram(Programme) - Termine toutes les connexions avec le 'Programme' spécifié
Ajouté: AvailableProgramOutput(Programme) - Renvoie le nombre d'octets qui sont disponibles pour la lecture.
Ajouté: ReadProgramString(Programme) - Lit une ligne texte provenant de la sortie standard (stdout) du 'Programme'
Ajouté: ReadProgramData(Programme, *Buffer, Taille) - Lit les données provenant de la sortie standard (stdout) du 'Programme'
Ajouté: ReadProgramError(Programme) - Lit une ligne texte provenant de la sortie erreur (stderr) du 'Programme'.
Ajouté: WriteProgramString(Programme, Texte$) - Ecrit le Texte$ dans l'entrée standard (stdin) du 'Programme'
Ajouté: WriteProgramData(Programme, *Buffer, Taille)- Ecrit les données dans l'entrée standard (stdin) du 'Programme'.

Changé: ProgramParameter([Index]) - Renvoie le paramètre suivant
Changé: RunProgram() utilise de nouvelles options:
  #PB_Program_Open    - Ouvre des canaux de communication entre le programme lancé et le programme PureBasic
  #PB_Program_Read    - Lecture possible sur la sortie standard (stdout)
  #PB_Program_Write   - Ecriture possible sur l'entrée standard (stdin)
  #PB_Program_Error   - Lecture possible sur la sortie d'erreur(stderr)
  #PB_Program_Connect - Connecte la sortie d'un autre programme à l'entrée du programme PureBasic

File

Ajouté: FileBuffersSize(#Fichier, Taille) - Change la taille des caches de lecture/écriture pour le #Fichier spécifié.
Ajouté: FileID(#Fichier) - Renvoie l'identifiant unique du #Fichier dans le système d'exploitation.
Ajouté: FlushFileBuffers(#Fichier) - Ecrit immédiatement le contenu du cache dans le #Fichier.
Ajouté: ReadChar(#Fichier)
Ajouté: ReadQuad(#Fichier)
Ajouté: ReadDouble(#Fichier)
Ajouté: WriteCharacter(#Fichier, Valeur)
Ajouté: WriteQuad(#Fichier, Valeur)
Ajouté: WriteDouble(#Fichier, Valeur)
Ajouté: ReadStringFormat(#Fichier)
Ajouté: WriteStringFormat(#Fichier, Format)

Changé: FileSeek(#Fichier, NouvellePosition) - nouveau paramètre
Changé: WriteData(#Fichier) - nouveau paramètre
Changé: ReadData(#Fichier) - nouveau paramètre
Changé: Lof(#Fichier) - nouveau paramètre
Changé: Loc(#Fichier) - nouveau paramètre
Changé: ReadByte(#Fichier) - nouveau paramètre
Changé: ReadWord(#Fichier) - nouveau paramètre
Changé: ReadLong(#Fichier) - nouveau paramètre
Changé: ReadFloat(#Fichier) - nouveau paramètre
Changé: ReadString(#Fichier [,Format]) - nouveau paramètre
Changé: ReadData(#Fichier) - nouveau paramètre
Changé: WriteByte(#Fichier, Data) - nouveau paramètre
Changé: WriteWord(#Fichier, Data) - nouveau paramètre
Changé: WriteLong(#Fichier, Data) - nouveau paramètre
Changé: WriteFloat(#Fichier, Data) - nouveau paramètre
Changé: WriteString(#Fichier, Data [,Format]) - nouveau paramètre
Changé: WriteStringN(#Fichier, Data [,Format])- nouveau paramètre
Changé: WriteData(#Fichier, Data, Length) - nouveau paramètre

Supprimé: UseFile() - changez UseFile(#Fichier) par FileID(#Fichier) quand l'ID est nécessaire.

2DDrawing

Ajouté: DrawAlphaImage()
Ajouté: TextHeight(Texte$) - Retourne la hauteur de la chaîne Texte$ en fonction de la surface et de la police en cours
Ajouté: FillArea(x, y, CouleurBord [, Couleur]) - Si 'Couleur' est -1, alors la zone sera remplie par la couleur trouvée en (x,y).

Changé: FrontColor(Couleur) - Remplacement de Rouge, Vert, Bleu, par un seul paramètre couleur.(Utilisez RGB() pour une mise à jour rapide)
Changé: BackColor(Couleur) - Remplacement de Rouge, Vert, Bleu, par un seul paramètre couleur.
Changé: NewX = DrawText(x, y, Texte$ [, FrontColor [, BackColor]]) - Ajout des coordonnées x/y et des couleurs optionnelles
Changé: TextLength(Text$) en TextWidth(Text$)

Supprimé: Locate(x, y) - plus utile (Voir DrawText()).

Palette

Supprimé: UsePalette()

Changé: GetPaletteColor(#Palette, Index) - nouveau paramètre
Changé: SetPaletteColor(#Palette, Index, Color) - nouveau paramètre

Module

Changé: SetModulePosition(#Module, Position) - nouveau paramètre
Changé: GetModulePosition(#Module) - nouveau paramètre
Changé: GetModuleRow(#Module) - nouveau paramètre
Changé: StopModule(#Module) - nouveau paramètre and -1 = stop tous les modules

Database

Changé: FirstDatabaseRow((#BaseDeDonnees) - nouveau paramètre
Changé: PreviousDatabaseRow((#BaseDeDonnees) - nouveau paramètre
Changé: NextDatabaseRow((#BaseDeDonnees) - nouveau paramètre
Changé: GetDatabaseLong((#BaseDeDonnees) - nouveau paramètre
Changé: GetDatabaseFloat((#BaseDeDonnees) - nouveau paramètre
Changé: GetDatabaseString((#BaseDeDonnees) - nouveau paramètre
Changé: DatabaseUpdate((#BaseDeDonnees, Requete$) - nouveau paramètre
Changé: DatabaseQuery((#BaseDeDonnees, Requete$) - nouveau paramètre
Changé: DatabaseColumnType((#BaseDeDonnees, Colonne)- nouveau paramètre
Changé: DatabaseColumns((#BaseDeDonnees) - nouveau paramètre
Changé: DatabaseColumnName((#BaseDeDonnees, Colonne)- nouveau paramètre

Supprimé: UseDatabase()

Movie

Changé: MovieAudio(#Film) - nouveau paramètre
Changé: MovieHeight(#Film) - nouveau paramètre
Changé: MovieWidth(#Film) - nouveau paramètre
Changé: MovieInfo(#Film) - nouveau paramètre
Changé: MovieLength(#Film) - nouveau paramètre
Changé: RenderMovieFrame(#Film) - nouveau paramètre
Changé: ResizeMovie(#Film, x, y, largeur, Hauteur) - nouveau paramètre
Changé: ResumeMovie(#Film) - nouveau paramètre
Changé: PauseMovie(#Film) - nouveau paramètre
Changé: StopMovie(#Film) - nouveau paramètre
Changé: MovieSeek(#Film, Position) - nouveau paramètre
Changé: MovieStatus(#Film) - nouveau paramètre

Supprimé: UseMovie()

FileSystem

Ajouté: FinishDirectory(#Repertoire)
Ajouté: DirectoryEntryType(#Repertoire)
Ajouté: DirectoryEntryDate(#Repertoire, TypeDate) - #PB_Date_Created, #PB_Date_Accessed, #PB_Date_Modified
Ajouté: GetFileDate(NomFichier$, TypeDate)
Ajouté: SetFileDate(NomFichier$, TypeDate)

Changé: NextDirectoryEntry(#Repertoire) - nouveau paramètre
Changé: DirectoryEntryName(#Repertoire) - nouveau paramètre
Changé: DirectoryEntryAttributes(#Repertoire) - nouveau paramètre
Changé: DirectoryEntrySize(#Repertoire) - nouveau paramètre

Renommé: IsFilename() en CheckFilename() - Le nom de la fonction a changé

Supprimé: UseDirectory()

Notes importantes: NextDirectoryEntry() ne renvoie plus le type d'entrée (fichier/Sous-répertoire). NextDirectoryEntry() renvoie seulement 0 ou 1 (0 signifie qu'il n'y plus d'objets), ceci pour être cohérent avec les autres commandes Examine...()/Next..() de PB. Utilisez DirectoryEntryType() pour connaître le type d'entrée comme vous faisiez avant avec le résultat de NextDirectoryEntry(). FinishDirectory () doit être appelé après chaque ExamineDirectory().

Menu

Ajouté: GetMenuItemText(#Menu, ItemID)
Ajouté: GetMenuTitleText(#Menu, ItemID)
Ajouté: SetMenuItemText(#Menu, ItemID, Text$)
Ajouté: SetMenuTitleText(#Menu, ItemID, Text$)

Changé: DisableMenuItem(#Menu, ItemID, State) - nouveau paramètre
Changé: MenuID(#Menu) - nouveau paramètre

Console

Ajouté: EnableGraphicalConsole(State)
Ajouté: RawKey()
Ajouté: Redirection et support des sorties standards

Changé: Inkey() - Désormais, renvoie seulement un caractère ou rien (à la place de 2), utilisez RawKey() pour le caractère supplémentaire

Note: Avec l'ancienne bibliothèque les consoles étaient en mode graphique, et les redirections (pipes) ne fonctionnaient pas correctement. (vous ne pouviez pas l'appeler avec une ligne de commande comme : myprogram.exe > test.txt) Maintenant vous avez le choix avec EnableGraphicalConsole(Etat), et si vous n'activez pas explicitement le mode graphique, les redirections devraient se faire correctement vers stdout pour permettre l'écriture de meilleurs outils en mode console. Ceci s'applique également à stdin et aux commandes d'entrée.

AudioCD

Changé: Remplacement de 'CDAudio' par 'AudioCD' dans le nom de toutes les fonctions (moins franco-anglais)

Toolbar

Ajouté: ToolBarHeight(#BarreOutils)
Ajouté: ToolBarID(#BarreOutils)

Changé: ToolBarTooltip(#BarreOutils, Bouton, Texte$) - nouveau paramètre
Changé: DisableToolBarButton(#BarreOutils, Bouton, Etat) - nouveau paramètre

Statusbar

Ajouté: StatusBarHeight(#BarreEtat)
Ajouté: StatusBarID(#BarreEtat)

Font

Changé: FontID(#Font) - nouveau paramètre
Changé: CloseFont() en FreeFont()

Supprimé: UseFont()

Preferences

Ajouté: possibilité d'ajouter/changer/effacer des clefs dans les fichiers préférences existants.
Ajouté: RemovePreferenceKey(Name$)
Ajouté: RemovePreferenceGroup(Name$)
Ajouté: ExaminePreferenceGroups() - Commence l'énumération de tous les groupes trouvés dans le fichier
Ajouté: NextPreferenceGroup() - Renvoie les informations concernant le groupe suivant.
Ajouté: PreferenceGroupName() - Renvoie le nom du groupe.
Ajouté: ExaminePreferenceKeys() - Commence l'énumération de toutes les clefs du groupe courant
Ajouté: NextPreferenceKey() - Renvoie les informations concernant la clef suivante.
Ajouté: PreferenceKeyName() - Renvoie le nom de la clef courante
Ajouté: ReadPreferenceQuad(Key$, Default)
Ajouté: ReadPreferenceDouble(Key$, Default)
Ajouté: WritePreferenceQuad(Key$, Value)
Ajouté: WritePreferenceDouble(Key$, Value)

Sprite

Ajouté: SpriteID(#Sprite)
Ajouté: FlipBuffer() - Ajout d'une option, pour avoir une synchronisation verticale optimisée dans le mode plein écran

Renommé: DisplayTranslucideSprite() en DisplayTranslucentSprite()

Changé: TransparentSpriteColor(#Sprite, R, G, B) en TransparentSpriteColor(#Sprite, Couleur)
Changé: ClearScreen(R, G, B) en ClearScreen(Couleur)

Library

Renommé: IsFunction() -> GetFunction()

Network

Ajouté: UDP support trough the flags #PB_Network_UDP and #PB_Network_TCP
Ajouté: GetClientIP()
Ajouté: GetClientPort()
Ajouté: EventServerNumber()

Renommé: NetworkClientID() en EventClient()

Keyboard

Ajouté: Les constantes #PB_Keyboard_International et #PB_Keyboard_AllowSystemKeys pour KeyboardMode()

Clipboard

Changé: GetClipboardData(Type) en GetClipboardImage(#Image)
Changé: SetClipboardData(Type, Data) en SetClipboardImage(#Image)

Memory

Ajouté: Unicode conversion support to PeekS() and PokeS() between ascii, UTF8 and UTF16
Ajouté: PeekC(), PeekD(), PeekQ()
Ajouté: PokeC(), PokeD(), PokeQ()
Ajouté: MemorySize() - Renvoie la longueur totale (en octets) de la zone de mémoire
Ajouté: MoveMemory()
Ajouté: CompareMemoryString(*Text1, *Test2 [Mode [, MaxLength [, Flags]]]) - Nouveaux paramètres pour les comparaisons en UTF16/UTF8/Ascii
Ajouté: MemoryStringLength() - Nouveaux paramètres pour UTF16/UTF8/Ascii

Note: Les commandes PeekS, PokeS, CompareMemoryString et MemoryStringLength ont maintenant un paramètre pour indiquer le format du texte. Les options possibles sont : #PB_Ascii, #PB_Unicode ou #PB_UTF8. Ceci vous permet de travailler avec des chaînes en mémoire indépendamment du mode dans lequel l'exécutable sera compilé (unicode ou non).

Engine3D

Changé: CreateMesh(#Mesh,TailleMaximum) - nouveau paramètre
Changé: MaterialAmbientColor(#Matrix1,-1) - -1 nouveau paramètre

Ajouté: EntityRenderMode()
Ajouté: WorldShadows(#PB_Shadow_Additive)
Ajouté: ParticleEmitterDirection()
Ajouté: GetEntityMass
Ajouté: SetEntityMass
Ajouté: GetEntityFriction
Ajouté: SetEntityFriction
Ajouté: EntityPhysicBody
Ajouté: ExamineWorldCollisions
Ajouté: NextWorldCollision
Ajouté: CheckWorldCollisionEntity
Ajouté: FirstWorldCollisionEntity
Ajouté: SecondWorldCollisionEntity
Ajouté: WorldGravity
Ajouté: EnableWorldCollision
Ajouté: EnableWorldPhysics
Ajouté: Parse3DScripts

Supprimé: RotateParticleEmitter()

Window

Ajouté: GetActiveWindow() - Renvoie le numéro de la fenêtre qui a le 'focus'.
Ajouté: DisableWindow(#Fenetre, Etat) - Active ou désactive les interactions avec l'utilisateur.
Ajouté: GetWindowState(#Fenetre) - Détermine si la #Fenetre est maximisée, minimisée ou affichée normalement.
Ajouté: SetWindowState(#Fenetre, Etat) - Change l'état minimisé ou maximisé de la #Fenetre
Ajouté: StickyWindow(#Fenetre, Etat) - Affiche la #Fenetre toujours au premier plan même si elle n'est pas active.
Ajouté: SetWindowColor(#Fenetre, Couleur) - Change la couleur de fond de la fenêtre
Ajouté: GetWindowColor(#Fenetre) - Renvoie la couleur de fond de la fenêtre
Ajouté: SmartWindowRefresh(#Fenetre, Etat) - Active ou désactive le rafraichissement intelligent

Changé: OpenWindow(#Fenetre, x, y, Largeur, Hauteur, Titre$ [, Options [, ParentID]]) - Les options sont à la fin et optionnelles
Changé: WaitWindowEvent([Timeout]) - Ajout d'un timeout optionnel
Changé: ResizeWindow(#Fenetre, x, y, Largeur, Hauteur) - Les paramètres à '-1' doivent être remplacés par #PB_Ignore
Changé: SetWindowCallback(@procedure() [, #Fenetre]) - Ajout du paramètre optionnel #Fenetre (Affecte callback seulement à une fenêtre)
Changé: ResizeWindow(#Fenetre, x, y, largeur, Hauteur) - Maintenant c'est identique à ResizeGadget()
Changé: WindowID(#Fenetre) - le paramètre n'est plus optionnel
Changé: WindowHeight(#Fenetre) - nouveau paramètre
Changé: WindowWidth(#Fenetre) - nouveau paramètre
Changé: WindowX(#Fenetre) - nouveau paramètre
Changé: WindowY(#Fenetre) - nouveau paramètre
Changé: WindowMouseX(#Fenetre) - nouveau paramètre
Changé: WindowMouseY(#Fenetre) - nouveau paramètre
Changé: WindowOutput(#Fenetre) - nouveau paramètre

Renommé: EventWindowID() en EventWindow()
Renommé: EventGadgetID() en EventGadget()
Renommé: EventMenuID() en EventMenu()
Renommé: ActivateWindow() en SetActiveWindow(#Fenetre)

Supprimé: MoveWindow()
Supprimé: DetachMenu()
Supprimé: UseWindow()
Supprimé: Les constantes de compatibilité (Par exemple, remplacez #PB_EventCloseWindow par la constante documentée #PB_Event_CloseWindow)

Gadget

Ajouté: GetActiveGadget() - Renvoie le numéro du #Gadget qui a actuellement le 'focus'
Ajouté: GadgetType(#Gadget) - Renvoie le type du #Gadget spécifié.
Ajouté: SetGadgetData(#Gadget, Valeur) - Associe la 'Valeur' spécifiée au #Gadget (fonctionne avec tous les gadgets).
Ajouté: GetGadgetData(#Gadget) - Renvoie la valeur associée
Ajouté: SetGadgetItemData(#Gadget, Element, Valeur) - Associe la 'Valeur' spécifiée avec l'Element du #Gadget (Pour quelques gadgets seulement)
Ajouté: GetGadgetItemData(#Gadget, Element)
Ajouté: SetGadgetColor(#Gadget, TypeCouleur, Couleur)
Ajouté: GetGadgetColor(#Gadget, TypeCouleur)
Ajouté: SetGadgetItemColor(#Gadget, Element, TypeCouleur, couleur [, Colonne])
Ajouté: GetGadgetItemColor(#Gadget, Element, TypeCouleur [, Colonne])

Changé: ActivateGadget(#Gadget) devient SetActiveGadget(#Gadget)
Changé: ResizeGadget(#Gadget, x, y, Largeur, Hauteur), Remplacez -1 par #PB_Ignore

Supprimé: #PB_String_MultiLine

Changements pour chaque gadget:

CalendarGadget()
- supporte SetGadgetColor() avec les options suivantes:
#PB_Gadget_BackColor - couleur du fond
#PB_Gadget_FrontColor - couleur du texte pour les jours affichés
#PB_Gadget_TitleBackColor - couleur du fond du titre du mois
#PB_Gadget_TitleFrontColor - couleur du texte du titre du mois
#PB_Gadget_GreyTextColor - couleur du texte pour les jours n'appartenant pas au mois courant

ComboBoxGadget()
- Supporte SetGadgetItemData()

ContainerGadget()
- supporte SetGadgetColor() pour la couleur de fond

DateGadget()
- supporte SetGadgetColor() avec les mêmes options que CalendarGadget
- la zone de saisie ne peut pas encore être colorée à ce jour

EditorGadget()
- supporte SetGadgetColor() pour la couleur de fond et la couleur du texte
- nouvelle option: #PB_Editor_ReadOnly
- supporte SetGadgetrAttribute() avec #PB_Editor_ReadOnly pour renvoyer/changer l'option ReadOnly

ExplorerListGadget()
- supporte SetGadgetColor() pour la couleur de fond et la couleur du texte et #PB_Gadget_LineColor
- Supporte GetGadgetItemAttribute(#Gadget, 0, #PB_Explorer_ColumnWidth, 2) ; renvoie la largeur de la colonne 2
- Supporte SetGadgetItemAttribute(#Gadget, 0, #PB_Explorer_ColumnWidth, 100, 2) ; fixe la largeur de la colonne 2 à 100
- Supporte GetGadgetItemText(#Gadget, -1, 2) ; renvoie le titre de la colonne 2
- Supporte SetGadgetItemText(#Gadget, -1, "Nouveau Texte", 2) ; change le titre de la colonne 2

ExplorerTreeGadget()
- supporte SetGadgetColor() pour la couleur de fond et la couleur du texte et #PB_Gadget_LineColor

HyperLinkGadget()
- supporte SetGadgetColor() pour la couleur du texte (la couleur de fond est toujours transparente)
- nouvelle option: #PB_Hyperlink_Underline - Affiche une ligne en dessous du texte sans avoir à utiliser une police soulignée.

ListIconGadget()
- supporte SetGadgetColor() pour la couleur de fond et la couleur du texte et #PB_Gadget_LineColor (Pour #PB_ListIcon_GridLines)
- Supporte SetGadgetItemColor() pour la couleur de fond et du texte de l'élément (Peut être utilisé pour chaque élément)
- Supporte SetGadgetItemData()
- L'évènement pour détecter si une case à cocher a changé d'état est maintenant #PB_EventType_Change
- Supporte GetGadgetItemAttribute(#Gadget, 0, #PB_ListIcon_ColumnWidth, 2) ; renvoie la largeur de la colonne 2
- Supporte SetGadgetItemAttribute(#Gadget, 0, #PB_ListIcon_ColumnWidth, 100, 2) ; fixe la largeur de la colonne 2 à 100
- Supporte GetGadgetItemText(#Gadget, -1, 2) ; renvoie le titre de la colonne 2
- Supporte SetGadgetItemText(#Gadget, -1, "Nouveau Texte", 2) ; change le titre de la colonne 2

ListViewGadget()
- supporte SetGadgetColor() pour la couleur de fond et la couleur du texte (Pas pour les différents éléments)
- Supporte SetGadgetItemData()
- Nouvelles options:
#PB_ListView_Multiselect - Permet la sélection de plusieurs éléments.
#PB_ListView_ClickSelect - Permet la sélection de plusieurs éléments. Clicker sur un élément le sélectionne ou le désélectionne.

MDIGadget()
- Les fenêtres filles des MDIGadget ne sont plus des "GadgetItems", mais de vraies fenêtres PB. Ce qui signifie que vous pouvez employer n'importe quelle commande de la bibliothèque Windows (à l'exception de StickyWindow()). Ce qui rend quelques fonctions pour le MDIGadget obsolètes, et implique quelques changements:
- Le gadget n'envoie plus d'événement : les événements close, resize, activate sont reçus comme des événements de fenêtre
- GetGadgetAttribute(), Get/SetGadgetItemAttribute, Get/SetGadgetItemState(), Get/SetGadgetItemText ne sont plus supportés. Toutes ces commandes peuvent être remplacées facilement à l'aide des commandes de la bibliothèque Window.
- RemoveGadgetItem() n'est plus supporté... utilisez CloseWindow()

Les commandes utilisables avec un MDIGadget sont maintenant celles-ci: (plus l'ensemble des commandes de la bibliothèque window !)
- ClearGadgetItemList() : ferme toutes les fenêtres filles
- CountGadgetItems() : renvoie le nombre de fenêtres filles
- GetGadgetState() : renvoie l'identifiant de la fenêtre fille active.
- SetGadgetState() : Change la fenêtre fille active ou ré-arrange la disposition des fenêtres filles
- AddGadgetItem() : Crée une nouvelle fenêtre fille. fonctionne de la façon suivante:
   AddGadgetItem(#MDI, #Fenetre, Titre$ [, ImageID [, Options]])
     - #Fenetre - Numéro de la nouvelle fenêtre (vous pouvez utiliser #PB_Any!)
     - Titre$   - titre de la nouvelle fenêtre
     - ImageID  - Icône pour la fenêtre (optionnel)
     - Options  - Supporte la plupart des options pour OpenWindow,
                  si rien n'est indiqué, les options par défaut d'une fenêtre MDI sont utilisées.
   Les options suivantes ne sont pas supportées: #PB_Window_Borderless, #PB_Window_ScreenCentered, #PB_Window_WindowCentered
Note: Désormais vous devez appeler CreateGadgetList() pour ajouter des éléments à la fenêtre MDI fille, de la même façon que pour une fenêtre normale.

- SetGadgetColor() peut être utilisé avec #PB_Gadget_BackColor pour définir la couleur de fond du MDI
- SetGadgetAttribute() peut être utilisé avec #PB_MDI_Image pour appliquer une image de fond, #PB_MDI_TileImage applique l'image de fond en mosaïque

PanelGadget()
- Ajouté GetGadgetAttribute() avec #PB_Panel_ItemWidth, #PB_Panel_ItemHeight (en lecture seulement) (il doit y avoir au moins un élément dans le PanelGadget())

ProgressBarGadget()
- supporte SetGadgetColor() pour la couleur de fond et la couleur du texte (Ne fonctionne pas avec les thèmes XP activés)
- supporte SetGadgetAttribute() avec #PB_ProgressBar_Minimum, #PB_ProgressBar_Maximum

ScrollAreaGadget()
- supporte SetGadgetColor() pour la couleur de fond
- nouvelle option: #PB_ScrollArea_Center - La zone interne est automatiquement centrée si sa taille est plus petite que le cadre extérieur
- nouvelles options pour SetGadgetAttribute() #PB_ScrollArea_X/#PB_ScrollArea_Y pour modifier/renvoyer la position actuelle de l'ascenseur.
- Maintenant un évènement est généré quand les ascenseurs sont déplacés

ScrollBarGadget()
- Supporte SetGadgetAttribute() avec #PB_ScrollBar_Minimum, #PB_ScrollBar_Maximum, #PB_ScrollBar_PageLength

SpinGadget()
- supporte SetGadgetColor() pour la couleur de fond et la couleur du texte (pour colorer la zone d'édition)
- supporte SetGadgetAttribute() avec #PB_Spin_Minimum, #PB_Spin_Maximum
- Nouvelles options:
#PB_Spin_ReadOnly - Le gadget n'est pas éditable, sa valeur ne peut être changée que par les flèches.
#PB_Spin_Numeric - Le gadget met à jour automatiquement le texte affiché par rapport à sa valeur interne, SetGadgetText() n'est pas nécessaire.
- Valeurs pour EventType :
1 - Le bouton 'Haut' a été pressé
-1 - Le bouton 'Bas' a été pressé
#PB_EventType_Change - Le texte dans la zone d'édition a changé

SplitterGadget()
- nouvelles options pour Get/SetGadgetAttribute(): #PB_Splitter_FirstGadget, #PB_Splitter_SecondGadget avec GetGadgetAttribute(), renvoie le numéro du gadget associé avec SetGadgetAttribute(), associe un nouveau gadget au SplitterGadget.

Note: quand un gadget est remplacé à l'aide de SetGadgetAttribute(), l'ancien gadget n'est pas automatiquement supprimé. Il sera remis sur la fenêtre qui contient le splitter, pour permettre de permuter les gadgets entre différents splitters sans avoir à les recréer. Si l'ancien gadget doit être supprimé, son numéro peut être recupéré avec GetGadgetAttribute() puis supprimé par FreeGadget() après son remplacement.

Note: Un gadget ne peut pas être dans deux splitters à la fois. Aussi pour déplacer un gadget d'un splitter à un autre, commencez par le remplacer dans le premier splitter, puis placez le dans le second splitter.

StringGadget()
- supporte SetGadgetColor() pour la couleur de fond et la couleur du texte

TextGadget()
- supporte SetGadgetColor() pour la couleur de fond et la couleur du texte

TrackBarGadget()
- supporte SetGadgetAttribute() avec #PB_TrackBar_Minimum, #PB_TrackBar_Maximum

TreeGadget()
- supporte SetGadgetColor() pour la couleur de fond et la couleur du texte et #PB_Gadget_LineColor
- Supporte SetGadgetItemColor() pour la couleur de fond et du texte de l'élément
- Changement complet de la gestion des éléments. Il n'y a plus aucun noeud, juste une liste continue où chaque élément a un « sous-niveau ». Les sous-niveaux de tous les éléments définissent la structure arborescente comme ceci:
   + sublevel 0
   +-+ sublevel 1
   | | sublevel 1
   | +-+ sublevel 2
   | | sublevel 1
   | sublevel 0
- nouveau paramètre à AddGadgetItem: AddGadgetItem(#Gadget, Position, Texte$ [, ImageID [, Options]]) Le paramètre 'Options' est toujours requis pour le TReeGadget et indique le niveau du nouvel élément.

Pour créer l'arbre précédent, faites comme ceci:
   AddGadgetItem(#TreeGadget, -1, "sublevel 0", 0, 0)
   AddGadgetItem(#TreeGadget, -1, "sublevel 1", 0, 1)
   AddGadgetItem(#TreeGadget, -1, "sublevel 1", 0, 1)
   AddGadgetItem(#TreeGadget, -1, "sublevel 2", 0, 2)
   AddGadgetItem(#TreeGadget, -1, "sublevel 1", 0, 1)
   AddGadgetItem(#TreeGadget, -1, "sublevel 0", 0, 0)
- nouveau GetGadgetItemAttribute() avec #PB_Tree_SubLevel (readonly) Renvoie le niveau actuel de l'élément dans l'arbre.
- Supprimé: OpenTreeGadgetNode()
- Supprimé: CloseTreeGadgetNode()
- Supprimé: TreeGadgetItemNumber() - peut être émulé facilement avec GadgetItemID()
- Supprimé: CountTreeGadgetNodeItems() - peut être émulé facilement en comparant le niveau des éléments


License for the expat XML parser

Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
                               and Clark Cooper
Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers.

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


LGPL

      GNU LIBRARY GENERAL PUBLIC LICENSE
           Version 2, June 1991

 Copyright (C) 1991 Free Software Foundation, Inc.
            59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

[This is the first released version of the library GPL.  It is
 numbered 2 because it goes with version 2 of the ordinary GPL.]

          Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.

  This license, the Library General Public License, applies to some
specially designated Free Software Foundation software, and to any
other libraries whose authors decide to use it.  You can use it for
your libraries, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if
you distribute copies of the library, or if you modify it.

  For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you.  You must make sure that they, too, receive or can get the source
code.  If you link a program with the library, you must provide
complete object files to the recipients so that they can relink them
with the library, after making changes to the library and recompiling
it.  And you must show them these terms so they know their rights.

  Our method of protecting your rights has two steps: (1) copyright
the library, and (2) offer you this license which gives you legal
permission to copy, distribute and/or modify the library.

  Also, for each distributor's protection, we want to make certain
that everyone understands that there is no warranty for this free
library.  If the library is modified by someone else and passed on, we
want its recipients to know that what they have is not the original
version, so that any problems introduced by others will not reflect on
the original authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that companies distributing free
software will individually obtain patent licenses, thus in effect
transforming the program into proprietary software.  To prevent this,
we have made it clear that any patent must be licensed for everyone's
free use or not licensed at all.

  Most GNU software, including some libraries, is covered by the ordinary
GNU General Public License, which was designed for utility programs.  This
license, the GNU Library General Public License, applies to certain
designated libraries.  This license is quite different from the ordinary
one; be sure to read it in full, and don't assume that anything in it is
the same as in the ordinary license.

  The reason we have a separate public license for some libraries is that
they blur the distinction we usually make between modifying or adding to a
program and simply using it.  Linking a program with a library, without
changing the library, is in some sense simply using the library, and is
analogous to running a utility program or application program.  However, in
a textual and legal sense, the linked executable is a combined work, a
derivative of the original library, and the ordinary General Public License
treats it as such.

  Because of this blurred distinction, using the ordinary General
Public License for libraries did not effectively promote software
sharing, because most developers did not use the libraries.  We
concluded that weaker conditions might promote sharing better.

  However, unrestricted linking of non-free programs would deprive the
users of those programs of all benefit from the free status of the
libraries themselves.  This Library General Public License is intended to
permit developers of non-free programs to use free libraries, while
preserving your freedom as a user of such programs to change the free
libraries that are incorporated in them.  (We have not seen how to achieve
this as regards changes in header files, but we have achieved it as regards
changes in the actual functions of the Library.)  The hope is that this
will lead to faster development of free libraries.

  The precise terms and conditions for copying, distribution and
modification follow.  Pay close attention to the difference between a
"work based on the library" and a "work that uses the library".  The
former contains code derived from the library, while the latter only
works together with the library.

  Note that it is possible for a library to be covered by the ordinary
General Public License rather than by this special one.

      GNU LIBRARY GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License Agreement applies to any software library which
contains a notice placed by the copyright holder or other authorized
party saying it may be distributed under the terms of this Library
General Public License (also called "this License").  Each licensee is
addressed as "you".

  A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.

  The "Library", below, refers to any such software library or work
which has been distributed under these terms.  A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language.  (Hereinafter, translation is
included without limitation in the term "modification".)

  "Source code" for a work means the preferred form of the work for
making modifications to it.  For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.

  Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it).  Whether that is true depends on what the Library does
and what the program that uses the Library does.

  1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.

  You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.

  2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) The modified work must itself be a software library.

    b) You must cause the files modified to carry prominent notices
    stating that you changed the files and the date of any change.

    c) You must cause the whole of the work to be licensed at no
    charge to all third parties under the terms of this License.

    d) If a facility in the modified Library refers to a function or a
    table of data to be supplied by an application program that uses
    the facility, other than as an argument passed when the facility
    is invoked, then you must make a good faith effort to ensure that,
    in the event an application does not supply such function or
    table, the facility still operates, and performs whatever part of
    its purpose remains meaningful.

    (For example, a function in a library to compute square roots has
    a purpose that is entirely well-defined independent of the
    application.  Therefore, Subsection 2d requires that any
    application-supplied function or table used by this function must
    be optional: if the application does not supply it, the square
    root function must still compute square roots.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.

In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library.  To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License.  (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.)  Do not make any other change in
these notices.

  Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.

  This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.

  4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.

  If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.

  5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library".  Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.

  However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library".  The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.

  When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library.  The
threshold for this to be true is not precisely defined by law.

  If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work.  (Executables containing this object code plus portions of the
Library will still fall under Section 6.)

  Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.

  6. As an exception to the Sections above, you may also compile or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.

  You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License.  You must supply a copy of this License.  If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License.  Also, you must do one
of these things:

    a) Accompany the work with the complete corresponding
    machine-readable source code for the Library including whatever
    changes were used in the work (which must be distributed under
    Sections 1 and 2 above); and, if the work is an executable linked
    with the Library, with the complete machine-readable "work that
    uses the Library", as object code and/or source code, so that the
    user can modify the Library and then relink to produce a modified
    executable containing the modified Library.  (It is understood
    that the user who changes the contents of definitions files in the
    Library will not necessarily be able to recompile the application
    to use the modified definitions.)

    b) Accompany the work with a written offer, valid for at
    least three years, to give the same user the materials
    specified in Subsection 6a, above, for a charge no more
    than the cost of performing this distribution.

    c) If distribution of the work is made by offering access to copy
    from a designated place, offer equivalent access to copy the above
    specified materials from the same place.

    d) Verify that the user has already received a copy of these
    materials or that you have already sent this user a copy.

  For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it.  However, as a special exception,
the source code distributed need not include anything that is normally
distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.

  It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system.  Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.

  7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:

    a) Accompany the combined library with a copy of the same work
    based on the Library, uncombined with any other library
    facilities.  This must be distributed under the terms of the
    Sections above.

    b) Give prominent notice with the combined library of the fact
    that part of it is a work based on the Library, and explaining
    where to find the accompanying uncombined form of the same work.

  8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License.  Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License.  However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.

  9. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Library or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.

  10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all.  For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.

If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded.  In such case, this License incorporates the limitation as if
written in the body of this License.

  13. The Free Software Foundation may publish revised and/or new
versions of the Library General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number.  If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation.  If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.

  14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission.  For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this.  Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.

          NO WARRANTY

  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.

         END OF TERMS AND CONDITIONS

           How to Apply These Terms to Your New Libraries

  If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change.  You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).

  To apply these terms, attach the following notices to the library.  It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.

    <one line to give the library's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public
    License along with this library; if not, write to the Free
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

Also add information on how to contact you by electronic and paper mail.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the
  library `Frob' (a library for tweaking knobs) written by James Random Hacker.

  <signature of Ty Coon>, 1 April 1990
  Ty Coon, President of Vice

That's all there is to it!


License for the PCRE library (used by the RegularExpression library)

PCRE LICENCE
------------

PCRE is a library of functions to support regular expressions whose syntax
and semantics are as close as possible to those of the Perl 5 language.

Release 7 of PCRE is distributed under the terms of the "BSD" licence, as
specified below. The documentation for PCRE, supplied in the "doc"
directory, is distributed under the same terms as the software itself.

The basic library functions are written in C and are freestanding. Also
included in the distribution is a set of C++ wrapper functions.

THE BASIC LIBRARY FUNCTIONS
---------------------------

Written by:       Philip Hazel
Email local part: ph10
Email domain:     cam.ac.uk

University of Cambridge Computing Service,
Cambridge, England.

Copyright (c) 1997-2007 University of Cambridge
All rights reserved.

THE C++ WRAPPER FUNCTIONS
-------------------------

Contributed by:   Google Inc.

Copyright (c) 2007, Google Inc.
All rights reserved.

THE "BSD" LICENCE
-----------------

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

    * Neither the name of the University of Cambridge nor the name of Google
      Inc. nor the names of their contributors may be used to endorse or
      promote products derived from this software without specific prior
      written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

End


Licence Scintilla

License for Scintilla and SciTE

Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>

All Rights Reserved

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation.

NEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
OR PERFORMANCE OF THIS SOFTWARE.


License for the udis86 library

Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008 <vivek@sig9.com>
All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


Table des codes ASCII et leur correspondance

Codes ASCII de 0 à 255

  ------------------------------------------------------------------------
 |  0: NUL |  32:   |  64: @ |  96: ` | 128: € | 160:   | 192: À | 224: à |
 |  1: SOH |  33: ! |  65: A |  97: a | 129:  | 161: ¡ | 193: Á | 225: á |
 |  2: STX |  34: " |  66: B |  98: b | 130: ‚ | 162: ¢ | 194: Â | 226: â |
 |  3: ETX |  35: # |  67: C |  99: c | 131: ƒ | 163: £ | 195: Ã | 227: ã |
 |  4: EOT |  36: $ |  68: D | 100: d | 132: „ | 164: ¤ | 196: Ä | 228: ä |
 |  5: ENQ |  37: % |  69: E | 101: e | 133: … | 165: ¥ | 197: Å | 229: å |
 |  6: ACK |  38: & |  70: F | 102: f | 134: † | 166: ¦ | 198: Æ | 230: æ |
 |  7: BEL |  39: ' |  71: G | 103: g | 135: ‡ | 167: § | 199: Ç | 231: ç |
 |  8: BS  |  40: ( |  72: H | 104: h | 136: ˆ | 168: ¨ | 200: È | 232: è |
 |  9: HT  |  41: ) |  73: I | 105: i | 137: ‰ | 169: © | 201: É | 233: é |
 | 10: LF  |  42: * |  74: J | 106: j | 138: Š | 170: ª | 202: Ê | 234: ê |
 | 11: VT  |  43: + |  75: K | 107: k | 139: ‹ | 171: « | 203: Ë | 235: ë |
 | 12: FF  |  44: , |  76: L | 108: l | 140: Œ | 172: ¬ | 204: Ì | 236: ì |
 | 13: CR  |  45: - |  77: M | 109: m | 141:  | 173:  | 205: Í | 237: í |
 | 14: SO  |  46: . |  78: N | 110: n | 142: Ž | 174: ® | 206: Î | 238: î |
 | 15: SI  |  47: / |  79: O | 111: o | 143:  | 175: ¯ | 207: Ï | 239: ï |
 | 16: DLE |  48: 0 |  80: P | 112: p | 144:  | 176: ° | 208: Ð | 240: ð |
 | 17: DC1 |  49: 1 |  81: Q | 113: q | 145: ‘ | 177: ± | 209: Ñ | 241: ñ |
 | 18: DC2 |  50: 2 |  82: R | 114: r | 146: ’ | 178: ² | 210: Ò | 242: ò |
 | 19: DC3 |  51: 3 |  83: S | 115: s | 147: “ | 179: ³ | 211: Ó | 243: ó |
 | 20: DC4 |  52: 4 |  84: T | 116: t | 148: ” | 180: ´ | 212: Ô | 244: ô |
 | 21: NAK |  53: 5 |  85: U | 117: u | 149: • | 181: µ | 213: Õ | 245: õ |
 | 22: SYN |  54: 6 |  86: V | 118: v | 150: – | 182: ¶ | 214: Ö | 246: ö |
 | 23: ETB |  55: 7 |  87: W | 119: w | 151: — | 183: · | 215: × | 247: ÷ |
 | 24: CAN |  56: 8 |  88: X | 120: x | 152: ˜ | 184: ¸ | 216: Ø | 248: ø |
 | 25: EM  |  57: 9 |  89: Y | 121: y | 153: ™ | 185: ¹ | 217: Ù | 249: ù |
 | 26: SUB |  58: : |  90: Z | 122: z | 154: š | 186: º | 218: Ú | 250: ú |
 | 27: ESC |  59: ; |  91: [ | 123: { | 155: › | 187: » | 219: Û | 251: û |
 | 28: FS  |  60: < |  92: \ | 124: | | 156: œ | 188: ¼ | 220: Ü | 252: ü |
 | 29: GS  |  61: = |  93: ] | 125: } | 157:  | 189: ½ | 221: Ý | 253: ý |
 | 30: RS  |  62: > |  94: ^ | 126: ~ | 158: ž | 190: ¾ | 222: Þ | 254: þ |
 | 31: US  |  63: ? |  95: _ | 127:  | 159: Ÿ | 191: ¿ | 223: ß | 255: ÿ |
  ------------------------------------------------------------------------

Description étendue de l'usage des caractères de contrôle (caractères ASCII 0 à 31)

  | ASCII | Description
  |-------+---------------------------------------------------------------------------------------------------------------
  |   0   | NUL (NULL / Caractère nul). Typiquement (et spécialement en PureBasic) utilisé pour indiquer la fin d'une chaîne.
  |   1   | SOH (Start Of Heading / Début de titre). Indique le début d'un bloc de données, ou la zone d'en-tête d'un bloc de données.
  |   2   | STX (Start of TeXt / Début de texte). Typiquement envoyé comme premier caractère dans un bloc de texte, pendant les communications.
  |   3   | ETX (End of TeXt / Fin de texte). Typiquement envoyé comme dernier caractère dans un bloc de texte, pendant les communications.
  |   4   | EOT (End Of Transmission / Fin de transmission) Utilisé pour indiquer la fin d'une transmission.
  |   5   | ENQ (ENQuiry / Requête - Invitation à la transmission). Envoyé à un récepteur afin d'obtenir une réponse.
  |   6   | ACK (ACKnowledge / Accusé de réception). Envoyé par un récepteur pour indiquer qu'il a reçu et/ou compris la requête.
  |   7   | BEL (BELL / Cloche). Produit un signal sonore (provoque l'émission d'un 'bip' par le haut-parleur du PC)
  |   8   | BS (BackSpace / Retour arrière). Déplace le curseur d'une position vers la gauche (pourrait également effacer le caractère à gauche du curseur avant d'effectuer le mouvement)
  |   9   | HT (Horizontal Tab / Tabulation horizontale). Typiquement utilisé pour la mise en forme de tableaux dans un texte.
  |   10  | LF (LineFeed / Saut de ligne). Le caractère utilisé pour représenter l'action de passer une ligne sur une machine à écrire ou une imprimante en mode texte. Typiquement utilisé comme, ou partie des, caractères de fin de ligne.
  |   11  | VT (Vertical Tab / Tabulation verticale). Même chose que la tabulation (horizontale), mais le déplacement s'effectue d'une rangée vers le bas au lieu d'une colonne vers la droite.
  |   12  | FF (Form Feed / Saut de page). Caractère typiquement utilisé pour indiquer à une imprimante (en mode texte) de passer à la page (feuille) suivante.
  |   13  | CR (Carriage Return / Retour chariot). Le caractère qui représente l'action de ramener la tête d'une machine à écrire ou d'une imprimante au début de la ligne. Typiquement utilisé comme, ou partie des, caractères de fin de ligne.
  |   14  | SO (Shift Out / Mouvement sortant). Début d'un bloc de caractères dont la signification dépend de l'implémentation.
  |   15  | SI (Shift In / Mouvement entrant). Ferme la transmission du type de bloc ci-dessus.
  |   16  | DLE (Data Link Escape / Echappement de lien de donnée). Utilisé pour indiquer que le caractère de contrôle suivant devrait être interprété comme donnée et non comme caractère de contrôle.
  |   17  | DC1 (Device Control 1/Contrôle de périphérique 1). Typiquement utilisé pour activer une partie d'un équipement. L'usage le plus courant aujourd'hui est en tant que caractère XON dans les communications série à contrôle de flux logiciel.
  |   18  | DC2 (Device Control 2/Contrôle de périphérique 2). Un autre caractère de contrôle de périphérique. Son usage dépend du contexte.
  |   19  | DC3 (Device Control 3/Contrôle de périphérique 3). Typiquement utilisé pour désactiver une partie d'un équipement. L'usage le plus courant aujourd'hui est en tant que caractère XOFF dans les communications série à contrôle de flux logiciel.
  |   20  | DC4 (Device Control 4/Contrôle de périphérique 4). Un autre caractère de contrôle de périphérique.
  |   21  | NAK (Negative AcKnowledge/Accusé de réception négatif). Typiquement utilisé pour signaler des données non-reçues ou non-comprises (erronée).
  |   22  | SYN (SYNchronous idle/Attente synchronisée). Comme son nom l'indique, il s'agit d'un signal envoyé à intervalle régulier pour indiquer que le canal de communication est en attente, mais toujours actif.
  |   23  | ETB (End of Transmission Block/Fin de transmission de bloc). Utilisé pour contrôler la transmission de donnée en indiquant la fin de bloc. A ne pas confondre avec EOT.
  |   24  | CAN (CANcel/Annulation). Signifie généralement que la donnée envoyée précédemment devrait être ignorée, bien que les détails dépendent de l'application.
  |   25  | EM (End of Medium/Fin de média). Utilisé pour indiquer la fin d'un média, par exemple la fin d'un lecteur de bande
  |   26  | SUB (SUBstitute/Substitution). Un caractère utilisé pour indiquer qu'un caractère a été substitué.
  |   27  | ESC (ESCape/Echappement). Le caractère produit habituellement en appuyant sur la touche 'ECHAP' de votre clavier, utilisé dans les "séquences d'échappement" pour fournir des informations de formattage aux afficheurs de texte (consoles, imprimantes, etc..)
  |   28  | FS (File Separator / Séparateur de fichier)
  |   29  | GS (Group Separator / Séparateur de groupe)
  |   30  | RS (Record separator / Séparateur d'enregistrement)
  |   31  | US (Unit separator) / Séparateur d'unité)


Travailler avec différentes bases numériques

(Note: Ces exemples utilisent le symbole ^ pour signifier 'élevé à la puissance de' - ceci est seulement une convention dans ce document, PureBasic n'a pas actuellement d'opérateur d'élévation à la puissance ! Utilisez plutôt la commande PureBasic Pow() de la bibliothèque "Math".)

Introduction

Une base numérique est une manière de représenter les nombres, en utilisant une certaine quantité de symboles possibles par chiffre. La plus courante que vous devez connaître est la base 10 (c-a-d décimale), car il y a 10 chiffres utilisés (0 à 9), et c'est celle que la plupart des humains peuvent manipuler le plus facilement.

Le but de cette page est d'expliquer différentes bases numériques et comment vous pouvez travailler avec elles. En effet les ordinateurs travaillent en binaire (base 2) et il y a certains cas où il est avantageux de le comprendre (par exemple, lors de l'utilisation d'opérateurs logiques, masques de bits, etc).

Vue d'ensemble des bases numériques

Le système Décimal

Pensez à un nombre décimal, et réfléchissez à sa représentation en colonnes. Prenons par exemple le nombre 1234. Séparé en colonnes, nous avons :
  1   2   3   4
Réfléchissez à ce que sont les en-têtes de chaque colonne. Nous savons qu'il y a les unités, les dizaines, les centaines et les milliers, présentés ainsi :
  1000  100   10    1
     1    2    3    4
Nous pouvons voir que le nombre 1234 est constitué de
    1*1000=1000
  + 2* 100= 200
  + 3*  10=  30
  + 4*   1=   4
  Total   =1234
Si nous regardons également les en-têtes de colonne, vous verrez qu'à chaque fois que vous bougez d'une colonne vers la gauche nous multiplions par 10, qui justement s'avère être la base numérique. Chaque fois que vous bougez d'une colonne vers la droite, vous divisez par 10. Les en-têtes de colonnes peuvent être appelées les poids, puisque pour obtenir tout le nombre nous devons multiplier les chiffres de chaque colonne par le poids. Nous pouvons exprimer les poids en utilisant des index. Par exemple 10^2 signifie '10 élevé à la puissance de 2' ou 1*10*10 (=100). De même, 10^4 signifie 1*10*10*10*10 (=10000). Remarquez dans ces exemples, que peu importe la valeur de l'index, il correspond au nombre de fois que nous multiplions le nombre qui doit être élevé. 10^0 signifie 1 (puisque nous multiplions par 10 aucune fois). Utiliser des nombres négatifs montre que nous devons diviser, par exemple 10^-2 signifie 1/10/10 (=0.01). Les valeurs de l'index prennent plus de sens quand nous attribuons un numéro à chaque colonne - vous verrez souvent des choses comme 'bit 0' qui signifie en fait 'chiffre binaire en colonne 0'.
  Dans cet exemple, ^ signifie élevé à la puissance de, donc 10^2 signifie 10 élevé à la puissance de 2.
  Numéro de colonne          3     2     1     0
  Poids (index)           10^3  10^2  10^1  10^0
  Poids (valeur réelle)   1000   100    10     1
  Nombre exemple (1234)      1     2     3     4
Précédemment nous avons vu comment convertir le nombre 1234 dans son équivalent décimal. Conversion peu justifiée, car il était déjà en décimal mais nous pouvons en tirer la méthode générale - voici donc comment convertir n'importe quel nombre en sa valeur décimale :
  B = Valeur de la base numérique

  1) Séparer le nombre, peu importe la base, en colonnes. Par
     exemple, si nous avions la valeur 'abcde' dans notre base numérique fictive 'B',
     les colonnes seraient : a   b   c   d   e

  2) Multiplier chaque symbole par le poids de chaque colonne (le poids étant
     calculé par 'B' élevé à la puissance du numéro de la colonne):
       a * B^4 = a * B * B * B * B
       b * B^3 = b * B * B * B
       c * B^2 = c * B * B
       d * B^1 = d * B
       e * B^0 = e

  3) Calculer la somme de toutes ces valeurs. En écrivant toutes ces valeurs dans leur
     équivalent décimal pendant les calculs, il devient beaucoup plus facile de voir le
     résultat and de faire le calcul (si nous convertissons en décimal).
Convertir dans la direction opposée (de décimal vers la base numérique 'B') s'effectue en utilisant la division au lieu de la multiplication :
  1) Commencer par le nombre décimal que vous voulez convertir (e.g. 1234).

  2) Diviser par la base numérique ciblée ('B') et prendre note du quotient et du
     reste.

  3) Diviser le quotient de (2) par la base numérique ciblée ('B') et prendre note du
     quotient et du reste.

  4) Continuer à diviser comme ça jusqu'à ce que vous obteniez un quotient de 0.

  5) Votre nombre dans la base numérique ciblée est constitué des restes écrits dans l'ordre
     du dernier calculé au premier calculé. Par exemple, votre nombre serait constitué
     des restes des étapes dans cet ordre 432.
Des exemples plus particuliers seront donnés dans les paragraphes concernant les bases numériques particulières.

Système binaire

Tout dans un ordinateur est stocké en binaire (base 2, avec les symboles définis '0' ou '1') mais le travail avec des nombres binaires suit les mêmes règles qu'en décimal. Chaque symbole dans un nombre binaire est appelé bit, abréviation de BInary digiT (chiffre binaire). Généralement, vous travaillerez avec des bytes (octets, 8-bit), words (mots, 16-bit) ou longwords (mots longs, 32-bit) car ce sont les tailles par défaut des types intégrés à PureBasic. Les poids pour un byte (octet) sont les suivants :
  (^ signifie 'élevé à la puissance de', la base numérique est 2 pour le binaire)
  Bit/numéro de colonne      7     6     5     4     3     2     1     0
  Poids (index)            2^7   2^6   2^5   2^4   2^3   2^2   2^1   2^0
  Poids (valeur réelle)    128    64    32    16     8     4     2     1
Donc, par exemple, si nous avions le nombre 00110011 (Base 2), nous pourrions établir sa valeur comme ceci :
    0 * 128
  + 0 *  64
  + 1 *  32
  + 1 *  16
  + 0 *   8
  + 0 *   4
  + 1 *   2
  + 1 *   1
  =      51
Un exemple de conversion inversée serait d'écrire la valeur 69 en binaire. Nous ferions comme ceci :
  69 / 2 = 34 r 1     ^
  34 / 2 = 17 r 0    /|\
  17 / 2 =  8 r 1     |
   8 / 2 =  4 r 0     |    Lire les restes dans cette direction
   4 / 2 =  2 r 0     |
   2 / 2 =  1 r 0     |
   1 / 2 =  0 r 1     |
  (Arrêt ici car le quotient de la dernière division était 0)

 Lire les restes de bas en haut pour obtenir la valeur en binaire = 1000101
Une autre chose à considérer lorsque l'on travaille avec des nombres binaires est la représentation des nombres négatifs. Comme nous le faisons quotidiennement, nous pourrions simplement mettre un symbole négatif devant le nombre décimal. Nous ne pouvons pas faire cela en binaire, mais il y a un moyen (après tout, PureBasic travaille principalement avec des nombres signés, et doit donc être capable de gérer les nombres négatifs). Cette méthode est appelée 'complément à deux' et indépendamment de toutes les bonnes fonctionnalités que cette méthode possède (et qui ne seront pas expliquées ici, pour épargner une certaine confusion) la manière la plus simple de la comprendre, est de se dire que le poids du bit le plus significatif (Most Significant bit / le MSb est le numéro du bit avec la plus grande valeur. Dans le cas d'un octet (byte), ce serait le bit 7) est réellement une valeur négative. Donc pour un système de complément à deux, les poids des bits sont modifés en :
  (^ signifie 'élevé à la puissance de', la base numérique est 2 pour le binaire)
  Bit/numéro de colonne     7     6     5     4     3     2     1     0
  Poids (index)          -2^7   2^6   2^5   2^4   2^3   2^2   2^1   2^0
  Poids (valeur réelle)  -128    64    32    16     8     4     2     1
et vous pourrez faire la conversion de binaire vers décimal exactement de la même manière que ci-dessus, mais en utilisant le nouveau jeu de poids. Par exemple, le nombre 10000000 (Base 2) est -128, et 10101010 (Base 2) est -86.

Pour convertir un nombre binaire positif en négatif et vice versa, vous inversez tous les bits et ensuite ajoutez 1. Par exemple, 00100010 passerait en négatif en inversant -> 11011101 et additionant 1 -> 11011110.

Ceci facilite la conversion de décimal à binaire, car vous pouvez convertir les nombres décimaux négatifs comme leurs équivalents positifs (en utilisant la méthode ci-dessus) et ensuite rendre le nombre binaire négatif à la fin.

Les nombre binaires dans PureBasic sont précédés du symbol 'pourcentage', et évidement tous les bits du nombre doivent être un '0' ou un '1'. Par exemple, vous pouvez utiliser la valeur %110011 dans PureBasic pour signifier 51. Notez que vous n'avez pas besoin de mettre les '0' de tête (ce nombre serait vraiment %00110011) mais cela peut faciliter la lisibilité de votre source si vous écrivez l'ensemble des bits.

Le système Hexadécimal

L'hexadecimal (pour base 16, symboles '0'-'9' suivis de 'A'-'F') est une base numérique qui est plus généralement employée en informatique, car il s'agit probablement de la base numérique non décimale la plus facile à comprendre pour les humains, et vous n'avez pas à écrire de longues chaines de symboles pour vos nombres (comme c'est le cas avec le binaire).

Les mathématiques hexadécimales suivent les mêmes règles qu'en décimal, bien que vous ayez maintenant 16 symboles par colonne jusqu'à ce que vous ayez besoin d'une retenue. La conversion entre l'hexadécimal et le décimal suit les mêmes principes qu'entre le binaire et le décimal, sauf que les poids sont des multiples de 16 et les divisions sont faites par 16 au lieu de 2 :
  Numéro de colonne          3      2      1      0
  Poids (index)           16^3   16^2   16^1   16^0
  Poids (valeur réelle)   4096    256     16      1
Convertir la valeur hexadécimale BEEF (Base 16) en décimal serait fait comme ceci :
    B * 4096 = 11 * 4096
  + E *  256 = 14 *  256
  + E *   16 = 14 *   16
  + F *    1 = 15 *    1
  =                48879
Et convertir la valeur 666 en hexadécimal serait fait comme ceci :
  666 / 16 = 41 r 10    ^
   41 / 16 =  2 r  9   /|\    Lire les chiffres dans cette direction, se souvenir de convertir
    2 / 16 =  0 r  2    |     en chiffres hexadecimaux où nécessaire
  (Arrêt ici car le quotient de la dernière division était 0)
  La valeur hexadécimale de 666 est 29A
La chose vraiment intéressante avec l'hexadécimal c'est qu'il permet également de convertir vers le binaire très facilement. Chaque chiffre hexadécimal représente 4 bits, pour convertir entre hexadécimal et binaire, vous devez juste convertir chaque chiffre hexadécimal en 4 bits ou chaque groupe de 4 bits vers un chiffre hexadécimal (en se rappelant que 4 est un diviseur de toutes les tailles communes de nombres binaires dans un CPU). Par exemple :
  Nombre hexadécimal     5        9        D        F           4E
  Valeur binaire      0101     1001     1101     1111       01001110
Lorsque vous utilisez des valeurs hexadécimales dans PureBasic, vous mettez un symbole 'dollar' devant le nombre, par exemple $BEEF.

Pour terminer ce sujet vous avez ici une table avec les nombres de 0 à 255 au format décimal, binaire et hexadécimal.


Break : Continue

Syntax
Break [Niveau]
Description
Break permet de quitter à n'importe quel moment une ou plusieurs des boucles suivantes: Repeat, For, ForEach et While. Le paramètre optionnel 'Niveau' indique le nombre de boucles qui doivent être abrégées. Sans paramètre, Break quitte la boucle courante.

Exemple: Boucle simple

  For k=0 To 10
    If k=5
      Break  ; Quitte immédiatement la boucle For/Next
    EndIf
    Debug k
  Next

Exemple: Boucles imbriquées

  For k=0 To 10
    Counter = 0
    Repeat
      If k=5
        Break 2 ; Quitte immédiatement les boucles Repeat/Until et For/Next
      EndIf
      Counter+1
    Until Counter > 1
    Debug k
  Next

Syntax
Continue
Description
Continue permet de passer directement à la prochaine itération dans l'une des boucles suivantes: Repeat, For, ForEach et While.

Exemple

  For k=0 To 10
    If k=5
      Continue  ; N'affichera pas 'Debug 5' car la fin de cette itération sera ignorée
    EndIf
    Debug k
  Next


Utiliser le compilateur en ligne de commande

Introduction

Le compilateur est situé dans le répertoire 'Compilers\' de la distribution PureBasic. La manière la plus simple d'y accéder est d'ajouter ce répertoire à la variable PATH de Windows, ce qui vous donnera un accès permanent à toutes les commandes de ce répertoire.

Paramètres du compilateur

/? : affiche une aide simplifiée sur le compilateur.

/COMMENTED : créé un fichier de sortie '.asm' commenté en même temps que l'exécutable. Ce fichier peut être ré-assemblé ultérieurement après l'avoir modifié selon vos besoins. Cette option est à destination des programmeurs avancés.

/DEBUGGER : active le débogueur.

/EXE "NomFichier" : créé un fichier exécutable indépendant spécifié par NomFichier.

/ICON "IconName" : ajoute l'icône spécifiée par IconName dans l'exécutable.

/INLINEASM : active la fonction assembleur en ligne (des routines asm peuvent être écrites directement dans le code source BASIC).

/RESIDENT "NomFichier" : crée un fichier résident spécifié par NomFichier.

/CONSOLE: le fichier de sortie est au format Console. Le format par défaut est Win32.

/DLL: le fichier de sortie est une DLL.

/XP: ajoute le support des thèmes ('skins') pour Windows XP.

/REASM: réassemble le fichier PureBasic.asm file en fichier exécutable. Ceci permet d'utiliser la fonction /COMMENTED, de modifier le fichier de sortie asm et de recréer un exécutable.

/LINENUMBERING: ajoute des informations concernant les lignes et les fichiers sources à l'exécutable, qui peut le ralentir considérablement. Ce qui permet à la bibliothèque OnError d'indiquer le fichier et le numéro de ligne en cas d'erreur.

/QUIET: désactive toutes les éditions de texte inutiles. Très pratique lorsque vous utilisez un éditeur tiers. Plus d'informations sur l'utilisation de ce paramètre est disponible dans le fichier 'CompilerInterface.txt' du répertoire 'SDK' de PureBasic.

/STANDBY: charge le compilateur en mémoire, en attente de commandes externes (éditeurs, scripts...).

/MMX, /3DNOW, /SSE or /SSE2: génère un exécutable spécifique à un type de processeur. Si une routine est disponible dans une version optimisée pour le type de processeur choisi, elle sera utilisée. Du coup, l'exécutable ne fonctionnera correctement que sur ce type de processeur.

/DYNAMICCPU: génère un exécutable qui contient toutes les versions des routines spécialement optimisées pour un type de processeur. Quand le programme se lance, il déterminera dynamiquement le type du processeur et choisira les routines les plus adaptées. Cela produit un exécutable plus gros mais plus rapide.

/RESOURCE "NomFichier": ajoute un fichier de resource Windows (.rc) à l'exécutable ou la DLL. Ce fichier ne doit pas être un fichier resource compilé, mais un fichier texte contenant des directives. Il est possible de ne specifier qu'un seul fichier resource, mais il peut en inclure d'autre si besoin est, à l'aide des directives adéquates.
/LINKER "FichierCommandes": spécifie un fichier qui contient des commandes à passer directement au linker. Sur Windows, PureBasic utilise le linker de PellesC (polink), plus d'informations à propos des options possible sont disponible dans l'aide de PellesC.

/IGNORERESIDENT "Fichier": ne charge pas le fichier résident quand au démarrage du compilateur. C'est principalement utilisé quand un mise à jour d'un fichier résident déjà existant est nécessaire (en conjonction avec /CREATERESIDENT).

/CONSTANT Nom=Valeur: crée la constante spécifiée avec la valeur indiquée.
Exemple: 'pbcompiler test.pb /CONSTANT MaConstante=10'. La constante #MaConstante sera créée automatiquement avec la valeur 10 avant de commencer la compilation. Très utile pour faire de la compilation ciblée à partir de scripts.

/UNICODE: utilise l'unicode en lieu et place de l'ASCII pour la gestion des chaînes de caractères.

/THREAD: utilise les routines thread-safe pour toutes les commandes.

/SUBSYSTEM "Nom": utilise le sous-système spécifié pour remplacer des commandes internes. Pour plus d'informations, voir sous-systèmes.

Les deux options suivantes du compilateur sont nécessaires pour créer des programmes qui s'exécutent sous Microsoft Vista. Ces deux options sont en rapport avec le 'manifeste' inclus, donc elles sont ignorées avec les versions plus anciennes de Windows. Si aucune de ces deux options ne s ont utilisées, l'exe s'exécutera en tant qu'utilisateur normal, mais avec la virtualisation activée (redirection du registre et des fichiers). Il est recommandé d'utiliser le commutateur /USER pour désactiver la virtualisation pour tous les programmes qui ont les privilèges d'utilisateur standard, car c'est seulement destinés à la compatibilité des programmes plus anciens. Ces options sont également disponibles dans le menu Compilateur/Options du compilateur de l'IDE.
/ADMINISTRATOR: oblige le programme à demander des privilèges d'administrateur au démarrage. Le programme ne fonctionnera pas sans ça. Cette option est nécessaire. Note: Vous pouvez également déboguer les programmes avec cette option, mais seulement avec la version autonome du débogueur (car il doit fonctionner avec des droits élevés lui aussi).
/USER: le programme sera exécuté avec les droit de l'utilisateur qui l'a lancé. Virtualisation pour l'exe est désactivée.
/CHECK: vérifie la syntaxe uniquement, ne créer pas ni ne lance l'exécutable.

Exemple

    CLI> pbcompiler codesource.pb
Le compilateur compile le code 'codesource.pb' et l'exécute.
    CLI> pbcompiler codesource.pb /DEBUGGER /INLINEASM
Le compilateur compile le code 'codesource.pb' et l'exécute avec le débogueur actif en autorisant l'assembleur en ligne.
    CLI> pbcompiler "C:\Project\Source\DLLSource.pb" /EXE "C:\Projet\projet.dll" /DLL
Le compilateur compile le code 'DLLSource.pb' (ici avec le chemin complet) et crée la DLL "projet.dll" à l'emplacement indiqué.


Table des couleurs

Généralités

Le tableau suivant représente 216 couleurs dans différentes variations. Cela donne un aperçu des couleurs possibles ainsi que leurs valeurs numériques (en hexadécimale).

La table des couleurs est affichée dans le format RGB habituel (rouge, vert, bleu). Par exemple la couleur bleue en haut à droite a pour valeur hexadécimale '$0000FF', avec 'FF' pour indiquer la pleine échelle de la composante bleue.

Pour toutes les commandes PureBasic qui attendent la valeur d'une couleur, vous avez deux possibilités:

1.) Utilisez les valeurs affichées avec la commande RGB() en séparant la valeur de chaque composante de la couleur dans l'ordre (R)ed, (G)reen and (B)lue (Rouge ,Vert , Bleu) :
  Plot(0, 0, RGB($00,$00,$FF))
2.) Utilisez une seule valeur de couleur incluant toutes les composantes, mais dans ce cas les composantes bleue et rouge doivent être croisées, de telle sorte que la couleur soit dans le format BGR. Par exemple la couleur bleue sera utilisée comme ceci :
  Plot(0, 0, $FF0000))
Truc pour programmeur avancé: La valeur RGB est calculée de la façon suivante : Couleur = Rouge + Vert*256 + Bleu*65536


Les directives du compilateur

Syntax
CompilerIf  <expression constante>
  ...
[CompilerElseIf]
  ...
[CompilerElse]
  ...
CompilerEndIf
Description
Si le résultat <expression constante> est vrai, le code inclus dans la structure 'If' sera compilé, sinon il sera totalement ignoré. Cette directive permet de construire des programmes multi-plateformes en personnalisant des parties du code source avec des fonctions spécifiques pour chaque système d'exploitation.

Exemple

  CompilerIf #PB_Compiler_OS = #PB_OS_Linux
    ; code spécifique Linux..
  CompilerEndIf

Syntax
CompilerSelect <constante numérique>
  CompilerCase <constante numérique>
    ...
  [CompilerElse]
    ...
  [CompilerDefault]
    ...
CompilerEndSelect
Description
Fonctionne comme un Select : EndSelect classique en opérant une compilation conditionnelle. Cette directive permet par exemple de construire des programmes multi-plateformes en personnalisant des parties du code source avec des fonctions spécifiques pour chaque système d'exploitation.

Exemple

  CompilerSelect #OS
    CompilerCase #AmigaOS
      ; code spécifique Amiga
    CompilerCase #Linux
      ; code spécifique Linux
  CompilerEndSelect

Syntax
CompilerError <message>
Description
Génère une erreur, comme si c'était une erreur de syntaxe et affiche le message spécifié. Ceci peut être utile pour faire des routines spécifiques et indiquer qu'elles ne sont pas disponibles pour un OS particulier.

Exemple

  CompilerIf #PB_Compiler_OS = #PB_OS_AmigaOS
    CompilerError "AmigaOS n'est pas supporté, désolé."
  CompilerElse
    CompilerError "OS Supporté, vous pouvez me mettre en commentaire."
  CompilerEndIf

Syntax
EnableExplicit
DisableExplicit
Description
Active ou désactive le mode explicite. Quand il est actif, toutes les variables qui ne sont pas explicitement déclarées avec Define, Global, Protected ou Static ne seront pas acceptées par le compilateur et génèreront une erreur. Cela peut aider à éviter les erreurs de frappe.

Exemple

  EnableExplicit

  Define a

  a = 20 ; Ok, car déclaré avec 'Define'
  b = 10 ; Erreur

Syntax
EnableASM
DisableASM
Description
Active ou désactive l'assembleur en ligne. Quand il est actif, toutes les commandes assembleur sont incluses directement dans le code source, pour plus d'informations référez vous à la page L'assembleur en ligne.

Exemple

  ; Exemple assembleur x86
  ;
  Test = 10

  EnableASM
    MOV dword [v_Test],20
  DisableASM

  Debug Test ; Affichera 20

Constantes prédéfinies

Le compilateur PureBasic déclare automatiquement plusieurs constantes avant chaque compilation pour donner plus d'informations sur l'environnement de développement:
    #PB_Compiler_OS: Permet de savoir sur quelle plateforme est exécuté le compilateur
    #PB_OS_Windows : Le compilateur est exécuté sur Windows
    #PB_OS_Linux   : Le compilateur est exécuté sur Linux
    #PB_OS_AmigaOS : Le compilateur est exécuté sur AmigaOS
    #PB_OS_MacOS   : Le compilateur est exécuté sur Mac OS X

  #PB_Compiler_Processor : Détermine le type de processeur pour lequel le programme est créé. Il peut être l'un des suivants:
    #PB_Processor_x86     : Architecture de processeur x86 (aussi appelé IA-32 ou x86-32)
    #PB_Processor_x64     : Architecture de processeur x86-64 (aussi appelé x64, AMD64 ou Intel64)
    #PB_Processor_PowerPC : Architecture de processeur PowerPC
    #PB_Processor_mc68000 : Architecture de processeur Motorola 68000

  #PB_Compiler_ExecutableFormat : Détermine le format de l'exécutable. Il peut être l'un des suivants:
    #PB_Compiler_Executable : Exécutable standard
    #PB_Compiler_Console    : Exécutable console (Uniquement sur Windows, les autres OS utiliseront le format exécutable standard)
    #PB_Compiler_DLL        : DLL (dynlib sur MacOS X et objet partagé sur Linux)

  #PB_Compiler_Date     : La date actuelle, au moment de la compilation, au format date PureBasic.
  #PB_Compiler_File     : Chemin complet et nom du fichier en cours de compilation, utile pour debogguer.
  #PB_Compiler_FilePath : Chemin complet du fichier en cours de compilation, utile pour debogguer.
  #PB_Compiler_Line     : Numéro de la ligne du fichier en cours de compilation, utile pour debogguer.
  #PB_Compiler_Procedure: Nom de la procédure actuelle, si la ligne est à l'intérieur d'une procédure.
  #PB_Compiler_Version  : Version du compilateur, nombre entier sous la forme '420' pour la version 4.20.
  #PB_Compiler_Home     : Chemin complet du répertoire PureBasic, utile pour localiser des fichiers inclus
  #PB_Compiler_Debugger : Egal à 1 si le débogueur est activé, égal 0 sinon. Quand un exécutable est
                          créé, le débogueur est toujours désactivé (cette constante sera égale à 0).
  #PB_Compiler_Thread   : Egal à 1 si l'exécutable est compilé en mode 'multi-threadé', égal à 0 sinon.
  #PB_Compiler_Unicode  : Egal à 1 si l'exécutable est compilé en mode unicode, égal à 0 sinon.
  #PB_Compiler_LineNumbering : Egal à 1 si l'exécutable est compilé avec l'option 'Activer le numéro de ligne pour OnError', égal à 0 sinon.
  #PB_Compiler_InlineAssembly: Egal à 1 si l'exécutable est compilé avec l'option 'Activer l'assembleur en ligne', égal à 0 sinon.
  #PB_Compiler_EnableExplicit: Egal à 1 si l'exécutable est compilé en mode 'explicit', égal à 0 sinon.
  #PB_Compiler_IsMainFile    : Egal à 1 si l'exécutable en cours de compilation est le fichier principal, égal à 0 sinon.
  #PB_Compiler_IsIncludeFile : Egal à 1 si l'exécutable en cours de compilation a été inclus par un autre fichier, égal à 0 sinon.


Les fonctions du compilateur

Syntax
Taille = SizeOf(Type)
Description
La commande SizeOf permet de renvoyer la taille en octets que prendra une structure complexe (ne fonctionne pas avec les types de base tels que les 'long', les 'word' etc.), une interface ou même une variable. C'est très utile dans de nombreux cas, notamment lors de l'utilisation des commandes API.

Note : Dans le mode unicode un caractère occupe 2 octets. Dans le mode ASCII un caractère occupe 1 octet. Sizeof(Character) permet de renvoyer la taille en octets que prend un caractère selon le mode activé.

Exemple

  Structure Personne
    Nom.s
    Prenom.s
    Age.w
  EndStructure

  Debug "La taille d'une personne est "+Str(Sizeof(Personne))+" octets" ; Affichera 10 (4+4+2)

  Jean.Personne\Nom = "Jean"

  Debug SizeOf(Jean) ; Affichera 10 aussi
Note: Si une variable et une structure ont le même nom, la structure aura la priorité sur la variable.

Syntax
Index = OffsetOf(Structure\Champ)
Index = OffsetOf(Interface\Fonction())
Description
La commande OffsetOf permet de déterminer l'index d'un champ dans le cas d'une structure ou l'index d'une fonction dans le cas d'une interface (qui sera sa position en mémoire soit IndexDeLaFunction*SizeOf(Integer)).

Exemple

  Structure Personne
    Nom.s
    Prenom.s
    Age.w
  EndStructure

  Debug OffsetOf(Personne\Age) ; Affichera 8 car une 'string' occupe 4 octets en mémoire
                               ;(16 avec un compilateur 64 bits, car une 'string' occupe 8 octets en mémoire)

  Interface ITest
    Creer()
    Detruire(Options)
  EndInterface

  Debug OffsetOf(ITest\Detruire()) ; Affichera 4

Syntax
Type = TypeOf(Objet)
Description
TypeOf peut être utilisé pour déterminer le type d'une variable, ou d'un champ d'une structure.
Le type peut être une des valeurs suivantes:
  #PB_Byte
  #PB_Word
  #PB_Long
  #PB_String
  #PB_Structure
  #PB_Float
  #PB_Character
  #PB_Double
  #PB_Quad
  #PB_LinkedList
  #PB_Array
  #PB_Integer
  #PB_Map
  #PB_Ascii
  #PB_Unicode

Exemple

  Structure Personne
    Nom.s
    Prenom.s
    Age.w
  EndStructure

  If TypeOf(Personne\Age) = #PB_Word
    Debug "Age est un 'Word'"
  EndIf

  Surface.f
  If TypeOf(Surface) = #PB_Float
    Debug "Surface est un 'Float'"
  EndIf

Syntax
Resultat = Subsystem(<expression texte constante>)
Description
Subsystem permet de savoir si un sous-système est utilisé pour le programme en cours de compilation. Le nom de sous-système n'est pas sensible à la casse.

Exemple

  CompilerIf Subsystem("OpenGL")
    Debug "Compilation avec le sous-système OpenGL"
  CompilerEndIf

Syntax
Resultat = Defined(Nom, Type)
Description
Defined détermine si un objet tel qu'une structure, interface, variables etc. est déjà défini dans le programme. Le paramètre 'Nom' doit être spécifié sans aucune forme de décoration (sans le '#' pour une constante, sans les '()' pour un tableau, une liste chaînée, une map ou une procédure).

Le paramètre 'Type' peut être une des valeurs suivantes:
  #PB_Constant
  #PB_Variable
  #PB_Array
  #PB_LinkedList
  #PB_Map
  #PB_Structure
  #PB_Interface
  #PB_Procedure
  #PB_Function
  #PB_OSFunction
  #PB_Label

Exemple

  #PureConstante = 10

  CompilerIf Defined(PureConstante, #PB_Constant)
    Debug "La constante 'PureConstante' est déjà déclarée"
  CompilerEndIf

  Test = 25

  CompilerIf Defined(Test, #PB_Variable)
    Debug "La variable 'Test' est déjà déclarée"
  CompilerEndIf

Syntax
InitializeStructure(*Pointeur, Structure)
Description
InitializeStructure initialise la zone mémoire structurée. C'est particulièrement utile quand la structure contient des tableaux dynamiques, des listes ou des maps qui doivent être allouées en interne par PureBasic. 'Structure' est le nom de la structure qui sera utilisée pour effectuer l'initialisation. Il n'y a pas de contrôle pour s'assurer que la zone mémoire est bien du type 'Structure' spécifié, donc il est impératif de manipuler cette commande avec précaution.

Exemple

  Structure Personne
    Prenom$
    Age.l
    List Amis.s()
  EndStructure

  *Etudiant.Personne = AllocateMemory(SizeOf(Personne))
  InitializeStructure(*Etudiant, Personne)

  ; Maintenant, la liste est prête à l'emploi
  ;
  AddElement(*Etudiant\Amis())
  *Etudiant\Amis() = "John"

  AddElement(*Etudiant\Amis())
  *Etudiant\Amis() = "Yann"

  ; Affichage du contenu de la liste
  ;
  ForEach *Etudiant\Amis()
    Debug *Etudiant\Amis()
  Next

Syntax
CopyStructure(*Source, *Destination, Structure)
Description
CopyStructure copie une zone de mémoire structurée vers une autre. C'est particulièrement utile lors de l'utilisation de mémoire dynamique avec les pointeurs. Chaque champ de la structure sera dupliqué, y compris les tableaux dynamiques, les listes et les maps. La structure de destination sera automatiquement effacée avant de faire la copie, il n'est pas nécessaire d'appeler ClearStructure avant CopyStructure. Il n'y a pas de contrôle pour s'assurer que les deux zones mémoires sont bien du type 'Structure', donc il est impératif de manipuler cette commande avec précaution.

Exemple

  Structure Personne
    Prenom$
    Nom$
    Map Amis$()
    Age.l
  EndStructure

  Etudiant.Personne\Prenom$ = "Paul"
  Etudiant\Nom$ = "Morito"
  Etudiant\Amis$("Tom") = "Jones"
  Etudiant\Amis$("Jim") = "Doe"

  CopyStructure(@Etudiant, @EtudiantCopy.Personne, Personne)

  Debug EtudiantCopy\Prenom$
  Debug EtudiantCopy\Nom$
  Debug EtudiantCopy\Amis$("Tom")
  Debug EtudiantCopy\Amis$("Jim")

Syntax
Resultat = ClearStructure(*Pointeur, Structure)
Description
ClearStructure vide la zone mémoire structurée et met la valeur de tous les champs à zéro. C'est particulièrement utile quand la structure contient des chaînes de caractères qui ont été allouées en interne par PureBasic. 'Structure' est le nom de la structure qui sera utilisée pour effectuer le nettoyage. Il n'y a pas de contrôle pour s'assurer que la zone mémoire est bien du type 'Structure' spécifié, donc il est impératif de manipuler cette commande avec précaution.

Exemple

  Structure Personne
    Prenom$
    Nom$
    Age.l
  EndStructure

  Etudiant.Personne\Prenom$ = "Paul"
  Etudiant\Nom$ = "Morito"
  Etudiant\Age = 10

  ClearStructure(@Etudiant, Personne)

  ; Affichera des chaines vide, car la structure entiere a ete videe. Tous les autres champs ont ete remis a zero
  ;
  Debug Etudiant\Prenom$
  Debug Etudiant\Nom$
  Debug Etudiant\Age

Syntax
Bool(<expression booléenne>)
Description
Bool peut être utilisé pour évaluer une expression booléenne en dehors des opérateurs conditionnels réguliers comme If, While, Until, etc.

Si l'expression booléenne est vraie, elle renverra #True, sinon elle renverra #False.

Exemple

  Salut$ = "Salut"
  LeMonde$ = "Le Monde"

  Debug Bool(Salut$ = "Salut")  ; Affichera 1
  Debug Bool(Salut$ <> "Salut" Or LeMonde$ = "Le Monde") ; Affichera 1


Data

Introduction

PureBasic autorise l'utilisation de données pour stocker des blocs d'informations prédéfinies dans votre programme. Ceci est utile pour disposer de valeurs par défaut (messages textuels par exemple) ou dans un jeu pour définir le cheminement prédéfini d'un sprite.

DataSection doit être placé en tête du bloc de données. Tous les labels et composants data sont stockés dans cette partie data dont l'accès est plus rapide que la zone de code. Data est utilisé pour entrer des données. EndDataSection doit être spécifié si du code à exécuter est situé après. Il est intéressant de pouvoir placer plusieurs zones de données à différents endroits du code source. Les données peuvent être chargées à l'aide des commandes Restore et Read.

Syntax
DataSection
Description
Débute une zone de données.

Syntax
EndDataSection
Description
Termine une zone de données.

Syntax
Data.NomType
Description
Définit les données. Le type peut être choisi parmi les types natifs (integer, long, word, byte, ascii, unicode, float, double, quad, character, string). Un nombre quelconque de données peut être placé sur une même ligne, chacune étant séparée par une virgule.

Exemple

  Data.l 100, 200, -250, -452, 145
  Data.s "Bonjour", "Qu'est", "ce que ", "c'est ?"
Pour les programmeurs chevronnés: il est aussi possible de mettre l'adresse d'une procédure ou d'un label avec Data si le type 'entier' (integer .i) est utilisé. Sur un système 32 bits les adresses seront stockées sur 4 octets et sur 8 octets sur un système 64 bits.
Par exemple, des tables de fonctions virtuelles peuvent être créées facilement.

Exemple

  Procedure Max(Nombre, Nombre2)
  EndProcedure

  Etiquette:

  DataSection
    Data.i ?Etiquette, @Max()
  EndDataSection

Exemple

  Interface MonObjet
     FaireCeci()
     FaireCela()
  EndInterface

  Procedure Ceci(*Self)
     MessageRequester("MonObjet", "Ceci")
  EndProcedure

  Procedure Cela(*Self)
     MessageRequester("MonObjet", "Cela")
  EndProcedure

  m.MonObjet = ?VTable

  m\FaireCeci()
  m\FaireCela()

  DataSection
     VTable:
        Data.i ?Procedures
     Procedures:
        Data.i @Ceci(), @Cela()
  EndDataSection

Syntax
Restore label
Description
Ce mot clef permet de placer un indicateur de début de zone pour la commande Read. Le label utilisé par cette commande doit être déclaré dans le bloc DataSection, car il sera déplacé lors de la création de l'exécutable.

Exemple

  Restore DonneesTexte
  Read.s MonPremierTexte$
  Read.s MonSecondTexte$

  Restore DonneesNumeriques
  Read.l a
  Read.l b

  Debug MonPremierTexte$
  Debug a

  End

  DataSection

    DonneesNumeriques:
      Data.l 100, 200, -250, -452, 145

    DonneesTexte:
      Data.s "Bonjour", "Qu'est-ce", "que ", "c'est ?"
  EndDataSection

Syntax
  Read[.<type>] <variable>
Description
Lit la donnée suivante. Le pointeur peut être modifié en utilisant la commande Restore. Par défaut, la donnée suivante est la première donnée déclarée.


Commandes de débogage

Introduction

La description complète des fonctionnalités du débogueur se trouve dans les chapitres Utilisation du débogueur et Utiliser les outils de déboguage.

Une bibliothèque Debugger est également disponible pour controler le comportement du débogueur à partir du code source.

Syntax
CallDebugger
Description
Appel du "débogueur" et arrêt immédiat du programme au point courant du code.

Syntax
Debug <expression> [, NiveauDebug]
Description
Affiche la fenêtre DebugOutput et le résultat correspondant. L'expression peut être toute expression valide en PureBasic, de forme numérique ou chaine. Un point important est que toute commande Debug et les expressions associées sont totalement ignorées (non compilées) si le débogueur est désactivé. Cela singifie qu'il n'est pas nécessaire de passer les instruction Debug en commentaires lors de la création de l'exécutable final tout en ayant la possibilité de tracer facilement l'exécution du programme pour le développeur.

'NiveauDebug' est le niveau de priorité des messages du débogueur. Tous les messages (avec un niveau non spécifié) sont affichés automatiquement. Lorsqu'un niveau est spécifié alors le message correspondant ne sera affiché que si le niveau de debug courant est égal ou supérieur au niveau associé au message. Cela permet de réaliser une traçabilité hiérarchisée en affichant des informations de plus en plus précises en fonction de la valeur 'NiveauDebug' utilisée.

Syntax
DebugLevel <expression constante >
Description
Fixe le niveau courant pour les messages 'Debug'.

Note: Le niveau est fixé au moment de la compilation, ce qui signifie que vous devez mettre la commande DebugLevel avant les commandes debug pour être sûr qu'elles seront bien toutes affectées.

Syntax
DisableDebugger
Description
Interromps l'utilisation du débogueur sur les lignes du code qui suivent cette commande.

Syntax
EnableDebugger
Description
Active l'utilisation du débogueur sur les lignes de code qui suivent cette commande (lorsque le débogueur a été préalablement interrompu par la commande DisableDebugger).


Define

Syntax
Define.<type> [<variable> [= <expression>], <variable> [= <expression>], ...]
Description
Si aucune <variable> n'est spécifiée, Define est utilisé pour changer le type par défaut des variables qui seront ensuite utilisées sans déclaration (y compris les paramètres des procedures et les paramètres des méthodes dans les interfaces ainsi que les données lues avec le mot clé Read.
Le type par défaut initial est le type integer (.i). Chaque variable peut avoir une valeur assignée par défaut.

Define peut également être utilisé avec les tableaux, les listes chaînées (linkedlists) et les maps.

Exemple

  d = e + f
  Define.w
  a = b + c
Les variables d, e et f sont créées avec le type integer, puisqu'il n'y a pas eu de type spécifié. Les variables a, b et c sont des mots signés (.w) car aucun type ne leur est spécifié, le type par défaut ayant été passé à .w.

Si des variables sont précisées avec la commande Define le type par défaut n'est pas changé seules les variables nommées utilisant le type indiqué.

Exemple

  Define.b a, b = 10, c = b*2, d
a,b,c,d sont de type octet (.b)

Syntax
Define <variable>.<type> [= <expression>] [, <variable>.<type> [= <expression>], ...]
Description
Autre possibilité pour la déclaration des variables avec Define.

Exemple

  Define MonChar.c ; Caractère
  Define MonLong.l ; Double Mots
  Define MonWord.w ; Mot

  Debug SizeOf(MonChar)   ; Affichera 1 en mode ASCII, et 2 en mode unicode
  Debug SizeOf(MonLong)   ; Affichera 4
  Debug SizeOf(MonWord)   ; Affichera 2


Dim

Syntax
Dim nom.<type>(<expression>, [<expression>], ...)
Description
Dim est utilisé pour dimensionner un nouveau tableau.

Un tableau peut être composé d'éléments de type basique connu sous PureBasic, incluant les structures et les types définis par l'utilisateur.
Attention : Les éléments d'un tableau doivent tous être de même type.
Une fois le tableau créé il peut être redimensionné mais son contenu sera alors effacé, sauf si ReDim est utilisé.

Les tableaux sont alloués dynamiquement ce qui signifie que le dimensionnement peut se faire à partir d'une variable ou d'une expression.

Les tableaux sont toujours locaux par défaut, donc pour accéder à partir d'une procedure à un tableau défini dans le code source principal du programme, l'utilisation de Global ou Shared est requise. Il est également possible de passer un tableau en paramètre d'une procédure à l'aide du mot clef Array. Il sera passé "par référence" (ce qui signifie que le tableau ne sera pas copié, et les fonctions dans la procédure manipulerons le tableau original).

Pour consulter toutes les commandes relatives aux tableaux comme la copie, la destruction ou l'obtention de la taille d'un tableau, voir la bibliothèque Array.

Pour effacer le contenu complet d'un tableau et libérer la mémoire qu'il occupe, appelez Dim avec 0 élément.

Utilisez la commande Swap pour permuter le contenu de tableaux rapidement.

Note: La vérification des accès à un tableau est effectuée uniquement quand le débogueur est activé.

Exemple

  Dim MonTableau.l(41)
  MonTableau(0) = 1
  MonTableau(1) = 2

Exemple: Tableau à dimensions multiples

  Dim TableauMultiple.b(NbColonnes, NbLignes)
  TableauMultiple(10, 20) = 10
  TableauMultiple(20, 30) = 20

Exemple: Tableau en paramètre d'une procédure

  Procedure fill(Array A.l(1), longueur)  ; Le 1 représente le nombre de dimensions du tableau
    For i = 0 To longueur
      A(i) = i
    Next i
  EndProcedure

  Dim A.l(10)
  fill(A(), 10)  ; Le tableau A() est passé en paramètre

  Debug A(5)
  Debug A(10)

Syntax
ReDim nom.<type>(<expression>, [<expression>], ...)
Description
ReDim permet de redimensionner un tableau déjà déclaré tout en préservant son contenu. La nouvelle taille peut être plus grande ou plus petite, mais le nombre de dimensions ne peut pas être modifié.

Si ReDim est utilisé sur un tableau à plusieurs dimensions, seule la dernière dimension peut être changée.

Exemple

  Dim MonTableau.l(1) ; nous avons 2 éléments
  MonTableau(0) = 1
  MonTableau(1) = 2

  ReDim MonTableau(4) ; Maintenant nous avons 5 éléments
  MonTableau(2) = 3

  For k = 0 To 2
    Debug MonTableau(k)
  Next


Construire une DLL

Introduction

PureBasic permet de créer des DLL Microsoft Windows (DLL : Dynamic Linked Library), des objets partagés (.so) sous Linux, et des bibliothèques dynamiques (.dylib) sous MacOS X. Le code d'une DLL est de même nature que le code PureBasic excepté qu'aucun code ne peut exister en dehors d'une procédure. Lors de l'écriture d'une DLL, tout le code est intégré dans des procédures. Lorsqu'une procédure doit être publique (accessible par un programme tiers qui doit accéder à la DLL), le mot clef ProcedureDLL est utilisé au lieu de Procedure. C'est la seule différence pour écrire un programme.

Lorsque le codage est ainsi fait, il suffit de sélectionner 'Shared DLL' comme format de sortie (fenêtre 'Compiler Option' dans l'éditeur PureBasic ou commutateur /DLL dans la ligne de commande) et de créer un exécutable.

Exemple

  ProcedureDLL MaFonction()
    MessageRequester("Bonjour", "Voici une DLL PureBasic !", 0)
  EndProcedure

  ; Voici le programme client qui utilise la DLL
  ;
  If OpenLibrary(0, "PureBasic.dll")
    CallFunction(0, "MaFonction")
    CloseLibrary(0)
  EndIf
Pour les programmeurs avancés, il existe 4 procédures spéciales qui sont appelées par Windows lorsque l'un des évènements suivants survient:
- une DLL est attachée à un nouveau process
- une DLL est détachée d'un process
- une DLL est attachée à un nouveau thread
- une DLL est détachée d'un thread

Pour gérer cela, il est possible de déclarer 4 procédures spéciales nommées: AttachProcess(Instance), DetachProcess(Instance), AttachThread(Instance) et DetachThread(Instance). Cela signifie que ces 4 noms sont réservés et ne peuvent être utilisés par le programmeur pour d'autres usages.

Notes à propos de la création des DLL's:

- La déclaration des tableaux, des listes chaînées ou des maps doivent toujours être faite dans la procédure 'AttachProcess()'.
- Ne pas écrire de code en dehors des procédures. La seule exception est pour la déclaration des variables ou des structures.
- Les routines d'initialisation DirectX ne doivent pas être dans la procédure 'AttachProcess()'.

A propos de retour de string dans une DLL's:

Pour qu'une fonction puisse renvoyer un string, il doit être déclaré en global.

Exemple

  Global ReturnString$

  ProcedureDLL.s MaFonction(var.s)
    ReturnString$ = var + " test"
    ProcedureReturn ReturnString$
  EndProcedure
Si le string n'est pas déclaré en global, il sera local à la procédure, et donc libéré lors de la fin de la procédure. Il ne pourra pas être utilisé par le programme appelant la fonction.

Quand CallFunction() est utilisé sur une fonction de DLL qui renvoie un pointeur vers une chaîne de caractères, il pourra être lu avec Link "memory/peeks" "PeekS()".

Exemple

  String.s = PeekS(CallFunction(0, "NomFonction", Parametre1, Parametre2))
Vous trouverez ci dessous un exemple complet:

Exemple

DLLSample.pb


Enumérations

Syntax
Enumeration [<constante> [Step <constante>]]
  #Constant1
  #Constant2 [= <constante>]
  #Constant3
  ...
EndEnumeration
Description
Les énumérations sont très pratiques pour déclarer rapidement une série de constantes sans s'occuper de leur valeur numérique. La première constante de l'énumération prendra la valeur 0, la constante suivante prendra la valeur 1 etc. Il est possible de changer la valeur de départ de l'énumération et d'ajuster la valeur utilisée pour l'incrémentation de chaque constante. Si nécessaire, il est possible d'affecter directement une valeur numérique à une constante (grâce à l'opérateur '=') et les constantes suivantes utiliseront cette nouvelle valeur comme valeur de base. Comme les énumerations n'acceptent que les nombres entiers, les nombres flottants seront arroundis à l'entier le plus proche.

La constante réservée #PB_Compiler_EnumerationValue stocke la prochaine valeur qui sera utilisée par l'énumération. Cela peut être utile pour chaîner plusieurs énumérations.

Exemple: Enumération simple

  Enumeration
    #GadgetInfo ; Sera 0
    #GadgetText ; Sera 1
    #GadgetOK   ; Sera 2
  EndEnumeration

Exemple: Enumération avec un pas déterminé

  Enumeration 20 Step 3
    #GadgetInfo ; Sera 20
    #GadgetText ; Sera 23
    #GadgetOK   ; Sera 26
  EndEnumeration

Exemple: Enumération avec un changement dynamique

  Enumeration
    #GadgetInfo      ; Sera 0
    #GadgetText = 15 ; Sera 15
    #GadgetOK        ; Sera 16
  EndEnumeration

Exemple: Enumérations chainées

  Enumeration
    #GadgetInfo ; Sera 0
    #GadgetText ; Sera 1
    #GadgetOK   ; Sera 2
  EndEnumeration

  Enumeration #PB_Compiler_EnumerationValue
    #GadgetCancel ; Sera 3
    #GadgetImage  ; Sera 4
    #GadgetSound  ; Sera 5
  EndEnumeration


For : Next

Syntax
For <variable> = <expression1> To <expression2> [Step <constante>]
  ...
Next [<variable>]
Description
La fonction For : Next est utilisée pour produire une boucle dans le programme, avec les paramètres définis. A chaque cycle, <variable> est incrémentée de 1 (ou d'une valeur correspondant au pas indiqué dans Step <constante>). Le première valeur de <variable> est <expression1>. La boucle est interrompue dès que la valeur de <variable> est supérieure la valeur de <expression2>.

La commande Break permet de quitter à n'importe quel moment une ou plusieurs boucles. la commande Continue permet de passer directement à la prochaine itération de la boucle.

La boucle For : Next fonctionne uniquement avec des valeurs entières, aussi bien pour les expressions que pour la constante Step. La constante Step peut aussi être négative.

Exemple

  For k = 0 To 10
    Debug k
  Next
Dans cet exemple, le programme bouclera 11 fois (de 0 à 10) et sortira.

Exemple

  For k = 10 To 1 Step -1
    Debug k
  Next
Dans cet exemple, le programme bouclera 10 fois (de 10 à 1) et sortira.

Exemple

  a = 2
  b = 3
  For k = a+2 To b+7 Step 2
    Debug k
  Next k
Ici, le programme bouclera 4 fois avant de sortir (k est augmentée de 2 à chaque cycle et prend donc successivement les valeurs 4, 6, 8 et 10=. La lettre k après le mot clef Next indique que ce Next ferme la boucle "For k". Si un autre nom de variable est utilisé, le compilateur génèrera une erreur. Cela est utile pour la lisibilité d'un code comprenant des boucles imbriquées.

Exemple

  For x=0 To 319
    For y=0 To 199
      Plot(x,y)
    Next y
  Next x
Note: Gardez à l'esprit que la valeur de <expression2> peut également être changée dans la boucle For : Next, ce qui peut engendrer une boucle sans fin si la valeur n'est pas correcte.


ForEach : Next

Syntax
ForEach LinkedList() Ou Map()
  ...
Next [LinkedList() Ou Map()]
Description
ForEach énumère tous les élèments d'une liste chaînée ou d'une map. Si la liste ou la map est vide, ForEach : Next quitte immédiatement, sans entrer dans la boucle.

Lors du l'utilisation en conjonction avec une liste: comme la boucle se termine seulement lorsque le dernier élément de la liste est atteint (en terme de position), il est tout à fait possible de supprimer ou d' ajouter des éléments durant un cycle de boucle. De même il est permis de changer l'élément courant avec ChangeCurrentElement(). Après l'un de ces changements, le prochain cycle de boucle continue avec l'élément qui suit l'élément courant.

Il est possible de quitter une boucle ForEach : Next à tout moment à l'aide de la commande Break. La commande Continue permet de passer directement à l'itération suivante, sans exécuter la fin du code contenu dans la boucle.

Exemple: Liste chaînée

  NewList Nombre()

  AddElement(Nombre())
  Nombre() = 10

  AddElement(Nombre())
  Nombre() = 20

  AddElement(Nombre())
  Nombre() = 30

  ForEach Nombre()
    Debug Nombre() ; Affichera 10, 20 et 30
  Next

Exemple: Map

  NewMap Pays.s()

  Pays("US") = "United States"
  Pays("FR") = "France"
  Pays("DE") = "Allemagne"

  ForEach Pays()
    Debug Pays()
  Next


Formules mathématiques (géométrie 2D)

Introduction

Ci-dessous vous trouverez un ensemble de diverses formules mathématiques. Données pour référence, elles seront également utiles, pour combler vos éventuelles lacunes. Car sans une bonne connaissance des mathématiques, les jeux et les applications avancées ne peuvent pas être réalisés. .

Note: A la place du symbole '^' Utilisez plutôt la commande PureBasic Pow() de la bibliothèque 'Math'. 'PI' réfère à la valeur constante "PI = 3.1415...". Un exemple pour réaliser une telle formule en langage PureBasic : A = PI*r^2 devient A = PI*Pow(r,2)

Carré

l = Longueur du côté
e = Diagonale (mesure)
A = Surface
U = Périmètre

Surface : A = l^2

Périmètre : U = 4*l

Diagonale (mesure) : e = SQR(2)*l

Exemple

  ; Longueur d'un côté du carré
  Longueur = 35

  ; Racine de 2
  #RacineDeDeux = 1.414213538

  ; Surface
  Surface = Pow(Longueur, 2) ; ou encore Longueur * Longueur (c'est plus rapide)

  ; Périmètre
  Perimetre = 4 * Longueur

  ; Longueur de la Diagonale
  Diagonale = Sqr(2) * Longueur ; Pour accélérer le calcul il est possible de remplacer Sqr(2) par #RacineDeDeux

  ;Affiche le résultat
  Debug "Longueur d'un côté du carré = " + Str(Longueur) + " m"
  Debug "Diagonale du carré = " + Str(Diagonale) + " m"
  Debug "Surface du carré = " + Str(Surface) + " m²"
  Debug "Périmètre du carré = " + Str(Perimetre) + " m"

Rhombe/Losange

l = Longueur du côté
b = Largeur
A = Surface
U = Périmètre

Surface : A = l*b

Périmètre : U = 4*l

Exemple

  ; Longueur
  Longueur = 35

  ; largeur
  Largeur = 23

  ; Surface
  Surface = Longueur * Largeur

  ; Périmètre
  Perimetre = 4 * Longueur

  ;Affiche le résultat
  Debug "Longueur = " + Str(Longueur) + " m"
  Debug "Largueur = " + Str(Largeur) + " m"
  Debug "Surface du losange = " + Str(Surface) + " m²"
  Debug "Périmètre du losange = " + Str(Perimetre) + " m"

Rectangle

l = Longueur
b = Largeur
e = Diagonale (mesure)
A = Surface
U = Périmètre

Surface : A = l*b

Périmètre : U = 2*l+2*b

Diagonale (mesure) : e = SQR(l^2+b^2))

Exemple

  ; Longueur
  Longueur = 35

  ; largeur
  Largeur = 23

  ; Diagonale
  Diagonale = Sqr(Longueur * Longueur + Largeur * Largeur)
  ; Surface
  Surface = Longueur * Largeur

  ; Périmètre
  Perimetre = 2 * Longueur + 2 * Largeur

  ;Affiche le résultat
  Debug "Longueur = " + Str(Longueur) + " m"
  Debug "Largueur = " + Str(Largeur) + " m"
  Debug "Diagonale du rectangle = " + Str(Diagonale) + " m"
  Debug "Surface du rectangle = " + Str(Surface) + " m²"
  Debug "Périmètre du rectangle = " + Str(Perimetre) + " m"

Rhomboïde/Parallélogramme

l = Longueur
h = Hauteur
b = Largeur
A = Surface
U = Périmètre

Surface : A = l*h

Périmètre : U = 2*l+2*b

Trapèze

a = Côté 1
b = Côté 2
c = Côté 3
d = Côté 4
lm = Longueur médiane
h = Hauteur
A = Surface
U = Périmètre

Surface : A = (a+c)/2*h

Périmètre : U = a+b+c+d

Longueur médiane : lm = (a+c)/2

Triangle

a = Côté 1
b = Côté 2
c = Côté 3
l = Longueur de la base
h = Hauteur
A = Surface
U = Périmètre

Surface :
A = (l*h)/2
A = 1/4*SQR(U*(U-2*a)*(U-2*b)*(U-2*c))

Périmètre : U = a+b+c

Polygone

l = Longueur du côté
d = Diamètre du cercle inscrit
D = Diamètre du cercle circonscrit
n = Nombre de côtés
alpha = Angle au centre
beta = Angle au sommet
A = Surface
U = Périmètre

Diamètre du cercle inscrit : d = SQR(D*D-l*l)

Diamètre du cercle circonscrit : D = SQR(d*d+l*l)

Longueur du côté : l = D*SIN(180/n)

Angle au centre : alpha = 360/n

Angle au sommet : beta = 180-alpha

Surface : A = n*l*d/4

Périmètre : U = l*n

Cercle

r = Rayon
D = Diamètre
A = Surface
U = Périmètre
Surface :
A = PI*r^2
A = PI/4*d^2

Périmètre :
U = 2*PI*r
U = PI*d

Arc de cercle

r = Rayon
D = Diamètre
l = Longueur de la corde
lb = Longueur de l'arc
alpha = Angle au centre
A = Surface
U = Périmètre

Longueur de la corde : l = 2*r*SIN(alpha/2)

Longueur de l'arc : lb = PI*r*alpha/180

Surface :
A = PI*D^2*alpha/1440
A = lb*r/2

Périmètre : U = lb+D

Section de cercle

r = Rayon
D = Diamètre
l = Longueur de la corde
lb = Longueur de l'arc
alpha = Angle au centre
b = Largeur
A = Surface
U = Périmètre

Longueur de la corde :
l = 2*r*SIN(alpha/2)
l = 2*SQR(b*(2*r-b))

Longeur de l'arc : lb = PI*r*alpha/180

Largeur :
b = l/2*TAN(alpha/4)
b = r-SQR(r^2-l^2/4)

Rayon : r = b/2+l^2/(8*b)

Surface :
A = PI*d^2*alpha/1440-(l*(r-b))/2
A = (lb*r-l*(r-b))/2

Périmètre : U = lb+l

Anneau

d = Diamètre interne
D = Diamètre externe
dm = Diamètre intermédiaire
b = Largeur
A = Surface

Diamètre intermédiaire : dm = (D+d)/2

Surface :
A = PI*dm*b
A = PI/4*(D^2-d^2)

Consommation mémoire d'une image

a = Largeur de l'image (en Pixel)
b = Hauteur de l'image (en Pixel)
bits = Profondeur de couleurs de l'image (en Bits)

taille = a * b * (bits / 8)

Distance entre deux points

(x1|y1) = coordonnées XY du point n°1
(x2|y2) = coordonnées XY du point n°2
a = Distance entre les points

a = SQR((x1-x2)^2 + (y1-y2)^2)

"Mélange" de deux valeurs

a = 1er Nombre
b = 2ème Nombre
v = Rapport (0% - 100%)
e = Résultat

e = ((a*v)/100) + ((b*(100-v)) / 100)


Règles de syntaxe générales

PureBasic a défini des règles qui ne changent jamais. Elles sont:

> Commentaires

Les commentaires sont signalés par ';' . Tout le texte situé après le caractère ';' est ignoré par le compilateur jusqu'à la fin de la ligne.

Exemple

  If a = 10 ; Ceci est un commentaire pour indiquer quelque chose.

> Mots clé (Keywords)

Tous les mots clés sont utilisés pour des choses générales à l'intérieur de PureBasic, comme la création de tableaux (Dim) ou des listes (NewList), ou le contrôle du déroulement du programme (If : Else : EndIf). Ils ne sont pas suivis par les parenthèses '()', qui sont généralement utilisées par PureBasic pour les fonctions.

Exemple

    If a = 1      ; If, Else et EndIf sont des mots clés; contrairement à 'a'
      ...         ; qui est une variable utilisée dans une expression ('a = 1').
    Else
      ...
    EndIf
Les mots clés sont régulièrement décrits dans les chapitres sur le côté gauche de la page d'index du manuel de référence.

> Fonctions

Toutes les fonctions doivent avoir un nom suivi d'un '(' à défaut de quoi elle ne sera pas considérée comme une fonction. Cela est vrai y compris lorsque la fonction ne prend aucun paramètre.

Exemple

  WindowEvent() ; est une fonction.
  WindowEvent   ; est une variable.

> Constantes

Toutes les constantes ont un nom précédé par un #.
Elles ne peuvent être déclarées qu'une fois et garde toujours leur valeur prédéfinie. (Le compilateur remplace tous les noms des constantes avec leur valeur correspondante lors de la compilation de l'exécutable.)

Exemple

  #Hello = 10 ; est une constante.
  Hello  = 10 ; est une variable.

> Labels

Tous les labels (étiquettes) doivent être suivis par un ':'. Les noms de label ne peuvent pas contenir d'opérateurs (+,-,...) ou de caractères spéciaux (é,à,ß,ä,ö,ü,...).
Dans une procédure, l'étiquette sera disponible uniquement dans cette procédure.

Exemple

  Je_suis_un_label:

> Expressions

On appelle expression toute séquence de code qui peut être évaluée. Une expression peut regrouper toute variable, constante ou fonction d'un même type. Lorsque vous utilisez des nombres dans une expression, vous pouvez utiliser le symbole $ en tête pour préciser qu'il s'agit d'une valeur hexadécimale ou un % pour signifier une valeur binaire. Sans l'un ou l'autre de ces deux symboles, la valeur sera toujours considérée comme décimale. Les chaînes de caractères doivent être délimitées par des guillemets.

Exemple

  a = a + 1 + (12 * 3)
  a = a + WindowHeight() + b/2 + #MaConstante

  If a <> 12 + 2
    b + 2 >= c + 3
  EndIf

  a.s = b.s + "ceci est une chaine" + c.s
  a$ = b$ + "ceci est une autre chaine" + c$

  foo = foo + $69 / %1001 ; Utilisation de nombres hexadécimal et binaire

> Regroupement des commandes

Il est possible de placer un nombre quelconque de commandes sur la même ligne en les séparant par :.

Exemple

  If OpenScreen(0,320,200,8,0) : PrintN("Ok") : Else : PrintN("Erreur") : EndIf

> Texte multiligne

Si une ligne de code contient une expression de grande taille, elle peut être divisée en plusieurs lignes. Une ligne découpée doit se terminer avec l'un des opérateurs suivants: plus (+), virgule (,), ou (|), And, Or, Xor.

Exemple

  Texte$ = "Très très très très long texte" + #LF$ +
          "un autre long texte" + #LF$ +
          "et la fin du long texte."

  MessageRequester("Bonjour c'est un titre très long.",
                   "Et un très long message, afin que nous puissions utiliser le multiligne" + #LF$ + Texte$,
                   #PB_MessageRequester_Ok)

> Glossaire

Les mots suivants utilisés dans ce manuel ont toujours le même sens :

<variable> : une variable basic.
<expression> : une expression comme commenté ci-dessus.
<constant> : une constante numérique.
<label> : un label de programme.
<type> : tout type, (standard ou structuré).

> Autres

- Dans ce manuel, tous les sujets sont listés en ordre alphabétique pour réduire tout temps de recherche.

- La valeur retournée par les commandes est le plus souvent un Integer. Dans le cas contraire, le type de la valeur est indiqué dans la description (ligne de syntaxe) de la commande.

- Dans la documentation de PureBasic, les termes "commandes" et "fonctions" ont le même sens, independamment du fait que la fonction retourne une valeur ou non.


Global

Syntax
Global[.<type>] <variable[.<type>]> [= <expression>] [, ...]
Description
Global permet à des variables d'être utilisées globalement, pouvant ainsi être accessibles depuis l'intérieur de n'importe quelle procédure. Une valeur par défaut peut être assignée à la variable. Global peut aussi être utilisé avec les tableaux, les listes chaînées et les maps.

Les instructions Protected et Static permettent de déclarer une variable locale dans une procédure qui a le même nom qu'une variable globale, sans risque de conflit.

Exemple

Exemple: Avec des variables

  Global a.l, b.b, c, d = 20

  Procedure Change()
    Debug a  ; Affiche 10 car la variable 'a' est globale
  EndProcedure

  a = 10
  Change()

Exemple: Avec un tableau

  Global Dim Tableau(2)

  Procedure Change()
    Debug Tableau(0)  ; Affiche 10 car le tableau 'Tableau()' est global
  EndProcedure

  Tableau(0) = 10
  Change()


Gosub : Return

Syntax
Gosub MonLabel

MonLabel:
  ...
Return
Description
Gosub signifie 'Go to sub routine', en français: 'Aller au sous-programme'. Un label doit être spécifié après Gosub pour que l'exécution du programme se poursuive à la position du label et jusqu'à ce qu'un Return soit rencontré. Lorsque le Return est atteint, le programme revient à l'instruction suivant le Gosub. Gosub est pratique pour construire rapidement un code structuré.

Les procédures sont une autre alternative pour la conception rapide d'un programme structuré. Gosub peut être seulement utilisé dans la partie principale du programme, pas dans les procedures.

Exemple

  a = 1
  b = 2
  Gosub OperationComplexe
  Debug a
  End

  OperationComplexe:
    a = b*2+a*3+(a+b)
    a = a+a*a
  Return

Syntax
FakeReturn
Description
Lorsque vous souhaitez sauter d'un sous-programme à une autre partie du code extérieur au sous-programme (en utilisant une commande Goto), vous pouvez utiliser un FakeReturn qui simule un Return sans l'effectuer réellement. Si vous n'utilisez pas ce dispositif, votre programme génèrera une erreur. Cette commande ne devrait pas avoir d'utilité car un programme bien conçu ne devrait pas utiliser de Goto. Toutefois, dans certains cas où la performance est critique, cela peut aider le programmeur.

Exemple

  Gosub SousProgramme1

  SousProgramme1:
    ...
    If a = 10
      FakeReturn
      Goto ProgrammePrincipal
    EndIf
  Return


Numéros et Identifiants (Handles)

Les numéros

Tous les objets crées sont identifiés par un numéro arbitraire (qui n'est pas l'identifiant de l'objet, comme défini ci-dessous). Dans ce manuel, les numéros s'écrivent sous la forme #Numéro (par exemple, chaque gadget créé a un numéro #Gadget).

Les numéros que vous leurs attribuez n'ont pas besoin d'être des constantes, mais ils doivent être uniques pour chaque objet de votre programme (une image peut avoir le même numéro qu'un gadget, parce que ce sont des types d'objets différents). Ces numéros sont utilisés pour accéder ultérieurement à ces objets dans votre programme.

Par exemple, les fonctions de gestion des évènements renvoient des numéros :
  EventGadget()
  EventMenu()
  EventWindow()

Les identifiants

Tous les objets ont également un numéro unique qui leur est attribué par le système. Ces numéros uniques sont appelés identifiants. Parfois, une fonction PureBasic n'a pas besoin du numéro comme paramètre, mais de l'identifiant. Dans ce manuel, ce genre de besoin est indiqué, à l'aide du suffixe ID.

Exemple

  ImageGadget(#Gadget, x, y, Largeur, Hauteur, ImageID [, Options])
  ; #Gadget doit être le numéro que vous voulez attribuer au Gadget
  ; ImageID doit être l'IDentifiant (numéro unique) de l'image.
Pour obtenir l'identifiant d'un objet, il y a des fonctions spéciales telles que :
  FontID()
  GadgetID()
  ImageID()
  ThreadID()
  WindowID()
La plupart des fonctions qui créent ces objets renvoient cet identifiant comme résultat, si tout s'est bien passé. Ceci est seulement le cas si #PB_Any n'a pas été utilisé pour créer l'objet. Si #PB_Any est utilisé, ces fonctions renvoient le numéro de l'objet qui a été attribué par PB pour elles, mais pas l'identifiant.

Exemple

  GadgetHandle = ImageGadget(...)


If : Else : EndIf

Syntax
If <expression>
  ...
[ElseIf <expression>]
  ...
[Else]
  ...
EndIf
Description
La structure If est utilisée pour effectuer des tests et/ou changer le déroulement du programme selon le résultat (vrai ou faux) du test. ElseIf est utilisé pour produire un nombre quelconque de tests additionnels si le premier n'a pas eu un résultat vrai. La commande optionnelle Else est utilisée pour exécuter une séquence de code si tous les tests précédents de la structure ont échoué. Les structures If peuvent être imbriquées sans limite de profondeur.

Exemple

  If a=10
    PrintN("a=10")
  Else
    PrintN("a<>10")
  EndIf

Exemple

  If a=10 And b>=10 Or c=20
    If b=15
      PrintN("b=15")
    Else
      PrintN("Autre possibilité")
    EndIf
  Else
    PrintN("Erreur de test")
  EndIf


Import : EndImport

Syntax
Import "NomFichier"
  NomFonction.<type>(<parametre>, [, <parametre> [= ValeurDefaut]...]) [As "NomSymbole"]
  ...
  NomVariable.<type> [As "NomSymbole"]
EndImport
Description
Pour les programmeurs chevronnés. Import : EndImport permet de déclarer facilement des fonctions et des variables externes à partir d'un fichier bibliothèque (.lib) ou objet (.obj).

Une fois déclarées, les fonctions importées sont directement disponibles dans le programme, comme n'importe quelle autre commande. Le compilateur ne vérifie pas si la fonction existe réellement dans le fichier importé, donc si une erreur survient, elle sera reportée par le linker.

Les fonctions importées remplacent avantageusement les commandes OpenLibrary()/CallFunction(): la vérification du type, le nombre de paramètres sont validés par le compilateur. De plus, contrairement à CallFunction(), une fonction importée peut gérer les types 'double', 'float' et 'quad' sans aucun problème.

Les paramètres en fin de fonction peuvent avoir une valeur par défaut (une expression constante est requise). Les paramètres ayant une valeur par défaut pourront être omis lors de l'appel de la fonction, la valeur par défaut de chaque paramètre manquant sera utilisée.

Par défaut, le symbole de la fonction importée est décoré suivant le schéma suivant: _NomFonction@tailleargument. Cela devrait fonctionner pour la plupart des fonctions qui utilise la convention standard d'appel (stdcall). Par contre, si la bibliothèque est écrite en C, et que les fonctions exportées ne sont pas stdcall, ImportC devra être utilisé à la place de Import. Dans ce cas, par défaut le symbole est préfixé comme ceci: _NomFonction.

Les pseudotypes peuvent être utilisés pour les paramètres, mais pas pour le type de la valeur de retour.

Exemple

  Import "User32.lib"

    ; Pas besoin d'utiliser 'As' car PureBasic préfixe la fonction correctement
    ; Nous définissons également le paramètre 'Options' comme facultatif, avec une valeur par défaut de 0 (quand il est omis)
    ;
    MessageBoxA(Fenetre.l, Corps$, Titre$, Options.l = 0)

    ; Cette fois PureBasic ne peut pas se débrouiller tout seul, car le
    ; nom de la fonction n'est pas le même que celui utilisé par le symbole
    ;
    BoiteDeMessage(Fenetre.l, Corps$, Titre$, Options.l) As "_MessageBoxA@16"

  EndImport

  MessageBoxA(0, "Salut", "le Monde") ; Nous ne précisons pas les options
  BoiteDeMessage(0, "Salut", "le Monde 2", 0)

Exemple: Avec les pseudotypes

  Import "User32.lib"

    ; Nous utilisons le pseudotype 'p-unicode' pour les paramètres chaîne, car
    ; MessageBoxW() est une fonction unicode seulement. Le compilateur va
    ; automatiquement convertir les chaînes en unicode quand nécessaire.
    ;
    MessageBoxW(Fenetre.l, Corps.p-unicode, Titre.p-unicode, Options.l = 0)

  EndImport

  ; Cela fonctionnera correctement en mode ascii et en mode unicode, même si l'API est uniquement
  ; unicode car le compilateur s'occupera lui-même de la conversion.
  ;
  MessageBoxW(0, "Salut", "le Monde")


Les fonctions 'Include'

Syntax
IncludeFile  "NomFichier"
XIncludeFile "NomFichier"
Description
IncludeFile permet d'inclure tout fichier source spécifié à l'endroit où la commande est située. XIncludeFile réalise la même fonction en évitant toutefois d'inclure le même fichier plusieurs fois.

Exemple

  XIncludeFile "Sources\monfichier.pb" ; monfichier sera inséré.
  XIncludeFile "Sources\monfichier.pb" ; monfichier sera ignoré dans tout appel supplémentaire.

Syntax
IncludeBinary "NomFichier"
Description
IncludeBinary inclut le fichier nommé à l'endroit où la commande est placée.

Exemple

  IncludeBinary "Data\map.data"

Syntax
IncludePath "Chemin"
Description
IncludePath spécifie le chemin d'accès par défaut pour tous les fichiers inclus appelés après la commande. Très pratique pour l'inclusion de nombreux fichiers provenant d'un même répertoire.

Exemple

  IncludePath  "Sources\Data"
  IncludeFile  "Sprite.pb"
  XIncludeFile "Music.pb"


L'assembleur en ligne x86

PureBasic permet d'inclure toute commande assembleur x86 (y compris les instructions MMX et FPU) directement dans le code source comme dans un vrai source assembleur. Vous pouvez également utiliser directement les variables ou pointeurs avec les instructions assembleur et pouvez intégrer plusieurs commandes assembleur sur une même ligne. La syntaxe est celle de FAsm (http://flatassembler.net), la lecture du guide FAsm est recommandée si vous souhaitez plus d'informations sur la syntaxe.

Il existe plusieurs façons d'activer l'assembleur en ligne:
- Cochez la case "Activer l'assembleur en ligne" via l'IDE dans les Options du compilateur
- Utilisez le paramètre /INLINEASM en lançant le compilateur Utiliser le compilateur SHELL
- Utilisez les directives du compilateur EnableASM et DisableASM

Règles

Vous devez respecter plusieurs règles précises pour inclure de l'assembleur dans un source Basic:

- Les variables et les pointeurs utilisés doivent être déclarés préalablement à leur utilisation dans un contexte assembleur
- Lorsque vous faites référence à un label vous devez précéder son nom par un 'l_'. Cette règle est due au fait que PureBasic place un 'l_' devant les labels BASIC pour éviter les conflits avec les labels internes. Le label référencé en assembleur doit être en minuscule. Si le label est défini dans une procédure, alors son préfixe est 'l_procedurename_', en minuscules.

Exemple

  MOV ebx,l_monlabel
  ...
  MonLabel:
- Les erreurs dans une section asm ne sont pas reportées par PureBasic mais par FAsm. Vérifiez votre code si une telle erreur survient.
- Les registres volatiles sont: eax, edx et ecx. Tous les autres doivent être préservés.

Quand on utilise l'assembleur dans une procédure, il est utile de connaître les points suivants:
- Pour renvoyer directement la valeur du registre 'eax' comme valeur de retour, il suffit d'utiliser ProcedureReturn, sans paramètre. Le contenu du registre 'eax' restera inchangé et sera utilisé comme valeur de retour.

Exemple

  Procedure.l MyTest()
    MOV eax, 45
    ProcedureReturn  ; La valeur de retour sera 45
  EndProcedure
- Les variables locales en PureBasic sont directement indexées par rapport au registre de la pile (ESP) ce qui implique qu'un changement de la valeur de ce registre par une instruction assembleur (tel que PUSH, POP etc..) la référence vers la variable ne sera plus correcte.

- Il est possible de passer directement une ligne complète à l'assembleur sans aucune modification en utilisant le caractère '!' en début de ligne. Ceci permet d'avoir un accès total aux fonctionnalités de l'assembleur. Pour faciliter l'accès aux variables locales, une notation a été mise en place: 'p.v_NomVariable' pour une variable standard et 'p.p_NomPointeur' pour un pointeur.

Exemple

  Procedure Test(*Pointer, Variable)
    ! MOV dword [p.p_Pointer], 20
    ! MOV dword [p.v_Variable], 30
    Debug *Pointer
    Debug Variable
  EndProcedure

  Test(0, 0)

Exemple

AsmInline.pb


Interfaces

Syntax
Interface <nom> [Extends <nom>]
  <Methode[.<type>]()>
...
EndInterface
Description
Les Interfaces sont utilisées pour accéder facilement aux modules 'Orientés Objets' tels que les bibliothèques COM (Component Object Model) ou DirectX. Ce type de bibliothèques sont de plus en plus courantes sous Windows et les interfaces permettent une exploitation de ces fonctions sans impacts de performances. Les interfaces jettent aussi les bases pour une 'Programmation Orientée Object' (OOP en anglais) avec PureBasic mais de solides connaissances sont nécessaires pour en tirer parti (les interfaces n'ont pas été conçues pour ajouter une couche objet à PureBasic mais plutôt pour accéder facilement à des objets dejà conçus). La plupart des interfaces utilisées sous Windows sont déjà incluses dans les fichiers résidents 'Interfaces.res' et 'InterfaceDX.res', ce qui rend leur utilisation immédiate.

Le paramètre optionnel Extends permet d'étendre une interface sans avoir à dupliquer ses fonctions (ces 'fonctions' sont aussi communément appelées 'méthodes' dans les autres langages objet tels que C++ ou Java). Toutes les fonctions contenues dans l'interface étendue seront disponibles dans la nouvelle interface. C'est utile pour un héritage simple d'objets.

les tableaux (Arrays) peuvent être passés en paramètres à l'aide du mot clé Array, Les listes chaînées (linked-lists) en utilisant le mot clé List et les maps en utilisant le mot clé Map.

Un type de retour peut être défini dans la déclaration de l'interface en ajoutant le type après la méthode.

La commande SizeOf peut être utilisée avec les interfaces pour déterminer la taille d'une interface et la commande OffsetOf peut être utilisée pour déterminer l'index d'une fonction dans une interface.

Les pseudotypes peuvent être utilisés pour les paramètres des fonctions de l'interface, mais pas pour le type de retour.

Note: Les concepts objets sont principalement appropriés pour les développeurs expérimentés et il n'est pas nécessaire de les maîtriser ou même les comprendre pour réaliser des applications ou jeux professionnels.

Exemple: Appel à une fonction objet

  ; Nous allons considérer que vous voulez accéder à une fonction
  ; d'un objet externe en PureBasic. Premièrement, déclarez son interface.
  ;
  Interface MonObjet
    Deplacer(x,y)
    DeplacerF(x.f,y.f)
    Detruire()
  EndInterface

  ; MonCreationObjet est la fonction qui permet la création de l'objet.
  ; Création du premier objet..
  ;
  Objet1.MonObjet = MonCreationObjet()

  ; Et du deuxième.
  ;
  Objet2.MonObjet = MonCreationObjet()

  ; Nous pouvons alors utiliser les fonctions de l'objet directement comme suit:
  ;
  Objet1\Deplacer(10, 20)
  Objet1\Detruire()

  Objet2\DeplacerF(10.5, 20.1)
  Objet2\Detruire()

Exemple: Utilisation de 'Extends'

  ; Définition d'une interface générique 'Cube'
  ;
  Interface Cube
    EnvoyerPosition()
    DefinirPosition(x)
    EnvoyerLargeur()
    DefinirLargeur(Largeur)
  EndInterface

  Interface CubeColorer Extends Cube
    EnvoyerCouleur()
    DefinirCouleur(Couleur)
  EndInterface

  Interface CubeTexturer Extends Cube
    EnvoyerTexture()
    DefinirTexture(TextureID)
  EndInterface

  ; Nous avons maintenant 3 interfaces pour chaque objet:
  ;
  ; - 'Cube' a les fonctions Envoyer/DefinirPosition() et Envoyer/DefinirLargeur()
  ; - 'CubeColorer' a les fonctions Envoyer/DefinirPosition(), Envoyer/DefinirLargeur() et Envoyer/DefinirCouleur()
  ; - 'CubeTexturer' a les fonctions Envoyer/DefinirPosition(),Envoyer/DefinirLargeur() et Envoyer/DefinirTexture()
  ;


Liens internet utiles

Forums PureBasic

Forum officiel [anglais]
Forum allemand
Forum français

Tchat PureBasic

Nom du serveur : irc.freenode.net
          Port : 6667
         Canal : #purebasic [anglais]
         Canal : ##purebasic.de [allemand] (bien mettre les deux #)

Ressources PureBasic

  Site officiel de PureBasic            : Développeur & Editeur International [anglais]
  PureArea.net                          : Archive de codes, Freeware & Shareware en PureBasic & plus [anglais & allemand]
  PureBasic - A Beginner's Guide (free and very good book for PureBasic beginners)
  PureBasic Survival Guide (big tutorial about coding with PureBasic)
  PureBasic Blog (Ce blog contient des informations importantes sur PureBasic) [anglais]
  The Pure Project Network              : Bibliothèques utilisateurs, Exemples de codes & plus [anglais]
  PureVision                            : Editeur visuel d'interfaces [anglais]
  PBDev                                 : Environnement de programmation [anglais]
  Robsite                               : Tutoriels PureBasic [allemand]
  Support de l'API Microsoft Windows    : Interface de Programmation d'Applications [anglais]

Revendeurs PureBasic

Equipe de développement & Editeur International
German Publisher

Jeux écrits avec PureBasic

Restricted Area
Krakout Unlimited 2
Bricklinker
Hostile Skies
Ladies Garden
DEW.Line
Tributoids
Lethal Judgement + les suites 2 & 3
Puckman
PureBasic Showcase

Sites personnels dédiés à PureBasic

Freak's PureBasic Place [anglais]
Horst Schaeffer [anglais]

Vous trouverez d'autres sites dédiés à PureBasic (dont certains en français) en consultant les liens PureArea.net.


Les macros

Syntax
Macro <nom> [(Parametre [, ...])]
  ...
EndMacro
Description
Le système de macro est une fonctionnalité très puissante, principalement utile pour les programmeurs chevronnés. Une macro est un bout de code quelconque (un mot clef, une ligne, plusieurs lignes) qui peut être inséré à n'importe quel endroit dans le code source en indiquant le nom de la macro. En ce sens, une macro est différente d'une procedure, car les procédures ne dupliquent pas leur code à chaque appel.

La déclaration Macro : EndMacro doit être effectuée avant le premier appel à la macro. Comme les macros seront complètement remplacées par le code correspondant au moment de la compilation, elles ne sont pas locales à une procédure.

Une macro ne peut pas avoir un type de retour, ou des paramètres typés, car cela n'a pas de sens. Quand une macro a des paramètres, ils sont remplacés dans le code de la macro par l'expression littérale qui a été passée lors de l'appel. Aucune évaluation n'est faite à ce stade, ce qui est très important à comprendre: l'évaluation de la ligne ne commence uniquement lorsque toutes les macros trouvées sur cette ligne ont été traitées.

Les macros sont divisées en deux catégories: les simples (sans paramètres) et les complexes (avec paramètres, obligation d'utiliser les parenthèses pour les appeler). Quand aucun paramètre n'est spécifié, il est possible de remplacer n'importe quel mot avec un autre mot (ou une autre expression). Les macros peuvent être utilisées de manière récursive, mais si un des paramètres passés contient le caractère de concaténation '#', il ne sera pas géré.

Exemple: Macro simple

  Macro MonNot
    Not
  EndMacro

  a = 0
  If MonNot a   ; Ici la ligne sera remplacée par : 'If Not a'
    Debug "Ok"
  EndIf
En utilisant les paramètres, il est possible de créer des macros très flexibles. Le caractère de concaténation '#' est disponible pour créer des nouveaux mots ou labels en combinant le code de la macro et l'expression passée en paramètre (les espaces ne sont pas acceptées entre chaque mots devant être concaténés). Il est aussi possible de définir des valeurs par défaut pour chaque paramètre, pour qu'ils puissent être omis lors de l'appel de la macro.

Exemple: Macro avec paramètres

  Macro BoiteDeMessageEnMajuscule(Titre, Corps)
    MessageRequester(Titre, UCase(Corps), 0)
  EndMacro

  Texte$ = "le Monde"
  BoiteDeMessageEnMajuscule("Salut", "-"+Texte$+"-") ; Ici la ligne sera remplacée comme ça :
                                                     ; MessageRequester("Salut", UCase("-"+Texte$+"-"), 0)

Exemple: Macro avec paramètre par défaut

  Macro BoiteDeMessageEnMajuscule(Titre, Corps = "Ah, aucun corps spécifié")
    MessageRequester(Titre, UCase(Corps), 0)
  EndMacro

  BoiteDeMessageEnMajuscule("Salut") ; Ici la ligne sera remplacée comme ça :
                                     ; MessageRequester("Salut", UCase("Ah, aucun corps spécifié"), 0)

Exemple: Macro et concaténation

  Macro XCase(Type, Texte) ; renvoie le texte dans la casse du type spécifié
    Type#Case(Texte)        ; Type U => MAJUSCULES
  EndMacro                 ; Type L => minuscules

  Debug XCase(U, "Salut") ; macro remplacée par UCase("Salut")
  Debug XCase(L, "Salut") ; macro remplacée par LCase("Salut")

Exemple: Macro complexe sur plusieurs lignes

  Macro Guillemet
    "
  EndMacro

  Macro Assertion(Expression)
    CompilerIf #PB_Compiler_Debugger  ; active uniquement l'assertion lorsque le débogueur est actif
      If Expression
        Debug "Assertion (Ligne " + #PB_Compiler_Line + ") : " + Guillemet#Expression#Guillemet
      EndIf
    CompilerEndIf
  EndMacro

  Assertion(10 <> 10) ; N'affichera rien
  Assertion(10 <> 15) ; Devrait afficher l'assertion

Syntax
UndefineMacro <nom>
Description
UndefineMacro permet d'annuler une macro définie précédemment, et de la redéfinir d'une manière différente.
Une fois que la macro a été annulée, elle n'est plus disponible.

Exemple: annulation de macro

  Macro Test
    Debug "1"
  EndMacro

  Test ; Appel de la macro

  UndefineMacro Test ; Annule la définition du macro, elle n'existe plus.

  Macro Test ; Maintenant, nous pouvons redéfinir la macro.
    Debug "2"
  EndMacro

  Test ; Appel de la macro

Syntax
MacroExpandedCount
Description
MacroExpandedCount permet d'obtenir le nombre de fois que la macro a été utilisée/appel. Il peut être utile de générer des identifiants uniques dans la même macro pour chaque utilisation (comme un label, le nom de la procédure, etc.)

Exemple: Comptage

  Macro Test
    Debug MacroExpandedCount
  EndMacro

  Test ; Appel de la macro
  Test ; Appel de la macro
  Test ; Appel de la macro


Pointeurs et accès mémoire

Pointeurs

L'utilisation des pointeurs est possible en plaçant une * devant le nom de la variable.
Un pointeur est une variable qui stocke une adresse mémoire et qui est généralement associé à une structure.

Exemple

  *MonEcran.Ecran = OpenScreen(0,320,200,8,0)
  mouseX = *MonEcran\SourisX ; La structure Ecran devant contenir un champ SourisX
Il existe seulement trois méthodes valides pour fixer la valeur d'un pointeur:
- Obtenir le résultat par une fonction (voir l'exemple ci-dessous)
- Copier la valeur d'un autre pointeur
- Trouver l'adresse d'une variable, procédure ou label (voir ci-dessous)

Note : A l'inverse du C/C++, en PureBasic l'* fait partie intégrante du nom de la variable. Aussi ptr et *ptr sont deux variables bien distinctes.
ptr est une variable (régulière) contenant une valeur, *ptr est une autre variable de type pointeur contenant une adresse.

Pointeurs et taille mémoire

Comme un pointeur reçoit uniquement une adresse mémoire comme valeur, sa taille en mémoire sera celle qui permettra de représenter une adresse du processeur :
- Sur un processeur 32-bit, les adresses sont représentées sur 32-bit, par conséquent un pointeur prendra 32-bit en mémoire (soit 4 octets comme une variable de type ‘long').
- Sur les processeurs 64-bit, les adresses sont représentées sur 64-bit, ce qui implique qu'un pointeur prendra 64-bit en mémoire (soit 8 octets comme une variable de type ‘quad').

C'est pour cette raison qu'un pointeur est une variable dite de type pointeur car son encombrement en mémoire sera lié à la capacité d'adressage mémoire du processeur.
Il en découle qu'affecter un type natif à un pointeur (*Pointeur.l, *Pointeur.b…) n'a aucun sens puisque l'encombrement mémoire d'un pointeur est imposé par celui d'une adresse et non par celui d'un type.

Note :
- A chaque fois qu'une adresse mémoire doit être stockée dans une variable, il faudrait le faire par l'intermédiaire d'un pointeur. Ceci garanti que l'adresse sera correctement représentée lors de la compilation du code que ce soit par un processeur 32-bit comme par un processeur 64-bit par exemple.

Pointeurs et structures

Attacher une structure à un pointeur (par exemple *MonPoint.Point) permet d'accéder au contenu mémoire de chaque membre de la structure avec le caractère \ .

Exemple

  Define Point1.Point, Point2.Point
  *PointCourant.Point = @Point1 ; Déclare le pointeur, l'associe a une structure et l'initialise avec l'adresse de Point1
  *PointCourant\x = 10 ; Assigne la valeur 10 à Point1\x
  *PointCourant.Point = @Point2 ; Récupère l'adresse de Point2
  *PointCourant\x = 20 ; Assigne la valeur 20 à Point2\x
  Debug Point1\x
  Debug Point2\x
Les pointeurs permettent donc de se déplacer, de lire et d'écrire facilement en mémoire. De plus ils permettent aux programmeurs d'accéder à de grandes quantités de données sans coût supplémentaire suite à une duplication de ces données. Copier un pointeur est beaucoup plus rapide.

Les pointeurs sont également disponibles dans les structures, pour plus d'informations, consultez le chapitre sur les structures.

Pointeurs et chaînes de caractères

Toutes les variables ont une taille fixe en mémoire (2 octets pour un Word, 4 octets pour un Long, etc) hormis les chaînes de caractères dont la longueur peut changer, ce qui fait qu'elles sont gérées différemment.
Ainsi, les champs d'une structure faisant référence à une chaîne de caractères stockent l'adresse mémoire où réside la chaîne de caractères et non la chaîne elle-même: ce sont des pointeurs vers des chaînes de caractères.

Exemple

  Texte$ = "Bonjour"
  *Texte = @Texte$ ;*Texte a pour valeur l'adresse où réside la chaîne de caractères en mémoire
  *Pointeur.String = @*Texte ; *Pointeur pointe sur *Texte
  Debug *Pointeur\s ; Lit la chaîne de caractères qui réside à l'adresse écrite en *Pointeur (c-a-d @Texte$)
Arithmétiques des pointeurs

Il est possible d'effectuer des opérations arithmétiques sur les pointeurs en s'aidant de la commande SizeOf().

Exemple

  Dim Tableau.Point(1) ; tableau de points

  *Pointeur.Point = @Tableau() ; Récupère l'adresse du tableau
  *Pointeur\x = 10 ; Modifie l'élément 0 du tableau
  *Pointeur\y = 15

  *Pointeur + SizeOf(Point) ; Pointe sur l'élément suivant

  *Pointeur\x = 7 ; Modifie l'élément 1 du tableau
  *Pointeur\y = 9

  ;Affiche le résultat
  For i = 0 To 1
    Debug Tableau(i)\x
    Debug Tableau(i)\y
  Next i

Adresses des variables

Pour trouver l'adresse d'une variable dans votre code, utilisez le symbole @. La raison la plus fréquente d'utiliser ce système est le transfert d'une variable de type structure à une procédure. Il faut passer un pointeur à la procédure car il est impossible de passer directement la structure comme argument.

Exemple

  Structure astruct
    a.w
    b.l
    c.w
  EndStructure

  Procedure SetB(*monpointeur.astruct)
    *monpointeur\b = 69
  EndProcedure

  Define.astruct mavariable
  mavariable\b = 0
  SetB( @mavariable )
  Debug mavariable\b

Adresses des procédures

En principe seuls les programmeurs avancés ont à connaître l'adresse d'une procédure. La raison la plus fréquente est de devoir négocier des échanges de bas niveau avec le système d'exploitation. Certains systèmes autorisent la mise en place de callbacks ou points d'ancrage (hooks) permettant au système d'exploitation de dialoguer avec le programme en étendant ainsi les capacités du système d'exploitation. L'adresse d'une procédure est accessible d'une manière similaire à une variable.

Exemple

  Procedure WindowCB(WindowID.l, Message.l, wParam.l, lParam.l)
    ; C'est ici que le traitement de votre callback sera effectué
  EndProcedure

  ; Un callback spécifique pour Windows permet de traiter les évènements sur les fenêtres
  SetWindowCallback( @WindowCB() )

Adresses des labels

Il peut également être utile de connaître l'adresse d'un label dans votre programme. Cela peut être le cas pour accéder au code ou aux données placées à cet endroit ou toute autre bonne raison qui peut vous venir à l'esprit. Pour trouver l'adresse d'un label dans votre programme, placez un '?' devant le nom du label.

Exemple

  Debug "Taille du fichier de données = " + Str(?endofmydata - ?mydata)

  DataSection
    mydata:
      IncludeBinary "somefile.bin"
    endofmydata:


NewList

Syntax
NewList nom.<type>()
Description
NewList permet de déclarer une nouvelle liste chaînée. Chaque élément de la liste est alloué dynamiquement. Il n'y a pas de limite, ce qui permet d'en créer autant que nécessaire. Une liste peut avoir tout type standard ou structuré valide. Pour connaître toutes les commandes disponibles pour la gestion des listes chaînées, consultez la bibliothèque LinkedList.

Les listes chaînées sont toujours locales par défaut, donc pour accéder à partir d'une procédure à une liste chaînée définie dans le code source principal du programme, l'utilisation de Global ou Shared est requise. Il est également possible de passer une liste chaînée en paramètre d'une procédure à l'aide du mot-clef List.

Utilisez la commande Swap pour permuter rapidement un élément d'une liste chaînée avec une variable, ou un élément d'un tableau ou un élément d'une autre liste chaînée.

Exemple: Liste simple

  NewList MaListe.l()

  AddElement(MaListe())
  MaListe() = 10

  AddElement(MaListe())
  MaListe() = 20

  AddElement(MaListe())
  MaListe() = 30

  ForEach MaListe()
    Debug MaListe()
  Next

Exemple: Liste en paramètre d'une procédure

  NewList Test.l()

  AddElement(Test())
  Test() = 1
  AddElement(Test())
  Test() = 2

  Procedure DebugList(c.l, List ParameterList.l())

    AddElement(ParameterList())
    ParameterList() = 3

    ForEach ParameterList()
      MessageRequester("Liste", Str(ParameterList()))
    Next

  EndProcedure

  DebugList(10, Test())


NewMap

Syntax
NewMap nom.<type>([Slots])
Description
NewMap permet de déclarer une nouvelle map, aussi connue sous le nom de table de hachage ou dictionnaire. Elle permet un accès rapide à un élément basé sur une clef. Chaque clef dans la map est unique, ce qui signifie qu'il n'est pas possible d'avoir deux éléments distincts avec la même clef. Il n'y a pas de limite sur le nombre d'élément que peut contenir une map. Une map peut être déclarée avec n'importe quel type basic ou structuré. Pour consulter toutes les commandes nécessaires à la manipulation des maps, voir la bibliothèque Map.

Quand une nouvelle clef est utilisée lors d'une affectation, un nouvel élément est automatiquement ajouté à la map. Si un autre élément avec la même clef était déjà présent dans la map, il sera remplacé par le nouveau. Une fois qu'un élément a été créé ou accédé, il devient l' élément courant de la map, et les accès à cet élément peuvent ensuite s'effectuer sans avoir à spécifier de clef. C'est très utile lors de l'utilisation d'une map structurée, car la recherche de l'élément ne sera plus nécéssaire pour accéder aux différents champs.

Les maps sont toujours locales par défaut, donc pour accéder à partir d'une procédure à une map définie dans le code source principal du programme, l'utilisation de Global ou Shared est requise. Il est également possible de passer une map en paramètre d'une procédure à l'aide du mot-clef Map.

Utilisez la commande Swap pour permuter rapidement un élément d'une map avec une variable, un élément d'un tableau ou un élément de la map.

Le paramètre optionnel 'Slots' défini le nombre de slots interne qui sera utilisé par la map pour effectuer le stockage des éléments. Plus il y a de slots en interne, plus l'accès à un élément sera rapide, mais plus la consommation mémoire sera importante. C'est un compromis dépendant du nombre d'éléments que la map contiendra au maximum et de la rapidité nécessaire à l'accès d'un élément. La valeur par défaut est 512. Ce paramètre n'a pas d'influence sur le nombre d'éléments que la map peut contenir.

Exemple: Map simple

  NewMap Pays.s()

  Pays("DE") = "Allemagne"
  Pays("FR") = "France"
  Pays("UK") = "United Kingdom"

  Debug Pays("FR")

  ForEach Pays()
    Debug Pays()
  Next

Exemple: Map en paramètre d'une procédure

  NewMap Pays.s()

  Pays("DE") = "Allemagne"
  Pays("FR") = "France"
  Pays("UK") = "United Kingdom"

  Procedure DebugMap(Map ParameterMap.s())

    ParameterMap("US") = "United States"

    ForEach ParameterMap()
      Debug ParameterMap()
    Next

  EndProcedure

  DebugMap(Pays())

Exemple: Map structurée

  Structure Voiture
    Poids.l
    Vitesse.l
    Prix.l
  EndStructure

  NewMap Voitures.Voiture()

  ; Ici, nous utilisons l'élément courant après l'insertion du nouvel élément
  ;
  Voitures("Ferrari F40")\Poids = 1000
  Voitures()\Vitesse = 320
  Voitures()\Prix = 500000

  Voitures("Lamborghini Gallardo")\Poids = 1200
  Voitures()\Vitesse = 340
  Voitures()\Prix = 700000

  ForEach Voitures()
    Debug "Nom de la Voiture: "+MapKey(Voitures())
    Debug "Poids: "+Str(Voitures()\Poids)
  Next


Liste des fonctions dépendantes de la plateforme

  • Vert: les commandes ou les bibliothèques qui sont supportées sur cette plateforme.
  • Yellow: La commande est présente mais ne fait rien (elle compile mais est ignorée).
  • Rouge: les commandes ou les bibliothèques qui ne sont pas supportées sur cette plateforme.
  • Toute commande ou bibliothèque non mentionée est supportée sur toutes les plateformes.

Bibliothèques qui ne sont pas complètement universelles:

Palette | Windows | Linux | MacOS
Sprite3D | Windows | SDL | OpenGl | MacOS

Commandes qui ne sont pas complètement universelles:

DesktopFrequency | Windows | Linux | MacOS
AudioCDLength | Windows | Linux | MacOS
EjectAudioCD | Windows | Linux | MacOS
RawKey | Windows | Linux | MacOS
ClearConsole | Windows | Linux | MacOS
ConsoleCursor | Windows | Linux | MacOS
ConsoleLocate | Windows | Linux | MacOS
ConsoleColor | Windows | Linux | MacOS
ConsoleTitle | Windows | Linux | MacOS
EnableGraphicalConsole | Windows | Linux | MacOS
GadgetItemID | Windows | Linux | MacOS
MDIGadget | Windows | Linux | MacOS
InitScintilla | Windows | Linux | MacOS
KeyboardMode | Windows | Linux | MacOS
GetFunctionEntry | Windows | Linux | MacOS
CountLibraryFunctions | Windows | Linux | MacOS
ExamineLibraryFunctions | Windows | Linux | MacOS
LibraryFunctionAddress | Windows | Linux | MacOS
LibraryFunctionName | Windows | Linux | MacOS
NextLibraryFunction | Windows | Linux | MacOS
MovieAudio | Windows | Linux | MacOS
MovieInfo | Windows | Linux | MacOS
MovieLength | Windows | Linux | MacOS
MovieSeek | Windows | Linux | MacOS
RenderMovieFrame | Windows | Linux | MacOS
MouseWheel | Windows | Linux | MacOS
CocoaMessage | Windows | Linux | MacOS
ExamineAssembly | Windows | Linux | PPC | x86
NextInstruction | Windows | Linux | PPC | x86
InstructionAddress | Windows | Linux | PPC | x86
InstructionString | Windows | Linux | PPC | x86
SelectedFontColor | Windows | Linux | MacOS
AvailableScreenMemory | DirectX | OpenGl | SDL | OpenGl | MacOS
ChangeGamma | DirectX | OpenGl | Linux | MacOS
ScreenID | DirectX | OpenGl | SDL | OpenGl | MacOS
ScreenModeRefreshRate | Windows | SDL | OpenGl | MacOS
OpenScreen | Windows | SDL | OpenGl | MacOS
SoundFrequency | Windows | Linux | MacOS
SoundPan | Windows | Linux | MacOS
StartSpecialFX | DirectX | OpenGl | SDL | OpenGl | MacOS
StopSpecialFX | DirectX | OpenGl | SDL | OpenGl | MacOS
UseBuffer | DirectX | OpenGl | SDL | OpenGl | MacOS
SpritePixelCollision | DirectX | OpenGl | Linux | MacOS
ThreadPriority | Windows | Linux | MacOS
GetToolBarButtonState | Windows | Linux | MacOS
SetToolBarButtonState | Windows | Linux | MacOS
ToolBarStandardButton | Windows | Linux | MacOS
SetWindowCallback | Windows | Linux | MacOS
SmartWindowRefresh | Windows | Linux | MacOS


Autres commandes

Syntax
Goto <label>
Description
Cette commande permet de transférer directement l'exécution du programme à l'emplacement d'un label. Soyez attentif en utilisant Goto car une mauvaise utilisation peut provoquer une fin anormale du programme...

Note: Pour sortir d'une boucle en toute sécurité, vous devriez toujours utiliser Break à la place de Goto.

Syntax
End [CodeDeSortie]
Description
Termine et quitte le programme de manière correcte à n'importe quel endroit du code source. Le paramètre optionnel 'CodeDeSortie' peut être utilisé pour renvoyer un code d'erreur différent de 0 (valeur par défaut) lorsque le programme se termine (souvent utilisé par les programmes en mode console).

Le 'CodeDeSortie' peut-être récupéré dans un autre programme à l'aide de la commande ProgramExitCode().

Syntax

Swap <expression>, <expression>
Description
Permute la valeur des deux expressions, de manière très rapide. Chaque <expression> doit être soit une variable, un élément (structuré ou non) de tableau, de liste chaînée ou de map et être d'un des types natifs: long (.l), quad (.q), string, etc.

Exemple: Permute des chaînes

  Salut$ = "Salut"
  Monde$ = "Monde"

  Swap Salut$, Monde$

  Debug Salut$+" "+Monde$

Exemple: Permute des tableaux à dimensions multiples

  Dim Tableau1(5,5)
  Dim Tableau2(5,5)
  Tableau1(2,2) = 10     ; Initialise les tableaux
  Tableau2(3,3) = 20

  Debug Tableau1(2,2)    ; Affichera 10
  Debug Tableau2(3,3)    ; Affichera 20

  Swap Tableau1() , Tableau2()    ; Permute le contenu des tableaux

  Debug "Contenu des tableaux après permutation:"
  Debug Tableau1(3,3)    ; Affichera 20
  Debug Tableau2(2,2)    ; Affichera 10

Exemple: Permute différents éléments

  Define a, b
  Dim Tableau(4, 4)
  NewList Liste1.Point()

  ;-Initialise les variables, le tableau et la liste chaînée
  a = 11
  b = 12

  Tableau(1,1) = 21

  ;Ajoute un élément à la liste 1
  AddElement(Liste1())
  Liste1()\x = 31
  Liste1()\y = 32

  ;Permute un élément de la liste avec une variable
  Swap Liste1()\x, a
  ;Permute un élément de la liste avec un élément du tableau
  Swap Liste1()\y, Tableau(1,1)

  ;Affiche le résultat
  Debug a              ; Affichera 31
  Debug b              ; Affichera 12
  Debug Tableau(1,1)   ; Affichera 32
  Debug Liste1()\x     ; Affichera 11
  Debug Liste1()\y     ; Affichera 21


Numéros de Port

Généralités

Vous trouverez ci-dessous la liste des plus importants numéros de port et leurs significations. Lorsque vous accédez à Internet, par exemple à un serveur FTP avec les commandes réseaux de PureBasic (voir l'exemple "PureBasic/Examples/Atomic FTP Server"), vous devez indiquer un numéro de port. De plus amples informations sur les "normes de protocoles d'Internet" sont disponibles, entre autres, sur le site : http://www.rfc-editor.org/rfcxx00.html.

Note : Des fournisseurs d'accès peuvent restreindre l'accès sur des numéros de port particuliers !

Numéros de Port

     9 : discard
    15 : netstat
    19 : chargen
    21 : ftp
    23 : telnet
    25 : smtp
    39 : rlp
    67 : boot
    79 : finger
    80 : http
    87 : link
   110 : pop3
   113 : ident
   119 : nntp
   139 : net bios
   513 : login
   515 : pkill
   533 : netwall
   560 : rmonitor
   561 : monitor
  1080 : firewall-port
  5580 : mil.http
  8080 : http|mil.http


Procedures

Syntax
Procedure[.<type>] nom(<variable1[.<type>]> [, <variable2[.<type>]>, ...])
  ...
  [ProcedureReturn valeur]
EndProcedure
Description
Une procédure est une partie du code indépendante du programme principal qui peut avoir des paramètres et ses propres variables. En PureBasic, les procédures sont récursives et peuvent donc s'appeler elles-mêmes. Lors de chaque appel à la procédure, les variables locales sont automatiquement initialisées avec la valeur 0. Pour accéder aux variables du programme principal, ils faut les partager en utilisant les mots clefs Shared ou Global (voir aussi: Protected et Static).

Les paramètres en fin de procédure peuvent avoir une valeur par défaut (une expression constante est requise). Les paramètres ayant une valeur par défaut pourront être omis lors de l'appel de la procédure, la valeur par défaut de chaque paramètre manquant sera utilisée.

Une procédure peut également recevoir en paramètre des listes chaînées, des maps et des tableaux à l'aide des mot-clefs List, Map et Array (Pour les tableaux vous devrez indiquer le nombre de dimensions, voir l'exemple ci-dessous).

Une procédure peut avoir une valeur de retour si nécessaire. Il faut en définir le type après Procedure et utiliser le mot clef ProcedureReturn à tout moment opportun dans la procédure. ProcedureReturn permet de sortir immédiatement d'une procédure, même si l'appel est placé à l'intérieur d'une boucle.
ProcedureReturn ne peut pas être utilisé pour renvoyer un tableau, une liste chaînée ou une map.

Si aucune valeur n'est spécifiée pour ProcedureReturn, la valeur renvoyée sera indéterminée (voir assembleur en ligne pour plus d'information).

Note: Pour renvoyer une chaîne de caractères dans une DLL, voir DLLs. Pour les programmeurs chevronnés, ProcedureC est disponible pour déclarer la procédure en utilisant la convention d'appel 'cdecl' au lieu de 'stdcall'.

Les procédures peuvent également être appelées de manière asynchrone en utilisant les threads.

Exemple

  Procedure.l Maximum(nb1.l, nb2.l)
    If nb1>nb2
      Resultat.l = nb1
    Else
      Resultat = nb2
    EndIf

    ProcedureReturn Resultat
  EndProcedure

  Resultat.l = Maximum(15,30)
  Debug Resultat
  End

Exemple: Paramètre par défaut

  Procedure a(a, b, c=2)
    Debug c
  EndProcedure

  a(10, 12) ; ou
  a(10, 12, 15)

Exemple: Listes chaînées en paramètre

  NewList Test.Point()

  AddElement(Test())
  Test()\x = 1
  AddElement(Test())
  Test()\x = 2

  Procedure DebugList(c.l, List ParametreListe.Point())

    AddElement(ParametreListe())
    ParametreListe()\x = 3

    ForEach ParametreListe()
      MessageRequester("Liste", Str(ParametreListe()\x))
    Next

  EndProcedure

  DebugList(10, Test())

Exemple: Tableau en paramètre

  Dim Tableau.Point(10, 15)

  Tableau(0,0)\x = 1
  Tableau(1,0)\x = 2

  Procedure TestIt(c.l, Array ParametreTableau.Point(2))  ; Le tableau comporte 2 dimensions

    ParametreTableau(1, 2)\x = 3
    ParametreTableau(2, 2)\x = 4

  EndProcedure

  TestIt(10, Tableau())

  MessageRequester("Tableau", Str(Tableau(1, 2)\x))

Syntax
Declare[.<type>] nom(<variable1[.<type>]> [, <variable2[.<type>]>, ...])
Description
Dans certains cas une procédure peut appeler une autre procédure qui n'a pas été déclarée avant sa propre définition. Ce cas peut se produire et provoquer une erreur de compilation 'Procedure not found'. Declare permet de traiter ce cas particulier en déclarant seulement l'en-tête de la procédure. Il est essentiel que les attributs de la fonction Declare et la déclaration réelle de la procédure soient identiques.

Pour les programmeurs chevronnés, DeclareC est disponible pour déclarer la procédure en utilisant la convention d'appel 'cdecl' au lieu de 'stdcall'.

Exemple

  Declare Maximum(Valeur1, Valeur2)

  Procedure Traitement(Valeur)
    Maximum(10, 2)      ; A cet instant Maximum() n'est pas connu du compilateur.
  EndProcedure

  Procedure.l Maximum(Valeur1.l, Valeur2.l)
    If Valeur1>Valeur2
      Resultat.l = Valeur1
    Else
      Resultat = Valeur2
    EndIf

    ProcedureReturn Resultat
  EndProcedure


Protected

Syntax
Protected[.<type>] <variable[.<type>]> [= <expression>] [, ...]
Description
Protected permet de créer une variable locale dans une procédure. Elle supplante l'éventuelle variable globale du même nom pendant toute la procédure (contrairement à une variable locale classique non protégée). Une valeur par défaut peut être assignée à la variable. Protected peut aussi être utilisé avec les tableaux, les listes chaînées et les maps.

La valeur de la variable locale sera réinitialisée à chaque appel de la procédure. Pour éviter cela, Static permet de déclarer une variable locale indépendante des variables globales tout en gardant sa valeur au fil des appels de la procédure.

Exemple: Avec une variable

  Global a
  a = 10

  Procedure Change()
    Protected a
    a = 20
  EndProcedure

  Debug a ; Affichera 10 car la variable a été protégée.

Exemple: Avec un tableau

  Global Dim Tableau(2)
  Tableau(0) = 10

  Procedure Change()
    Protected Dim Tableau(2) ; Ce tableau est protégé, il sera local.
    Tableau(0) = 20
  EndProcedure

  Change()
  Debug Tableau(0) ; Affichera 10 car le tableau a été protégé.


Prototypes

Syntax
Prototype.<type> nom(<parametre>, [, <parametre> [= ValeurDefaut]...])
Description
Pour les programmeurs chevronnés. Un Prototype permet la déclaration d'un type particulier qui servira à appeler une fonction. Cela permet de faire facilement des pointeurs de fonctions, car ce type peut être affecté à une variable.

Cette fonctionnalité peut remplacer CallFunction() car elle présente quelques avantages: vérification du type de paramètre, du nombre de paramètres.

Contrairement à CallFunction(), le prototype peut gérer les paramètres de types 'double', 'float' et 'quad' sans aucun problème. GetFunction() permet d'obtenir facilement le pointeur d'une fonction dans une bibliothèque.

Les paramètres en fin de prototype peuvent avoir une valeur par défaut (une expression constante est requise). Les paramètres ayant une valeur par défaut pourront être omis lors de l'appel du prototype, la valeur par défaut de chaque paramètre manquant sera utilisée.

Par défaut, la fonction utilisera la convention d'appel 'stdcall'. Si le pointeur de fonction appelle une fonction C utilisant la convention d'appel 'cdecl', PrototypeC est fortement conseillé.

Les pseudotypes peuvent être utilisés pour les paramètres, mais pas pour le type de retour.

Exemple

  Prototype.l ProtoMessageBox(Fenetre.l, Corps$, Titre$, Options.l = 0)

  If OpenLibrary(0, "User32.dll")

    ; 'MsgBox' est une variable de type 'ProtoMessageBox'
    ;
    MsgBox.ProtoMessageBox = GetFunction(0, "MessageBoxA")

    MsgBox(0, "Hello", "World") ; Les options peuvent être omises
  EndIf

Exemple: Avec des pseudotypes

  ; Nous spécifions le pseudotype 'p-unicode'pour les 2 paramètres de type string
  ; (texte à afficher et titre) car l'api MessageBoxW est une fonction unicode. Le compilateur
  ; convertira automatiquement les chaînes ascii en unicode pour les besoins de la fonction
  ;
  Prototype.l ProtoMessageBoxW(Fenetre.l, Corps.p-unicode, Titre.p-unicode, Options.l = 0)

  If OpenLibrary(0, "User32.dll")

    ; 'MsgBox' est une variable de type 'ProtoMessageBoxW'
    ;
    MsgBox.ProtoMessageBoxW = GetFunction(0, "MessageBoxW")

    MsgBox(0, "Hello", "World") ; Les options peuvent être omises
  EndIf


Pseudotypes

Description
Pour les programmeurs chevronnés. Les pseudotypes sont destinés à faciliter la programmation quand l'utilisation de bibliothèques externes nécessitant des types non supportés par PureBasic sont requises. Plusieurs types prédéfinis sont disponibles et permettent une conversion à la volée des types PureBasic vers ces types. Etant donné que ce ne sont pas des types normaux, leur notation est volontairement différente: un préfixe 'p-' (pour 'pseudo') fait partie du nom du type. Les pseudotypes disponibles sont:
  p-ascii: se comporte comme un type 'string', mais la chaîne de caractères sera toujours convertie en
           ascii lors de l'appel de la fonction, même si le programme est compilé en mode unicode.
           C'est très utile pour appeler les fonctions d'une bibliothèque qui ne supporte pas
           l'unicode, dans un programme unicode.

  p-utf8: se comporte comme un type 'string', mais la chaîne de caractères sera toujours convertie en
          utf-8 lors de l'appel de la fonction. C'est très utile pour appeler les fonctions d'une bibliothèque qui ne supporte que
          l'utf-8 comme format de chaîne de caractères.

  p-bstr: se comporte comme un type 'string', mais la chaîne de caractères sera toujours convertie en
          bstr lors de l'appel de la fonction. C'est très utile pour appeler les fonctions d'une bibliothèque qui ont besoin
          des chaînes de caractères bstr, comme les composants COM.

  p-unicode: se comporte comme un type 'string', mais la chaîne de caractères sera toujours convertie en
             unicode lors de l'appel de la fonction, même si le programme est compilé en mode ascii.
             C'est très utile pour appeler les fonctions d'une bibliothèque qui ne supporte que
             l'unicode, dans un programme ascii.

  p-variant: se comporte comme un type numérique, en ajustant l'appel de la fonction pour utiliser correctement
             un paramètre de type 'VARIANT'. C'est très utile pour appeler les fonctions d'une bibliothèque qui ont besoin
             des paramètres de type 'VARIANT', comme les composants COM.
Les pseudotypes peuvent être utilisés uniquement avec les prototypes, les interfaces et les fonctions importées. Ils ne font la conversion que si c'est nécessaire: par exemple utiliser le pseudotype 'p-ascii' dans un programme compilé en mode ascii n'a aucun effet, car les chaînes internes de PureBasic sont déjà en ascii.

Exemple

  Import "User32.lib"

    ; Nous spécifions le pseudotype 'p-unicode'pour les 2 paramètres de type string
    ; (texte à afficher et titre) car l'api MessageBoxW est une fonction unicode. Le compilateur
    ; convertira automatiquement les chaînes ascii en unicode pour les besoins de la fonction
    ;
    MessageBoxW(Window.l, Corps.p-unicode, Titre.p-unicode, Options.l = 0)

  EndImport

  ; L'exemple suivant fonctionnera correctement bien que le type string soit codé en ascii,
  ; le compilateur se charge de la conversion en unicode pour les besoins de la fonction
  ;
  MessageBoxW(0, "Hello", "World")


Les objets PureBasic

Introduction

L'objectif de ce chapitre est d'assimiler la création et la manipulation des objets en PureBasic. Pour cette présentation nous allons utiliser l'objet Image, mais la même logique s'applique à tous les autres objets PureBasic. Quand nous voulons créer une image, nous avons deux possibilités: la méthode indexée et la méthode dynamique.

I. Les objets indexés

La manière indexée (statique) permet de référencer un objet à l'aide d'une valeur numérique que nous déterminons. Elle doit être comprise entre 0 et un nombre maximum qui va dépendre du type de l'objet (en principe entre 5000 et 64000). Etant donné que c'est indexé, si vous utilisez la valeur 0 pour votre premier objet et la valeur 1000 pour votre deuxième objet, il y aura 1001 index de disponibles et 999 seront inutilisés, ce qui n'est pas très efficace (gâchis de mémoire vive). C'est pour cette raison qu'il faut autant que possible utiliser une indexation sequentielle, qui commence à partir de 0. Si vous avez besoin d'une méthode plus flexible, il vous faudra probablement utiliser la méthode dynamique, décrite dans la section II. La méthode indexée offre plusieurs avantages:

- Manipulation plus facile, pas besoin de variables ni de tableaux.
- Manipulation 'Groupée' sans avoir à utiliser de tableaux supplémentaires.
- Utilisation des objets dans les procédures sans avoir à déclarer de globales (si on utilise une constante ou un nombre).
- Destruction automatique des objets précédents quand un index est réutilisé.
Les Enumérations sont fortement recommandées si vous souhaitez utiliser des constantes séquentielles pour identifier vos objets.

Exemple

  CreateImage(0, 640, 480) ; Crée une image à l'emplacement 0
  ResizeImage(0, 320, 240) ; Retaille l'image n°0

Exemple

  CreateImage(2, 640, 480) ; Crée une image à l'emplacement 2
  ResizeImage(2, 320, 240) ; Retaille l'image n°2
  CreateImage(2, 800, 800) ; Crée une nouvelle image à l'emplacement n°2. L'ancienne image n°2 est désallouée automatiquement

Exemple

  For k = 0 To 9
    CreateImage(k, 640, 480) ; Crée 10 images, aux emplacements 0 à 9
    ResizeImage(k, 320, 240) ; Recrée une nouvelle image à l'emplacement n°2. L'ancienne image n°2 est désallouée automatiquement
  Next

Exemple

  #ImageBackground = 0
  #ImageButton     = 1

  CreateImage(#ImageBackground, 640, 480) ; Crée une image à l'emplacement #ImageBackground (0)
  ResizeImage(#ImageBackground, 320, 240) ; Retaille l'image 0 (ImageBackground)
  CreateImage(#ImageButton    , 800, 800) ; Crée une image (n°1)

II. Les objets dynamiques

Quelquefois, les objets indexés ne sont pas pratiques pour gérer des situations où l'on ne connaît pas à l'avance le nombre d'objets nécessaire à un instant donné. PureBasic permet de créer très facilement des objets dynamiques. Les deux méthodes (indexée et dynamique) peuvent être utilisées en même temps sans risque de conflit. Pour créer un objet dynamique, il suffit de spécifier la constante #PB_Any à la place du numéro et un numéro dynamique sera retourné comme résultat de la fonction. Cette manière de gérer les objets se marie bien avec les listes chaînées, qui sont aussi un moyen dynamique de gérer des données.

Exemple

  DynamicImage1 = CreateImage(#PB_Any, 640, 480) ; Crée une image dynamique
  ResizeImage(DynamicImage1, 320, 240) ; Retaille l'image dynamique
Code complet d'example de gestion dynamique d'objets avec une liste chainée:

Exemple

MDI_ImageViewer.pb


Repeat : Until

Syntax
Repeat
  ...
Until <expression> [ou Forever]
Description
Cette fonction boucle jusqu'à ce que <expression> soit vrai. Si une boucle infinie est requise il est préférable d'utiliser le mot clef Forever à la place de Until.

Exemple

  a=0
  Repeat
    a=a+1
    Debug a
  Until a>100
Ceci produira une boucle jusqu'à ce que "a" prenne une valeur strictement supérieure à 100, (il y aura donc 101 cycles).


Résidents

Description
Les résidents sont des fichiers pré-compilés qui sont chargés lors du démarrage du compilateur. Ils se trouvent dans le dossier des 'residents' dans le chemin d'installation de PureBasic. Un fichier résident doit avoir l'extension '.res' et peut contenir les éléments suivants: Structures, interfaces, macros et constantes. Il ne peut pas contenir un code dynamique ni des procédures.

Lorsqu'un résident est chargé, tout son contenu est disponible pour le programme en cours de compilation. C'est pourquoi toutes les constantes intégrées comme #PB_Event_CloseWindow sont disponibles, elles sont dans le fichier 'PureBasic.res.
Toutes les structures et les constantes de l'API sont également dans un fichier résident. L'utilisation des résidents est un bon moyen pour stocker les macros, les structures et les constantes communes afin qu'elles soient disponibles pour tous les programmes.
Lors de la distribution d'une bibliothèque utilisateur, c'est aussi une bonne solution pour fournir les constantes et les structures nécessaires.

Pour créer un nouveau résident, le compilateur en ligne de commande doit être utilisé, car il n'y a pas d'option pour le faire à partir de l'IDE. Il est souvent nécessaire d'utiliser /IGNORERESIDENT et /CREATERESIDENT en même temps afin d'éviter des erreurs, car la version précédente du résident est chargée avant la création de la nouvelle.

Les résidents aident grandement à avoir une compilation et un démarrage du compilateur plus rapide, car toutes les informations sont stockées au format binaire. C'est beaucoup plus rapide que l'analyse d'un fichier d'inclusion à chaque compilation.


Select : EndSelect

Syntax
Select <expression1>
  Case <expression> [, <expression> [<expression numerique> To <expression numerique>]]
     ...
  [Case <expression>]
     ...
  [Default]
     ...
EndSelect
Description
Select permet d'opérer des choix rapides. Le programme exécute <expression1> et retient la valeur en mémoire. Cette valeur est ensuite comparée à chacune des valeurs "Case <expression>" et s'il y a égalité, le code du bloc Case est exécuté pour quitter ensuite la structure Select. Case supporte les valeurs multiples ainsi que les intervalles à l'aide du mot-clef To (seulement pour les intervalles numériques). Si aucune des valeurs Case n'est vraie, alors le code du bloc Default, (s'il est spécifié) est exécuté.

Note: Select accepte les nombres à virgules (float) comme <expression1>, mais ils seront arrondis à l'entier inférieur (les comparaisons ne se font que sur des nombres entiers).

Exemple

  Valeur = 2

  Select Valeur
    Case 1
      Debug "Valeur = 1"

    Case 2
      Debug "Valeur = 2"

    Case 20
      Debug "Valeur = 20"

    Default
      Debug "Je ne sais pas"
  EndSelect

Exemple: Cas multiples et intervalles

  Valeur = 2

  Select Valeur
    Case 1, 2, 3
      Debug "Valeur est 1, 2 ou 3"

    Case 10 To 20, 30, 40 To 50
      Debug "Valeur est entre 10 et 20, égale à 30 ou entre 40 et 50"

    Default
      Debug "Je ne sais pas"

  EndSelect


Utiliser plusieurs versions de PureBasic avec Windows

Introduction

Il est possible d'installer plusieurs versions de PureBasic sur votre disque dur. C'est utile pour finir un projet avec une ancienne version de PureBasic, tout en commençant le développement d'un nouveau projet avec une version plus récente de PureBasic.

Comment procéder

Créez différents répertoires comme par exemple "PureBasic_v3.94" et "PureBasic_v5" et installez les versions de PureBasic correspondant à chaque répertoire.

Quand un des fichiers "PureBasic.exe" est démarré, il associe tous les fichiers ".pb" à la version de PureBasic correspondante. Aussi quand un code source est chargé en double cliquant sur son fichier, c'est la version de PureBasic associée en cours qui sera démarrée. PureBasic ne changera rien, qui pourrait affecter les autres versions de PureBasic dans les autres répertoires.

Pour éviter l'association automatique des fichiers ".pb" au démarrage de l'IDE, un raccourci peut être créé depuis PureBasic.exe avec "/NOEXT" comme paramètre. La ligne de commande optionnelle depuis l'IDE est décrite ici.

Note: Depuis PureBasic 4.10, les paramètres de l'IDE ne sont plus enregistrés dans le répertoire 'PureBasic' mais dans le répertoire %APPDATA%\PureBasic. Pour utiliser le même fichier de configuration avec différentes versions de Purebasic, utilisez les interrupteurs /P /T et /A. En outre, le commutateur /PORTABLE met tous les fichiers dans le répertoire PureBasic et désactive la création de l'extension '.pb'.


Shared

Syntax
Shared <variable> [, ...]
Description
Shared permet de rendre une variable, un tableau, une liste chaînée ou une map non global accessible depuis une procédure. Quand Shared est utilisé avec un tableau, une liste chaînée ou une map, seul le nom suivi de '()' doit être spécifié.

Exemple: Avec une variable

  a = 10

  Procedure Change()
    Shared a
    a = 20
  EndProcedure

  Change()
  Debug a   ; Affichera 20, car la variable est partagée.

Exemple: Avec un tableau et une liste chaînée

  Dim Array(2)
  NewList List()
  AddElement(List())

  Procedure Change()
    Shared Array(), List()
    Array(0) = 1
    List() = 2
  EndProcedure

  Change()
  Debug Array(0)  ; Affichera 1, car le tableau est partagé.
  Debug List()    ; Affichera 2, car la liste chaînée est partagée.


Static

Syntax
Global[.<type>] <variable[.<type>]> [= <constant expression>] [, ...]
Description
Static permet de créer des variables locales persistantes dans une procedure. Les variables statiques sont prioritaires sur les variables globales, ce qui implique qu'une variable globale sera ignorée dans une procédure si une variable statique portant le même nom est déjà déclarée. La valeur de la variable statique n'est pas réinitialisée à chaque appel de la procédure: c'est donc un bon moyen pour avoir une variable globale affectée à une seule procédure.

Static peut aussi être utilisé avec les tableaux, les listes chaînées et les maps. Lors de la déclaration d'un tableau static, ses paramètres doivent être une valeur constante.

Exemple: Avec une variable

  Global a
  a = 10

  Procedure Change()
    Static a
    a+1
    Debug "Dans la Procédure: "+Str(a) ; Affichera 1, 2, 3 car la variable s'incrémente à chaque appel de la procédure.
  EndProcedure

  Change()
  Change()
  Change()
  Debug a ; Affichera 10, car une variable 'static' n'affecte pas une variable 'global'.

Exemple: Avec un tableau

  Global Dim Tableau(2)
  Tableau(0) = 10

  Procedure Change()
    Static Dim Tableau(2)
    Tableau(0)+1
    Debug "Dans la Procédure: "+Str(Tableau(0)) ; Affichera 1, 2, 3 car la valeur du champ du tableau s'incrémente à chaque appel de la procédure.
  EndProcedure

  Change()
  Change()
  Change()
  Debug Tableau(0) ; Affichera 10, car un tableau 'static' n'affecte pas un tableau 'global'.


Structures

Syntax
Structure <nom> [Extends <name>] [Align <expression numérique constante>]
  ...
EndStructure
Description
Structure est utile pour définir un type utilisateur et accéder à des zones mémoires du système d'exploitation par exemple. Les structures peuvent être utilisées pour rendre l'accès à des grands fichiers plus facilement. Cela peut être plus efficace dans la mesure où vous pouvez regrouper dans un même objet des informations communes. On accède aux structures avec le caractère \ . Les structures peuvent s'imbriquer. Les tableaux statiques sont acceptés dans une structure.

Les objets dynamiques tel que les tableaux, listes et maps sont supportés dans les structures et sont automatiquement initialisés quand l'objet utilisant la structure est déclaré. Pour définir un tel champ, utiliser les mot-clés suivant: Array, List et Map.

Le paramètre optionnel Extends permet d'étendre une structure existante avec de nouveaux champs. Tous les champs se trouvant dans la structure étendue se retrouveront en tête de la nouvelle structure. C'est très utile pour faire un héritage simple de structures.

Pour les utilisateurs avancés seulement. Le paramètre Align permet d'ajuster l'alignement entre chaque champ de la structure. L'alignement par défaut est de 1, ce qui signifie pas d'alignement. Par exemple, si l'alignement est fixé à 4, chaque champs sera aligné sur 4 octets. Cela peut aider à améliorer les performances lors de l'accès aux champs de la structure, mais cela peut utiliser plus de mémoire, car un certain espace entre chaque champs sera perdu. La valeur spéciale #PB_Structure_AlignC peut être utilisée pour aligner la structure telle qu'elle se ferait en langage C, utile lors de l'importation structures C utilisées avec des fonctions API.
  - SizeOf permet de connaître la taille en octets d'une structure
  - OffsetOf peut être utilisé pour rechercher l'index du champ indiqué.

Note : Un tableau statique dans une structure ne se comporte pas de la même façon qu'un tableau défini avec la commande Dim. Ceci pour être conforme au format de structures en C/C++ (pour permettre un portage direct des structures de l'API). Ce qui signifie que a[2] assignera un tableau de 0 à 1 (deux éléments) alors que Dim a(2) assignera un tableau de 0 à 2 (trois éléments).

Lorsque vous utilisez des pointeurs dans les structures, L' '*' doit être omis lors de l'utilisation du champ, une fois de plus pour faciliter le portage de code API. Cela peut être considéré comme une bizarrerie (et pour être honnête, ça l'est) mais c'est comme ça depuis le début de PureBasic et beaucoup, beaucoup de sources sont écrites de cette façon et cela restera inchangé.

Quand beaucoup de champs doivent être remplis en une fois, il est conseillé d'utiliser With : EndWith pour réduire la quantité de code à saisir et améliorer sa lisibilité.

Il est possible de copier une structure complète en utilisant l'opérateur égal entre deux éléments de même type.

ClearStructure peut être utilisé pour vider une zone de mémoire structurée. Uniquement pour les programmeurs confirmés, lorsque les pointeurs sont de la partie.

Exemple

  Structure Personne
    Nom.s
    Prenom.s
    Age.w
  EndStructure

  Dim MesAmis.Personne(100)

  ; Ici la position '0' du tableau MesAmis()
  ; contiendra une personne et ses informations personnelles

  MesAmis(0)\Nom = "Durand"
  MesAmis(0)\Prenom = "Michel"
  MesAmis(0)\Age = 32

Exemple: Structure plus complexe (Tableau statique imbriqué)

   Structure Fenetre
    *FenetreSuivante.Fenetre  ; Pointe vers un autre objet fenêtre
    x.w
    y.w
    Nom.s[10]  ; 10 noms possibles
  EndStructure

Exemple: Structure étendue

  Structure MonPoint
    x.l
    y.l
  EndStructure

  Structure MonPointEnCouleur Extends MonPoint
    couleur.l
  EndStructure

  ColoredPoint.MonPointEnCouleur\x = 10
  ColoredPoint.MonPointEnCouleur\y = 20
  ColoredPoint.MonPointEnCouleur\couleur = RGB(255, 0, 0)

Exemple: Copie de structure

  Structure MonPoint
    x.l
    y.l
  EndStructure

  PointGauche.MonPoint\x = 10
  PointGauche\y = 20

  PointDroit.MonPoint = PointGauche

  Debug PointDroit\x
  Debug PointDroit\y

Exemple: Objet Dynamique

  Structure Personne
    Nom$
    Age.l
    List Amis$()
  EndStructure

  Jean.Personne
  Jean\Nom$ = "Jean"
  Jean\Age   = 23

  ; Ajoutons des amis à Jean
  ;
  AddElement(Jean\Amis$())
  Jean\Amis$() = "Jim"

  AddElement(Jean\Amis$())
  Jean\Amis$() = "Monica"

  ForEach Jean\Amis$()
    Debug Jean\Amis$()
  Next

Syntax
StructureUnion
  Field1.Type
  Field2.Type
  ...
EndStructureUnion
Description
StructureUnion est prévu pour les programmeurs avancés qui souhaitent économiser de la mémoire en partageant certains champs à l'intérieur d'une même structure. Il s'agit d'un équivalent du mot clef 'union' en C/C++.

Note: Chaque champ dans la déclaration StructureUnion peut être d'un type différent.

Exemple

  Structure Type
    Nom$
    StructureUnion
      Long.l      ; Chaque champ (Long, Float et Byte) est placé à la
      Float.f     ; même adresse mémoire.
      String.b    ;
    EndStructureUnion
  EndStructure

Exemple: Exemple extended (gestion des dates)

  Structure date
    jour.s{2}
    pk1.s{1}
    mois.s{2}
    pk2.s{1}
    an.s{4}
  EndStructure

  Structure date2
    StructureUnion
      s.s{10}
      d.date
    EndStructureUnion
  EndStructure

  Dim d1.date2(5)

  d1(0)\s = "05.04.2008"
  d1(1)\s = "07.05.2009"

  Debug d1(0)\d\jour
  Debug d1(0)\d\mois
  Debug d1(0)\d\an

  Debug d1(1)\d\jour
  Debug d1(1)\d\mois
  Debug d1(1)\d\an

  d2.date2\s = "15.11.2010"

  Debug d2\d\jour
  Debug d2\d\mois
  Debug d2\d\an

Exemple: Alignement Mémoire

  Structure Type Align 4
    Byte.b
    Word.w
    Long.l
    Float.f
  EndStructure

  Debug OffsetOf(Type\Byte)   ; Affiche 0
  Debug OffsetOf(Type\Word)   ; Affiche 4
  Debug OffsetOf(Type\Long)   ; Affiche 8
  Debug OffsetOf(Type\Float)  ; Affiche 12

Exemple: Pointers

  Structure Personne
    *Next.Personne ; Ici, le '*' est obligatoire pour déclarer un pointeur
    Nom$
    Age.b
  EndStructure

  Timo.Personne\Nom$ = "Timo"
  Timo\Age = 25

  Fred.Personne\Nom$ = "Fred"
  Fred\Age = 25

  Timo\Next = @Fred ; Lorsque vous utilisez le pointeur, le '*' est omis

  Debug Timo\Next\Nom$ ; Affichera 'Fred'


Sous-systèmes

Introduction

Les commandes intégrées de PureBasic s'appuient sur les bibliothèques disponibles de chaque système d'exploitation. Parfois, il est possible d'atteindre un même résultat de différentes façons. Pour ce faire, PureBasic offre la possibilité de changer de bibliothèque, sans changer une ligne de code source. Par exemple, sous Windows, OpenGL peut être utiisé en utilisant le sous-système 'OpenGL' de PureBasic, qui lui, utilisera les fonctions OpenGL pour rendre les sprites par exemple, en lieu et place de DirectX (sous-système par défaut).

Pour activer un sous-système, son nom doit être défini dans l'IDE avec le menu Options du compilateur, ou par l'intermédiaire du commutateur /SUBSYSTEM en /ligne de commande. Il s'agit d'une option de compilation, ce qui signifie qu'un exécutable ne peut pas incorporer plus d'un sous-système à la fois. Si le support de multiple sous-systèmes est nécessaire (par exemple l'envoi d'une version OpenGL et DirectX d'un jeu), deux exécutables doivent être créés.

Les sous-systèmes disponibles sont situés dans le dossier 'subsystems' de PureBasic. Lorsqu'un sous-système est spécifié, tous les résidents ou les bibliothèques trouvées dans ce dossier auront préséance sur les bibliothèques par défaut et les résidents. N'importe quel nombre de sous-systèmes différents peuvent être spécifiés (pour autant que cela n'affecte pas les mêmes bibliothèques).

La fonction du compilateur Subsystem peut être utilisée pour détecter si un sous-système spécifique est utilisé pour la compilation.

Sous-systèmes disponibles

Voici une liste des sous-systèmes disponibles, et les bibliothèques concernées:

Windows
  OpenGL: Utiliser OpenGL au lieu de DirectX. Bibliothèques concernées:
          - Sprite
          - Sprite3D
          - Screen
          - Toutes les bibliothèques connexes du moteur 3D

Linux
  Rien

MacOS X
  Carbon: Attention, ce sous-système est obsolète et n'est plus maintenu.
          Utilisation de l'API Carbon au lieu de 'cocoa'. Bibliothèques concernées:
          - 2D Drawing
          - AudioCD
          - Clipboard
          - Desktop
          - Drag & Drop
          - Font
          - Gadget
          - Image
          - Menu
          - Movie
          - Printer
          - Requester
          - Scintilla
          - StatusBar
          - SysTray
          - Toolbar
          - Window


Threaded

Syntax
Threaded[.<type>] <variable[.<type>]> [= <expression constante>] [, ...]
Description
Threaded permet de créer une variable, un tableau, une liste chaînée ou une map qui sera persistant pour chaque thread. C'est à dire que chaque thread aura sa propre version de l'objet. C'est uniquement utile lors de l'écriture de programmes multi-threadés.
Si un type est spécifié après le mot-clef Threaded, le type par défaut pour cette déclaration est modifié.

Chaque variable peut avoir une valeur par défaut assignée, mais cette valeur doit être une constante. Lors de la déclaration d'un tableau threadé, les paramètres de dimensionnement doivent être des valeurs constantes.

Un objet threadé ne peut pas être déclaré dans une procédure, et sa portée est toujours globale.

Exemple: Avec une variable

  Threaded Compteur

  Compteur = 128

  Procedure Thread(Parametre)

    Debug Compteur ; Affichera zero, car ce thread n'a pas encore utilisé cette variable
    Compteur = 256
    Debug Compteur ; Affichera 256

  EndProcedure

  Thread = CreateThread(@Thread(), 0)
  WaitThread(Thread) ; Attente de la fin d'exécution du thread.

  Debug Compteur ; Affichera 128, meme si 'Compteur' a ete change dans le thread


Unicode

Introduction

'Unicode' est un terme utilisé pour désigner un jeu de caractères étendu destiné à afficher du texte dans de nombreux langages différents (y compris les langages non latins, avec beaucoup de symboles différents tel que le Japonais, le Coréen etc.). En unicode, chaque symbole a sa place propre, et il n'est pas nécessaire d'avoir une table de caractères par langue. Si une application doit fonctionner dans plusieurs langues, il est fortement recommandé d'activer le mode unicode lors du commencement du développement, car cela limitera les bugs qui pourraient survenir en cas de conversion tardive ascii vers unicode.

Pour simplifier, l'unicode peut être vu comme une très grande table ascii, qui n'a pas 256 caractères mais 65536. Donc, pour stocker un caractère, 2 octets seront nécessaires en mémoire (c'est important de noter cette différence, notamment lors de l'utilisation de pointeurs vers des chaînes de caractères). Le type natif 'caractère' (.c) de PureBasic change de taille automatiquement (de 1 octet à 2 octets) si le mode unicode est activé.

Voici quelques liens pour se faire une meilleure idée de l'unicode (lecture vivement conseillée):

Information générale sur l'unicode (Français)
Information générale sur l'unicode (Anglais)
L'unicode et les BOM

Unicode et Windows

Sous Windows, en mode unicode, PureBasic utilise l'encodage UCS2 qui est le format utilisé de manière interne par l'API, donc aucune conversion n'est nécessaire lorsqu'un fonction est appelée. Si le programme utilise des fonctions API, PureBasic utilisera automatiquement la version unicode de la fonction si elle est disponible (par exemple MessageBox_() pointera vers MessageBoxW() en mode unicode, et vers MessageBoxA() en mode ascii). Il en va de même pour toutes les structures et les constantes API supportées par PureBasic. Ainsi il est possible d'utiliser le même code source API et de le compiler en mode ascii ou unicode sans aucun changement.

Unicode est supporté nativement uniquement sur Windows NT et supérieur (Windows 2000/XP/Vista): un programme unicode ne fonctionnera pas sur Windows 95/98/NT. Il y a une solution qui consiste à utiliser la dll 'unicows' mais elle n'est pas gérée par PureBasic pour l'instant. Si le programme doit fonctionner sur Win 9x, le mieux est de fournir deux versions de l'exécutable: un en mode ascii et l'autre en mode unicode. Comme il faut uniquement spécifier une option de compilation pour passer du mode ascii au mode unicode, ça devrait être aisé.

UTF-8

L'UTF-8 est une autre façon d'encoder une chaîne de caractères unicode. Contrairement à UCS2 qui prend toujours 2 octets par caractère, UTF-8 utilise un encodage variable pour chaque caractère (jusqu'à 4 octets pour représenter un caractère). Le point fort de l'UTF-8 est qu'il ne contient pas de caractère nul lors de son encodage, donc le texte peut être édité facilement. De plus, les caractères ASCII de 1 à 127 sont conservés (ils ne sont pas modifiés lors de l'encodage) ce qui rend le texte à peu près lisible pour les langues latines. Son point faible est le côté variable de ses caractères, ce qui nécessite des routines de gestion de texte plus lentes.

PureBasic utilise l'UTF-8 comme encodage par défaut pour l'écriture et la lecture des chaînes de caractères dans les fichiers, lorsque l'exécutable est en mode unicode (bibliothèques Fichier et Préférence), pour que les fichiers soient complètement indépendants de la plateforme.

Le compilateur du PureBasic gère aussi les fichiers sources ascii et UTF-8 (les fichiers UTF-8 doivent avoir une entête BOM). Les deux types de fichiers peuvent être combinés dans un programme sans problème: un fichier source ASCII peut inclure un fichier source UTF-8 et vice-versa. Lors du développement d'un programme unicode, il est recommandé de mettre l'IDE en mode UTF-8, pour que tous les fichiers sources soient enregistrés en UTF-8. Comme les sources au format UTF-8 peuvent aussi servir à compiler un programme en mode ASCII, il n'est pas nécessaire de changer le format de fichier à chaque changement de mode.


Variables, Types et Opérateurs

Déclaration des variables

La déclaration d'une variable en PureBasic se fait en la nommant. Vous pouvez également spécifier le type que vous souhaitez pour cette variable. Les variables n'ont pas besoin d'être explicitement déclarées et peuvent être utilisées "à la volée". Le mot clef Define peut être utilisé pour déclarer plusieurs variables sur une même ligne.

Exemple

Arithmetic.pb

Exemple

  a.b ; Déclare une variable 'a' du type byte (.b).
  c.l = a*d.w ; 'd' est déclarée ici au milieu d'une expression !
Note: les noms de variables ne peuvent pas commencer avec un chiffre (0, 1, etc.) et ne peuvent pas contenir d'opérateurs (+, -, etc.) ni de caractères spéciaux(é, à, ß, ä, ö, ü, etc.).

Si le contenu d'une variable ne change pas tout au long de l'exécution du programme (utilisation d'une valeur fixe), il est préférable d'utiliser une constante.

Types basiques

PureBasic autorise la définition des types de variables. Ces types sont signés et peuvent être des entiers standards, des nombres flottants ou des chaînes de caractères. Voici la liste des types natifs supportés:

    Nom        | Extension    | Taille en mémoire | Plage
  -------------+--------------+-------------------+----------------------------------------------
  Byte         |    .b        | 1 octet           | -128 à +127
  Ascii        |    .a        | 1 octet           | 0 à +255
  Caractère    |    .c        | 1 octet (ascii)   | 0 à +255
  Caractère    |    .c        | 2 octets (unicode)| 0 à +65535
  Unicode      |    .u        | 2 octets          | 0 à +65535
  Word         |    .w        | 2 octets          | -32768 à +32767
  Long         |    .l        | 4 octets          | -2147483648 à +2147483647
  Integer      |    .i        | 4 octets (32-bit)| -2147483648 à +2147483647
  Integer      |    .i        | 8 octets (64-bit)| -9223372036854775808 à +9223372036854775807
  Float        |    .f        | 4 octets          | illimité (voir ci-dessous)
  Quad         |    .q        | 8 octets          | -9223372036854775808 à +9223372036854775807
  Double       |    .d        | 8 octets          | illimité (voir ci-dessous)
  String       |    .s        | longueur string+1 | illimité
  String Fixe  | .s{Longueur} | longueur string   | illimité

Types non-signés: Purebasic offre le support natif des types non-signés pour les variables de type 'byte' et 'word' au travers des types 'ascii' (.a) and 'unicode' (.u). Le type 'character'(.c) (qui est un 'byte' non-signé en mode ascii, et un 'word' non-signé en mode unicode) peut aussi être utilisé comme un type non-signé.

Notation des variables chaîne de caractères: Il est possible d'utiliser '$' comme dernier caractère d'une variable pour indiquer qu'il s'agit d'une chaîne de caractères. De cette façon vous pouvez utiliser 'a$' et 'a.s' , ce sont deux variables différentes.
Note: Vous devrez conserver le '$' à la fin de la variable a$, contrairement au '.s' de la variable a.s, qui n'est nécessaire que la première fois pour la déclarer.
  a.s = "Une chaîne"
  a$ = "Une autre chaîne"
  Debug a   ; Affichera "Une chaîne"
  Debug a$  ; Affichera "Une autre chaîne"

Note: Les nombres flottants (Simples ou doubles) peuvent être écrits sous la forme: 123.5e-20
  valeur.d = 123.5e-20
  Debug valeur   ; affichera 0.000000000000000001235

Opérateurs

Les opérateurs peuvent être intégrés aux expressions pour combiner les variables, constantes et tout ce qui est nécessaire. La table ci-dessous montre tous les opérateurs utilisables en PureBasic. (LHS = Left Hand Side ou partie gauche, RHS = Right Hand Side ou partie droite).

Opérateur = (Egal)

Peut être utilisé suivant deux acceptions. La première est pour l'affectation de la variable LHS à la valeur résultat de l'expression RHS. La seconde signification est l'utilisation dans une expression de comparaison entre LHS et RHS. Si le résultat de LHS est identique au résultat de RHS la valeur 'vrai' sera retournée sinon se sera la valeur 'faux'.

Exemple

  a=b+c ; Affecte la valeur de "b+c" à la variable "a"
  If abc=def ; Teste si les valeurs de abc et def sont identiques et utilise le résultat dans la commande If

Opérateur + (Plus)

Donne le résultat de la valeur de l'expression RHS ajoutée à la valeur de l'expression LHS. Si le résultat de cet opérateur n'est pas utilisé et qu'il y a une variable LHS, alors la valeur de l'expression RHS sera directement ajoutée à la valeur LHS.

Exemple

  nombre=mavaleur+2 ; Ajoute la valeur 2 à "mavaleur" et utilise le résultat avec l'opérateur =
  variable+expression ; La valeur de "expression" est directement ajoutée à "variable"

Opérateur - (Moins)

Soustrait la valeur de l'expression RHS de la valeur de l'expression LHS. S'il n'y a pas d'expression LHS l'opérateur prend la valeur négative de la valeur RHS. Si le résultat de l'opérateur n'est pas utilisé et qu'il n'y a pas de variable LHS, alors la valeur de RHS est directement soustraite à la valeur de la variable LHS. Cet opérateur ne peut être utilisé avec les variables de type chaîne.

Exemple

  var=#MaConstante-chose; Soustrait la valeur de "chose" de "#MyConstant" et utilise le résultat avec l'opérateur égal.
  uneautre=uneautre+ -var ; Calcule la valeur négative de "var" et utilise le résultat avec l'opérateur +.
  variable-expression ; La valeur "expression" est directement soustraite à "variable"

Opérateur * (Multiplication)

Multiplie la valeur de l'expression LHS par la valeur de RHS. Si le résultat de l'opérateur n'est pas utilisé et qu'il y a une variable LHS, alors la valeur de la variable est directement multipliée par la valeur de l'expression RHS. Cet opérateur ne peut être utilisé dans une variable de type chaine.

Exemple

  total=prix*quantite ; Multiplie la valeur de "prix" par la valeur de "quantite" et utilise le résultat avec l'opérateur =
  variable*expression ; "variable" est multiplé directement par la valeur de "expression"

Opérateur / (Division)

Divise la valeur de l'expression LHS par la valeur de l'expression RHS. Si le résultat de l'opérateur n'est pas utilisé et qu'il y a une variable LHS, alors la valeur de la variable est directement divisée par la valeur de l'expression RHS. Cet opérateur ne peut être utilisé dans les variables de type chaine.

Exemple

  quantite=total/prix ; Divise la valeur "total" par la valeur "prix" et utilise le résultat avec l'opérateur =
  variable/expression ; "variable" est directement divisé par la valeur "expression"

Opérateur & (AND est un ET logique (binaire))

Il vous faut être familiarisé avec les nombres binaires pour utiliser cet opérateur. Le résultat de cet opérateur est le résultat d'un ET logique entre les valeurs des expressions LHS et RHS, bit à bit. La valeur de chaque bit résultant est fixée comme indiqué dans la table ci-dessous. De plus, si le résultat de l'opérateur n'est pas utilisé et qu'il y a une variable LHS, alors le résultat sera directement stocké dans cette variable. Cet opérateur ne peut être utilisé avec une variable de type chaîne.
LHS | RHS |Résultat
------------------
 0  |  0  |    0
 0  |  1  |    0
 1  |  0  |    0
 1  |  1  |    1

Exemple

  ; La représentation binaire des valeurs est utilisée pour une présentation plus claire et lisible
  a.w = %1000 & %0101 ; Le résultat sera 0
  b.w = %1100 & %1010 ; Le résutlat sera %1000
  bits = a & b ; Effectue un ET bit à bit entre a et b et utilise le résultat avec l'opérateur =
  a & b ; Effectue un ET bit à bit entre a et b et place le résultat directement dans la variable "a"

Opérateur | (OR est un OU logique (binaire))

Vous devez être familiarisé avec les nombres binaires pour utiliser cet opérateur. Le résultat de cet opérateur est le résultat d'un OU logique entre les valeurs des expressions LHS et RHS bit à bit. La valeur de chaque bit résultant est fixée comme indiqué dans la table ci-dessous. De plus, si le résultat de l'opérateur n'est pas utilisé et qu'il et qu'il y a une variable LHS alors le résultat est directement stocké dans cette variable. Cet opérateur ne peut être utilisé avec une variable de type chaîne.
LHS | RHS |Résultat
------------------
 0  |  0  |    0
 0  |  1  |    1
 1  |  0  |    1
 1  |  1  |    1

Exemple

  ; La représentation binaire des valeurs est utilisée pour une présentation claire et lisible
  a.w = %1000 | %0101 ; Le résultat sera %1101
  b.w = %1100 | %1010 ; Le résultat sera %1110
  bits = a | b ; Effectue un OU bit à bit entre a et b et utilise le résultat avec l'opérateur =
  a | b ; Effectue un OU bit à bit entre a et b et place le résultat directement dans la variable "a"

Opérateur ! (XOR est un OU exclusif logique (binaire))

Vous devez être familiarisé avec les nombres binaires pour utiliser cet opérateur. Le résultat de cet opérateur est le résultat d'un OU Exclusif entre les valeurs LHS et RHS bit à bit. La valeur de chaque bit résultant est fixée comme indiqué dans la table ci-dessous. De plus, si le résultat de l'opérateur n'est pas utilisé et qu'il y a une variable LHS alors le résultat est directement stocké dans cette variable. Cet opérateur ne peut être utilisé avec une variable de type chaîne.
LHS | RHS |Résultat
------------------
 0  |  0  |    0
 0  |  1  |    1
 1  |  0  |    1
 1  |  1  |    0

Exemple

  ; La représentation binaire des valeurs est utilisée pour une présentation claire et lisible
  a.w = %1000 ! %0101 ; Le résultat sera %1101
  b.w = %1100 ! %1010 ; Le résultat sera %0110
  bits = a ! b ; Effectue un OU Exclusif bit à bit entre a et b et utilise le résultat avec l'opérateur =
  a ! b ; Effectue un OU Exclusif bit à bit entre a et b et place le résultat directement dans "a"

Opérateur ~ (NON inversion logique (binaire))

Vous devez être familiarisé avec les nombres binaires pour utiliser cet opérateur. Le résultat de cet opérateur est une inversion bit à bit de la valeur RHS. La valeur de chaque bit est fixée comme indiqué dans la table ci-dessous. Cet opérateur ne peut être utilisé avec une variable de type chaîne.
RHS |Résultat
----------
 0  |    1
 1  |    0

Exemple

  ; La représentation binaire des valeurs est utilisée pour une présentation claire et lisible
  a.w = ~%1000 ; Le résultat sera %0111
  b.w = ~%1010 ; Le résultat sera %0101

() (Parenthèses)

Vous pouvez utiliser les parenthèses pour forcer l'évaluation prioritaire d'une partie d'une expression ou modifier l'ordre d'évaluation.

Exemple

  a = (5 + 6) * 3 ; Le résultat est 33 car 5+6 est évalué en premier
  b = 4 * (2 - (3 - 4)) ; Le résultat est 12 car 3-4 est évalué en premier, ensuite 2-résultat puis la mutiplication pour finir

< (Inférieur à)

Utilisé pour comparer les valeurs des expressions LHS et RHS. Si la valeur de LHS est plus petite que la valeur de RHS cet opérateur rend un résultat vrai, sinon le résultat est faux.

> (Supérieur à)

Utilisé pour comparer les valeurs des expressions LHS et RHS. Si la valeur de LHS est plus grande que la valeur de RHS cet opérateur rend un résultat vrai, sinon le résultat est faux.

<= (Inférieur ou égal à)

Utilisé pour comparer les valeurs des expressions LHS et RHS. Si la valeur de LHS est plus petite ou égale à la valeur de RHS cet opérateur rend un résultat vrai, sinon le résultat est faux.

>= (Supérieur ou égal à)

Utilisé pour comparer les valeurs des expressions LHS et RHS. Si la valeur de LHS est plus grande ou égale à la valeur de RHS cet opérateur rend un résultat vrai, sinon le résultat est faux.

<> (Différent)

Utilisé pour comparer les valeurs des expressions LHS et RHS. Si la valeur de LHS est différente de la valeur de RHS cet opérateur rend un résultat vrai, sinon le résultat est faux.

And (ET logique)

Peut être utilisé pour combiner les résultats vrais ou faux des opérateurs de comparaison en donnant un résultat fixé comme indiqué dans la table ci-dessous.
  LHS  |  RHS  |Résultat
-----------------------
  faux |  faux |  faux
  faux |  vrai |  faux
  vrai |  faux |  faux
  vrai |  vrai |  vrai

Or (OU logique)

Peut être utilisé pour combiner les résultats vrais ou faux des opérateurs de comparaison en donnant un résultat fixé comme indiqué dans la table ci-dessous.
  LHS  |  RHS  | Résultat
-------------------------
  faux |  faux |  faux
  faux |  vrai |  vrai
  vrai |  faux |  vrai
  vrai |  vrai |  vrai

Operator XOr (OU exclusif logique)

Peut être utilisé pour combiner les résultats vrais ou faux des opérateurs de comparaison en donnant un résultat fixé comme indiqué dans la table ci-dessous.
  LHS |  RHS | Résultat
-----------------------
 faux | faux | faux
 faux | vrai | vrai
 vrai | faux | vrai
 vrai | vrai | faux

Operator Not (NON logique)

Le résultat de cet opérateur sera la négation de l'expression RHS. Cet opérateur ne fonctionne pas avec les strings.
  RHS | Résultat
----------------
 faux | vrai
 vrai | faux

Opérateur << (Décalage à gauche)

Décale vers la gauche les bits du nombre LHS de RHS places. Décaler les bits vers la gauche revient à faire une multiplication par un multiple de 2. Il est conseillé de bien comprendre les opérations binaires avant d'utiliser cet opérateur.

Exemple

  a=%1011 << 1 ; La valeur de 'a' sera %10110. (en decimal: %1011=11 et %10110=22)
  b=%111 << 4 ; La valeur de 'b' sera %1110000. (en decimal: %111=7 et %1110000=112)
  c.l=$8000000 << 1 ; La valeur de 'c' sera 0. Les bits supérieurs sont perdus car ils dépassent la capacité du type.

Opérateur >> (Décalage à droite)

Décale vers la droite les bits du nombre LHS de RHS places. Décaler les bits vers la droite revient à faire une division par un multiple de 2. Il est conseillé de bien comprendre les opérations binaires avant d'utiliser cet opérateur.

Exemple

  d=16 >> 1 ; La valeur de 'd' sera 8. (en binaire: 16=%10000 et 8=%1000)
  e.w=%10101010 >> 4 ; La valeur de 'e' sera %1010. (en décimal: %10101010=170 et %1010=10).
  f.b=-128 >> 1 ; La valeur de 'f' sera -64. -128=%10000000, -64=%11000000. Lors du décalage, le bit le plus fort reste (conservation du signe).

Opérateur % (Modulo)

Calcule le reste de la division entière de RHS par LHS.

Exemple

  a=16 % 2 ; La valeur sera 0 car 16/2 = 8 (aucun reste)
  b=17 % 2 ; La valeur sera 1 car 17/2 = 8*2+1 (reste 1)

Priorité des opérateurs

  Niveau de priorité  |    Opérateurs
  --------------------+---------------------
         8  (haute)   |      ~, -
         7            |    <<, >>, %, !
         6            |       |, &
         5            |       *, /
         4            |       +, -
         3            | >, >=, <, <=, =, <>
         2            |       Not
         1  (basse)   |   And, Or, XOr

Types structurés

Les types structurés peuvent être définis avec les options propres aux structures. Voyez le chapitre structures pour plus d'informations.

Types Pointeur

Les pointeurs sont déclarées avec un '*' devant le nom de la variable. Plus d'informations peuvent être trouvées dans le chapitre pointeurs.

Informations concernant les nombres flottants

Un nombre flottant est stocké de telle manière que la 'virgule flotte' autour de la partie réelle. De la sorte, il est possible d'avoir des nombres dont la valeur peut être aussi bien grande que petite. Toutefois vous ne pouvez pas stocker de grands nombres avec une précision aussi élevée que des petits nombres.

Une autre limitation concernant les nombres flottants est qu'ils restent concrètement représentés sous une forme binaire. Ainsi, ils ne peuvent être restitués qu'à partir de multiples et de divisions en base 2. Celà est important pour comprendre que la représentation décimale lors de l'affichage ou du calcul n'est pas tout à fait identique à ce que l'on peut attendre dans une représentation humaine. Représenter 0.5 ou 0.125 est simple car ce sont des divisions parfaites de 2, cela est plus complexe pour des nombres comme 0.11 ou 0.10999999. L'affichage approché de la valeur est toujours correct à un nombre limité de décimales, mais ne soyez pas surpris si au-delà le nombre affiché s'écarte de la valeur que vous attendez!

Ces remarques s'appliquent aux nombres flottants traités par ordinateur d'une manière générale et non spécifiquement à Purebasic.

Comme leur nom l'indique, les 'doubles' sont des flottants 'double-precision' (64-bit) comparativement aux flottants 'simple-precision' que sont les floats (32-bit). Donc, pour avoir plus de précision dans la manipulation des nombres à virgule, il est préférable d'utiliser les 'doubles'.

Pour plus d'information sur le format 'IEEE 754', consulter l'article Wikipedia.


Utiliser l'éditeur visuel

Généralités

L'éditeur visuel de PureBasic (concepteur d'interfaces graphiques utilisateur) a été créé pour le langage de programmation PureBasic et est bien sûr développé en PureBasic. Il deviendra de plus en plus puissant et supportera les fonctionnalités avancées tels que les boites de dialogue, l'édition de gadgets à partir de fichiers sources PureBasic, etc...

Utilisation

L'éditeur visuel est fourni avec son propre fichier d'aide. Vous le trouverez dans votre répertoire PureBasic, il s'agit du fichier "Visual Designer.chm".


While : Wend

Syntax
While <expression>
  ...
Wend
Description
While produit une boucle jusqu'à ce que l'expression devienne fausse. Il est à noter qu'avec le test accompagnant While, si la première tentative échoue, le programme n'entrera pas dans la boucle et évitera donc cette section de code contrairement à une boucle Repeat qui est toujours exécutée au moins une fois (car le test est effectué en sortie de code conditionnel).

Exemple

  b = 0
  a = 10
  While a = 10
    b = b+1
    If b=10
      a=11
    EndIf
  Wend
Ce programme boucle jusqu'à ce que la valeur "a" devienne différente de 10. La boucle sera donc exécutée 10 fois.


Gestion des messages Windows

Introduction

Les messages de votre programme seront transférés par Windows dans une file d'attente, qui est traitée uniquement si vous le désirez. Windows transmet un millier de messages à votre programme sans avertissement direct.

Par exemple si vous changez le statut d'un gadget (que ce soit en ajoutant une saisie ou en changeant l'image d'un ImageGadget), un message est envoyé à la file d'attente de votre programme.

Il y a deux possibilités de récupérer et de traiter les messages Windows dans PureBasic : WaitWindowEvent() and WindowEvent(). La différence est, que WaitWindowEvent() attend qu'un message arrive alors que WindowEvent() permet de continuer à travailler. Les messages dans la file d'attente ne seront cependant traités qu'après l'appel à WindowEvent() ou WaitWindowEvent().

Spécificités de WindowEvent()

La commande WindowEvent() n'attend pas, qu'un message arrive, mais vérifie seulement s'il y en a un dans la file d'attente. Si Oui, le message est traité et WindowEvent() renvoie le numéro du message. Si aucun message n'est dans la file, alors zéro (0) est renvoyé.

Exemple

  While WindowEvent() : Wend
Fait en sorte, que WindowEvent() soit appelée tant qu'elle ne renvoie pas 0, c'est à dire jusqu'à ce que tous les messages de la file d'attente soient traités

Insérer un simple 'WindowEvent()' après un SetGadgetState() ne suffit pas pour traiter ce message en particulier. Premièrement il peut toujours y avoir d'autres messages dans la file d'attente, qui sont arrivés auparavant, et deuxièmement Windows envoie également un nombre conséquent d'autres messages, dont nous n'avons que faire... mais qui néanmoins sont dans la file d'attente.

Un simple appel à
  WindowEvent()
ne suffit pas, le programme peut fonctionner correctement dans certaines circonstances sur une version de Windows, mais pas sur une autre version. Les différentes versions de Windows ont un fonctionnement interne tellement spécifique, qu'une version envoie seulement 1 message mais une autre version peut envoyer 5 messages pour le même cas de figure. .

A cause de cela, on utilise toujours pour la mise à jour :
  While WindowEvent() : Wend
Bien sûr il y a aussi l'alternative
  Repeat : Until WindowEvent() = 0
possible, qui n'est cependant pas très courante.

La méthode While WindowEvent() : Wend est fréquemment utilisée avec la commande Delay(), lorsqu'une une boucle est insérée AVANT le Delay(), par exemple pour attendre que la mise à jour d'un ImageGadget soit effective, après avoir changé une image avec SetGadgetState().


With : EndWith

Syntax
With <expression>
  ...
EndWith
Description
Le bloc With : EndWith permet de réduire la quantité de code à saisir et améliore sa lisibilité quand beaucoup de champs d'une structure doivent être renseignés. L'<expression> spécifiée sera automatiquement insérée avant chaque caractère anti-slash '\' qui suit un espace ou un opérateur. C'est une directive de compilateur qui fonctionne de la même manière qu'une macro: la ligne complète est recréée lors de la compilation, puis elle est traitée. Les blocs With : EndWith ne peuvent pas être imbriqués, car cela pourrait générer des bugs difficiles à résoudre.

Exemple

  Structure Personne
    Nom$
    Age.l
    Taille.l
  EndStructure

  Ami.Personne

  With Ami
    \Nom$ = "Yann"
    \Age   = 30
    \Taille  = 196

    Debug \Taille+\Taille
  EndWith

Exemple

  Structure Corps
    Poids.l
    Couleur.l
    Texture.l
  EndStructure

  Structure Personne
    Nom$
    Age.l
    Corps.Corps[10]
  EndStructure

  Ami.Personne

  For k = 0 To 9
    With Ami\Corps[k]
      \Poids = 50
      \Couleur  = 30
      \Texture = \Couleur*k

      Debug \Texture
    EndWith
  Next


SoundFrequency()

Syntaxe

SoundFrequency(#Son, Frequence [, Canal])
Description
Change la fréquence (en Hz), en temps réel, à laquelle est joué le #Son. La nouvelle fréquence devient la nouvelle fréquence par défaut du #Son. Les valeurs valides pour la fréquences vont de 1000 à 100000 Hz.

'Canal' est facultatif et spécifie sur quel canal la fréquence doit être modifiée. Un 'Canal' indépendant est créé quand PlaySound() est utilisé en conjonction avec #PB_Sound_MultiChannel.

OS Supportés

Windows