TStatic

Die Klasse TStatic repräsentiert Oberflächenelemente für statischen Text oder Grafiken. Statisch bedeutet, daß der Anwender mit diesen Elementen in der Regel nicht interagieren kann. Normalerweise wird TStatic für Text und Grafiken verwendet, welche nicht verändert werden sollen. Die Anwendung kann das statische Oberflächenelement aber durchaus verändern, um je nach Situation z.B. eine Änderung des Textes vorzunehmen.

Der Stil SS_NOTIFY ermöglicht das Versenden von Botschaften vom Kontrollelement an das übergeordnete Fenster.

 

Übersicht    

Konstruktor zur direkten Erzeugung
Konstruktor zur Erzeugung aus einer Ressource
Standardattribute
Stilkonstanten
Beispielprogramm
Mausereignisse
Wichtige Elementfunktionen

Konstruktor zur direkten Erzeugung

TStatic(TWindow* parent, int id, const char far* title, int x, int y, int w, int h, uint textLimit = 0, TModule* module = 0);

Parameter Bedeutung
parent Übergeordnetes Fenster.
id Eindeutige ID des Kontrollelements. Normalerweise wird der Wert -1 für statische Kontrollelemente verwendet. Wenn Sie aber z.B. via SendDlgItemMessage darauf zugreifen wollen, muß eine eindeutige ID verwendet werden.
title Text
x,y Position im Clientbereich des übergeordneten Fensters.
w Breite des Kontrollelements.
h Höhe des Kontrollelements.
textLimit Textlänge
module Zeiger auf die Modul- oder Anwendungsinstanz.

 

Standardattribute

Attr.Style wird auf

WS_CHILD | WS_VISIBLE | WS_GROUP | SS_LEFT

gesetzt.

Konstruktor zur Erzeugung aus einer Ressource

TStatic(TWindow* parent, int resourceId, uint textLimit = 0, TModule* module = 0);

Stilkonstanten

Statische Kontrollelemente können folgende Stile verwenden:

