![]() |
Kontrast per API ...
Hi Leutz,
sicher erinnern sich einige noch daran dass ich damals gefragt habe wie ich den Kontrast per Buttom-Klick zwischen 2 Werten wechseln kann. Meine Registry Experimente etc schlugen fehl. Bis mich Christian Seehase (hoffe ich verwechsle jetzt niemand) mich auf die SDK verwies .. Ich wurde leider auch nicht fündig bzw ich verstand "PSDK" nicht .... Nun bin ich durch ein Zufall auf diesen Code gekommen, der die Auflösung in zum Beispiel 800x600 wechseln kann. Mit dem Funktion Aufruf: change_resolution(800,600); Die Funktion-Code ...
Code:
Aufgrund diese neue Kenntnisse (konnte die Codes noch nicht testen) suchte ich nach dem Wort DEVMODE und wurde zum Beispiel unter
function change_resolution(width, height: word): boolean;
var lpDevMode: TDeviceMode; begin Result := EnumDisplaySettings(nil, 0, lpDevMode); if Result then begin lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT; lpDevMode.dmPelsWidth := width; lpDevMode.dmPelsHeight := height; Result := ChangeDisplaySettings(lpDevMode, CDS_UPDATEREGISTRY) = DISP_CHANGE_SUCCESSFUL; end; end; ![]() Zitat:
Nun der Code den ich noch nicht getestet habe um den Kontrast zu verändern
Code:
Nun sollte man mit dem Aufruf change_contrast(100); sein Kontrast ändern können. Vielleicht testet es ja einer vor mir :) Der kann es gerne berichten, bzw vielleicht ist dies auch gar nicht möglich ...
function change_contrast(contrast: word): boolean;
var lpDevMode: TDeviceMode; begin Result := EnumDisplaySettings(nil, 0, lpDevMode); if Result then begin lpDevMode.dmICMIntent := DMICM_CONTRAST; lpDevMode.DMICM_CONTRAST := contrast; Result := ChangeDisplaySettings(lpDevMode, CDS_UPDATEREGISTRY) = DISP_CHANGE_SUCCESSFUL; end; end; |
Hi,
TDeviceMode besitzt kein DMICM_CONTRAST Member. tom |
Zitat:
Hier nun die orginal Fassung von M.Knebels letztem Posting (nur das wichtigeste übersetzt): "Könnte mal bitte jemand diese Funktion für mich Test? Ich möchte mir nicht den Monitor ruinieren, falls was schief geht oder ich den Kontrast nicht mehr zurückstellen kann." Nix für ungut, sieht aber nicht schlecht aus, könnte klappen. Aber sichere dir vorher die Einstellung in einer Variablen, damit du es wieder Rückgängig machen kannst. |
Zitat:
Zitat:
Zitat:
![]() Ein Ausschnitt der wohl am wichtigsten auf der Seite .. Zitat:
Nachtrag: Also so wie ich sehe ist dmFields übergestellt in der dmICMIntent drin ist und es selbst ein Membér (?) ist. Und Darin ist dann dmICM_Contrast. |
Code:
Das ist die original Struktur. Vergleichbar eines Rekords in Delphi. Und Member (Mitglieder) sind die ganzen Variablen, die du da siehst (Man beachte: in C kommt erst der Datentyp und dann die Variable).
typedef struct _devicemode {
BCHAR dmDeviceName[CCHDEVICENAME]; WORD dmSpecVersion; WORD dmDriverVersion; WORD dmSize; WORD dmDriverExtra; DWORD dmFields; union { struct { short dmOrientation; short dmPaperSize; short dmPaperLength; short dmPaperWidth; short dmScale; short dmCopies; short dmDefaultSource; short dmPrintQuality; }; POINTL dmPosition; DWORD dmDisplayOrientation; DWORD dmDisplayFixedOutput; }; short dmColor; short dmDuplex; short dmYResolution; short dmTTOption; short dmCollate; BYTE dmFormName[CCHFORMNAME]; WORD dmLogPixels; DWORD dmBitsPerPel; DWORD dmPelsWidth; DWORD dmPelsHeight; union { DWORD dmDisplayFlags; DWORD dmNup; } DWORD dmDisplayFrequency; #if(WINVER >= 0x0400) DWORD dmICMMethod; DWORD dmICMIntent; DWORD dmMediaType; DWORD dmDitherType; DWORD dmReserved1; DWORD dmReserved2; #if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400) DWORD dmPanningWidth; DWORD dmPanningHeight; #endif #endif /* WINVER >= 0x0400 */ } DEVMODE; Solch eine Struktur kann man füllen oder man bekommt sie mit Informationen gefüllt zurück. Es geht sogar beides, wie hier. Man bekommt die Bildschirmauflösung geliefert und kann sie aber auch setzen mit einem Entsprechenden Aufruf dem man die Struktur übergibt. |
Hmmm langsam kommt Licht hier rein oder auch nicht ....
Also dass heisst dann ...
Code:
Dsas ist der fast gleiche Code wie oben ... Nur fehlt dazwischen etwas :roll: Wüsste da jemand etwas ?? Du Luckie ?
function change_contrast(contrast: word): boolean;
var lpDevMode: TDeviceMode; begin Result := EnumDisplaySettings(nil, 0, lpDevMode); if Result then begin lpDevMode.dmFields := dmICMIntent; // Hier fehlt etwas ??? Oder kann man da schon dmICM_Contrast aufrufen ?? // Wenn ja kannst es an einem Beispiel zeigen ?? Result := ChangeDisplaySettings(lpDevMode, CDS_UPDATEREGISTRY) = DISP_CHANGE_SUCCESSFUL; end; end; |
Hi Leutz,
mit dem untenstehenden Code wollte ich zunächst mal mit der Materie einarbeiten. Dies funktioniert auch. Kann per Button in 800x600 bzw in 1280x1024 wechseln. Nur bei der Anzeige der Werte in Label.caption gab es das Problem dass Label String ist und die Werte DWord ... Das Problem löste ich mit IntToStr, was aber wohl nicht das richtige Ergebnis anzeigt. Nun aber zeigt es immer bei 1. Wert: 2216296448 und 2. Wert: 72812900 an. Ich verwende immer die Auflösung 1280x1024 ... Selbst wenn ich auf 800x600 umschalte erhalte ich immer die gleiche Werte ?? Daher dachte ich, dass die Codes falsch sein müssen. Hatte ich da bei der Umwandlung Dword -> String etwas nicht beachtet ??
Code:
unit Kontrast2;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Button1: TButton; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private-Deklarationen } public Procedure ShowMe_resolution; { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} // Zeigt die Werte in Label an .. Procedure TForm1.ShowMe_resolution; var lpDevMode: TDeviceMode; begin lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT; label1.caption := inttostr(lpDevMode.dmPelsWidth); label2.caption := IntToStr(lpDevMode.dmPelsHeight); end; // Auflösung ändern function change_resolution(width, height: word): boolean; var lpDevMode: TDeviceMode; begin Result := EnumDisplaySettings(nil, 0, lpDevMode); if Result then begin lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT; lpDevMode.dmPelsWidth := width; lpDevMode.dmPelsHeight := height; Result := ChangeDisplaySettings(lpDevMode, CDS_UPDATEREGISTRY) = DISP_CHANGE_SUCCESSFUL; end; end; // Button Klick zeigt Resolution an procedure TForm1.Button1Click(Sender: TObject); begin ShowMe_Resolution; end; // Button Klick wechselt in 800x600 procedure TForm1.Button2Click(Sender: TObject); begin change_resolution(800,600); end; // Button Klick wechselt in 1280x1024 procedure TForm1.Button3Click(Sender: TObject); begin change_resolution(1280,1024) end; end. |
Moin Mathias,
das Problem hat nichts mit der Umwandlung von DWORD in STRING zu tun haben: Du zeigst in ShowMe_resolution schlicht uninitialisierte Werte an, denn lpDevMode wird dort deklariert, aber nicht mit Werten gefüllt. Da es sich um eine lokale Variable handelt, wird deren Inhalt auch nicht initialisiert. Wäre es eine globale würdest Du wahrscheinlich immer 0 angezeigt bekommen. Entweder Du deklarierst jetzt lpDevMode global, oder Change_Resolution als Methode des Formulares und lpDevMode als Eigenschaft. |
Hi Christian Seehase,
:oops: stimmt ... Habe es global deklariert und es funzt auch :) Kannst Du vielleicht auch etwas zu mein anderes Problem mit dem Kontrast ein paar Posting über mir schreiben ?? Wüsstest DU wie ich es anwenden könnte ?? eventuell andere ?? |
Moin Mathias,
sorry, aber in dem Bereich kenne ich mich so irgendwie gar nicht aus. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz