Д>никаких аргументов не было прдьявлено, кроме не понравившихся цветов.
Это было замечание об Look & Feel и я не приводил никаких аргументов поскольку они сугубо субъективны и могли бы спровоцировать спор о вкусах.
Но если вы настаиваиете, то пожалуйста:
1. В Beryl более продвинутая анимация
2. В Microsoft Office 2007 и Aero элементы управления переливаются и более активны на какие-либо действия пользователя.
_>>Возможностью менять фоновой рисунок сейчас уже мало кого можно удивить. Д>Никто и не собирается этим удивлять. Вам кислотный фон не понравился, я и говорю, что это меняется на раз-два и обьяснил, почему там контрастные цвета, на мой взгляд. Кроме того, может быть изменена и компоновка контролов.
... и поменять на другой кислотный цвет. Мне лично не нравится когда я в ОС устанавливаю один цвет, а отдельные "продвинутые" приложения используют другой. Как раз это я имел ввиду.
Так вроде там все или почти все решили.
И>все косяки решены не были, решались с трудом, поэтому в конце концов мне пришлось отказаться от использования HTMLayout. но я не отрицаю факт, что я чтото мог делать неправильно, просто тот же wxWidjets мне показалось использовать намного проще.
На старт необходимо потратить какое-то время. Текущий недостаток документации тоже не есть гуд.
Надумаешь еще раз попробовать HTMLayout — буду рад помочь
Здравствуйте, onyx2, Вы писали:
O>Подскажите какую-нибудь библиотеку классов или компонентов для создания красивого пользовательского интерфейса. O>Условие: язык программирования C++. O>Мне вот, например, нравятся в этом отношении продукты от Microsoft 2003 года — MS Word 2003, MS Visual Studio 2003 и т.п. Может кто подскажет на чем это написано? Или кто поделиться библиотечкой классов
> Д>Я не знаю, на чём написан Skype, но он в самом деле использует Qt. > > я не знаю где и как он использует QT, но написан он либо на делфи либо на билдере.
На Kylix, хотите сказать? Поскольку под линуксом скайп тоже есть.
> Достаточно глянуть один раз на содержимое ресурсов Skype.exe
И что там такого характерно борландовского лежит?
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, SchweinDeBurg, Вы писали:
C>>Вот с этим не соглашусь. ОТВРАТИТЕЛЬНЕЙШАЯ РЕАЛИЗАЦИЯ! Я такого от Бъярка не ожидал.
SDB>Подробностями не поделишься? А то я только мельком смотрел.
Да какие там подробности — код просто не работает Когда полез в исходники разбираться какого фига у меня все зависло, то сразу же наткунлся на то, что из текущей темы ничего не берется, куча жестко зашитых констант. Глобальная переменная _photos, которая используется для уведомлений в большинстве контролов, вместо того, чтобы посылать честные сообщения контейнеру... дальше уже смотреть не стал. Использовать это невозможно — слишком много придется переписывать, лучше уж тогда заново самому писать, выйдет и проще, и быстрее. Хорошо, что мне это не требуется
Здравствуйте, игппук, Вы писали:
И>Здравствуйте, Left2, Вы писали:
L>>Согласен. Попробовал — очень понравился, интерфейс очень быстро клепается. Гибкость более чем достаточная — можно и свои контролы делать, и реюзать их потом влёт. Самое главное — дизайнеры сейчас хорошо умеют рисовать HTML-и, и их довольно несложно потом впихнуть в приложение прямо "как есть". Из дополнительных плюсов — поддержка Windows Mobile 2003 и выше.
И>мое имхо, один из самых больших недостатков этой библиотеки — сложность в программировании динамических контролов.
Что такое "динамические контролы"?
Если например нечто типа этого:
то куда уж проще (behavior_expandable_list.cpp):
struct expandable_list: public behavior
{
// ctor
expandable_list(const char* name="expandable-list"): behavior(HANDLE_MOUSE | HANDLE_KEY | HANDLE_FOCUS, name ) {}
virtual void attached (HELEMENT he )
{
dom::element ctl = he;
bool got_one = false;
for( int i = ctl.children_count() - 1; i >= 0 ; --i)
{
dom::element t = ctl.child((unsigned int)i);
if( t.get_attribute("default") && !got_one)
{
t.set_state(STATE_CURRENT | STATE_EXPANDED); // set state flags
got_one = true;
}
else
t.set_state(STATE_COLLAPSED); // set state flags
}
}
// set current itemvirtual void set_current_item( const dom::element& ctl, dom::element& item )
{
// get previously selected item:
dom::element prev_current = ctl.find_first(":current");
dom::element prev = ctl.find_first(":expanded");
if(prev_current != item)
prev_current.set_state(0, STATE_CURRENT);
if( prev.is_valid() )
{
if( prev == item ) return; // already here, nothing to do.
prev.set_state(0,STATE_CURRENT | STATE_EXPANDED); // drop state flags
}
item.set_state(STATE_CURRENT | STATE_EXPANDED); // set state flags
}
virtual BOOL on_mouse(HELEMENT he, HELEMENT target, UINT event_type, POINT pt, UINT mouseButtons, UINT keyboardStates )
{
if( event_type != MOUSE_DOWN && event_type != MOUSE_DCLICK )
return false;
if(mouseButtons != MAIN_MOUSE_BUTTON)
return false;
// el is presumably <li>;
dom::element ctl = he;
dom::element item = target_item(ctl, target);
if(item.is_valid()) // click on the item caption
set_current_item(ctl, item);
return true; // as it is always ours then stop event bubbling
}
virtual BOOL on_event (HELEMENT he, HELEMENT target, BEHAVIOR_EVENTS type, UINT_PTR reason )
{
if( type == ACTIVATE_CHILD )
{
dom::element item = target_item(dom::element(he), target);
if(item.is_valid()) // click on the item caption
{
set_current_item(he, item);
return TRUE;
}
}
return FALSE;
}
virtual BOOL on_key(HELEMENT he, HELEMENT target, UINT event_type, UINT code, UINT keyboardStates )
{
if( event_type == KEY_DOWN )
{
dom::element ctl = he;
switch( code )
{
case VK_DOWN:
{
dom::element c = ctl.find_first(":current");
int idx = c.is_valid()? (c.index() + 1):0;
if( idx < (int)ctl.children_count() )
{
dom::element nc = ctl.child(idx);
set_current_item(ctl, nc);
}
}
return TRUE;
case VK_UP:
{
dom::element c = ctl.find_first(":current");
int idx = c.is_valid()? (c.index() - 1):(ctl.children_count() - 1);
if( idx >= 0 )
{
dom::element nc = ctl.child(idx);
set_current_item(ctl, nc);
}
}
return TRUE;
}
}
return FALSE;
}
dom::element target_item(const dom::element& ctl, dom::element target)
{
if( target == ctl )
return dom::element();
if( !target.is_valid() )
return target;
dom::element target_parent = target.parent();
if( !target_parent.is_valid() )
return target;
if( target.test("li > .caption") )
return target_parent; // only if click on "caption" element of <li>. Returns that <li> element.return target_item( ctl, target.parent() );
}
};
Я думаю что найти имплементацию Outlook Bar которая была бы проще чем это сложно будет.
я имел ввиду генерирование контролов в рантайме, а также в рантайме их удаление, а также вставка этих контролов в любое место, и с любой вложенностью.
в wxWidject проще, чем тот код, что вы мне привели.
Здравствуйте, игппук, Вы писали:
И>действительно, что может быть проще
И>я имел ввиду генерирование контролов в рантайме, а также в рантайме их удаление, а также вставка этих контролов в любое место, и с любой вложенностью. И>в wxWidject проще, чем тот код, что вы мне привели.
Что такое "генерирование контролов в рантайме"?
Нечто типа этого:
dom::element el = ...;
el.set_html("<input type=text value='hello world' /> <select><option>one</option></select>");
?
Куда уж проще?
Для конкретности спора, приведи код в wxWidject создающий в котейнере два аналогичных controls. Сильно короче получится?
А что такое "с любой вложенностью"? Нечто типа этого:
Кстати хотел бы я посмотреть решение listbox c button внутри и/или хотя бы с гиперлинками. В wxWidgets я имею ввиду.
(я понимаю что такой listbox редко когда нужен — но тем не менее).
Ну дык вроде как не проблема.
Но! Массовое использование absolute positioning в UI есть зло великое, при любом изменении языка или шрифта приводящее к очевидным багам.
Не понимаю, что в топике "красивый пользовательский интерфейс C++" делает wxWidgets?
Мое первое знакомство с wxAUI закончилось вот чем http://www.kirix.com/forums/viewtopic.php?f=15&t=600
Он портабельный, но отнюдь не красивый. Я бы посоветовал юзать BCG-шные контролы (Visual C++ 2008 Feature Pack Beta).
Сейчас выходит все больше прикладных программ в стиле 2007-го офиса (oodefrag, pocket controller), и пользователи будут плеваться на wxWidgets.
Здравствуйте, Joric, Вы писали:
J>Здравствуйте, c-smile, Вы писали:
J>Не понимаю, что в топике "красивый пользовательский интерфейс C++" делает wxWidgets? J>Мое первое знакомство с wxAUI закончилось вот чем http://www.kirix.com/forums/viewtopic.php?f=15&t=600 J>Он портабельный, но отнюдь не красивый. Я бы посоветовал юзать BCG-шные контролы (Visual C++ 2008 Feature Pack Beta). J>Сейчас выходит все больше прикладных программ в стиле 2007-го офиса (oodefrag, pocket controller), и пользователи будут плеваться на wxWidgets.
Это уже как бы OT но тем не менее... "стиль 2007-го офиса" это то что было сделано для офиса и я подозреваю хорошо сугубо для оного офиса. Почему, я думаю должно быть понятно.
Вот это, я извиняюсь, но смотрится исключительно наколеночно коряво:
Интерфейс офиса, в частности Ribbon, сделан для размещения максимального количества служебных элементов в данном контексте.
Но когда у тебя всего три кнопки зачем оно нужно? ribbon не самое лучшее решение в этом случае.
Здравствуйте, игппук, Вы писали:
И>Здравствуйте, Аноним, Вы писали:
А>>Сколько QT стоит? Платная версия для Комерческого использования?
И>1200-1500 евро.
But in general 1xQt Desktop Edition for a single platform will be 930 Euros.
The price for two platforms is 1380 EUR and for three platforms is 1840 EUR per license.
но это только для программы "Qt Small Business Program (SBP)".
Скоро они сделают платформу для ВинСЕ, но это тоже будет как отдельная платформа...
Здравствуйте, Lepsik, Вы писали:
L>Здравствуйте, shvonder, Вы писали:
L>>>проще всего на Borland Builder S>>Вы невнимательно прочитали требования автора вопроса: O>>>>Условие: язык программирования C++. S>>
L>вам наверное следует знать что Borland Builder C++ отвечает этим требованиям
Особенно борландовские расширения, которые сделали из c+= некое подобие дэлфи. Неужели в с++ есть свойства (у классов)?