Helligkeit ändern
-
nu, ich hab ne gamma-klasse geschrieben.
Gamma.h
#include <windows.h> #include <math.h> #pragma once class CGamma { public: CGamma(void); ~CGamma(void); int RestoreGamma(void); float GetGamma(void); int SetGamma(float fGamma); private: WORD RampDefault[3*256]; WORD RampNow[3*256]; float GammaDefault; float GammaNow; };
Gamma.cpp
#include "Gamma.h" #include <windows.h> #include <math.h> CGamma::CGamma(void) { HDC dc; dc = GetDC(GetDesktopWindow()); if (!GetDeviceGammaRamp(dc,RampDefault)) { CGamma::~CGamma(); } // Get Gamma!!! int i; int m; int min; int max; float sum[3]; float rgb[3]; for (i=0;i<3;i++) { min = i*256; max = min+256; for (m=min;m<max;m++) { if ((RampDefault[m] != 0) && (RampDefault[m] != 65535)) { sum[i] += log((double)RampDefault[m]/(double)65535)/log((double)(m-min)/(double)256); } } rgb[i] = sum[i]/256; } GammaDefault = (rgb[0]+rgb[1]+rgb[2])/3; // Update Ramp int b; for (b=0;b<3*256;b++) { RampNow[b] = RampDefault[b]; } GammaNow = GammaDefault; } CGamma::~CGamma(void) { RestoreGamma(); } int CGamma::RestoreGamma(void) { HDC dc; dc = GetDC(GetDesktopWindow()); if (!SetDeviceGammaRamp(dc,RampDefault)) { return 1; } // Update Ramp int b; for (b=0;b<3*256;b++) { RampNow[b] = RampDefault[b]; } GammaNow = GammaDefault; return 0; } float CGamma::GetGamma(void) { // Return gamma value return (GammaNow-0.5)*2; } int CGamma::SetGamma(float fGamma) { // First check wheather all is ok. if ((fGamma < 0) || (fGamma > 1)) { return 1; } fGamma = 0.5 + fGamma*0.5; // Make backup :) WORD RampBackup[3*256]; int b; for (b=0;b<256;b++) { RampBackup[b] = RampNow[b]; } // Then make ramps int i; for (i=0;i<256;i++) { RampNow[i] = (WORD)((float)i/(float)255*(float)65535*(float)fGamma); if (RampNow[i] < 0) { RampNow[i] = 0; } if (RampNow[i] > 65535) { RampNow[i] = 65535; } RampNow[i+256] = RampNow[i+512] = RampNow[i]; } // Get Device HDC dc; dc = GetDC(GetDesktopWindow()); // Set it if (!SetDeviceGammaRamp(dc,RampNow)) { // Restore backup :( int b; for (b=0;b<256;b++) { RampNow[b] = RampBackup[b]; } return 1; } // Update gamma GammaNow = fGamma; return 0; }
Nun mann kann die so benutzen.
#include "Gamma.h" CGamma *Gamma = new CGamma(); // Nun kann ich die Helligkeit von 0 - 1 ändern. // Null ist aber nicht wirklich schwarz... Gamma->SetGamma(0.5); // und dann kann ich das ausgeben lassen. cout << "Gamma: "; cout << Gamma->GetGamma();
-
So!
hier habe ich mal mein genialen Farbveränderer!
der ist total cool ...
nun hat meine Gamma klasse noch etwas mehr zu bieten:
RGB separat angeben
von 0-2. 1 == standard , 0 dunkelste, 2 hellste.
toll ne?
-
toll
-
Ich find deine Begeisterung echt super, aber nicht unbedingt mitteilenswürdig...
Mfg ominion
-
Warum die meisten Leute ihre Objekte immer sinnlos mit new anlegen...hm irgendwann werd ich das auchmal verstehen .
-
CodeFinder schrieb:
Warum die meisten Leute ihre Objekte immer sinnlos mit new anlegen...hm irgendwann werd ich das auchmal verstehen .
Da kann ich dir weiterhelfen: der Grund ist weil sie doof sind.
-
hustbaer schrieb:
CodeFinder schrieb:
Warum die meisten Leute ihre Objekte immer sinnlos mit new anlegen...hm irgendwann werd ich das auchmal verstehen .
Da kann ich dir weiterhelfen: der Grund ist weil sie doof sind.
Scharfsinnig , yep, so ist's wohl .
-
hustbaer schrieb:
CodeFinder schrieb:
Warum die meisten Leute ihre Objekte immer sinnlos mit new anlegen...hm irgendwann werd ich das auchmal verstehen .
Da kann ich dir weiterhelfen: der Grund ist weil sie doof sind.
Falsch sie haben vorher in Java geproggt.
-
Wie soll ich das Objekt denn sonst anlegen?????
-
CGamma Gamma;
-
Außerdem ist es meiner Meinung nach gefährlicher mit new Objekte anzulegen, da es nur einen Zeiger auf dieses Objekt zurückgibt, aber keinen richtigen Namen, wenn man CGamma Gamma; schreibt, dann ist Gamma CGamme, aber wenn man das mit new macht, und dann aus versehen den Zeiger auf ein Anderes Objekt zeigen lässt, dann ist Speicher futsch!
Gruß Chris
-
Also meiner kompetenten meinung nach(aha!) ist es auch ganz toll ein objekt mit new anzulegen! Der -> operator sieht einfach schöner aus und verdeutlicht, dass es ganz toll ist. So ein paarhundertfachen erstellungsgeschwindigkeitsverlust kann man ja einmal hinnehmen ist ja nich die welt!
-
Ja ja! ich bin böld.
aha, weiß man ja net, wenn mans net gesagt bekommt.
aber von nu werd icn das drechs new weglassen.
thx.
-
Naja so böse wars ja nicht gemeint...
Aber es ist wirklich besser außer eben du hast etwas, was du wirklich außerhalb einer funktion hast, oder erst im verlauf eines konstruktors initialisieren kann.
-
Naja, es gibt auch leute die C++ im Stil "viel new ist viel OO" unterrichten.
Was natürlich doof ist. Jemand der "viel new" mag sollte Java und nicht C++ verwenden.Und tragisch ist es auch, solche Leute sollten nicht unterrichten... aber naja. He who can, does. He who cannot, teaches.
-
Hallo,
auch wenn der Thread schon etwas aelter ist: Erst mal vielen Dank fuer das Beispiel. Ich habe allerdings noch eine Frage. Der Code compiliert im VS 2005 Express ohne Probleme. Ich wollte die CGamma Klasse aber auch in einem kleinen QT Programm verwenden. Dazu hab ich mir den QTCreator installiert. Wenn ich den gleiche Code mit dem QtCreator compiliere, bekomme ich immer den Fehler:
Gamma.cpp:17: error: no matching function for call to `CGamma::CGamma()
Gamma.cpp:6: note: candidates are: CGamma::~CGamma()Er scheint den Destruktor zwar zu finden (weil er ja sagt, es gebe einen KAndidaten) aber scheinbar nicht anzuerkennen?!?!
Hab in meinem C++ Buch und im Internet gesucht, finde aber keinen Grund warums nicht funktionieren sollte. Hat jemand ne Idee?Gruss
Sebastian