Konstante Bedeutung
SS_BITMAP
Gibt an, daß eine Bitmap im statischen Kontrollelement angezeigt wird. Der gegebene Text ist der Name der Bitmap, unter der diese irgendwo in einer Ressourcedatei enthalten ist. Die Parameter für Höhe und Breite werden bei Verwendung dieses Stils ignoriert, da das Kontrollelement automatisch die Anpassung zur Unterbringung der Bitmap erforderlichen Größe vornimmt.
SS_BLACKFRAME Feld mit einem Rahmen, der in der gleichen Farbe wie Fensterrahmen gezeichnet wird. Diese Farbe ist im standardmäßigen Windows Farbenschema schwarz.
SS_BLACKRECT Rechteck, das mit der aktuellen Fensterrahmen- Farbe gefüllt wird. Diese Farbe ist im standardmäßigen Windows Farbschema schwarz.
SS_CENTER Bestimmt ein einfaches Rechteck und zeigt den Text in diesem zentriert an. Der Text wird vor der Anzeige formatiert. Wörter die über das Zeilenende hinausgehen werden automatisch auf den Anfang der nächsten zentrierten Zeile umgebrochen.
SS_CENTERIMAGE
Gibt an, daß bei einer Bitmap oder einem Icon die kleiner als der Clientbereich des Kontrollelements ist, der verbleibende Clientbereich mit der Farbe des Pixels in der linken oberen Ecke der Bitmap oder des Icon aufgefüllt wird. Wenn das statische Kontrollelement eine einfache Textzeile enthält, wird der Text vertikal im Clientbereich des Kontrollelements zentriert.
SS_ENHMETAFILE
Gibt an, daß eine erweiterte Metadatei im Kontrollelement angezeigt wird. Der angegebene Text stellt dabei den Namen des Metadatei dar. Das Kontrollelement hat eine fixe Größe.
SS_ETCHEDFRAME
Zeichnet den Rahmen des Kontrollelements unter Verwendung des Stils EDGE_ETCHED.
SS_ETCHEDHORZ
Zeichnet die obere und untere Kante des Kontrollelements unter Verwendung des Stils EDGE_ETCHED.
SS_ETCHEDVERT
Zeichnet die linke und rechte Kante des Kontrollelements unter Verwendung des Stils EDGE_ETCHED.
SS_GRAYFRAME Feld mit einem Rahmen in der gleichen Farbe wie der aktuelle Bildschirmhintergrund (Desktop) Diese Farbe ist im standardmäßigen Windows Farbenschema grau.
SS_GRAYRECT Rechteck das in der gleichen Farbe wie der aktuelle Bildschirmhintergrund (Desktop) gefüllt wird. Diese Farbe ist im standardmäßigen Windows Farbenschema grau.
SS_ICON Bestimmt, das ein Symbol angezeigt wird. Der gegebene Text ist der Name des Symbols der irgendwo in der Ressourcendatei definiert wurde. Die Parameter für Höhe und Breite werden ignoriert, da das Symbol seine Größe selbst festlegt.
SS_LEFT Einfaches Rechteck, das den Text linksbündig im Rechteck anzeigt. Der Text wird vor der Anzeige formatiert. Wörter, die über das Zeilenende hinausgehen würden, werden automatisch auf den Anfang der nächsten Zeile umgebrochen.
SS_LEFTNOWORDWRAP Einfaches Rechteck, das den Text linksbündig im Rechteck anzeigt. Tabulatorzeichen werden erweitert aber Wörter werden nicht umgebrochen. Text der über das Zeilenende hinausgeht wird abgeschnitten.
SS_NOPREFIX Normalerweise wird jedes "&" Zeichen im Text des Elements entfernt und der darauffolgende Buchstabe unterstrichen. Wenn dieser Stil angegeben wird, kann der Text auch das Zeichen "&" enthalten. Der Stil kann auch mit anderen kombiniert werden, zum Beispiel:

SS_LEFT | SS_NOPREFIX

SS_NOTIFY
Durch die Angabe dieses Stils werden an das übergeordnete Fenster die Benachrichtigungen STN_CLICKED, STN_DBLCLK, STN_DISABLE und STN_ENABLE gesendet.
SS_OWNERDRAW
Bestimmt das das Kontrollelement zum Zeichnen verantwortlich ist. Das Besitzerfenster erhält einen WM_DRAWITEM Botschaft, wenn ein Zeichnen nötig wird.
SS_REALSIZEIMAGE
Verhindert, daß ein Kontrollelement mit dem Stil SS_ICON oder SS_BITMAP seine Größe beim Laden oder Zeichnen ändert. Wenn das Icon oder Bitmap größer ist als der Zielbereich, wird das Bild abgeschnitten.
SS_RIGHT Einfaches Rechteck, das den Text rechtsbündig im Rechteck anzeigt. Text wird vor der Anzeige formatiert und Wörter die über das Zeilenende hinausgehen, werden automatisch in die nächste rechtsbündige Zeile umgebrochen.
SS_RIGHTJUST
Bestimmt das die untere rechte Ecke des Kontrollelements bei Verwendung einer der Stile SS_BITMAP oder SS_ICON fest bleibt. Nur die obere und linke Seite werden zur Unterbringung einer neuen Bitmap oder eines neuen Icon angepaßt.
SS_SIMPLE Einfaches Rechteck, das den Text linksbündig im Rechteck anzeigt. Die Textzeile kann auf keinen Fall gekürzt oder verändert werden. Das übergeordnete Fenster oder Besitzerfenster des Elements darf die Botschaft WM_CTLCOLORSTATIC nicht bearbeiten!
SS_SUNKEN
Zeichnet einen halb versunkenen Rahmen um das statische Kontrollelement.
SS_WHITEFRAME Feld mit einem Rahmen, der in der gleichen Farbe wie der Fensterhintergrund gezeichnet wird. Diese Farbe ist im standardmäßigen Windows Farbenschema weiß.
SS_WHITERECT Rechteck, das mit der gleichen Farbe wie der Fensterhintergrund gefüllt wird. Diese Farbe ist im standardmäßigen Windows Farbenschema weiß.

