# Hintergrund und Schriftfarbe mit C Aktion ändern



## Anonymous (19 April 2005)

Hallo zusammen
Auch ich hab ein problem. Bin seit längerem stiller leser dieses Forums. Hat mir auch schon sher viel geholfen

Ich würde gerne mit einer C Aktion den Hintergrund von grau auf rot und
die Schriftfarbe von schwarz auf weiß setzen, wenn bei einer 32Bit Variablen ein bestimmtes Bit gesetzt ist.

Wäre super wenn ihr mir weiterhelfen könntet

Gruß
Christian


----------



## volker (19 April 2005)

wincc kenne ich nicht. bei protool gibt es aber den reiter atribute im eigenschaftendialog. dort kann man über eine steuervariable das aussehen des feldes ändern. ob es das bei wincc auch gibt weiss ich nicht.


----------



## Anonymous (19 April 2005)

ja das kann ich schon auch anderst einstellen nur ist das viel mehr arbeit und da ich ziemlich viele solcher teile erstellen muß, wäre es in C viel besser einfach reinkopieren und fertig

Wäre echt super wenn ihr mir weiterhelfen könntet


----------



## Speedy (25 April 2005)

Hallo,

Die Schriftfarbe kann man über "ForeColor" ändern und den Hintergrung über "BackColor". 
Mit SetPropWord( lpszPictureName, lpszObjectName, lpszPropertyName, lValue);
Wobei lpszPropertyName = "ForeColor" oder "BackColor" ist.

Gruß Speedy


----------



## Anonymous (28 April 2005)

Hallo Speedy
Danke für deine Antwort.
Sorry das ich mich nicht gleich gemeldet habe
Woher weiß dann WinCC welche Farbe es nehmen soll.
Bin absoluter C looser


----------



## Anonymous (28 April 2005)

Es gibt bei WinCC vordefinierte Farben:
Diese sind

Schwarz		CO_BLACK
Weiß		  CO_WHITE
Rot		   CO_RED
Dunkelrot	CO_DKRED
Grün 		  CO_GREEN
Dunkelgrün    CO_DKGREEN
Blau	 	  CO_BLUE
Dunkelblau     CO_DKBLUE
Gelb		  CO_YELLOW	
Dunkelgelb     CO_DKYELLOW
Cyan		  CO_CYAN
Dunkelcyan 	CO_DKCYAN
Magenta		 CO_MAGENTA
Dunkelmagenta	CO_DKMAGENTA	
Hellgrau	   CO_LTGRAY
Dunkelgrau	CO_DKGRAY

Ansonsten muss man die Farbe die man will "berechnen"
Wenn du ins Farbmenu gehst kann man Farben definieren.
Dabei wird der Farbcode in dezimaler Darstellung nach Rot, Grün, Blau angezeigt. Diese Dezimalzahl in Hex umrechnen und in der Reihenfolge
BlauGrünRot als lValue eintragen.
Beispiel:
Rot 100
Grün 10
Blau  15
-> Rot hex F
    Grün hex A
    Blau hex 64
also als lValue 0x64AF eingeben und schon kommt ein wunderbares Braun zum Vorschein 
 8)


----------



## Anonymous (28 April 2005)

Es gibt bei WinCC vordefinierte Farben:
Diese sind

Schwarz		CO_BLACK
Weiß		  CO_WHITE
Rot		   CO_RED
Dunkelrot	CO_DKRED
Grün 		  CO_GREEN
Dunkelgrün    CO_DKGREEN
Blau	 	  CO_BLUE
Dunkelblau     CO_DKBLUE
Gelb		  CO_YELLOW	
Dunkelgelb     CO_DKYELLOW
Cyan		  CO_CYAN
Dunkelcyan 	CO_DKCYAN
Magenta		 CO_MAGENTA
Dunkelmagenta	CO_DKMAGENTA	
Hellgrau	   CO_LTGRAY
Dunkelgrau	CO_DKGRAY

Ansonsten muss man die Farbe die man will "berechnen"
Wenn du ins Farbmenu gehst kann man Farben definieren.
Dabei wird der Farbcode in dezimaler Darstellung nach Rot, Grün, Blau angezeigt. Diese Dezimalzahl in Hex umrechnen und in der Reihenfolge
BlauGrünRot als lValue eintragen.
Beispiel:
Rot 100
Grün 10
Blau  15
-> Rot hex F
    Grün hex A
    Blau hex 64
also als lValue 0x64AF eingeben und schon kommt ein wunderbares Braun zum Vorschein 
 8)


----------



## Anonymous (3 Mai 2005)

ohh mann ich bin zu doof für das ganze
Hab mich jetzt auch zu nem C kurs angemeldet, aber bis dahin wäre es super wenn ihr mir da nochmal helfen könnt

