Eule TGlyphButton

Übersicht    

Diese Klasse erzeugt eine Schaltfläche, die entweder einen Text, eine Grafik oder beides enthalten kann.

 

Konstruktor zur direkten Erzeugung

Konstruktor zur Erzeugung aus einer Ressource

Beispielprogramm

Zustandskonstanten

Schalterinformationskonstanten

Konstruktor zur direkten Erzeugung

TGlyphButton(TWindow* parent, int id, const char far* text, int X, int Y, int W, int H, bool isDefault = false, TModule* module = 0);
 

Parameter

Bedeutung

parent Zeiger auf übergeordnetes Fenster.
id Dialogelement id
text Der im Schalter anzuzeigende Text.
X,Y Position der oberen linken Ecke relativ zum Ursprung des Clientbereichs.
W Breite
H Höhe
isDefault Legt fest, ob der Schalter ein Standardschalter ist oder nicht. Geben Sie true an, wenn der Schalter ein Standardschalter sein soll. Per Vorgabe wird false verwendet. Achten Sie darauf, daß nur ein Schalter der Standardschalter sein kann.
module Zeiger auf die Modul- oder Anwendungsinstanz. Die Voreinstellung ist 0.

Tabelle 1: Parameter des TGlyphButton Konstruktors

 

Bei der Konstruktion wird die Elementfunktion InitVars() aufgerufen, um die Initialisierung der Datenelemente der Klasse durchzuführen. Außerdem wird über einen Aufruf von Set(biShowText) das Kontrollelement angewiesen einen vorhandenen Text anzuzeigen.

Konstruktor zur Erzeugung aus einer Ressource

TGlyphButton(TWindow* parent, int resourceId, TModule* module=0);

Beispielprogramm

// Beispielprogramm GLYPHBTN
// Datei: GLYPHBTN.H
 
#include <owl\framewin.h>
#include <owl\glyphbtn.h>
 
class CGlyphTestWindow : public TWindow
{
TGlyphButton* glyphButtons[5];
bool btnsEnable;
 
public:
 
CGlyphTestWindow(TWindow* parent=0,const char far* title=0, TModule* module=0);
 
void EndGTest();
 
protected:
 
void EnableButtons();
void DisableButtons();
void ToggleEnable();
 
DECLARE_RESPONSE_TABLE(CGlyphTestWindow);
};
 
class CGlyphTestApp : public TApplication {
public:
 
CGlyphTestApp() : TApplication() {}
void InitMainWindow();
};
 
// Beispielprogramm GLYPHBTN
// Datei: GLYPHBTN.CPP
 
#include "glyphbtn.h"
#include "glyphbtn.rh"
 
DEFINE_RESPONSE_TABLE1(CGlyphTestWindow, TWindow)
EV_COMMAND(IDB_GLYPHBTN_SWAP, ToggleEnable),
EV_COMMAND(IDB_GLYPHBTN_OK, EndGTest),
END_RESPONSE_TABLE;
 
CGlyphTestWindow::CGlyphTestWindow(TWindow* parent,const char far* title,
TModule* module){
 
Init(parent, title, module);
btnsEnable = true;
 
glyphButtons[0] = new TGlyphButton(this,IDB_GLYPHBTN_OK, "OK", 20, 20, 80, 30, true);
glyphButtons[1] = new TGlyphButton(this,IDB_GLYPHBTN_CAN, "Abbruch", 120, 20, 80, 30);
glyphButtons[2] = new TGlyphButton(this,IDB_GLYPHBTN_NO, "Nein", 220, 20, 80, 30);
glyphButtons[3] = new TGlyphButton(this,IDB_GLYPHBTN_HELP, "Hilfe", 20, 70, 80, 30);
glyphButtons[4] = new TGlyphButton(this,IDB_GLYPHBTN_SWAP, "Wechsel", 220, 70, 80, 30);
 
glyphButtons[0]->SetGlyph(IDB_GLYPHBTN_OK);
glyphButtons[0]->SetGlyph(IDB_GLYPHBTN_OK + 1,0, TGlyphButton::gtDisabled);
glyphButtons[1]->SetGlyph(IDB_GLYPHBTN_CAN);
glyphButtons[1]->SetGlyph(IDB_GLYPHBTN_CAN + 1,0, TGlyphButton::gtDisabled);
glyphButtons[2]->SetGlyph(IDB_GLYPHBTN_NO);
glyphButtons[2]->SetGlyph(IDB_GLYPHBTN_NO + 1,0, TGlyphButton::gtDisabled);
glyphButtons[3]->SetGlyph(IDB_GLYPHBTN_HELP);
 
// Für den Hilfeschalter verwenden wir zu Demonstra-
// tionszwecken keine graue Bitmap für einen als
// ungültig gesetzten Schalter
 
glyphButtons[4]->SetGlyph(IDB_GLYPHBTN_SWAP);
Attr.W = 320;
Attr.H = 150;
}
 