Tabelle 1, SS_XXXX Konstanten

Beispiel

Sehen wir uns nun einmal ein Beispielprogramm an, in dem ein statisches Kontrollelement in einem Fenster verwendet wird. Wir benutzen dazu den Konstruktor zur direkten Erzeugung. Es enthält unter anderem aber auch noch ein paar besondere Fähigkeiten:

 

 

// Beispielprogramm STATIC1
 
#include <owl/applicat.h>
#include <owl/framewin.h>
#include <owl/static.h>
 
class CStatic1 : public TWindow {

TStatic* pStaticText;

public:

CStatic1(TWindow* parent = 0);

protected:

void EvSize(uint sizeType, TSize& size);

void EvLButtonDown(uint modKeys, TPoint& point);

void EvLButtonUp(uint modKeys, TPoint& point);

void EvRButtonDown(uint modKeys, TPoint& point);

 

DECLARE_RESPONSE_TABLE(CStatic1);

};
 
DEFINE_RESPONSE_TABLE1(CStatic1,TWindow)

EV_WM_SIZE,

EV_WM_LBUTTONDOWN,

EV_WM_LBUTTONUP,

EV_WM_RBUTTONDOWN,

END_RESPONSE_TABLE;
 
CStatic1::CStatic1(TWindow* parent) : TWindow(parent)
{

pStaticText = new TStatic( this,  -1, "Das ist ein statischer Text", 25, 20, 250, 20, 0);

// Text nicht linksbündig, sondern zentriert

pStaticText->Attr.Style &= ~SS_LEFT;

pStaticText->Attr.Style |= SS_CENTER;

// Anfangsbreite und -höhe des Fenster festlegen

Attr.W = 250 + 50; Attr.H = 60;

}
 
void CStatic1::EvSize(uint sizeType, TSize& size)
{

TWindow::EvSize(sizeType, size);

 

//+++++++++++++++++++++++++++++++++++++++++++

// Das Kontrollelement an neue Fenstergröße anpassen

//+++++++++++++++++++++++++++++++++++++++++++

int middleX = size.cx / 2;

int middleY = size.cy / 2;

pStaticText->MoveWindow(middleX - 125, middleY - 10, 250, 20 , true);

}
 
void CStatic1:: EvLButtonDown(uint modKeys, TPoint& point)
{

TWindow::EvLButtonDown(modKeys, point);

pStaticText->SetText( "Die linke Maustaste wird gedrückt!");

}
 
void CStatic1::EvLButtonUp(uint modKeys, TPoint& point)
{

TWindow::EvLButtonUp(modKeys, point);

pStaticText->SetText("Das ist ein statischer Text");

}
 
void CStatic1:: EvRButtonDown(uint modKeys, TPoint& point)
{

TWindow::EvRButtonDown(modKeys, point);

pStaticText->SetText("Bitte linke Maustaste drücken.");

}
 
class CFrame : public TFrameWindow {

public:

CFrame(TWindow* parent, const char far *title = 0, TWindow* clientWnd = 0,

bool shrinkToClient = false, TModule* module = 0):

TFrameWindow(parent, title, clientWnd, shrinkToClient, module) ,

TWindow(parent, title, module) {}

 

protected:

void EvGetMinMaxInfo(MINMAXINFO far& MinMaxInfo);

 

DECLARE_RESPONSE_TABLE(CFrame);

};
DEFINE_RESPONSE_TABLE1(CFrame, TFrameWindow)

EV_WM_GETMINMAXINFO,

END_RESPONSE_TABLE;
 
