wxWidgets & VCL
wxWidgets & VCL
Доброго все времени суток.
Пытаюсь переписать свои старые Delphi проекты на VS+wxWidgets, с целью изучения виджетов.
Столкнулся с такими вопросами:
1. Есть ли аналог компонента TCanvas?
2. Большинство VCL-компонентов имеют свойство TAG. Есть его аналог в виджетах?
3. Так же не могу найти аналог поля Handle.
Подскажите, плз, куда копать!
Заранее благодарен.
Пытаюсь переписать свои старые Delphi проекты на VS+wxWidgets, с целью изучения виджетов.
Столкнулся с такими вопросами:
1. Есть ли аналог компонента TCanvas?
2. Большинство VCL-компонентов имеют свойство TAG. Есть его аналог в виджетах?
3. Так же не могу найти аналог поля Handle.
Подскажите, плз, куда копать!
Заранее благодарен.
Win XP, Win 7-64, VS2008, VS2010, wxWidgets 3.0.2
Re: wxWidgets & VCL
Доброго времени суток,
Я просто ну очень давно с Delphi не общался.
В каком контексте? Для прорисовки чего-то или для расположения контролов?AK74 wrote: Доброго все времени суток.
Пытаюсь переписать свои старые Delphi проекты на VS+wxWidgets, с целью изучения виджетов.
Столкнулся с такими вопросами:
1. Есть ли аналог компонента TCanvas?
Каждый контрол имеет поле name. Посмотрите по документации для wxWindow - если не ошибаюсь это последний параметр.AK74 wrote: 2. Большинство VCL-компонентов имеют свойство TAG. Есть его аналог в виджетах?
Здесь просто - нужно вызвать функцию GetHandle(). Это если нужен HWND - Window Handle.AK74 wrote: 3. Так же не могу найти аналог поля Handle.
Я просто ну очень давно с Delphi не общался.
AK74 wrote: Подскажите, плз, куда копать!
Заранее благодарен.
Re: wxWidgets & VCL
Да, именно рисования.1. Есть ли аналог компонента TCanvas?
В каком контексте? Для прорисовки чего-то или для расположения контролов?
Спасибочки, померяю.2. Большинство VCL-компонентов имеют свойство TAG. Есть его аналог в виджетах?
Каждый контрол имеет поле name. Посмотрите по документации для wxWindow - если не ошибаюсь это последний параметр.
ЗЫ. Я было подумал использовать wxWindowID, т.к wxFormBuilder туда заносит wxID_ANY.
Как смотрите на такое извращение?
Опять спасибочки.3. Так же не могу найти аналог поля Handle.
Здесь просто - нужно вызвать функцию GetHandle(). Это если нужен HWND - Window Handle.
Еще вот такой вопросик: как программно "нажать" кнопку?
Т.е в делфи у меня было:
void __fastcall TForm::FormKeyDown(TObject *Sender,
WORD &Key, TShiftState Shift)
{
if (Key==VK_ESCAPE) kbCancel->Click();
if (Key==VK_RETURN) kbOk->Click();
}
А в wxWidgets как это провернуть?
Win XP, Win 7-64, VS2008, VS2010, wxWidgets 3.0.2
Re: wxWidgets & VCL
Здравствуйте,
Будут вопросы - пишите.
В данном случае больше подходит name. Window ID - это в основном используется для привязки событий.
К тому же wxID_ANY - константа (-1) которая не меняется.
Кстати, какая версия wx и какая версия компилятора?
И может проще и быстрее будет в личку - ikorot01 at gmail dot com.
Посмотрите как это реализовано в drawing sample.AK74 wrote:Да, именно рисования.1. Есть ли аналог компонента TCanvas?
В каком контексте? Для прорисовки чего-то или для расположения контролов?
Будут вопросы - пишите.
Если я правильно помню - TAG это строка которая пнривязывается к окну.AK74 wrote:Спасибочки, померяю.2. Большинство VCL-компонентов имеют свойство TAG. Есть его аналог в виджетах?
Каждый контрол имеет поле name. Посмотрите по документации для wxWindow - если не ошибаюсь это последний параметр.
ЗЫ. Я было подумал использовать wxWindowID, т.к wxFormBuilder туда заносит wxID_ANY.
Как смотрите на такое извращение?
В данном случае больше подходит name. Window ID - это в основном используется для привязки событий.
К тому же wxID_ANY - константа (-1) которая не меняется.
Опять просто - создаете wxCommandEvent и вызываете HandleEvent(). Посмотрите event sample - там должна быть реализация.AK74 wrote:Опять спасибочки.3. Так же не могу найти аналог поля Handle.
Здесь просто - нужно вызвать функцию GetHandle(). Это если нужен HWND - Window Handle.
Еще вот такой вопросик: как программно "нажать" кнопку?
Т.е в делфи у меня было:
void __fastcall TForm::FormKeyDown(TObject *Sender,
WORD &Key, TShiftState Shift)
{
if (Key==VK_ESCAPE) kbCancel->Click();
if (Key==VK_RETURN) kbOk->Click();
}
А в wxWidgets как это провернуть?
Кстати, какая версия wx и какая версия компилятора?
И может проще и быстрее будет в личку - ikorot01 at gmail dot com.
Re: wxWidgets & VCL
Нет, в VCL Tag - integer и имеют его не только окна, почти все компоненты.Если я правильно помню - TAG это строка которая пнривязывается к окну.
Т.е, как я понимаю, wxWindowID, как таковой не используется, его использование и интерпретация
оставлены на усмотрение конечных девелоперов?
Win XP, Win 7-64, VS2008, VS2010, wxWidgets 3.0.2
Re: wxWidgets & VCL
При программировании в Windows/MFC Микрософт сделал статическую таблицу событий (BEGIN_MESSAGE_MAP()/END_MESSAGE_MAP()). Привязка событий в этом случае происходит через уникальный идентификатор окна.AK74 wrote:Нет, в VCL Tag - integer и имеют его не только окна, почти все компоненты.Если я правильно помню - TAG это строка которая пнривязывается к окну.
Т.е, как я понимаю, wxWindowID, как таковой не используется, его использование и интерпретация
оставлены на усмотрение конечных девелоперов?
В wxWidgets этот интерфейс сохранен, но добавлена возможность динамической привязки. Но поскольку окна должны иметь уникальный иднетификатор (требование Виндовс интеейса - RegisterClass() API необходимо вызывать) то используется данный параметр.
Что касаемо wxID_ANY. Значение этой константы -1. Одерко ьиьлиотека сама генерирует уникальный идентификатор окна. Вы как программист можете создать свои идентификаторы и использовать их (как в большинстве проимеров - используется статическая таблица событий). Но в основном все пишут так чтобы обходиться без жтого.
Re: wxWidgets & VCL
Доброго всем времени суток!
Спасибо, камрад ONEEYEMAN.
Может еще не откажете помочь советом?
Заморочился я логами.
Нужно, чтобы выводился лог в отдельное окошко, как LogWindow, но без вывода DialogBox, т.е тихий "стукачек", который может сворачиваться/разворачиваться в родительской форме.
Но! Нужно чтобы выводимые сообщения "окрашивались" в зависимости от LogLevel либо к ним добавлялись значки, как у LogGUI.
Среди стандартных, как я понял, такого нет. Т.е нужно писать самому.
Самое простое - переписать LogWindow, но в TextCtrl не возможно ни красить текст, ни добавлять значки.
Может, подскажете куда рыть?
ЗЫ. Если имеет значение, VStudio 2008+wxWidgets 3.0.2
Заранее спасибо.
Спасибо, камрад ONEEYEMAN.
Может еще не откажете помочь советом?
Заморочился я логами.
Нужно, чтобы выводился лог в отдельное окошко, как LogWindow, но без вывода DialogBox, т.е тихий "стукачек", который может сворачиваться/разворачиваться в родительской форме.
Но! Нужно чтобы выводимые сообщения "окрашивались" в зависимости от LogLevel либо к ним добавлялись значки, как у LogGUI.
Среди стандартных, как я понял, такого нет. Т.е нужно писать самому.
Самое простое - переписать LogWindow, но в TextCtrl не возможно ни красить текст, ни добавлять значки.
Может, подскажете куда рыть?
ЗЫ. Если имеет значение, VStudio 2008+wxWidgets 3.0.2
Заранее спасибо.
Win XP, Win 7-64, VS2008, VS2010, wxWidgets 3.0.2
Re: wxWidgets & VCL
Пожалуйств.AK74 wrote: Доброго всем времени суток!
Спасибо, камрад ONEEYEMAN.
Проще всего действительно переписать. Но при этом либо использовать RICHTEXT флаг, либо wxRichTextCtrl. Посмотрите в примере text. Там это показано.AK74 wrote: Может еще не откажете помочь советом?
Заморочился я логами.
Нужно, чтобы выводился лог в отдельное окошко, как LogWindow, но без вывода DialogBox, т.е тихий "стукачек", который может сворачиваться/разворачиваться в родительской форме.
Но! Нужно чтобы выводимые сообщения "окрашивались" в зависимости от LogLevel либо к ним добавлялись значки, как у LogGUI.
Среди стандартных, как я понял, такого нет. Т.е нужно писать самому.
Самое простое - переписать LogWindow, но в TextCtrl не возможно ни красить текст, ни добавлять значки.
Может, подскажете куда рыть?
ЗЫ. Если имеет значение, VStudio 2008+wxWidgets 3.0.2
Заранее спасибо.
Re: wxWidgets & VCL
Мне он показался избыточным и тяжеловесным, для подобного применения.ONEEYEMAN wrote: Проще всего действительно переписать. Но при этом либо использовать RICHTEXT флаг, либо wxRichTextCtrl. Посмотрите в примере text. Там это показано.
Я склоняюсь к мысли переписать LogWindow на использование wxListCtrl вместо TextCtrl.
Если все выводить в одну колонку, без заголовка.
Там вроде и цвет айтимов можно задавать и иконки задавать.
Или фигня получится? Как считаете?
Win XP, Win 7-64, VS2008, VS2010, wxWidgets 3.0.2
Re: wxWidgets & VCL
В данном конкретном случае есть выбор - либо использовать стиль wxTE_RICH либо действительно наследоваться от wxListCtrl.AK74 wrote:Мне он показался избыточным и тяжеловесным, для подобного применения.ONEEYEMAN wrote: Проще всего действительно переписать. Но при этом либо использовать RICHTEXT флаг, либо wxRichTextCtrl. Посмотрите в примере text. Там это показано.
Я склоняюсь к мысли переписать LogWindow на использование wxListCtrl вместо TextCtrl.
Если все выводить в одну колонку, без заголовка.
Там вроде и цвет айтимов можно задавать и иконки задавать.
Или фигня получится? Как считаете?
Судя по всему для лога редактирование не обязательно поэтому наверно проше будет использовать wxListCtrl.
Re: wxWidgets & VCL
А зачем нужна возможность редактировать лог?ONEEYEMAN wrote: Судя по всему для лога редактирование не обязательно поэтому наверно проше будет использовать wxListCtrl.
Конечно только режим read-only, с возможность сохранить в файл.
Я даже переписал стандартный wxLogWindow на использование wxListCtrl. И даже работает, но не совсем так, как хотелось бы:
1. Фрейм лога никак не хочет "рождаться" в родительском фейме, а веде себя как независимый фрейм. Появляется в стороне от родительского окна, собственно и оригинал себя вел так же. Может это такое ограничение, что фрейм не может содержать в себе фрейм?
2. Иконки не появляются, но цвет сообщений меняется. Может иконки не могут "жить" в одной колонке с текстовым сообщением?
Еще раз спасибо, камрад! Ваши подсказки существенны для "чайника", т.е меня.
Win XP, Win 7-64, VS2008, VS2010, wxWidgets 3.0.2
Re: wxWidgets & VCL
Судя по всему из-за сохранения в файл и произошло наследование от wxTextCtrl. Птому что сбрасывать в файл поточно строки из листа утомительно.AK74 wrote:А зачем нужна возможность редактировать лог?ONEEYEMAN wrote: Судя по всему для лога редактирование не обязательно поэтому наверно проше будет использовать wxListCtrl.
Конечно только режим read-only, с возможность сохранить в файл.
Начну с более простого.AK74 wrote: Я даже переписал стандартный wxLogWindow на использование wxListCtrl. И даже работает, но не совсем так, как хотелось бы:
1. Фрейм лога никак не хочет "рождаться" в родительском фейме, а веде себя как независимый фрейм. Появляется в стороне от родительского окна, собственно и оригинал себя вел так же. Может это такое ограничение, что фрейм не может содержать в себе фрейм?
2. Иконки не появляются, но цвет сообщений меняется. Может иконки не могут "жить" в одной колонке с текстовым сообщением?
Еще раз спасибо, камрад! Ваши подсказки существенны для "чайника", т.е меня.
2. Посмотрите как это реализовано в примере listctrl. И еще - если есть желание выводить иконку не в первой колонке - работать не булет. Если я правильно помнб был тикет на эту тему и большая дискуссия.
1. Не совсем понял: у вас есть главное окно приложения и вы в нем создаете еще одно окно где-то там внизу которое должно отображать Ваш лог? Зачем? Не проще ли положить лог в главное окно напрямую?
А для того что Вы хотите проще использовать wxAUI.
Re: wxWidgets & VCL
Доброго всем времени суток.
Да и зачем каждую строчку сбрасывать в файл? Можно ведь собрать все строки в буфер и затем скинуть уже его в файл.
Или я чего-то не понял?
Т.е нажимая какую-либо из кнопок, я отсылаю в лог соответствующее сообщение (через wxLogMessage/wxLogWarning/wxLogError).
Так вот, по моей задумке, лог должен родиться в основном фрейме и быть одним из окон. А у меня получается, что он "самостоятельный" фрейм (можно переключаться Alt+Tab)
Вот кусок моего быдло-кода:
Так вот, цвет меняется, текстовая часть выводится как надо, нет только иконок.
ЗЫ. По шагам проходил дебагером, все условия срабатывают.
AK74 wrote: А зачем нужна возможность редактировать лог?
Конечно только режим read-only, с возможность сохранить в файл.
Я имел ввиду, что логу, имхо, не нужны возможности редактирования. Только возможность очистить или скинуть в файл.ONEEYEMAN wrote: Судя по всему из-за сохранения в файл и произошло наследование от wxTextCtrl. Птому что сбрасывать в файл поточно строки из листа утомительно.
Да и зачем каждую строчку сбрасывать в файл? Можно ведь собрать все строки в буфер и затем скинуть уже его в файл.
Или я чего-то не понял?
AK74 wrote: 1. Фрейм лога никак не хочет "рождаться" в родительском фейме, а веде себя как независимый фрейм. Появляется в стороне от родительского окна, собственно и оригинал себя вел так же. Может это такое ограничение, что фрейм не может содержать в себе фрейм?
Основной фрейм это только отладочный фрейм. Там только чекбокс (скрыть/показать лог) и три кнопки, имитирующие события (Info, warning, Error).ONEEYEMAN wrote: 1. Не совсем понял: у вас есть главное окно приложения и вы в нем создаете еще одно окно где-то там внизу которое должно отображать Ваш лог? Зачем? Не проще ли положить лог в главное окно напрямую?
Т.е нажимая какую-либо из кнопок, я отсылаю в лог соответствующее сообщение (через wxLogMessage/wxLogWarning/wxLogError).
Так вот, по моей задумке, лог должен родиться в основном фрейме и быть одним из окон. А у меня получается, что он "самостоятельный" фрейм (можно переключаться Alt+Tab)
AK74 wrote: 2. Иконки не появляются, но цвет сообщений меняется. Может иконки не могут "жить" в одной колонке с текстовым сообщением?
Смотрел и даже куски кода стырил, но видимо, чего-то "не догнал".ONEEYEMAN wrote: Посмотрите как это реализовано в примере listctrl. И еще - если есть желание выводить иконку не в первой колонке - работать не булет. Если я правильно помнб был тикет на эту тему и большая дискуссия.
Вот кусок моего быдло-кода:
Code: Select all
// log all kinds of messages
void TColoredLogFrame::ShowLogMessage(wxLogLevel level, const wxString& msg)
{
// preset default values
wxString message= ""; wxColor m_color; m_color.Set(0xFF,0xFF,0xFF); int m_icon= 0;
// choose background color and StatusBar if enabled
switch ( level )
{
case wxLOG_Info: message.append(_(wxS("INFO: ")));
case wxLOG_Message: m_color.Set(0x80,0xFF,0x80);
message.append(_(wxS("MESSAGE: ")));
m_icon= 1;
break;
case wxLOG_Error: m_color.Set(0xFF,0x80,0x80);
message.append(_(wxS("ERROR: ")));
m_icon= 2;
break;
case wxLOG_Warning: m_color.Set(0xE6,0xE7,0x00);
message.append(_(wxS("WARNING: ")));
m_icon= 3;
break;
case wxLOG_Debug: message.append(_(wxS("DEBUG: ")));
case wxLOG_Trace: message.append(_(wxS("TRACE: ")));
break;
case wxLOG_FatalError: m_color.Set(0xFF,0x00,0x00);
message.append(_(wxS("FATAL ERROR: ")));
m_icon= 2;
default: m_color.Set(0xE7,0xE6,0xFF);
message.append(_(wxS("Unknown log reason: ")));
}
message.append(msg);
//add log string and icon if it is enabled & has valid value
if (m_UseIcons && (m_icon != 0))
m_Canvas->InsertItem(0,message,m_icon);
else //add message to log string only
m_Canvas->InsertItem(0,message);
//add background color if enabled
if (m_UseColors) m_Canvas->SetItemBackgroundColour(0,m_color);
m_Canvas->SetColumnWidth(0,wxLIST_AUTOSIZE);
m_Canvas->Update();
}
ЗЫ. По шагам проходил дебагером, все условия срабатывают.
Win XP, Win 7-64, VS2008, VS2010, wxWidgets 3.0.2
Re: wxWidgets & VCL
Лог обычно в программах бывает очень большим, по нескольку сотен а то и тысяч строк. Создавать буфер только для сохранения лога - накладно.AK74 wrote: Доброго всем времени суток.AK74 wrote: А зачем нужна возможность редактировать лог?
Конечно только режим read-only, с возможность сохранить в файл.Я имел ввиду, что логу, имхо, не нужны возможности редактирования. Только возможность очистить или скинуть в файл.ONEEYEMAN wrote: Судя по всему из-за сохранения в файл и произошло наследование от wxTextCtrl. Птому что сбрасывать в файл поточно строки из листа утомительно.
Да и зачем каждую строчку сбрасывать в файл? Можно ведь собрать все строки в буфер и затем скинуть уже его в файл.
Или я чего-то не понял?
А можно на код взглянуть. Я так понимаю у Вас его не очень много...AK74 wrote:AK74 wrote: 1. Фрейм лога никак не хочет "рождаться" в родительском фейме, а веде себя как независимый фрейм. Появляется в стороне от родительского окна, собственно и оригинал себя вел так же. Может это такое ограничение, что фрейм не может содержать в себе фрейм?Основной фрейм это только отладочный фрейм. Там только чекбокс (скрыть/показать лог) и три кнопки, имитирующие события (Info, warning, Error).ONEEYEMAN wrote: 1. Не совсем понял: у вас есть главное окно приложения и вы в нем создаете еще одно окно где-то там внизу которое должно отображать Ваш лог? Зачем? Не проще ли положить лог в главное окно напрямую?
Т.е нажимая какую-либо из кнопок, я отсылаю в лог соответствующее сообщение (через wxLogMessage/wxLogWarning/wxLogError).
Так вот, по моей задумке, лог должен родиться в основном фрейме и быть одним из окон. А у меня получается, что он "самостоятельный" фрейм (можно переключаться Alt+Tab)
ОК, иконки читаются из ресурсов или файла? InitAllImageHandlers() вызывалм в начале прграммы?AK74 wrote:AK74 wrote: 2. Иконки не появляются, но цвет сообщений меняется. Может иконки не могут "жить" в одной колонке с текстовым сообщением?Смотрел и даже куски кода стырил, но видимо, чего-то "не догнал".ONEEYEMAN wrote: Посмотрите как это реализовано в примере listctrl. И еще - если есть желание выводить иконку не в первой колонке - работать не булет. Если я правильно помнб был тикет на эту тему и большая дискуссия.
Вот кусок моего быдло-кода:Так вот, цвет меняется, текстовая часть выводится как надо, нет только иконок.Code: Select all
// log all kinds of messages void TColoredLogFrame::ShowLogMessage(wxLogLevel level, const wxString& msg) { // preset default values wxString message= ""; wxColor m_color; m_color.Set(0xFF,0xFF,0xFF); int m_icon= 0; // choose background color and StatusBar if enabled switch ( level ) { case wxLOG_Info: message.append(_(wxS("INFO: "))); case wxLOG_Message: m_color.Set(0x80,0xFF,0x80); message.append(_(wxS("MESSAGE: "))); m_icon= 1; break; case wxLOG_Error: m_color.Set(0xFF,0x80,0x80); message.append(_(wxS("ERROR: "))); m_icon= 2; break; case wxLOG_Warning: m_color.Set(0xE6,0xE7,0x00); message.append(_(wxS("WARNING: "))); m_icon= 3; break; case wxLOG_Debug: message.append(_(wxS("DEBUG: "))); case wxLOG_Trace: message.append(_(wxS("TRACE: "))); break; case wxLOG_FatalError: m_color.Set(0xFF,0x00,0x00); message.append(_(wxS("FATAL ERROR: "))); m_icon= 2; default: m_color.Set(0xE7,0xE6,0xFF); message.append(_(wxS("Unknown log reason: "))); } message.append(msg); //add log string and icon if it is enabled & has valid value if (m_UseIcons && (m_icon != 0)) m_Canvas->InsertItem(0,message,m_icon); else //add message to log string only m_Canvas->InsertItem(0,message); //add background color if enabled if (m_UseColors) m_Canvas->SetItemBackgroundColour(0,m_color); m_Canvas->SetColumnWidth(0,wxLIST_AUTOSIZE); m_Canvas->Update(); }
ЗЫ. По шагам проходил дебагером, все условия срабатывают.
Re: wxWidgets & VCL
Не много, но в ветке гадить не хочется. Может скинуть на файлообменник, а сюда дам линк?ONEEYEMAN wrote: А можно на код взглянуть. Я так понимаю у Вас его не очень много...
Только я уже заменил wxFrame на wxWindow, стал выводится в родительском фрейме. Но тоже не так как хотелось.
[/quote]ONEEYEMAN wrote: ОК, иконки читаются из ресурсов или файла? InitAllImageHandlers() вызывалм в начале прграммы?
Code: Select all
#include "error.xpm"
#include "info.xpm"
#include "warning.xpm"
А в конструкторе лог-фрейма:
if (fUseIcon)
{
img_list = new wxImageList( 48, 48 );
img_list->Add(wxIcon(info_xpm));
img_list->Add(wxIcon(error_xpm));
img_list->Add(wxIcon(warning_xpm));
m_Canvas->AssignImageList(img_list,wxIMAGE_LIST_NORMAL);
wxInitAllImageHandlers();
}
Win XP, Win 7-64, VS2008, VS2010, wxWidgets 3.0.2