JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=13f6a42cd4a4edaabbc789ce86f19860Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

DesktopHintergurndbild wechseln

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 05.08.2006, 20:29    Titel: DesktopHintergurndbild wechseln Antworten mit Zitat

Hi, ich wollte n Tool schreibne das aus meinen 250.37 DigiFotos ein zufälliges für den Destkophintergrund auswählt.
Theoretisch wäre das ja einfach, wenn ich mal flink ne Funktion hätte, mit der ich Windows sagen kann, welches Bild es benutzen soll. Und am besten ncoh ob zentriert, gekachelt oder skaliert.
Jemand ne idee?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 05.08.2006, 20:37    Titel: Antworten mit Zitat

Gibt's afaik einen Registry-Schlüssel in dem das steht, habe leider gerade kein Windows-System zur Hand, um mal eben nachzuschauen. Müsste eigentlich funktionieren, indem du diesen ausliest und veränderst. AFE-GmdG hatte da mal irgendwo einen Beispiel-Source, der demonstrierte wie man die Registry bearbeitet, vielleicht wenn du ihn mal lieb fragst... ;)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 05.08.2006, 21:57    Titel: Antworten mit Zitat

http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=304&lngWId=3
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 12.08.2006, 12:17    Titel: Antworten mit Zitat

CPP:
   SystemParametersInfo( SPI_SETDESKWALLPAPER, 0, "c:\\bild.bmp", SPIF_SENDWININICHANGE );


Das funktioniert schon, allerdings nu mit bmp's. Naja, ist ja jetzt auch nicht so mega schlimmer Wink
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 12.08.2006, 12:32    Titel: Antworten mit Zitat

Notfalls konvertiert dieses Tool eins der Bilder schnell (zu BMP) in den Ausführordner (oder auch in einen anderen) und lädt dieses bild dann immer fix.
Würde nur bisschen mehr Resourcen kosten ..
_________________
- - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - -
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 13.08.2006, 12:05    Titel: Antworten mit Zitat

Hm, das einzige problem ist jetzt, sobald ich n Fullscreen spiel starte, zum Beispiel Half Lift, ist danach das Hintergrundbild weg, bzw. nur noch die Füllfarbe vorhanden.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 13.08.2006, 16:52    Titel: Antworten mit Zitat

Hmmm .. kannst du den Zustand des Bildes/Desktops abfragen ?
_________________
- - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - -
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 13.08.2006, 17:15    Titel: Antworten mit Zitat

ka, aber es dann immer wieder neu zu setzen ist ja auch kacke. Das Prog läuft ja nur nahc start für ne zentelsekunde oder so, und beendet sich dann ja. Ist ja doof wenn das immer im Hitnergrund läuft. Außerdem ist das bei anderen Programmen, z.b. IrfanView auch nicht so.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 13.08.2006, 20:12    Titel: Antworten mit Zitat

Das stimmt schon, (ich dachte das Programm soll sowieso im Hintergrund laufen wegen Bilderwechsel, aber du meinst nur beim Hochfahren)

Musst dann wahrscheinlich einen anderen Weg benutzen - ich würde googlen
_________________
- - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - -
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 27.08.2006, 21:34    Titel: Antworten mit Zitat

Ich hab mich erinnert, dass ich soetwas in der Art schonmal gemacht hatte: Es gibt da eine Möglichkeit direkt mit der WinAPI:
Du musst dir einen Pointer auf das IActiveDesktop-Interface besorgen. Mit der Methode SetWallpaper kannst du dann das Hintergrundbild neu setzen und mit ApplyChanges aktivierst du die Änderung.
CPP:
HRESULT hr=0;
IActiveDesktop *pActiveDesktop=NULL;
hr=CoInitialize(NULL);
if(hr!=S_OK)
   return 0;
hr=CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,
   IID_IActiveDesktop, (void**)&pActiveDesktop);
if(hr!=S_OK) {
   CoUninitialize();
   return 0;
}
pActiveDesktop->SetWallpaper(L"C:\\Test.bmp", 0);
pActiveDesktop->ApplyChanges(AD_APPLY_ALL);
pActiveDesktop->Release();
CoUninitialize();


IActiveDesktop Interface
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
unsigned long
Junior JLI'ler



Anmeldedatum: 02.07.2006
Beiträge: 52

Medaillen: Keine

BeitragVerfasst am: 27.08.2006, 21:50    Titel: Antworten mit Zitat

Jop, IActiveDesktop ist für diesen Fall erheblich besser als mit SystemParameters zu hantieren!

Hier man ein "kleines" Beispielprogramm:
CPP:
// ###########################################################################
// Datei:        common.hpp
// ###########################################################################
// Autor:        Patrick Ullmann
// Erstellt:     20.08.2006
// Änderungen:   20.08.2006/Patrick: Datei erstellt
// ###########################################################################
// Beschreibung: Generelles

#pragma once

// I N C L U D E S ###########################################################
#define _WIN32_IE 0x400
#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
#include <wininet.h>
#include <shlobj.h>
#include <string>

