Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Kontrast per API ... (https://www.delphipraxis.net/181-kontrast-per-api.html)

Darty 17. Jun 2002 13:33


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:
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;
Aufgrund diese neue Kenntnisse (konnte die Codes noch nicht testen) suchte ich nach dem Wort DEVMODE und wurde zum Beispiel unter http://msdn.microsoft.com/library/de...tspol_8nle.asp fündig. Nur den Auszug aus dem Teil ...
Zitat:

dmICMIntent
Windows 95/98/Me, Windows 2000/XP: Specifies which color matching method, or intent, should be used by default. This member is primarily for non-ICM applications. ICM applications can establish intents by using the ICM functions. This member can be one of the following predefined values, or a driver defined value greater than or equal to the value of DMICM_USER.
Value
DMICM_ABS_COLORIMETRIC Color matching should optimize to match the exact color requested without white point mapping. This value is most appropriate for use with proofing.
DMICM_COLORMETRIC Color matching should optimize to match the exact color requested. This value is most appropriate for use with business logos or other images when an exact color match is desired.
DMICM_CONTRAST Color matching should optimize for color contrast. This value is the most appropriate choice for scanned or photographic images when dithering is desired.
DMICM_SATURATE Color matching should optimize for color saturation. This value is the most appropriate choice for business graphs when dithering is not desired.
Mich hatte nur stuzig gemacht, dass die Liste bei den Prining und Print Spooler zu finden war .. Denke aber dass dies auch allgeim für Display funktioniert.
Nun der Code den ich noch nicht getestet habe um den Kontrast zu verändern
Code:
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;
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 ...

toms 17. Jun 2002 13:54

Hi,

TDeviceMode besitzt kein DMICM_CONTRAST Member.

tom

Luckie 17. Jun 2002 14:00

Zitat:

Vielleicht testet es ja einer vor mir Der kann es gerne berichten, bzw vielleicht ist dies auch gar nicht möglich ...
Darf ich mal kurz übersetzen? :mrgreen:
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.

Darty 17. Jun 2002 14:30

Zitat:

Zitat von Luckie
Darf ich mal kurz übersetzen? :mrgreen:
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."

Sehe ich etwa :twisted: Teuflisch :twisted: aus ??
Zitat:

Zitat von Luckie
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.

Wäre toll wenn es gehen würde, aber toms ist wohl anderer Meinung :(

Zitat:

Zitat von toms
Hi,

TDeviceMode besitzt kein DMICM_CONTRAST Member.

tom

Erschick Dich nicht, aber ich bin absolute Newbee wenn es um API Funktionen geht. Aber was heisst besitzt kein Member ? Fehlt eventuell ein Eintrag in Uses ?? Auf jedenfalls habe ich etwas gefunden was mit "Members" in Verbindung bringt und zwar auf http://msdn.microsoft.com/library/de...phcnt_1m0m.asp
Ein Ausschnitt der wohl am wichtigsten auf der Seite ..
Zitat:

dmFields
Array of flags that determine whether the printer driver uses or ignores the remaining members in the DEVMODE structure. If a flag is set, the driver uses the value in the corresponding member; otherwise, the driver ignores it. A printer driver supports only those members that are appropriate for the printer technology. Can be a combination of these values:

DM_ICMINTENT (0x04000000) Use the dmICMIntent member.

dmICMIntent
ICM-intent flag. Indicates which of the three possible color matching intents should be used by default. This member is primarily for non-ICM applications. ICM application can establish intent by using the ICM functions. Can be one of these values:
DMICM_CONTRAST (2) Color matching should optimize for color contrast. This is the most appropriate choice for scanned or photographic images, when dithering is desired.
Anscheinend muss ich es doch mit dmFields kombinieren... Aber wüsste jetzt nicht was ich an der Code ändern kann bzw wie ich es setze :/ Weiss einer da was ??

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.

Luckie 17. Jun 2002 14:41

Code:
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;
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).
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.

Darty 17. Jun 2002 15:24

Hmmm langsam kommt Licht hier rein oder auch nicht ....
Also dass heisst dann ...
  • dmICMIntent ist ein Member (Variable) von dmFields ??
  • dmICMIntent sind mehrere Werte gespeichert. Und eine davon ist DMICM_CONTRAST ?
Wenn dass wirklich so ist, wie rufe ich dann die Werte aus dem dmICMIntent bzw wie übergebe ich dann die Werte ?
Code:
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;
Dsas ist der fast gleiche Code wie oben ... Nur fehlt dazwischen etwas :roll: Wüsste da jemand etwas ?? Du Luckie ?

Darty 30. Jun 2002 12:06

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.

Christian Seehase 30. Jun 2002 12:37

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.

Darty 30. Jun 2002 16:36

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 ??

Christian Seehase 30. Jun 2002 17:26

Moin Mathias,

sorry, aber in dem Bereich kenne ich mich so irgendwie gar nicht aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz