Utilisation des régions et des données de ressource
Nouveaux concepts:

Régions et utilisation de RGN Generator
Utilisation des données de ressource brutes
Utilisation d'une brosse
Réponse à un double-clic du bouton gauche de la souris

Nouvelles fonctions API:

LoadBitmap
CreatePatternBrush
FindResource
LoadResource
SizeofResource
LockResource
ExtCreateRegion
SetWindowRegion
DeleteObject

 


Ce tutoriel illustre comment les régions complexes utilisées pour créer des formes de fenêtres personnalisées, peuvent être appliquées à nos keygens et patches, offrant ainsi une démonstration pratique du concept.

La plupart des tutoriels existants sur les formes de fenêtre personnalisées et les régions, les appliquent aux applications avec fenêtres complètes. Ici, je n'ai pas pu penser à un exemple lié au cracking, donc j'ai adapté le tutoriel numéro 25 d'Iczelion (voir la section des références) pour montrer comment cela peut être appliqué à une boîte de dialogue simple pour notre style de programmation rapide et facile.

Pour créer une fenêtre ou une boîte de dialogue avec une forme personnalisée complexe, nous devons définir une région pour le contour de notre forme, puis définir la région pour la fenêtre. Une région est un rectangle, un polygone ou une ellipse (ou une combinaison de deux ou plusieurs de ces formes) qui peut être rempli, peint, inversé, encadré et utilisé pour effectuer des tests de localisation (tests pour la position du curseur).

Il existe des fonctions API pour créer des régions simples (rectangulaires, elliptiques ou polygonales) et combiner ces régions ensemble. Si nous voulons une forme plus complexe, nous devons utiliser une région étendue. L'API de création d'une région étendue prend un pointeur vers un bloc de données de région :

HRGN ExtCreateRegion(
CONST XFORM *lpXform, // pointeur vers les données de transformation
DWORD nCount, // taille de la structure contenant les données
CONST RGNDATA *lpRgnData // pointeur vers les données de la région
);

Ces données de région consistent en un grand nombre (plusieurs centaines) de régions rectangulaires combinées pour définir notre forme complexe. Heureusement, nous n'avons pas à calculer ces données de région nous-mêmes, car il existe un utilitaire appelé Region Generator par Richard D'Oude qui le fera pour nous et produira les données sous la forme d'un fichier avec l'extension .rgn, qui peut être inclus dans notre exécutable en tant que ressource.

Pour utiliser les données de ressource, nous devons trouver la ressource, charger la ressource, trouver la taille de la ressource et enfin verrouiller la ressource. Cela nous laisse un pointeur vers les données de la ressource en mémoire, qui peut ensuite être utilisé par notre programme.
 


Tout d'abord, nous devons préparer une image bitmap en choisissant la zone que nous souhaitons rendre transparente et en la remplissant d'une couleur particulière. Cela peut être fait dans n'importe quel éditeur de photos. J'ai utilisé l'exemple du tutoriel d'Iczelion (tweety78.bmp) qui est inclus dans les fichiers de ressources.

Ensuite, nous devons produire nos données de région. Lancez RGN Generator, cliquez sur Parcourir pour sélectionner l'image bitmap, puis cliquez sur Sélectionner pour ouvrir le sélecteur de couleur. Vous verrez 2 carrés à droite - le carré supérieur indique la couleur qui sera actuellement transparente (par défaut, c'est le noir) et le carré inférieur est la couleur indiquée par la pipette (pointeur de la souris). Déplacez la souris sur une zone rose, faites un clic droit pour sélectionner le rose comme couleur transparente. Enfin, cliquez sur OK, puis sur Créer et enregistrez votre fichier de région sous le nom de region.rgn:

1

Démarrez WinAsm comme d'habitude et créez un nouveau projet et des scripts de ressources. Dans le nouveau script de ressources, ajoutez une boîte de dialogue et redimensionnez-la suffisamment pour contenir l'image bitmap. Ensuite, modifiez les styles de sorte que seuls les styles WS_POPUP, WS_VISIBLE et DS_CENTER soient définis. Ajoutez un petit bouton carré avec un "?" comme légende. Le bouton doit être placé sur une partie non transparente de l'image, sinon il ne sera pas visible - cela peut nécessiter quelques expérimentations pour le positionner correctement car vous ne pouvez pas voir l'arrière-plan de l'image pour le moment. Dans ce cas, il se trouve juste au-dessus de la cheville de Bugs Bunny :

1

L'autre alternative serait d'ajouter l'image d'un bouton sur l'image bitmap, comme nous l'avons fait dans le dernier tutoriel. Ensuite, ajoutez l'image bitmap et le fichier de région en tant que ressources supplémentaires, mais ne leur donnez pas de noms. Dans ce cas, l'ID de la bitmap est 2001 et les données de la région ont l'ID 2002. Le script de ressources et le fichier asm (region.rc et region.asm) sont inclus comme d'habitude dans la section des codes sources. Collez le fichier asm :

1

Ce qui précède devrait être assez explicite, mais notez que nous avons une variable non initialisée prête à traiter les données de ressource et une brosse (arrière-plan de l'image). La procédure de la boîte de dialogue est la suivante :

1

La première nouvelle ligne utilise LoadBitmap qui prend l'ID de ressource de notre bitmap (2001) et renvoie un Handle vers celle-ci que nous pouvons transmettre à CreatePatternBrush. Une brosse de motif (pattern brush) est simplement une bitmap que le système d'exploitation peut utiliser pour peindre l'intérieur des formes remplies. CreatePatternBrush renvoie un Handle vers la brosse (bitmap) que nous stockons dans une variable pour une utilisation ultérieure. Pour peindre notre boîte de dialogue avec cette brosse, nous devons répondre au message WM_CTLCOLORDLG et renvoyer le Handle de notre brosse. Le message WM_CTLCOLORDLG est envoyé à une boîte de dialogue avant que le système ne la dessine, afin de permettre de définir ses couleurs de texte et de fond.

Nous avons ajouté nos données de région à l'exécutable en tant que données de ressource brutes. Pour les appliquer à notre boîte de dialogue, nous devons d'abord créer une région de fenêtre étendue, puis la définir pour notre boîte de dialogue. Pour créer une région étendue, nous utilisons ExtCreateRegion qui prend un pointeur vers nos données de région et leur taille, puis renvoie un Handle vers la région étendue terminée que nous transmettons ensuite à SetWindowRegion.

Pour accéder à nos données de région, nous devons trouver la ressource à partir de son ID. Nous pouvons ensuite trouver la taille, la charger et la verrouiller pour obtenir un pointeur vers les données comme indiqué ci-dessus. Le pointeur et la taille peuvent ensuite être transmis à ExtCreateRegion, comme déjà mentionné.

C'est la façon standard d'accéder aux données de ressource et cela ne dépend pas du type de données en question. Si nous avions inclus notre chiptune en tant que données de ressource brutes dans le dernier tutoriel, nous y accéderions exactement de la même manière.

Comme il n'y a pas de bouton de fermeture pour notre fenêtre, il serait peu élégant de devoir la fermer en appuyant sur Alt+F4, nous permettrons donc de la fermer en effectuant un double-clic sur le bouton gauche de la souris. Cela est réalisé en traitant le message WM_LBUTTONDBLCLK comme indiqué ci-dessus.

 


Copyright (C)- xtx Team (2021)

XHTML valide 1.1 CSS Valide !