Шрифт:
#include "../GUI.h"
using namespace Graph_lib;
class W7 : public Window {
// четыре способа продемонстрировать, что кнопка может
// передвигаться:
// показать/скрыть, изменить местоположение, создать новую
// и присоединить/отсоединить
public:
W7(int n, int n, const string& t);
Button* p1; // показать/скрыть
Button* p2;
bool sh_left;
Button* mvp; // переместить
bool mv_left;
Button* cdp; // создать/уничтожить
bool cd_left;
Button* adp1; // активировать/деактивировать
Button* adp2;
bool ad_left;
void sh; // действия
void mv;
void cd;
void ad;
static void cb_sh(Address, Address addr) // обратные вызовы
{ reference_to<W7>(addr).sh; }
static void cb_mv(Address, Address addr)
{ reference_to<W7>(addr).mv; }
static void cb_cd(Address, Address addr)
{ reference_to<W7>(addr).cd; }
static void cb_ad(Address, Address addr)
{ reference_to<W7>(addr).ad; }
};
Однако объект класса
W7
(эксперимент с объектом класса Window
номер 7
) на самом деле содержит шесть кнопок: просто две из них он скрывает.
W7::W7(int w, int h, const string& t)
:Window(w,h,t),
sh_left(true),mv_left(true),cd_left(true),ad_left(true)
{
p1 = new Button(Point(100,100),50,20,"show",cb_sh);
p2 = new Button(Point(200,100),50,20,"hide",cb_sh);
mvp = new Button(Point(100,200),50,20,"move",cb_mv);
cdp = new Button(Point(100,300),50,20,"create",cb_cd);
adp1 = new Button(Point(100,400),50,20,"activate",cb_ad);
adp2 = new Button(Point(200,400),80,20,"deactivate",cb_ad);
attach(*p1);
attach(*p2);
attach(*mvp);
attach(*cdp);
p2–>hide;
attach(*adp1);
}
В этом классе существуют четыре обратных вызова. Каждый из них проявляется в том, что нажатая кнопка исчезает и вместо нее появляется новая. Однако это достигается четырьмя разными способами.
voidW7::sh // скрывает кнопку, показывает следующую
{
if (sh_left) {
p1–>hide;
p2–>show;
}
else {
p1–>show;
p2–>hide;
}
sh_left = !sh_left;
}
void W7::mv // перемещает кнопку
{
if (mv_left) {
mvp–>move(100,0);
}
else {
mvp–>move(–100,0);
}
mv_left = !mv_left;
}
void W7::cd // удаляет кнопку и создает новую
{
cdp–>hide;
delete cdp;
string lab = "create";
int x = 100;
if (cd_left) {
lab = "delete";