// M A K R O S ###############################################################
    // Freigabe eines COM-Objektes
template<typename T> inline void release_object (T** object)
{
    if (!(*object))
        return;

    (*object)->Release ();
    (*object) = NULL;
}
    // Schließen eines Handles.
template<typename T> inline void close_handle (T** value)
{
        // Es muß ein gültiges Handle gegeben sein.
    if (!(*value))
        return;

        // Handle schließen und NULLen.
    ::CloseHandle (*value);
    (*value) = NULL;
}
    // Freigabe von reserviertem Speicher.
template<typename T> inline void release_memory (T** value)
{
    if (!(*value))
        return;

    delete (*value);
    (*value) = NULL;
}
    // Freigabe eines Arrays.
template<typename T> inline void release_memory_array (T** value)
{
    if (!(*value))
        return;

    delete (*value);
    (*value) = NULL;
}

// D E F I N I T I O N E N ###################################################
    // Generelle Fehlercodes
const unsigned long okay                                    = 0x00000000L;
const unsigned long error_invalid_parameter                 = 0x00000101L;
const unsigned long error_invalid_api_call                  = 0x00000102L;
const unsigned long error_wallpaper_no_active_desktop       = 0x00001000L;

// F U N K T I O N E N #######################################################
    // Prüfung ob eine Datei existiert.
bool file_exist (const std::basic_string<wchar_t>& file);
CPP:
// ###########################################################################
// Datei:        common.cpp
// ###########################################################################
// Autor:        Patrick Ullmann
// Erstellt:     20.08.2006
// Änderungen:   20.08.2006/Patrick: Datei erstellt
// ###########################################################################
// Beschreibung: Generelles

// I N C L U D E S ###########################################################
#include "common.hpp"

// ///////////////////////////////////////////////////////////////////////////
// GLOBAL
//
// Prüfung ob eine Datei existiert.
// ///////////////////////////////////////////////////////////////////////////
bool file_exist (const std::basic_string<wchar_t>& file)
{
        // Handle auf die Datei.
    void* handle = NULL;

        // Rückgabewert der Funtkion.
    bool result = true;

        // Prüfen ob die Datei existiert.
    if ((handle = ::CreateFileW (file.c_str (), GENERIC_ALL, 0, NULL, OPEN_EXISTING, 0, NULL)) != INVALID_HANDLE_VALUE)
        result = false;

        // Das Handle auf die Datei schließen.
    close_handle<void>(&handle);

    return (result);
}


Jetzt die Klasse:
CPP:
// ###########################################################################
// Datei:        wallpaper.hpp
// ###########################################################################
// Autor:        Patrick Ullmann
// Erstellt:     20.08.2006
// Änderungen:   20.08.2006/Patrick: Datei erstellt
// ###########################################################################
// Beschreibung: Klasse für die Behandlung von Desktophintergründen.

#pragma once

// I N C L U D E S ###########################################################
#include "common.hpp"   // Generelles

// M A K R O S ###############################################################
    // TODO: Template-Makros einfügen

// D E F I N I T I O N E N ###################################################
    // Optionen für die Wallpaper.
const unsigned long wallpaper_center    = 0x00000000L;
const unsigned long wallpaper_tile      = 0x00000001L;
const unsigned long wallpaper_stretch   = 0x00000002L;
const unsigned long wallpaper_max       = 0x00000003L;

// S T R U K T U R E N #######################################################
class wallpaper
{
public:
        // Constructor, Copyconstructor und Destructor
    wallpaper  (void);
    wallpaper  (const wallpaper& other);
    ~wallpaper (void);

        // Wiedergeben von Optionen des Wallpapers.
    unsigned long get_option (void);
        // Setzen von Optionen des Wallpapers.
    unsigned long set_option (unsigned long value);
        // Wiedergabe eines Wallpapers.
    std::basic_string<wchar_t> get_wallpaper (void);
        // Setzen eines Wallpapers.
    unsigned long set_wallpaper (const std::basic_string<wchar_t>& file, unsigned long option = wallpaper_center);
       
        // Zuweisungsoperator.
    const wallpaper& operator = (const wallpaper& other);

private:
        // Setzen der neuen Desktopeinstellungen.
    unsigned long apply (void);

        // Active Desktop Interface.
    ::IActiveDesktop*   desktop_;
};
CPP:
// ###########################################################################
// Datei:        wallpaper.cpp
// ###########################################################################
// Autor:        Patrick Ullmann
// Erstellt:     20.08.2006
// Änderungen:   20.08.2006/Patrick: Datei erstellt
// ###########################################################################
// Beschreibung: Klasse für die Behandlung von Desktophintergründen.

// I N C L U D E S ###########################################################
#include "wallpaper.hpp"

// F U N K T I O N E N #######################################################

