Entwickler-Ecke

Windows API - Wallpaper ändern /Zentrieren / Kacheln / Strecken


patmann2001 - Di 15.10.02 17:27
Titel: Wallpaper ändern /Zentrieren / Kacheln / Strecken
Ich verwende eine Function

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function bild_wechsel(dateiname:STRING):BOOLEAN;
BEGIN
   if NOT SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, Pointer (dateiname), SPIF_SENDWININICHANGE) 
    then begin
     Result:=false;
    end ELSE
    BEGIN
     Result := true;
    END;
 end;

Damit ändere ich das Hintergrundbild. Leider wird der Name des Bildes nicht in der Liste sichtbar, die man bekommt wenn man die Eigenschaften des Desktops aufruft. Auch kann ich es leider dort nicht Kacheln oder Strecken.
Wie komme ich da ran und wie schreibe ich diese Daten in die Eigenschaften?

cu Patmann


Anonymous - Di 15.10.02 17:49

Hier einige Prozeduren die ich mal geschrieben habe:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
{Ermittelt Pfad des Hintergrundbildes und die Anzeigeart. }
procedure GetWallpaperSystem(var sWallpaper: String; var bTile, bStrech: Boolean);
var
  Reg : TRegIniFile;
  sTemp: String;
begin
  Reg := TRegIniFile.Create('Control Panel\Desktop');
  with Reg do
  begin
    sWallpaper := ReadString('', 'Wallpaper', '');
    sTemp := ReadString('', 'TileWallpaper', '0');
    if sTemp = '1' then bTile := True else bTile := False;
    sTemp := ReadString('', 'WallpaperStyle', '0');
    if sTemp = '2' then bStrech := True else bStrech := False;
  end;
  Reg.Free;
end;

{Wechselt das Hintergrundbild und Anzeigeart}
procedure SetWallpaperSystem(sWallpaper: String; bTile, bStrech: Boolean);
var
  Reg : TRegIniFile;
begin
  Reg := TRegIniFile.Create('Control Panel\Desktop');
  with Reg do
  begin
    WriteString('', 'Wallpaper', sWallpaper);

    if bTile then WriteString('', 'TileWallpaper', '1')
             else WriteString('', 'TileWallpaper', '0');
    if bStrech then WriteString('', 'WallpaperStyle', '2')
               else WriteString('', 'WallpaperStyle', '0');
  end;
  Reg.Free;

  //Aktualisiert das Hintergrundbild
  SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, nil, SPIF_SENDWININICHANGE);

  Application.ProcessMessages;
end;


/EDIT

Sehe gerade, daß die die Objekte nicht durch try..finally geschützt sind. Kann hier zwar nichts passieren, aber bevor das einer bemängelt mach ich das lieber ;)


patmann2001 - Di 15.10.02 17:56

Danke 8)
Das Hilft weiter
cu Patmann


patmann2001 - Di 15.10.02 18:51

Mist geht doch nicht :?
Wenn ich ein Bild habe, das gekachelt war und dann ein Bild haben möchte, das Zentiert ist, dann geht das nicht.
Es bleibt gekachelt.
Ich habe Win2000.
Was mache ich falsch.
Ansonsten geht alles.
Kann man die Registry vieleicht neu starten oder so?

cu Patmann


Anonymous - Di 15.10.02 19:52

Die Prozeduren hab ich schon seit Monaten bei einem Programm im Gebrauch und sie funktioneren. Allerdings hab ich bis jetzt nur mit 9x getestet. Es könnte auch sein, daß du mit den Boolean's falsch umgehst:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
//Bild zentrieren
SetWallpaperSystem('c:\windows\1stboot.bmp', false, false);

//Bild zentrieren und strecken
SetWallpaperSystem('c:\windows\1stboot.bmp', false, true);

//Bild kachen
SetWallpaperSystem('c:\windows\1stboot.bmp', true, false);


Wäre schön wen jemand anders das unter anderen Windows Versionen testen könnte. Es kann sein, daß sich die Bedeutung der Schlüssel geänder hat.


patmann2001 - Mi 16.10.02 04:30

Hi
Ich hatte schon verstanden wie das geht, doch nachdem ich jetzt auch mal Strecken ausprobiert habe, bemerke ich, das es leider damit auch nicht geht. Das einzigste was sicher klappt ist kacheln.
Vieleicht weiss jemand anderes Rat.

cu Patmann


patmann2001 - Mi 16.10.02 04:38

Grrrr :oops:
Ich habe da was nicht richtig übernommen. :oops:
Natürlich funktioniert Deine Procedure auch unter 2000.
Alles Klar und Danke nochmal 8)

cu Patmann


Chatfix - Sa 09.11.02 22:06

also ich nutze die procedure zum wecheln auch, aber unter xp kommt dann lediglich die eingestellte hintergrundfarbe..

wenn ich nun auf eigenschaften gehe hat er das wallpaper, ich denke mal der nimmts auf aber aktualisiert den desktop irgendwie nicht..

geht auch nicht wenn ich den desktop aktualisier (F5)


Chatfix - So 10.11.02 13:27

ok funzt doch... man muss nur ein BMP und kein JPG nehmen... vllt könntest du in deinem FAQ noch mit einnehmen das man ggf jpegs in bmps umwandeln muss....


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
procedure BMPtoJPG(FileName :String); 
var BMP : TBitmap; 
    JPG : TJpegImage; 
begin 
     BMP := TBitmap.Create; 
     JPG := TJpegImage.Create; 
     BMP.LoadFromFile(FileName); 
     JPG.Assign(BMP.Picture.Bitmap); 
     // Hier könnt ihr noch die Eigenschaften ändern 
     JPG.SaveToFile(ChangeFileExt(Filename,'.jpg')); 
     JPG.Free; 
     BMP.Free; 
end;

procedure JPEGtoBMP(FileName : string);
var jpeg : TJPEGImage; 
    bmp : TBitmap; 
begin 
     jpeg:= TJPEGImage.Create; 
     try 
        jpeg.LoadFromFile(FileName ); 
        jpeg.CompressionQuality := 100; {Normaler Wert, kann weggelassen werden} 
        bmp:= TBitmap.Create; 
        try 
            bmp.Assign(jpeg); 
            bmp.SaveTofile(ChangeFileExt(Filename,'.bmp')); 
        finally 
               bmp.free 
        end; 
     finally 
            jpeg.free 
    end; 
end;