void CGlyphTestWindow::ToggleEnable()
{
btnsEnable = !btnsEnable;
if(btnsEnable)
EnableButtons();
else
DisableButtons();
}
void CGlyphTestWindow::EnableButtons()
{
for(int x=0; x<4; x++)
glyphButtons[x]->EnableWindow(true);
}
 
void CGlyphTestWindow::DisableButtons()
{
for(int x=0; x<4; x++)
glyphButtons[x]->EnableWindow(false);
}
 
void CGlyphTestWindow::EndGTest()
{
CloseWindow();
}
 
void CGlyphTestApp::InitMainWindow()
{
SetMainWindow(new TFrameWindow(0,"Beispiel GLYPHBTN",
new CGlyphTestWindow, true));
 
GetMainWindow()->EnableKBHandler();
}
 
int OwlMain(int , char*[])
{
CGlyphTestApp app;
return app.Run();
}
 

Neben den beiden Dateien glyphbtn.cpp und glyphbtn.h existieren zwei weitere Dateien nämlich glyphbtn.rc mit den Bitmaps in einer Ressourcendatei, sowie glyphbtn.rh die die Bezeichner enthält, die wir im Programm verwenden. In der Ressourcendatei sind für jeden von uns verwendeten Schalter zwei Bitmaps vorhanden. Die jeweils bunte Bitmap dient zur Darstellung wenn ein Schalter erlaubt ist und die graue zur Darstellung eines deaktivierten Schalters. Normalerweise würde auch eine einzelne Bitmap genügen, da TGlyphButton für jeden möglichen Status (Schalter gedrückt, nicht gedrückt, deaktiviert und fokussiert) automatisch eine Bitmap verwendet, falls keine explizite Angabe einer Bitmap für den betreffenden Status angegeben wurde. In obigem Beispielprogramm werden für den OK-, Abbruch- und Nein-Schalter die grauen Bitmaps explizit angegeben:

glyphButtons[0]->SetGlyph(IDB_GLYPHBTN_OK + 1,0, TGlyphButton::gtDisabled);

Damit wird die graue Bitmap des OK-Schalters verwendet, wenn der OK-Schalter deaktiviert wird.

Der Hilfe-Schalter und der Schalter Wechseln erfahren keine solche Angabe, da der Hilfe-Schalter zu Demonstrationszwecken die standardmäßige Darstellung eines deaktivierten Schalters in TGlyphButton aufzeigen soll. Der Wechsel Schalter letztendlich wird nicht deaktiviert. Er dient lediglich dem Umschalten des Status der anderen Schalter von deaktiv auf aktiv und umgekehrt.

In Abbildung 1 sehen Sie unser Beispielprogramm. Betätigen wir nun den Schalter Wechsel, können wir sehen, daß die Schalter OK, Abbruch, Nein und Hilfe deaktiviert werden. Die drei obersten Schalter verwenden wie bereits angesprochen die graue Bitmap zur Darstellung eines deaktierten Fensters. Was Ihnen sicher sofort auffällt, ist das sich die Bitmap im deaktivierten Hilfeschalter nicht von der eines aktivierten Schalters unterscheidet. Allein der Text macht auf die Deaktivierung aufmerksam. Daraus folgt, daß solange Text und Bitmap im Schalter vorhanden sind, kann beim Einsatz einer einzigen Bitmap für den ungedrückten Zustand (gtUp) der Benutzer erkennen, wenn ein Schalter nicht betätigt werden kann. Wird in einem TGlyphButton hingegen nur eine Bitmap verwendet, ist es unbedingt erforderlich eine weitere Bitmap zur Darstellung in einem deaktivierten Schalter (gtDisabled) zu verwenden. Wenn Sie das nicht tun, kann der Anwender keinen Unterschied zwischen aktiviert und deaktiviert erkennen.

Abbildung 1: Beispielprogramm GLYPHBTN

TGlyphButton kennt folgende Schalterzustände und diesen zugewiesene Konstanten:

Zustand

Konstante

Nicht gedrückt gtUp
deaktiviert gtDisabled
gedrückt gtDown
fokussiert gtFocus

Tabelle 2: Zustandskonstanten von TGlyphButton

 

Mit den verschiedenen SetGlyph-Funktionen kann jedem Zustand eine separate Bitmap zugeordnet werden:

void SetGlyph(TResId resId, TModule* module = 0, TGlyphType = gtUp);

void SetGlyph(TBitmap* bitmap, TGlyphType = gtUp);

void SetGlyph(HBITMAP hBitmap, TGlyphType = gtUp, TAutoDelete autoDelete = NoAutoDelete);

In unserem Beispiel wird in einer Variablen festgehalten, ob die Schalter aktiv oder deaktiv sind. TGlyphButton erlaubt aber auch die Abfrage und Manipulation der Schalterzustände mittels der Funktionen Clear(), Set() und IsSet(). In der Online-Hilfe werden diese leider nicht beschrieben.

int Clear(int t);
int Set(int t);
bool IsSet(int t) const;

In Tabelle 2 sind zu verwendenden Schalterinformationskonstanten (enum TButtonInfo) aufgeführt. Seltsamerweise sind die Funktionen zwar öffentlich, die erforderlichen Konstanten dagegen sind als protected deklariert. Möchte man nun mit IsSet() herausfinden, ob ein Element deaktiviert wurde wird dies fehlschlagen, da auf die TButtonInfo Aufzählung nicht zugegriffen werden kann:

bool isDisabled = elem.IsSet(TGlyphButton::biDisabled); // Fehler. TButtonInfo ist protected!!!

TButtonInfo::biDisabled entspricht dem Wert 8. Verwenden wir nun diesen Wert, können wir dennoch mittels IsSet unsere Information erhalten:

bool isDisabled = elem.IsSet(8); // Das geht!!!

Leider resultiert daraus auch, daß unsinnige Werte verwendet werden können. Das Beispielprogramm GLYPHBT2 (ebenfalls in GLYPHBTN.ZIP enthalten) geht einen anderen Weg. Es definiert selbst die TButtonInfo-Struktur und so können dann auch die obigen Funktionen auf eine sinnvolle Weise genutzt werden:

bool IsDisabled = elem.IsSet(biDisabled);

Beim Einsatz der Funktionen Set() und Clear() sollten Sie dagegen etwas vorsichtiger sein. So sollten Sie ein Kontrollelement nicht mit Set(biDisabled) als deaktiviert kennzeichnen. Schließlich bleibt das Element bis zur nächsten Zeichenaufforderung unverändert. Und selbst für den Fall, das via elem.Invalidate() eine Neuzeichnung erzwungen wird, erscheint der Schalter zwar als deaktiviert, kann aber dennoch betätigt werden.

Konstante

Bedeutung

biPushed gedrückt
biFocus fokussiert
biDefault Schalter ist ein Standardschalter.
biDisabled deaktiviert
biShowText Text soll angezeigt werden.
biShowGlyph Bitmap soll gezeichnet werden.

Tabelle 3, TGlyphButton Schalterinformationskonstanten

Übersicht    

Stand: 23.09.98
© 1998 by Hans Joachim Kiefer, hajokiefer@handshake.de