Wenn ich das ganz so mach wie beschrieben, kommen Fehlermeldungen ohne ende.

Ich habe eine 32Bit Variable bei der ich mit einem bestimmten Bit aus dieser Variable den Hintergrund + Schriftfarbe ändere

So wie geh ich jetz vor.
Brauch eine sehr sehr genaue beschreibung, aber wäre super wenns mir jemand erkärt.

Vielen Dank


----------



## Anonymous (4 Mai 2005)

Also du erstellt jeweils bei Hintergrund und Schriftfarbe (hoffe die Bezeichnungen stimmen da ich auf englischem WinCC arbeite) ein C Skript.
Das sieht folgendermaßen aus

// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1
#define TagName "testtag"        // HIER KOMMT DEIN TAG REIN
// WINCC:TAGNAME_SECTION_END

// WINCCICNAME_SECTION_START
// syntax: #define PicNameInAction "PictureName"
// next PicID : 1
// WINCCICNAME_SECTION_END

DWORD tag;

tag=GetTagDWord(TagName);
// Jetzt muss der Wert maskiert werden um nach dem gesetzten Bit 
// abzufragen; Öffne den Rechner in Windows, aktiviert wissenschaftliche
// Ansicht und schreibe in binärer Darstellung überall 0 wo nicht abgefragt // werden soll und 1 bei gewünschtem Bit und zeige es dezimal an.
// Also z.b. Bit 2 ist gesetzt -> 100 -> dezimal 4
if (tag&4)
	return CO_BLACK;
else
	return  CO_RED;

Falls du es nicht hinbekommst dann poste den Variablennamen und das Bit das abgefragt werden soll.
Gruss


----------



## Anonymous (4 Mai 2005)

Suuuper vielen dank. jetzt gehts.

Nur noch eine frage. Kann man das ganze auch so verbinden das ich z.b. diese ganze anweisung (hintergrund + Schriftfarbe) in einen C text reinpacken?


----------



## Anonymous (9 Mai 2005)

Ja geht (finde ich auch wesentlich eleganter)
Die C Aktion in eine der der zu ändernden Eigenschaften z.B. Schriftfarbe
Ändere den Code unten in

if (tag&4)
  {
  SetPropWord(lpszPictureName,lpszObjectName,"BackColor",CO_BLACK); 
  return CO_BLACK;
  }
else
  {
  SetPropWord(lpszPictureName,lpszObjectName,"BackColor",CO_RED); 
  return CO_RED;
  }

Fragen?  8)


----------



## Anonymous (12 Mai 2005)

Maldito schrieb:
			
		

> Ja geht (finde ich auch wesentlich eleganter)
> Die C Aktion in eine der der zu ändernden Eigenschaften z.B. Schriftfarbe
> Ändere den Code unten in
> 
> ...



Fragen hab ich immer. Aber vielen dank das du dich meiner erbarmst
Wie lerne ich den am besten C???? Ist irgendwie so schwierig. 

Irgendwie geht das bei mir nicht. Hab das ganze mal in "Hintergrnd Farbe" reinkopiert und es ändert sich nur die hintergrundfarbe
Weiter oben wird noch von Forecolor gesprochen. Kann es nicht sein das dieser auch noch mit eingebunden werden muß??


----------



## Anonymous (13 Mai 2005)

Soweit ich das verstanden habe willst du die Schiftfarbe und die Hintergrundfarbe ändern.
Die Funktion ist jetzt so ausgelegt das du sie als C-Skript unter Schriftfarbe anlegst. 
Abhängig von der IF Bedingung wird über SetPropWord mit BackColor die Hintergrundfarbe gesetzt und danach als Rückgabewert die Farbe der Schrift zurückgegeben.

Wenn du es in HintergrundFarbe reinkopiert hast dann muss es so aussehen

if (tag&4)
{
SetPropWord(lpszPictureName,lpszObjectName,"ForeColor",CO_BLACK);
return CO_BLACK;
}
else
{
SetPropWord(lpszPictureName,lpszObjectName,"ForeColor",CO_RED);
return CO_RED;
} 

Zum Thema C lernen kann ich dir jetzt keine entscheidenden Tips geben aber ich würde es einfach mal mit Lehrbücher versuchen.
Die Referenz in diesem Gebiet ist das Buch: 
Programmieren in C von Kernighan und Ritchie.
Allerdings nicht unbedingt zum lernen geeignet.
Steht bei mir auf dem Tisch zum nachschlagen.


----------



## Anonymous (13 Mai 2005)

Maldito schrieb:
			
		

> Soweit ich das verstanden habe willst du die Schiftfarbe und die Hintergrundfarbe ändern.
> Die Funktion ist jetzt so ausgelegt das du sie als C-Skript unter Schriftfarbe anlegst.
> Abhängig von der IF Bedingung wird über SetPropWord mit BackColor die Hintergrundfarbe gesetzt und danach als Rückgabewert die Farbe der Schrift zurückgegeben.
> 
> ...