void CFrame:: EvGetMinMaxInfo(MINMAXINFO far& MinMaxInfo)
{

//+++++++++++++++++++++++++++

// Minimale Fenstergröße festlegen

//+++++++++++++++++++++++++++

MinMaxInfo.ptMinTrackSize.x = 250;

MinMaxInfo.ptMinTrackSize.y += 20;

}
 
class CStatic1App : public TApplication {

public:

CStatic1App() : TApplication() {}

void InitMainWindow() { SetMainWindow(new

CFrame(0, "Beispiel STATIC1", new CStatic1, true)); }

};
 
int OwlMain(int , char*[])
{

CStatic1App app; return app.Run();

}
 

 

 

Beispiel STATIC1

 

Hier sehen Sie unser Beispielprogramm. Es stellt ein Fenster dar, das ein statisches Kontrollelement mit einem Text enthält. Im Konstruktor von CStatic1 haben wir bestimmt, daß der Text nichts linksbündig, sondern zentriert dargestellt werden soll. Ferner wurde die anfängliche Fenstergröße festgelegt.

Wenn Sie nun die Größe des Fensters verändern, können Sie sehen, daß das Kontrollelement immer in der Mitte des Fensters erscheint. Dies hat aber nichts mit SS_CENTER zu tun. SS_CENTER dient nur der Zentrierung des Textes innerhalb des statischen Kontrollelements.

Die Elementfunktion EvSize ist zum Anpassen der Positionen unseres Kontrollelements verantwortlich. Windows sendet eine WM_SIZE Botschaft, nachdem die Fenstergröße geändert wurde. Wir nehmen diese also in die Antworttabelle von CStatic1 auf und fügen unserer Klasse, die damit korrespondierende Antwortfunktion zu. Diese ruft zuerst die Version des Vorgängers (TWindow) auf. Danach wird die neue Positionen errechnet und das Fenster mit der MoveWindow() Elementfunktion an die neue Position verschoben.

Nachfolgend sehen Sie unser Fenster für das Beispielprogramm STATIC1 mit der kleinstmöglichen Ausdehnung des Fensters. Weiter verkleinern läßt sich das Fenster nicht. Es kann aber zu einem Icon verkleinert werden.

Beispiel STATIC1 mit kleinstmöglicher Ausdehnung

Die Lösung dazu liegt in der Elementfunktion EvGetMinMaxInfo der Klasse CFrame und einem Eintrag in der Botschaftstabelle, der die Antwortfunktion mit dem Botschaftscode verbindet.

Für ptMinTrackSize setzen wir den Wert 250, was der Breite unseres statischen Kontrollelements entspricht. Zu der von Windows vorgegebenen minimalen Höhe eines Fensters (Rahmen + Titelleiste), addieren wir zu ptMinTrackSize die Höhe unseres Kontrollelements.

Mausereignisse

Die Funktionen EvLButtonDown, EvLButtonUp und EvRButtonDown behandeln Mausereignisse.

 

Experimentieren Sie ein wenig mit diesem Programm und den verschiedenen Stilen herum. Verwenden Sie beispielsweise einmal den Stil SS_SIMPLE um herauszufinden, wie die Ausgabe des Programms dann aussieht.

Wichtige Elementfunktionen der Klasse TStatic

void Clear();
Löscht den Text des statischen Kontrollelementes.

HICON GetIcon() const;
Liefert das Handle des vom Kontrollelement benutzten Icon zurück.

int GetText(char far* str, int maxChars);
Holt Text und speichert ihn in str. maxChars gibt an, wieviel Zeichen maximal kopiert werden sollen. Die Funktion liefert die Anzahl der kopierten Zeichen zurück.

HICON SetIcon(HICON);
Setzt das Icon-Handle für das Kontrollelement.

void SetText(const char far* str);
Setzt den Text des statischen Kontrollelements auf den in str angegebenen String.

Übersicht    

Stand: 16.01.99 14:52:38
© 1998,1999 by Hans Joachim Kiefer, hajokiefer@handshake.de