Auflösung des Monitors ändern





  • Also ich mache immer wenn ich eine solche allgemeine funktion aufrufe, die auf bestimmte #defines reagiert, immer erst mal einen test ob es nicht auch ein define gibt, wo set drin seht. Ganz einfach: man drück Strg+Leertaste und gibt dann SPI_SETW ein und schon sieht man: juhu es gibt ein SPI_SETWORKINGAREA, und nund kann der gesunde menschenverstand daraus schließen, dass man damit die auflösung einstellen kann. Zur sicherheit kann man nun noch schnell die dokumentation der funktion angucken und gut isses.

    Naja aber ich habs ja nicht so mit dem (vielleicht etwas arrogrant wirkendem) [autocogito] à la TKKG.



  • ja ich habe es versucht. 😃

    allerdings mit einer von mir erstellten klasse.

    das will aber irgendwie nicht gehen, weiß der geier warum!

    Die Klasse:

    /* DisplaySettings.h */
    #pragma once
    
    class CDisplaySettings
    {
    public:
    	CDisplaySettings(void);
    	~CDisplaySettings(void);
    	void Change(void);
    	void Reset(void);
    
    public:
    	DEVMODE dmCurrent;
    private:
    	DEVMODE dmDefault;
    };
    
    /* DisplaySettings.cpp */
    #include <windows.h>
    
    #include "DisplaySettings.h"
    
    CDisplaySettings::CDisplaySettings(void)
    {
    	// initialize
    	dmDefault.dmSize = dmCurrent.dmSize = sizeof(DEVMODE);
    
    	// Get device settings
    	EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&dmDefault);
    
    	// copy to current
    	memcpy(&dmCurrent,&dmDefault,sizeof(DEVMODE));
    }
    
    CDisplaySettings::~CDisplaySettings(void)
    {
    	Reset();
    }
    
    void CDisplaySettings::Change(void)
    {
    	// change settings
    	ChangeDisplaySettings(&dmCurrent,CDS_FULLSCREEN);
    }
    
    void CDisplaySettings::Reset(void)
    {
    	// change settings
    	ChangeDisplaySettings(&dmDefault,CDS_FULLSCREEN);
    
    	// copy to current
    	memcpy(&dmCurrent,&dmDefault,sizeof(DEVMODE));
    }
    

    Nun die Main.cpp

    {
    	CDisplaySettings dsDisplay;
    	dsDisplay.dmCurrent.dmPelsWidth = 800;
    	dsDisplay.dmCurrent.dmPelsHeight = 600;
    	dsDisplay.dmCurrent.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
    
    	Sleep(10000);
    	dsDisplay.Reset();
    	return 0;
    }
    

    was ist daran falsch???

    die klasse kompiliert er ohne fehler.

    danke.



  • Vielleicht solltest du noch CDisplaySettings::Change aufrufen, wenn das nicht klappt, gibt ChangeDisplaySettings wahrscheinlich einen Wert zurück, der auf Erfolg/Fehler schließen lässt und eventuell sogar den Grund dafür, eventuell musst du auch die Funktion GetLastError zu Rate ziehen, alles eine Sache der MSDN



  • Du hast beispielsweise in den DEVMODE structs die ganzen member nicht auf 0 gesetzt. Ich würde die beiden DEVMODEs im ctor initialisieren

    CDisplaySettings::CDisplaySettings(void) : dmDefault()
    {
        // initialize
        dmDefault.dmSize = dmCurrent.dmSize = sizeof(DEVMODE);
    
        // Get device settings
        EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&dmDefault);
    
        // copy to current
        dmCurrent = dmDefault; // Warum so schwer?
    }
    


  • soo, danke. wenn ich change aufrufe, dann klappts.

    aber nun habe ich die Change-Funktion so geändert, dass man direkt den ganzen quark übergeben kann, aber irgendwie will er die Flags nicht hinzufügen.

    void CDisplaySettings::Change(int nXRes, int nYRes, int nBits, int nFreq)
    {
    	dmCurrent.dmFields = NULL;
    	if (nXRes > 0)
    	{
    		dmCurrent.dmFields &= DM_PELSWIDTH;
    		dmCurrent.dmPelsWidth = nXRes;
    	}
    	if (nYRes > 0)
    	{
    		dmCurrent.dmFields &= DM_PELSHEIGHT;
    		dmCurrent.dmPelsHeight = nYRes;
    	}
    	if (nBits > 0)
    	{
    		dmCurrent.dmFields &= DM_BITSPERPEL;
    		dmCurrent.dmBitsPerPel = nBits;
    	}
    	if (nFreq > 0)
    	{
    		dmCurrent.dmFields &= DM_DISPLAYFREQUENCY;
    		dmCurrent.dmDisplayFrequency = nFreq;
    	}
    
    	if (dmCurrent.dmFields != NULL)
    	{
    		// change settings
    		ChangeDisplaySettings(&dmCurrent,CDS_FULLSCREEN);
    	}
    }
    

    thx.



  • du musst |= benutzten nicht &=.



  • nBits is ned immer größer als 0.



  • warum nBits nicht immer größer als null???

    wie soll ich das verstehen?

    txh.



  • sorry sorry dachte nBits wär ein bitfeld für flags


Anmelden zum Antworten