IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Appliquer le papier peint en direct !


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut Appliquer le papier peint en direct !
    Bonjour à toutes et à tous,

    J'ai une procédure pour charger des images aux différents formats.

    J'applique un cadre de couleur.

    Puis je sauve le résultat dans le répertoire adéquat.

    Tout cela fonctionne, mais dès que je veux tester en utilisant cette procédure, comme elle m'oblige à utiliser le Topendialog.filename (Bdimage) alors que j'ai le résultat dans un Timage ou dans le dossier adéquat, je n'ai pas les effets sur mon image.

    La procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    procedure ApplyWallPaper(FileName: string; wpStyle: DWORD = WPSTYLE_CENTER);
    const
      GUID: TGUID = '{75048700-EF1F-11D0-9888-006097DEACF9}';
    var
      ComObj       : IUnknown;
      Buffer       : PWideChar;
      WallPaperOpt : TWallPaperOpt;
    begin
      if not FileExists(FileName) then Exit;
      Buffer := AllocMem(MAX_PATH);
      StringToWideChar(FileName, Buffer, MAX_PATH);
      WallPaperOpt.dwStyle := wpStyle;
      WallPaperOpt.dwSize := SizeOf(WallPaperOpt);
      ComObj := CreateComObject(GUID);
      with ComObj as IActiveDesktop do
      begin
        SetWallpaperOptions(WallPaperOpt, 0);
        SetWallpaper(Buffer, 0);
        ApplyChanges(AD_APPLY_ALL); //(AD_APPLY_ALL or AD_APPLY_FORCE);
      end;
      FreeMem(Buffer);
    end;
    L'Appel de cette procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ApplyWallPaper(bdimage.FileName, rgStyle.ItemIndex);
    Si quelqu'un à une autre idée, merci d'avance.

    @+,

    Cincap

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    Personne pour m'aider ?

    Bon si je fais ceci cela fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if bdimage.Execute then
      begin
      image1.Picture.loadfromfile(bdimage.filename);
     
      ApplyWallPaper(bdimage.filename, rgStyle.ItemIndex);
    Donc filename est bien une variable de type String ;

    Pourquoi alors en mettant le chemin du fichier cela ne fonctionne pas ?

    @+,

    Cincap

  3. #3
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Pour tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    if not FileExists(FileName) then Exit;
    Showmessage('Fichier existe');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    procedure ApplyWallPaper(FileName: Widestring; wpStyle: DWORD = WPSTYLE_CENTER);
    const
      GUID: TGUID = '{75048700-EF1F-11D0-9888-006097DEACF9}';
    var
      ComObj       : IUnknown;
      Buffer       : PWideChar;
      WallPaperOpt : TWallPaperOpt;
    begin
      if not FileExists(FileName) then Exit;
      Buffer := PWideChar(FileName);
      WallPaperOpt.dwStyle := wpStyle;
      WallPaperOpt.dwSize := SizeOf(WallPaperOpt);
      ComObj := CreateComObject(GUID);
      with ComObj as IActiveDesktop do
      begin
        SetWallpaperOptions(WallPaperOpt, 0);
        SetWallpaper(Buffer, 0);
        ApplyChanges(AD_APPLY_ALL); //(AD_APPLY_ALL or AD_APPLY_FORCE);
      end;
    end;

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ Montor, merci de ta réponse, j'ai testé sans succès, mon fichier jpg se trouve bien dans le dossier concerné mais il est seulement visible si je redémarre le pc.

    Ors le but, c'est de l'appliquer directement.

    Le chemin ou se trouve le fichier JPG :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fileSourcebis := 'C:\Users\Cincap\AppData\Roaming\Microsoft\Windows\Themes\TranscodedWallpaper.jpg' ;
    Donc mon appel devrait être ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     ApplyWallPaper(fileSourcebis, rgStyle.ItemIndex); // au lieu de  ApplyWallPaper(Bdimage.filename, rgStyle.ItemIndex);
    Mais cela ne fonctionne pas !

    Merci,

    @+,

    Cincap

  5. #5
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Voici la version unicode de la fonction PromptForFilename qui vous permet de receperer les noms de fichiers en unicode ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    41
    42
    43
    44
    45
    46
     
    uses CommDlg;
    function PromptForFileNameW(var AFileName: Widestring; const AFilter: Widestring = '';
      const ADefaultExt: Widestring = ''; const ATitle: Widestring = '';
      const AInitialDir: Widestring = ''; SaveDialog: Boolean = False): Boolean;
    var
       Dialog  : TOpenFilenameW;
       szFilter: Widestring;
       szFile  : Widestring;
       pszFile : PWideChar;
       I       : Integer;
    begin
        //SetLength(szFile,MAX_PATH); <- Do not use
        szFile    :=StringOfChar(#0,MAX_PATH);
        szFilter  :=AFilter;
     
        for I:= 1 To Length(szFilter) do
         if AFilter[I] = '|' then
            szFilter[I]:=#0;
        szFilter := szFilter+#0;
     
        for I:= 1 To Length(AFileName) do
            szFile[I]:=AFileName[I];
     
        pszFile  := PWideChar(szFile) ;
     
        Zeromemory(@Dialog, SizeOf(TOpenFilenameW));
        with  Dialog  do
        begin
           lStructSize      := SizeOf(TOpenFilenameW);
           hwndOwner        := Application.Handle;
           lpstrFilter      := PWideChar(szFilter);
           lpstrFile        := pszFile;
           nMaxFile         := Length(szFile);
           lpstrTitle       := PWideChar(ATitle);
           lpstrInitialDir  := PWideChar(AInitialDir);
           lpstrDefExt      := PWideChar(ADefaultExt);
           Flags            := OFN_OVERWRITEPROMPT or OFN_HIDEREADONLY or OFN_FILEMUSTEXIST or OFN_EXPLORER;
        end;
        case SaveDialog of
          True  : Result := GetSaveFileNameW(Dialog);
          False : Result := GetOpenFileNameW(Dialog);
        end;
        if Result then
          AFileName:= WideString(pszFile);
    end;

    Apres avoir recuperer le nom d'un fichier il faut le convertir a la vieille format 8.3 puisque les methode LoadFromFile,Filename avec TFileStream... ne gere pas l'unicode
    fonction ShortFilenamepour recuperer le format court des noms de fichiers...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function ShortFilename(const Filename: Widestring): string;
    var
     Ret:Widestring;
    begin
      SetLength(Ret, MAX_PATH);
      SetLength(Ret,GetShortPathNameW(PWideChar(Filename), PWideChar(Ret), MAX_PATH));
      Result:=Ret;
    end;
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Button2Click(Sender: TObject);
    var
      S      :WideString;
      Filter :WideString;
    begin
      Filter  :='Fichiers image |*.bmp;*.jpg;*.png;*.gif|Tous les fichiers(*.*)|*.*';
      if  PromptForFilenameW(S,Filter)then
          Image1.Picture.LoadFromFile(ShortFilename(S));
    end;
    je vous donne un exemple concret si on veut charger le fichier dans un Timage
    C:\Documents and Settings\All Users\Documents\Mes images\Échantillons d'images\Hiver.jpg
    ou
    C:\WINDOWS\Media\Windows XP Échec d'un matériel.wav

    ceci passe sans problème avec les pc qui on le français considérer comme un deuxième langue (par défaut pou Windows version fransaise)
    c'est à dire que toutes les caractères > 127 seront convertirent automatiquement vers la deuxième langue ...disons que quelqu'un a opté pour une autre langue pour une raison ou une autre
    le probleme s'introduit avec la lettre É du Échantillons est le chemin de fichier devienne invalide pour (Fileexists,LoadFromFile,..) sauf biensur pour les version unicode Delphi ...

    Essaie d'utiliser le chemin courte de fichier

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    @ Montor, merci pour le surplus d'infos, je garde en réserve pour une autre utilisation.

    @+,

    Cincap

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/12/2007, 17h50
  2. Mode centrer, étirer, mosaïque du papier-peint windows
    Par hellspawn_ludo dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/08/2007, 23h36
  3. Un papier peint (background-repeat) à gauche d'un rowspan
    Par puresprit dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 19/05/2007, 13h32
  4. [VB6]changer papier peint
    Par cada01a dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 08/06/2006, 18h03
  5. Papier peint html
    Par quarkz dans le forum Delphi
    Réponses: 5
    Dernier message: 18/05/2006, 17h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo