|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 05.08.2006, 20:29 Titel: DesktopHintergurndbild wechseln |
|
|
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 |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 05.08.2006, 20:37 Titel: |
|
|
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 |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 12.08.2006, 12:17 Titel: |
|
|
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 _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Mat Senior JLI'ler
Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 12.08.2006, 12:32 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 13.08.2006, 12:05 Titel: |
|
|
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 |
|
|
Mat Senior JLI'ler
Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 13.08.2006, 16:52 Titel: |
|
|
Hmmm .. kannst du den Zustand des Bildes/Desktops abfragen ? _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 13.08.2006, 17:15 Titel: |
|
|
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 |
|
|
Mat Senior JLI'ler
Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 13.08.2006, 20:12 Titel: |
|
|
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 |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 27.08.2006, 21:34 Titel: |
|
|
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 |
|
|
unsigned long Junior JLI'ler
Anmeldedatum: 02.07.2006 Beiträge: 52
Medaillen: Keine
|
Verfasst am: 27.08.2006, 21:50 Titel: |
|
|
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
Einen Desktophintergrund kann man wie folgt setzen: CPP: | wallpaper wallpaper;
wallpaper.set_wallpaper (L"u:/e3mural-1024x.bmp"); |
|
|
Nach oben |
|
|
|
|
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
|