AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kontrast per API ...

Ein Thema von Darty · begonnen am 17. Jun 2002 · letzter Beitrag vom 30. Jun 2002
Antwort Antwort
Benutzerbild von Darty
Darty

Registriert seit: 8. Jun 2002
Ort: Kronau
731 Beiträge
 
#1

Kontrast per API ...

  Alt 17. Jun 2002, 13:33
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 ...
Matthias Knebel
Mfg M. Knebel [-Darty-]
- Gehörlose Delphianer gibt es selten -
www.team-knebel.de
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2
  Alt 17. Jun 2002, 13:54
Hi,

TDeviceMode besitzt kein DMICM_CONTRAST Member.

tom
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3
  Alt 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?
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Darty
Darty

Registriert seit: 8. Jun 2002
Ort: Kronau
731 Beiträge
 
#4
  Alt 17. Jun 2002, 14:30
Zitat von Luckie:
Darf ich mal kurz übersetzen?
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 Teuflisch aus ??
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 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.
Matthias Knebel
Mfg M. Knebel [-Darty-]
- Gehörlose Delphianer gibt es selten -
www.team-knebel.de
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5
  Alt 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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Darty
Darty

Registriert seit: 8. Jun 2002
Ort: Kronau
731 Beiträge
 
#6
  Alt 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 Wüsste da jemand etwas ?? Du Luckie ?
Matthias Knebel
Mfg M. Knebel [-Darty-]
- Gehörlose Delphianer gibt es selten -
www.team-knebel.de
  Mit Zitat antworten Zitat
Benutzerbild von Darty
Darty

Registriert seit: 8. Jun 2002
Ort: Kronau
731 Beiträge
 
#7
  Alt 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.
Matthias Knebel
Mfg M. Knebel [-Darty-]
- Gehörlose Delphianer gibt es selten -
www.team-knebel.de
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#8
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Darty
Darty

Registriert seit: 8. Jun 2002
Ort: Kronau
731 Beiträge
 
#9
  Alt 30. Jun 2002, 16:36
Hi Christian Seehase,

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 ??
Matthias Knebel
Mfg M. Knebel [-Darty-]
- Gehörlose Delphianer gibt es selten -
www.team-knebel.de
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#10
  Alt 30. Jun 2002, 17:26
Moin Mathias,

sorry, aber in dem Bereich kenne ich mich so irgendwie gar nicht aus.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:59 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