[api windows] horloge digitale transparente sur le bureau

Soyez le premier à donner votre avis sur cette source.

Vue 16 163 fois - Téléchargée 1 871 fois

Description

Ce code utilisant l'API windows (d'ou la taille extrèmement réduite de l'executable final) vous permet d'afficher l'heure sur le bureau avec des caractères de type LCD en transparence...
Ecrit au départ avec freepascal, vous trouverez la source pour delphi dans le repertoire Delphi...

J'ai choisi d'utiliser la decoupe de ma form pour afficher les caractères en transparence sur le bureau...
Je n'ai ainsi pas besoin de gérer le rafraichissement de l'image, et le déplacement de celle-ci devient simple...

Dans l'espoir que ce code servira à certains...

Clandestino

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_clandestino
Messages postés
16
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
11 novembre 2004

C'est de la programmation utilisant l'api windows... donc ça marche sous....
Nerolph
Messages postés
58
Date d'inscription
vendredi 24 octobre 2003
Statut
Membre
Dernière intervention
4 septembre 2012

Et ça marche sous quel OS ?
cs_clandestino
Messages postés
16
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
11 novembre 2004

great :)
yvemoreau
Messages postés
320
Date d'inscription
mardi 11 juin 2002
Statut
Membre
Dernière intervention
26 septembre 2008

pour le constante,sendmessage(hwindow,274,61458,0) c'est simplement
parce que j'ai supprimer dans un autre code
uses windows;

ce qui impliquait de ne plus utiliser les const de ce fichier
et de réimporter les fonction gdi.dll user32.dll et autres
et comme le résultat est le même (ce qui prouve encore une fois la très grande efficacité du compilateur),d'importer les type,enfin tout ce travail environ 2 heure à chercher ,copier,coller, transposer ,remanipuler les record pour en faire de type params semblabe acceptable etc...

le compilateur étant ce qu'il est ,une constante ne doit donc pas être supprimer,puisque nous pouvons en debug time en connaître la signification, ici j'avais précalculé (Ws_machin or Ws_overlapped)or ws_visible)ce qui donnait un cardinal ...il n'y a donc aucun gain d'espace dans ce cas ,la valeur étant affecté directement .Difficile en effet de voir où une grande ligne de code n'occupera qu'en fait un byte ? peut-être pas tant que ça ...j'ai télécharger dernièrement un soft qui lis les exe ou les dll et qui les recompile ,permettant de voir les exportations,les entrées,mais on en revient à la base de l'asm.Ce soft n'est pas gratuit (démo 30 jours)il s'applelle PE Explorer.

Pour nous nous avons accès au code asm en utilisant la commande voir/fenêtres de débogage/cpu

donc à la lecture du code
procedure affichage;
je crois qu'ici il y aurait moyen de simplifier encore ,
procedure affichage;
var
points:packed array [0..5] of tpoint;
R1, R2 : Cardinal;
led:Byte;
Procedure point(aa:byte;bb:byte;cc:byte);
begin
points[aa].x:=bb+4;
points[aa].y:=cc+30;
End;
Procedure Setpoint(num,led,a1,a2,a3,a4,a5,a6:byte);
begin
Point( 0, valeur[num,led,0] ,a1 );
Point( 1, valeur[num,led,1] ,a2 );
Point( 2, valeur[num,led,2] ,a3 );
Point( 3, valeur[num,led,3] ,a4 );
Point( 4, valeur[num,led,4] ,a5 );
Point( 5, valeur[num,led,5] ,a6 );
R2:=CreatePolygonRgn(Points[0],6,2);
CombineRgn(R1,R1,R2,3);
deleteobject(R2);
end;
begin
R1 := CreateRectRgn(0,0,0,0);
for led :=1 to 4 do begin
if chiffre[led].A = 1 then Setpoint(1,led,4,1,1,4,7,7);
if chiffre[led].B = 1 then Setpoint(2,led,5,8,30,33,30,8);
if chiffre[led].C = 1 then Setpoint(3,led,5,8,30,33,30,8);
if chiffre[led].D = 1 then Setpoint(1,led,34,31,31,34,37,37);
if chiffre[led].E = 1 then Setpoint(2,led,35,38,60,63,60,38);
if chiffre[led].F = 1 then Setpoint(3,led,35,38,60,63,60,38);
if chiffre[led].G = 1 then Setpoint(1,led,64,61,61,64,67,67);
end;

if clignot=1 then begin
Point( 0, 86 ,19 );
Point( 1, 92 ,19 );
Point( 2, 92 ,24 );
Point( 3, 86 ,24 );
R2:=CreatePolygonRgn(Points[0],4,2);
CombineRgn(R1,R1,R2,3);
Point( 0, 86 ,43 );
Point( 1, 92 ,43 );
Point( 2, 92 ,48 );
Point( 3, 86 ,48 );
R2:=CreatePolygonRgn(Points[0],4,2);
CombineRgn(R1,R1,R2,3);
deleteobject(R2);end;
SetWindowRgn(hwindow,R1,TRUE);
deleteobject(R1);
end;

quelques octets de gagner mais bon !!!
cs_clandestino
Messages postés
16
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
11 novembre 2004

Le portage de ta source sous freepascal m'a obligé à quelques modifications mineures, et notemment la fonction miseajour...

Je n'avais pas réussi à la definir directement dans la création du timer, ce qui m'obligeait à gerer un evènement WM_TIMER..

En effet, contrairement à Delphi (plus tolérent !!) freepascal refuse de compiler la ligne
Settimer(hwindow,1,500,@miseajour);

si miseajour n'a pas une structure Timerproc stricte
j'ai du donc modifier ainsi
miseajour(a:HWND; b:ulong; c:ulong, d:ulong);

et faire mes appels de la manière suivante

miseajour(hwindow,0,0,0);

Merci, c'est grace à toi que je me suis repenché sur le problème et que j'ai compris la solution...

Clan

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.