Несколько моих бредовых идей по стилю написания кода гуи( ес-но это альтернативный вариант и пользоваться им необязательно ):
Пример цельного куска кода:
PHP код:
// IDs
enum
{
ID_ITEMS,
ID_CHECK_ALL,
ID_UNCHECK_ALL
};
// Create
Dialog dlg =
DIALOG( caption );
VLAYOUT
LABEL( ID_ANY, "Select one of:" )
HLAYOUT
CHK_LISTBOX( ID_ITEMS, choices )
VLAYOUT
BMP_BUTTON( ID_CHECK_ALL, plus_xpm );
BMP_BUTTON( ID_UNCHECK_ALL, minus_xpm );
END_LAYOUT
END_LAYOUT
STD_BUTTONS( ID_OK | ID_CANCEL );
END_LAYOUT
// Pointers
CheckListBox* items = (CheckListBox*) dlg->FindByID( ID_ITEMS );
BitmapButton* check = (BitmapButton*) dlg->FindByID( ID_CHECK_ALL );
BitmapButton* uncheck = (BitmapButton*) dlg->FindByID( ID_UNCHECK_ALL );
// Actions
check->SetAction( ID_ITEMS, ACTION_CHKLISTBOX_CHECK_ALL );
uncheck->SetAction( ID_ITEMS, ACTION_CHKLISTBOX_UNCHECK_ALL );
// Update
check->EnableIf( ID_ITEMS, IF_NON_EMPTY );
uncheck->EnableIf( ID_ITEMS, IF_NON_EMPTY );
теперь по шагам:
1. список ID
PHP код:
enum
{
ID_ITEMS,
ID_CHECK_ALL,
ID_UNCHECK_ALL
};
тут все понятно, каждый виджет может иметь уникальный ID, которые мы описываем перед созданием гуи, ес-но есть глобальный список преодпределенных ID - например ID_ANY
2. Создание гуи:
PHP код:
Dialog dlg =
DIALOG( caption );
VLAYOUT
LABEL( ID_ANY, "Select one of:" )
HLAYOUT
CHK_LISTBOX( ID_ITEMS, choices )
VLAYOUT
BMP_BUTTON( ID_CHECK_ALL, plus_xpm );
BMP_BUTTON( ID_UNCHECK_ALL, minus_xpm );
END_LAYOUT
END_LAYOUT
STD_BUTTONS( ID_OK | ID_CANCEL );
END_LAYOUT
тут с помощью макросов создаются сайзеры и виджеты, думаю тут тоже все ясно
3. получение указателей на виджеты
PHP код:
CheckListBox* items = (CheckListBox*) dlg->FindByID( ID_ITEMS );
BitmapButton* check = (BitmapButton*) dlg->FindByID( ID_CHECK_ALL );
BitmapButton* uncheck = (BitmapButton*) dlg->FindByID( ID_UNCHECK_ALL );
4. назначение действий
PHP код:
check->SetAction( ID_ITEMS, ACTION_CHKLISTBOX_CHECK_ALL );
uncheck->SetAction( ID_ITEMS, ACTION_CHKLISTBOX_UNCHECK_ALL );
здесь мы можем привязать одни виджеты к другим - у каждого типа виджетов есть набор действий( которые в принципе дублируют методы этого типа ), мы можем связать дефолтное действие для одного виджета на произвольное действие другого, в том числе можем указать аргумент для действия, например так:
button->SetAction( ID_LABEL, ACTION_LABEL_SET_TEXT, "Sample Text" );
5. автоматическое обновление
PHP код:
// Update
check->EnableIf( ID_ITEMS, IF_NON_EMPTY );
uncheck->EnableIf( ID_ITEMS, IF_NON_EMPTY );
здесь мы указываем, что кнопки будут активны только, если виджет с ID - ID_ITEMS не пустой( в данном случае список имеет одну или несколько строк ), варианты:
check->EnableIf( ID_TEXT, IF_VALUE_EQUAL, "Sample" );
check->ShowIf( ID_CHECKBOX, IF_CHECKED );
label->LabelIf( ID_CHECKBOX, IF_CHECKED, "Checked", "Not Checked" );
checkbox->CheckIf( ID_TEXT, IF_NON_EMPTY );
Все это, чтоб не писать лишний раз обработчики событий( ввод текста, нажатие клавиш, выбор чекбокса и т.п. ).
Lester добавил 18.04.2009 в 12:20
насчет:
PHP код:
check->EnableIf( ID_TEXT, IF_VALUE_EQUAL, "Sample" );
check->ShowIf( ID_CHECKBOX, IF_CHECKED );
label->LabelIf( ID_CHECKBOX, IF_CHECKED, "Checked", "Not Checked" );
checkbox->CheckIf( ID_TEXT, IF_NON_EMPTY );
т.к. у многих виджетов будет использоваться практически одно и то же свойство( IF_CHECKED для чекбоксов, IF_NON_EMPTY для полей ввода и т.д. ), то добавил сокращенные варианты:
PHP код:
check->ShowIf( ID_CHECKBOX );
checkbox->CheckIf( ID_TEXT );
ес-но это все будет отражено в моем IDE в редакторе GUI