blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 20 sept. 2008 à 18:28
S'il y avait une voie à explorer, ce serait, selon moi, du côté de Active Desktop (les éléments Web de la Personalisation du Bureau)....
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 19 sept. 2008 à 19:22
Hmm ...
Pourquoi pas essayer de récupérer le Handle de Explorer.exe, et puis un EnumWindows pour récuperer le handle du canevas de fond d'écran ... Et on agit pareil qu'avec les handles de "DesktopWindow" ??
J'essayerai dès que possible.
Cordialement, Bacterius !
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 19 sept. 2008 à 19:07
en quelque sorte...
Un live wallpaper !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 19 sept. 2008 à 18:55
Tu veux dire prendre comme canevas le fond d'écran et non pas le moniteur ?
Cordialement, Bacterius !
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 19 sept. 2008 à 18:53
oups : 'tu déplae' à lire 'tu déplaces"
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 19 sept. 2008 à 18:52
Le vrai problème avec un TCanvas pointant sur le Desktop, c'est de conserver l'affichage (dès que tu déplae une icône ou une fenêtre, ça part à l'ouest...
Si tu as une idée pour considérer le Desktop comme un WallPaper, ce serait pas plus mal...
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 19 sept. 2008 à 17:10
Erf f0xi je n'ai pas les unités GdiPClasses et GdiPApi.
Je cherche ...
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 19 sept. 2008 à 17:05
Bonjour,
tout d'abord merci pour vos commentaires.
@Cirec : oui maintenant que je m'en rends compte il est vrai que c'est un peu léger pour une source ... j'aurai pu au moins mettre un exemple ... quelle honte :'(
Tu pourras quand même me laisser mettre le singleton (et eventuellement la démo) avant de faire disparaître la source :} ?
j'ai réinstallé mon OS et pas encore lissé les polices d'écran ce qui m'a fait prendre une parenthèse "()" pour une accolade "{}" .. ceci et ce que JulioDelphi a dit a fait que j'ai pris ce code pour autre chose que du Delphi ... bouhouououuuu.
Désolé BluePerfect .. ton code a donc bien sa place ici ;)
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 19 sept. 2008 à 13:21
Conclusion:
Voilà : et ???? ;P
améliorations : Voir commentaires de Cirec
bugs : En si peu de lignes, ça m'étonnerait quand même ;)
conseils : Fournit au moins un programme qui l'utilise ton composant.
optimisations : Pas la peine de perdre du temps dans ce cas précis.
remarques : Nécéssité d'un tel composant ???
Cordialement.
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 19 sept. 2008 à 13:11
Hop, je t'ajoute la GDI+ (Désactivable) et le code pour le SingleTon (Désactivable).
on passe de TComponent a TCanvas, car inutile d'avoir TComponent.
{$DEFINE DESKTOPCANVAS_USEGDIPLUS} // active la GDI+
{$DEFINE DESKTOPCANVAS_ASSINGLETON} // active le mode Singleton
class function TDesktopCanvas.NewInstance: TObject;
begin
if __DesktopCanvasSingleInstance = Nil then
begin
__DesktopCanvasSingleInstance := TDesktopCanvas(inherited NewInstance);
Result := __DesktopCanvasSingleInstance;
end
else
raise Exception.Create(ClassName + ' : This object is used at singleton.');
end;
{$ENDIF}
{ TDesktop }
constructor TDesktop.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
fDesktopCanvas := TDesktopCanvas.Create;
end;
destructor TDesktop.Destroy;
begin
fDesktopCanvas.Free;
inherited Destroy;
end;
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 19 sept. 2008 à 11:38
Ouais, ça j'avoue, les '_' me viennent du C++, et l'indentation du Lyçée...
Ceci dit, l'approche singleton n'et pas mauvaise non-plus, mais C du Windows, alors que ma fonction s'appuie sur la VCL...
DH
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 19 sept. 2008 à 09:09
Cirec ? T'es pas réveillé ? le code blue est clairement du delphi :] Peut etre es tu troublé par les "_" et/ou une indentation excessive mais c'est du pascal ^^
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 19 sept. 2008 à 01:47
Heuuu....
Pourtant mon code, c'est du Pascal....
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 18 sept. 2008 à 23:40
Voici une fonction dont tu pourrais t'inspirer pour l'unicité de ton composant !
class function TAbstract.IsUniqueOfThisClass( _universe:TComponent;
_class:TClass
):Boolean;
var _each:Integer;
_stack:TComponent;
begin
Result := True;
if Assigned(_universe)
then begin
_stack := _universe;
while not( _stack.InheritsFrom(TForm)
or _stack.InheritsFrom(TDataModule)
)
and Assigned(_stack.Owner)
do _stack := _stack.Owner;
_each := 0;
while not(Result)
and (_each < _stack.ComponentCount)
do if _stack.Components[_each].InheritsFrom(_class)
then Result := False
else _each := _each + 1;
end;
end;
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 18 sept. 2008 à 21:34
20 sept. 2008 à 18:28
19 sept. 2008 à 19:22
Pourquoi pas essayer de récupérer le Handle de Explorer.exe, et puis un EnumWindows pour récuperer le handle du canevas de fond d'écran ... Et on agit pareil qu'avec les handles de "DesktopWindow" ??
J'essayerai dès que possible.
Cordialement, Bacterius !
19 sept. 2008 à 19:07
Un live wallpaper !
19 sept. 2008 à 18:55
Cordialement, Bacterius !
19 sept. 2008 à 18:53
19 sept. 2008 à 18:52
Si tu as une idée pour considérer le Desktop comme un WallPaper, ce serait pas plus mal...
19 sept. 2008 à 17:10
Je cherche ...
Cordialement, Bacterius !
19 sept. 2008 à 17:05
tout d'abord merci pour vos commentaires.
@Cirec : oui maintenant que je m'en rends compte il est vrai que c'est un peu léger pour une source ... j'aurai pu au moins mettre un exemple ... quelle honte :'(
Tu pourras quand même me laisser mettre le singleton (et eventuellement la démo) avant de faire disparaître la source :} ?
Cordialement, Bacterius !
19 sept. 2008 à 15:07
j'ai réinstallé mon OS et pas encore lissé les polices d'écran ce qui m'a fait prendre une parenthèse "()" pour une accolade "{}" .. ceci et ce que JulioDelphi a dit a fait que j'ai pris ce code pour autre chose que du Delphi ... bouhouououuuu.
Désolé BluePerfect .. ton code a donc bien sa place ici ;)
19 sept. 2008 à 13:21
Voilà : et ???? ;P
améliorations : Voir commentaires de Cirec
bugs : En si peu de lignes, ça m'étonnerait quand même ;)
conseils : Fournit au moins un programme qui l'utilise ton composant.
optimisations : Pas la peine de perdre du temps dans ce cas précis.
remarques : Nécéssité d'un tel composant ???
Cordialement.
19 sept. 2008 à 13:11
on passe de TComponent a TCanvas, car inutile d'avoir TComponent.
{$DEFINE DESKTOPCANVAS_USEGDIPLUS} // active la GDI+
{$DEFINE DESKTOPCANVAS_ASSINGLETON} // active le mode Singleton
{$IFDEF DESKTOPCANVAS_USEGDIPLUS}
uses GdipApi, GdipClass;
{$ENDIF}
type
TDesktopCanvas = class(TCanvas)
private
fDesktopHandle: HWND;
fDesktopHDC : HDC;
{$IFDEF DESKTOPCANVAS_USEGDIPLUS}
fGPGraphics : TGPGraphics;
fGPPen : TGPPen;
fGPBrush : TGPSolidBrush;
{$ENDIF}
protected
procedure CreateHandle; override;
public
{$IFDEF DESKTOPCANVAS_USEGDIPLUS}
property GPGraphics : TGPGraphics read fGPGraphics;
property GPPen : TGPPen read fGPPen;
property GPSolidBrush: TGPSolidBrush read fGPBrush;
{$ENDIF}
property DesktopHandle: HWND read FDesktopHandle;
public
{$IFDEF DESKTOPCANVAS_USEGDIPLUS}
constructor Create(const Compositing: CompositingQuality = CompositingQualityDefault;
const Smooth : SmoothingMode = SmoothingModeAntiAlias); reintroduce;
{$ELSE}
constructor Create; reintroduce;
{$ENDIF}
destructor Destroy; override;
{$IFDEF DESKTOPCANVAS_ASSINGLETON}
class function NewInstance: TObject; override;
procedure FreeInstance; override;
{$ENDIF}
end;
TDesktop = class(TComponent)
private
fDesktopCanvas : TDesktopCanvas;
public
property DesktopCanvas : TDesktopCanvas read fDesktopCanvas;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
{$IFDEF DESKTOPCANVAS_ASSINGLETON}
var
__DesktopCanvasSingleInstance : TObject = nil;
{$ENDIF}
{$IFDEF DESKTOPCANVAS_USEGDIPLUS}
constructor TDesktopCanvas.Create(const Compositing: CompositingQuality = CompositingQualityDefault;
const Smooth : SmoothingMode = SmoothingModeAntiAlias);
begin
inherited Create;
fDesktopHandle := GetDesktopWindow;
fDesktopHDC := GetWindowDC(fDesktopHandle);
Handle := fDesktopHDC;
fGPGraphics := TGPGraphics.Create(Handle);
fGPGraphics.SetCompositingQuality(Compositing);
fGPGraphics.SetSmoothingMode(Smooth);
fGPPen := TGPPen.Create(aclBlack);
fGPBrush := TGPSolidBrush.Create(aclWhite);
end;
{$ELSE}
constructor TDesktopCanvas.Create;
begin
inherited Create;
fDesktopHandle := GetDesktopWindow;
fDesktopHDC := GetWindowDC(fDesktopHandle);
Handle := fDesktopHDC;
end;
{$ENDIF}
procedure TDesktopCanvas.CreateHandle;
begin
if Handle <> fDesktopHDC then
Handle := fDesktopHDC;
end;
destructor TDesktopCanvas.Destroy;
begin
{$IFDEF DESKTOPCANVAS_USEGDIPLUS}
fGPBrush.Free;
fGPPen.Free;
fGPGraphics.Free;
{$ENDIF}
ReleaseDC(fDesktopHandle, Handle);
inherited Destroy;
end;
{$IFDEF DESKTOPCANVAS_ASSINGLETON}
procedure TDesktopCanvas.FreeInstance;
begin
inherited FreeInstance;
__DesktopCanvasSingleInstance := Nil;
end;
class function TDesktopCanvas.NewInstance: TObject;
begin
if __DesktopCanvasSingleInstance = Nil then
begin
__DesktopCanvasSingleInstance := TDesktopCanvas(inherited NewInstance);
Result := __DesktopCanvasSingleInstance;
end
else
raise Exception.Create(ClassName + ' : This object is used at singleton.');
end;
{$ENDIF}
{ TDesktop }
constructor TDesktop.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
fDesktopCanvas := TDesktopCanvas.Create;
end;
destructor TDesktop.Destroy;
begin
fDesktopCanvas.Free;
inherited Destroy;
end;
19 sept. 2008 à 11:38
Ceci dit, l'approche singleton n'et pas mauvaise non-plus, mais C du Windows, alors que ma fonction s'appuie sur la VCL...
DH
19 sept. 2008 à 09:09
19 sept. 2008 à 01:47
Pourtant mon code, c'est du Pascal....
18 sept. 2008 à 23:40
class function TAbstract.IsUniqueOfThisClass( _universe:TComponent;
_class:TClass
):Boolean;
var _each:Integer;
_stack:TComponent;
begin
Result := True;
if Assigned(_universe)
then begin
_stack := _universe;
while not( _stack.InheritsFrom(TForm)
or _stack.InheritsFrom(TDataModule)
)
and Assigned(_stack.Owner)
do _stack := _stack.Owner;
_each := 0;
while not(Result)
and (_each < _stack.ComponentCount)
do if _stack.Components[_each].InheritsFrom(_class)
then Result := False
else _each := _each + 1;
end;
end;
18 sept. 2008 à 21:34
Cordialement, Bacterius !