// ///////////////////////////////////////////////////////////////////////////
// PUBLIC Constructor
//
// ///////////////////////////////////////////////////////////////////////////
wallpaper::wallpaper (void) : desktop_ (NULL)
{
        // ActiveDesktop Interface erstellen.
    ::CoInitialize (NULL);
    ::CoCreateInstance (CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop, reinterpret_cast<void**>(&desktop_));
}

// ///////////////////////////////////////////////////////////////////////////
// PUBLIC Copyconstructor
//
// ///////////////////////////////////////////////////////////////////////////
wallpaper::wallpaper (const wallpaper& other) : desktop_ (other.desktop_)
{
}

// ///////////////////////////////////////////////////////////////////////////
// PUBLIC Destructor
//
// ///////////////////////////////////////////////////////////////////////////
wallpaper::~wallpaper (void)
{
        // Das ActiveDesktop Objekt freigeben.
    release_object<::IActiveDesktop>(&desktop_);
}

// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Wiedergeben von Optionen des Wallpapers.
// ///////////////////////////////////////////////////////////////////////////
unsigned long wallpaper::get_option (void)
{
        // ActiveDesktop Objekt muss initialisiert sein.
    if (!desktop_)
        return (error_wallpaper_no_active_desktop);

        // Struktur für die Wallpaperoption bereitstellen.
    ::WALLPAPEROPT option = { sizeof (option), 0 };

        // Wallpaperoptionen lesen.
    if (desktop_->GetWallpaperOptions (&option, 0) != S_OK)
        return (error_wallpaper_no_active_desktop);

    return (option.dwStyle);
}

// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Setzen von Optionen des Wallpapers.
// ///////////////////////////////////////////////////////////////////////////
unsigned long wallpaper::set_option (unsigned long value)
{
        // ActiveDesktop Objekt muss initialisiert sein.
    if (!desktop_)
        return (error_wallpaper_no_active_desktop);

        // Struktur für die Wallpaperoption bereitstellen.
    ::WALLPAPEROPT option = { sizeof (option), value };

        // Hilfsvariable für die Rückgabewerte der anderen Funktionen.
    unsigned long result = okay;

        // Wallpaperoptionen setzen.
    if (desktop_->SetWallpaperOptions (&option, 0) != S_OK)
        return (error_wallpaper_no_active_desktop);

        // Setzen der Desktopeinstellungen.
    if ((result = apply ()) != okay)
        return (result);

    return (okay);
}

// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Wiedergabe eines Wallpapers.
// ///////////////////////////////////////////////////////////////////////////
std::basic_string<wchar_t> wallpaper::get_wallpaper (void)
{
        // ActiveDesktop Objekt muss initialisiert sein.
    if (!desktop_)
        return L"";

        // Puffer für den Dateinamen des Wallpapers bereitstellen.
    wchar_t buffer[512] = L"";

        // Dateinamen des Wallpapers lesen.
    if (desktop_->GetWallpaper (buffer, 512, 0) != S_OK)
        return L"";

    return (buffer);
}

// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Setzen eines Wallpapers.
// ///////////////////////////////////////////////////////////////////////////
unsigned long wallpaper::set_wallpaper (const std::basic_string<wchar_t>& file, unsigned long option)
{
        // ActiveDesktop Objekt muss initialisiert sein.
    if (!desktop_)
        return (error_wallpaper_no_active_desktop);

        // Hilfsvariable für die Rückgabewerte der anderen Funktionen.
    unsigned long result = okay;

        // Die Datei muss existieren.
    if (!file_exist (file))
        return (okay);

        // Dateinamen des Wallpapers setzen.
    if (desktop_->SetWallpaper (file.c_str (), 0) != S_OK)
        return (error_wallpaper_no_active_desktop);

        // Option setzen.
    if ((result = set_option (option)) != okay)
        return (result);

        // Setzen der Desktopeinstellungen.
    if ((result = apply ()) != okay)
        return (result);

    return (okay);
}

// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Zuweisungsoperator
// ///////////////////////////////////////////////////////////////////////////
const wallpaper& wallpaper::operator = (const wallpaper& other)
{
        // Wertezuweisung
    desktop_ = other.desktop_;

        // Sich selbst wiedergeben
    return (*this);
}

// ///////////////////////////////////////////////////////////////////////////
// PRIVATE
//
// Setzen der neuen Desktopeinstellungen.
// ///////////////////////////////////////////////////////////////////////////
unsigned long wallpaper::apply (void)
{
        // ActiveDesktop Objekt muss initialisiert sein.
    if (!desktop_)
        return (error_wallpaper_no_active_desktop);

        // Desktopeinstellungen übernehmen.
    if (desktop_->ApplyChanges (AD_APPLY_ALL) != S_OK)
        return (error_wallpaper_no_active_desktop);

    return (okay);
}
Die klasse ist sehr erweiterbar und fehlerfrei und hat auch kein Problem mit Dateien, die nicht existieren Wink

Einen Desktophintergrund kann man wie folgt setzen:
CPP:
    wallpaper wallpaper;
    wallpaper.set_wallpaper (L"u:/e3mural-1024x.bmp");
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum