TButton

Die Klasse TButton repräsentiert Aktionsschalter. Diese führen bei ihrer Betätigung eine bestimmte Aktion aus. Wenn der Anwender einen Schalter betätigt, erhält das für den Schalter verantwortliche Fenster eine Benachrichtigungsbotschaft und dieses kann dann, durch Auswertung der Botschaft, die entsprechende Aktion einleiten. Es gibt zwei verschiedene Arten von Schaltern: Normale Schalter (BS_PUSHBUTTON) und Standard-Schalter oder Vorgabeschalter (BS_DEFPUSHBUTTON). Ein Standard-Schalter wird durch Betätigen der Returntaste automatisch ausgeführt, wenn kein anderer Schalter den Fokus besitzt.

 

TButton Teilhierarchie

 

Konstruktor zur direkten Erzeugung

TButton(Window *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
title Der im Schalter anzuzeigende Text
X,Y Position der oberen linken Ecke relativ zum Ursprung des Clientbereichs.
W Breite
H Höhe
isDefault Gibt an, ob es sich um einen Standardschalter handelt (true) oder nicht (false). Per Vorgabe wird hierfür false verwendet. Beachten Sie, daß nur ein einziger Schalter der Standardschalter sein darf.
module Zeiger auf die Modul- oder Anwendungsinstanz. Die Voreinstellung ist 0.

 

Konstruktor zur Erzeugung aus einer Ressource

TButton(TWindow* parent, int resourceID, TModule* module = 0);

Standardattribute

Ist isDefault true, wird der Stil BS_DEFPUSHBUTTON in Attr.Style gesetzt. Ansonsten wird der Stil BS_PUSHBUTTON verwendet.

Elementfunktionen

bool GetIsCurrentDefPB() const;
Ist der betroffene Schalter der aktuelle voreingestellte Schalter, wird true zurückgeliefert.

bool GetIsDefPB() const;
Liefert true zurück, falls der betroffene Schalter der voreingestellte Aktionsschalter ist.

void SetIsCurrentDefPB(bool is);
Mit Hilfe dieser Funktion kann ein Schalter zum aktuellen voreingestellten Aktionsschalter gemacht werden.

void SetIsDefPB(bool isdefpb);
Mit Hilfe dieser Funktion kann ein Schalter zum voreingestellten Aktionsschalter gemacht werden.

Benachrichtigungsbotschaften

Der Funktionsprototyp für die nachfolgenden Botschaftsmakros ist void Function();

EV_BN_CLICKED(id, Function)
Der Benutzer hat den Schalter betätigt.

EV_BN_DISABLE(id, Function)
Der Schalter wurde deaktiviert. Diese Botschaft existiert nur aus Kompatibilitätsgründen zu Anwendungen für Windows Versionen < 3.x. Neue Anwendungen sollten den BS_OWNERDRAW Stil verwenden.

EV_BN_DOUBLECLICKED(id, Function)
Der Benutzer hat einen Doppelklick auf den Schalter ausgeübt. BN_DOUBLECLICK ist mit BN_DBLCLK identisch. Diese Botschaft existiert nur aus Kompatibilitätsgründen zu Anwendungen für Windows Versionen < 3.x. Neue Anwendungen sollten den BS_OWNERDRAW Stil verwenden.

EV_BN_HILITE(id, Function)
Wird gesendet, wenn der Anwender einen Schalter selektiert. BN_HILITE ist identisch mit BN_PUSHED. Diese Botschaft existiert nur aus Kompatibilitätsgründen zu Anwendungen für Windows Versionen < 3.x. Neue Anwendungen sollten den BS_OWNERDRAW Stil verwenden.

EV_BN_PAINT(id, Function)
Wird gesendet, wenn der Schalter neu gezeichnet werden muß. Diese Botschaft existiert nur aus Kompatibilitätsgründen zu Anwendungen für Windows Versionen < 3.x. Neue Anwendungen sollten den BS_OWNERDRAW Stil verwenden.

EV_BN_UNHILITE(id, Function)
Wird gesendet, wenn die Hervorhebung eines Schalters entfernt werden muß. BN_UNHILITE ist identisch mit BN_UNPUSHED. Diese Botschaft existiert nur aus Kompatibilitätsgründen zu Anwendungen für Windows Versionen < 3.x. Neue Anwendungen sollten den BS_OWNERDRAW Stil verwenden.


EV_BN_KILLFOCUS(id, Function)

Wird gesendet, wenn der Schalter den Tastaturfokus verliert. Voraussetzung ist aber, daß der Stil BS_NOTIFY des Schalters gesetzt wurde.


EV_BN_SETFOCUS(id, Function)

Wird gesendet, wenn der Schalter den Tastaturfokus erhält. Voraussetzung ist aber, daß der Stil BS_NOTIFY des Schalters gesetzt wurde.

Beispiel

Das nachfolgende Beispielprogramm zeigt den Einsatz folgender Klassen: TButton, TGroupBox, TStatic, TRadioButton und TCheckBox. Dabei werden diese Elemente aber nicht nur einfach auf den Bildschirm gezaubert, sondern auch das Zusammenspiel der einzelnen Dialogelemente untereinander gezeigt. Das übergeordnete Fenster (im Beispiel CControlsWindow) übernimmt die Steuerung und führt je nach Situation ensprechende Maßnahmen durch.

 

 

Oben sehen wir das Fenster, das nach dem Start des Programms auf dem Bildschirm erscheint. Es enthält zwei Gruppen (TGroupBox): Sorten und Getränke, welche Schaltfelder und Auswahlfelder enthalten. Nun haben wir im Programm dafür gesorgt, daß je nach Auswahl der Sorten, die angebotenen Getränke damit übereinstimmen. Als Vorgabe lassen sich nur alkoholfreie Getränke auswählen und Cola wird als Getränk markiert. Wählen wir nun als Sorte alle, können alle Getränke gewählt werden, nur alkoholische läßt nur die Auswahl von Bier zu und keine sorgt dafür, daß keines der Getränke wählbar ist. Markierungen die nicht mehr erlaubt sind, werden automatisch zurückgenommen, gültige hingegen bleiben bestehen.

Weiterhin enthält das Fenster die zwei Schalter (TButton) OK und Vorgaben setzen. Wird der OK Schalter betätigt, wird das Fenster geschlossen und das Programm damit beendet. Der zweite Schalter dient dazu, die Voreinstellungen manuell zu setzen.

Die Realisierung eines solchen Mechanismus ist im Prinzip recht simpel.

In der Botschaftsantworttabelle von CControlsWindow bekommt jedes Schaltfeld eine entsprechende Elementfunktion zur Beantwortung der Botschaft BN_CLICKED zugewiesen. Die Funktionen EnableAll, AlcFree, AlcOnly und DisableAll sorgen dafür, daß nur die zur Sorte passenden Auswahlfelder wählbar sind und ungültige Markierungen entfernt werden.

Ebenso wird für die beiden Schalter jeweils ein Eintrag in die Botschaftsantworttabelle aufgenommen (EV_COMMAND). Wird der OK Schalter betätigt, wird die Funktion Ende() aufgerufen, die das Fenster über einen Aufruf von CloseWindow schließt und damit das Programm beendet. Beim Betätigen des Schalters Vorgaben setzen, wird die Funktion SetDefault() aufgerufen. Diese Funktion wird übrigens auch von unserer SetupWindow-Funktion in CControlsWindow aufgerufen, um die anfänglichen Standardeinstellungen zu setzen.

 

Noch ein paar Hinweise zum Programm-Listing:

 

 

// Beispielprogramm CONTROLS
// Datei: CONTROLS.H
 
#include <owl\applicat.h>
#include <owl\framewin.h>
#include <owl\static.h>
#include <owl\button.h>
#include <owl\checkbox.h>
#include <owl\radiobut.h>
 
const int okButtonId = IDOK;
const int defButtonId = 100;
const int group1Item = 150;
const int checkBoxItem = 200;
 
#ifdef __WIN32__
class CStaticSunken : public TStatic
{

public:

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

};
#endif
 
class CControlsWindow : public TWindow
{

TRadioButton *rbuttons[4];

TCheckBox *limo;

TCheckBox *cola;

TCheckBox *sprudel;

TCheckBox *bier;

TButton* okButton;

TButton* defButton;

 

public:

CControlsWindow(TWindow* parent=0, const char far* title=0, TModule* module=0);

void SetupWindow();

void EnableAll();

void DisableAll();

void AlcFree();

void AlcOnly();

void Ende();

 

protected:

void SetDefault();

 

DECLARE_RESPONSE_TABLE(CControlsWindow);

};
 
class CControlsApp : public TApplication {

public:

CControlsApp() : TApplication() {}

 

void InitMainWindow();

};
 
 

 

// Beispielprogramm CONTROLS
// Datei: CONTROLS.CPP
 
//
// Kontrollelemente:
// TRadioButton, TCheckBox, TGroupBox, TStatic, TButton
 
#include "controls.h"
#include <owl\groupbox.h>
 
#ifdef __WIN32__
CStaticSunken::CStaticSunken(TWindow* parent,int id, const char far* title,int x, int y, int w, int h,uint textLimit,
TModule* module) : TStatic(parent, id, title, x, y, w, h, textLimit, module)
{

Attr.Style &= ~SS_LEFT;

Attr.Style |= SS_SUNKEN;

}
#endif
 
DEFINE_RESPONSE_TABLE1(CControlsWindow,TWindow)

EV_COMMAND(defButtonId,SetDefault),

EV_COMMAND(okButtonId, Ende),

EV_CHILD_NOTIFY(group1Item, BN_CLICKED, EnableAll),

EV_CHILD_NOTIFY(group1Item+1, BN_CLICKED, AlcFree),

EV_CHILD_NOTIFY(group1Item+2, BN_CLICKED, AlcOnly),

EV_CHILD_NOTIFY(group1Item+3, BN_CLICKED,DisableAll),

END_RESPONSE_TABLE;
 
CControlsWindow::CControlsWindow(TWindow* parent, const char far* title, TModule* module)
{

Init(parent,title,module);

 
#ifdef __WIN32__

new CStaticSunken(this, -1, 0, 15, 15, 170, 135);

#endif
 

TGroupBox* group1 = new TGroupBox(this, -1, "Sorten", 20, 20, 160, 125);

rbuttons[0] = new TRadioButton(this, group1Item,"alle", 25, 45, 150, 20, group1);

rbuttons[1] = new TRadioButton(this, group1Item+1,"nur alkoholfrei", 25, 65, 150, 20, group1);

rbuttons[2] = new TRadioButton(this, group1Item+2,"nur alkoholische", 25, 85, 150, 20, group1);

rbuttons[3] = new TRadioButton(this, group1Item+3,"keine", 25, 105, 150, 20, group1);

 
#ifdef __WIN32__

new CStaticSunken(this, -1, 0, 200, 15, 110, 135);

#endif
 

TGroupBox* group2 = new TGroupBox(this, -1,"Getränke", 205, 20, 100, 125);

limo = new TCheckBox(this, checkBoxItem,"&Limo", 210, 45, 90, 20, group2);

cola = new TCheckBox(this, checkBoxItem+1,"&Cola", 210, 65, 90, 20, group2);

sprudel = new TCheckBox(this, checkBoxItem+2,"&Sprudel", 210, 85, 90, 20, group2);

bier = new TCheckBox(this, checkBoxItem+3,"&Bier", 210, 105, 90, 20, group2);

 

cola->Attr.Style &= ~WS_TABSTOP;

sprudel->Attr.Style &= ~WS_TABSTOP;

bier->Attr.Style &= ~WS_TABSTOP;

 

okButton = new TButton(this, okButtonId, "OK",20, 200, 100, 30, true);

defButton = new TButton(this, defButtonId,"&Vorgaben setzen", 150, 200,155, 30, false);

 

Attr.W = 330;

Attr.H = 250;

}
 
void CControlsWindow::SetupWindow()
{

TWindow::SetupWindow();

SetDefault();

}
 
void CControlsWindow::SetDefault()
{
// Hier wird die Verwendung mit SendDlgItemMessage demonstriert.
// Wir verwenden stattdessen im Programm:
//
// rbuttons[1]->Check();
//
// Wie man sieht ist dieser Aufruf wesentlich einfacher.
// Außerdem muß man sich nicht um die Parameterdetails und die Unterscheidung der
// Zielplattform (Win16 oder Win32) kümmern.Wenn Sie mit der Verwendung von
// SendDlgItemMessage experimentieren möchten müssen Sie die die Aufrufe von "rbuttons->"
// auskommentieren und die nachfolgenden Zeilen ins Programm aufnehmen.
//
// #ifdef __WIN32__
// // BST_CHECKED und BST_UNCHECKED erst ab Win32
// SendDlgItemMessage(group1Item, BM_SETCHECK, BST_UNCHECKED);
// SendDlgItemMessage(group1Item+1, BM_SETCHECK, BST_CHECKED);
// SendDlgItemMessage(group1Item+2, BM_SETCHECK, BST_UNCHECKED);
// SendDlgItemMessage(group1Item+3, BM_SETCHECK, BST_UNCHECKED);
// #else
// SendDlgItemMessage(group1Item, BM_SETCHECK, false);
// SendDlgItemMessage(group1Item+1, BM_SETCHECK, true);
// SendDlgItemMessage(group1Item+2, BM_SETCHECK, false);
// SendDlgItemMessage(group1Item+3, BM_SETCHECK, false);
// #endif
 

for(int x=0; x<4; x++)

rbuttons[x]->Uncheck();

rbuttons[1]->Check();

AlcFree();

limo->Uncheck();

cola->Check();

sprudel->Uncheck();

}
 
void CControlsWindow::EnableAll()
{

limo->EnableWindow(true);

cola->EnableWindow(true);

sprudel->EnableWindow(true);

bier->EnableWindow(true);

}
 
void CControlsWindow::DisableAll()
{

limo->EnableWindow(false);

limo->Uncheck();

cola->EnableWindow(false);

cola->Uncheck();

sprudel->EnableWindow(false);

sprudel->Uncheck();

bier->EnableWindow(false);

bier->Uncheck();

}
 
void CControlsWindow::AlcFree()
{

limo->EnableWindow(true);

cola->EnableWindow(true);

sprudel->EnableWindow(true);

bier->EnableWindow(false);

bier->Uncheck();

}
 
void CControlsWindow::AlcOnly()
{

limo->EnableWindow(false);

limo->Uncheck();

cola->EnableWindow(false);

cola->Uncheck();

sprudel->EnableWindow(false);

sprudel->Uncheck();

bier->EnableWindow(true);

}
 
void CControlsWindow::Ende()
{

CloseWindow();

}
 
void CControlsApp::InitMainWindow()
{

SetMainWindow(new TFrameWindow(0,"Beispiel CONTROLS",new CControlsWindow, true));

GetMainWindow()->EnableKBHandler();

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

CControlsApp app;

return app.Run();

}
 

 

 

Übersicht    

Stand: 15.01.99 15:53:15
© 1998 by Hans Joachim Kiefer, hajokiefer@handshake.de