ich habe mir schon ein Buch über C gekauft bin aber noch nicht wirklich dazu gekommen mich wirklich damit zu beschäftigen.
Zumal es keine Anlehnung an WinCC gibt (dinge wie bit setzen usw.)

Kennst du dich auch mit Faceplade aus? Das muß ich auch machen.

Aber danke erst mal. Werd es heute abend sofort testen. Vielen dank


----------



## Maldito (20 Mai 2005)

Die Bitmaskierung ist nichts WinCC spezifisches.
Wird auch in C verwendet und benötigt.

Mit Faceplates wirst du sehr viel Spaß haben.
Nicht böse sein:
Glaub das wird zeimlich knifflig da dir da wahrscheinlich noch Grundlagen fehlen.
Da wird mit Prefixes, Bildaufschlagsfunk. , Positionierungsfunk. ,... hantiert was nicht immer sofort einsichtig ist.

Aber probieren geht über studieren  :wink: 

Für Fragen sind ja Foren da


----------



## Anonymous (22 Mai 2005)

Maldito schrieb:
			
		

> Mit Faceplates wirst du sehr viel Spaß haben.
> Nicht böse sein:
> Glaub das wird zeimlich knifflig da dir da wahrscheinlich noch Grundlagen fehlen.
> Da wird mit Prefixes, Bildaufschlagsfunk. , Positionierungsfunk. ,... hantiert was nicht immer sofort einsichtig ist.
> ...



Ha habs schon geschft :lol:  :lol: 
Hab nen Order von Siemens bekommen wo es drin steht. 
Bin auch sehr zufrieden.
Nur hab ich jetzt folgendes Problem
Wenn ich auf dem linken Monitor mein Plate aufrufe geht alles wunderbar. Nur wenn ich das gleiche Bild im rechten monitor aufrufe und auf meine Zustandsanzeige klicke pop es im linken monitor auf  +*verzeifel*
was ist da wieder falsch??


----------



## Maldito (23 Mai 2005)

Habe noch nicht mit Dualmonitoring gearbeitet.

Wird das Faceplate an einer definierten Position geöffnet?
Zum Test einfach mal an den Positionswerten feste Werte eingeben.

Wird das Faceplate auf dem ersten Monitor auf jeden Fall geöffnet oder nur wenn auf beiden Monitoren das gleiche Bild angewählt ist?

Poste mal die Funktion die das Faceplate öffnet.


----------



## Anonymous (23 Mai 2005)

Hallo
Hier mal die Funktion laut dem Siemens Ordner


SetTagPrefix("area_picture","Motor_faceplate","Hauptpumpe_1");
SetPictureName("area_picture","Motor_faceplate","Motor_faceplate.pdl");
SetVisible("area_picture","Motor_faceplate",1);


----------



## Maldito (23 Mai 2005)

Also arbeitest du mit einem flexiblen Faceplate in das der jeweilige Bildname vor Aufruf geschrieben wird.

Ich würde mal versuchen die Position des Button mit dem das Faceplate aufgerufen wird zu bestimmen und die Faceplate Koordinaten auf z.B. x,y Position+30 festzulegen.
Hier wird ähnlich vorgegangen.
http://www.sps-forum.de/phpBB2/viewtopic.php?t=3446

Damit kannst du erreichen das die Position des Buttons als Anker für das Faceplate genommen wird.

Alternativ kannst du mal testen indem du dem Faceplate eine Y-Koordiante gibst die rechts vom Bildschirm liegt (Bildgröße z.B. 1200x1024) also 1100.
Vielleicht orientiert sich das Faceplate an der Y-Koordinate und diese ist durchgehend für beide Monitore.
Ist aber nur eine Idee.


----------



## Anonymous (23 Mai 2005)

Maldito schrieb:
			
		

> Also arbeitest du mit einem flexiblen Faceplate in das der jeweilige Bildname vor Aufruf geschrieben wird.
> 
> Ich würde mal versuchen die Position des Button mit dem das Faceplate aufgerufen wird zu bestimmen und die Faceplate Koordinaten auf z.B. x,y Position+30 festzulegen.
> Hier wird ähnlich vorgegangen.
> ...




Danke
Ja genau. So wirds dort gemacht
Mit dieser positionsbestimmung (habs aus dem thread) gehts leider net.
pop trozdem im ersten Monitor auf. Da das das gleiche Bild ist das auf dem 2. Monitor ist, kann ich keine festen yx werte eintragen. 

Hat alles so gut begonnen. Habs jetzt mal ne frage an Siemens gerichtet. Bin mal gespannt. Werds hier dann posten. Vielen dank aber mal


----------

