wxWidgets & VCL

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
AK74
Earned a small fee
Earned a small fee
Posts: 17
Joined: Thu Nov 27, 2014 5:41 pm

wxWidgets & VCL

Post by AK74 »

Доброго все времени суток.
Пытаюсь переписать свои старые Delphi проекты на VS+wxWidgets, с целью изучения виджетов.
Столкнулся с такими вопросами:
1. Есть ли аналог компонента TCanvas?
2. Большинство VCL-компонентов имеют свойство TAG. Есть его аналог в виджетах?
3. Так же не могу найти аналог поля Handle.
Подскажите, плз, куда копать!

Заранее благодарен.
Win XP, Win 7-64, VS2008, VS2010, wxWidgets 3.0.2
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: wxWidgets & VCL

Post by ONEEYEMAN »

Доброго времени суток,
AK74 wrote: Доброго все времени суток.
Пытаюсь переписать свои старые Delphi проекты на VS+wxWidgets, с целью изучения виджетов.
Столкнулся с такими вопросами:
1. Есть ли аналог компонента TCanvas?
В каком контексте? Для прорисовки чего-то или для расположения контролов?
AK74 wrote: 2. Большинство VCL-компонентов имеют свойство TAG. Есть его аналог в виджетах?
Каждый контрол имеет поле name. Посмотрите по документации для wxWindow - если не ошибаюсь это последний параметр.
AK74 wrote: 3. Так же не могу найти аналог поля Handle.
Здесь просто - нужно вызвать функцию GetHandle(). Это если нужен HWND - Window Handle.
Я просто ну очень давно с Delphi не общался. :D
AK74 wrote: Подскажите, плз, куда копать!

Заранее благодарен.
AK74
Earned a small fee
Earned a small fee
Posts: 17
Joined: Thu Nov 27, 2014 5:41 pm

Re: wxWidgets & VCL

Post by AK74 »

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
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: wxWidgets & VCL

Post by ONEEYEMAN »

Здравствуйте,
AK74 wrote:
1. Есть ли аналог компонента TCanvas?
В каком контексте? Для прорисовки чего-то или для расположения контролов?
Да, именно рисования.
Посмотрите как это реализовано в drawing sample.
Будут вопросы - пишите.
AK74 wrote:
2. Большинство VCL-компонентов имеют свойство TAG. Есть его аналог в виджетах?
Каждый контрол имеет поле name. Посмотрите по документации для wxWindow - если не ошибаюсь это последний параметр.
Спасибочки, померяю. ;-)
ЗЫ. Я было подумал использовать wxWindowID, т.к wxFormBuilder туда заносит wxID_ANY.
Как смотрите на такое извращение?
Если я правильно помню - TAG это строка которая пнривязывается к окну.
В данном случае больше подходит name. Window ID - это в основном используется для привязки событий.
К тому же wxID_ANY - константа (-1) которая не меняется.
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 как это провернуть?
Опять просто - создаете wxCommandEvent и вызываете HandleEvent(). Посмотрите event sample - там должна быть реализация.

Кстати, какая версия wx и какая версия компилятора?
И может проще и быстрее будет в личку - ikorot01 at gmail dot com.
AK74
Earned a small fee
Earned a small fee
Posts: 17
Joined: Thu Nov 27, 2014 5:41 pm

Re: wxWidgets & VCL

Post by AK74 »

Если я правильно помню - TAG это строка которая пнривязывается к окну.
Нет, в VCL Tag - integer и имеют его не только окна, почти все компоненты.

Т.е, как я понимаю, wxWindowID, как таковой не используется, его использование и интерпретация
оставлены на усмотрение конечных девелоперов?
Win XP, Win 7-64, VS2008, VS2010, wxWidgets 3.0.2
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: wxWidgets & VCL

Post by ONEEYEMAN »

AK74 wrote:
Если я правильно помню - TAG это строка которая пнривязывается к окну.
Нет, в VCL Tag - integer и имеют его не только окна, почти все компоненты.

Т.е, как я понимаю, wxWindowID, как таковой не используется, его использование и интерпретация
оставлены на усмотрение конечных девелоперов?
При программировании в Windows/MFC Микрософт сделал статическую таблицу событий (BEGIN_MESSAGE_MAP()/END_MESSAGE_MAP()). Привязка событий в этом случае происходит через уникальный идентификатор окна.
В wxWidgets этот интерфейс сохранен, но добавлена возможность динамической привязки. Но поскольку окна должны иметь уникальный иднетификатор (требование Виндовс интеейса - RegisterClass() API необходимо вызывать) то используется данный параметр.
Что касаемо wxID_ANY. Значение этой константы -1. Одерко ьиьлиотека сама генерирует уникальный идентификатор окна. Вы как программист можете создать свои идентификаторы и использовать их (как в большинстве проимеров - используется статическая таблица событий). Но в основном все пишут так чтобы обходиться без жтого.
AK74
Earned a small fee
Earned a small fee
Posts: 17
Joined: Thu Nov 27, 2014 5:41 pm

Re: wxWidgets & VCL

Post by AK74 »

Доброго всем времени суток!
Спасибо, камрад ONEEYEMAN.

Может еще не откажете помочь советом?
Заморочился я логами.
Нужно, чтобы выводился лог в отдельное окошко, как LogWindow, но без вывода DialogBox, т.е тихий "стукачек", который может сворачиваться/разворачиваться в родительской форме.
Но! Нужно чтобы выводимые сообщения "окрашивались" в зависимости от LogLevel либо к ним добавлялись значки, как у LogGUI.
Среди стандартных, как я понял, такого нет. Т.е нужно писать самому.
Самое простое - переписать LogWindow, но в TextCtrl не возможно ни красить текст, ни добавлять значки.
Может, подскажете куда рыть?

ЗЫ. Если имеет значение, VStudio 2008+wxWidgets 3.0.2

Заранее спасибо.
Win XP, Win 7-64, VS2008, VS2010, wxWidgets 3.0.2
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: wxWidgets & VCL

Post by ONEEYEMAN »

AK74 wrote: Доброго всем времени суток!
Спасибо, камрад ONEEYEMAN.
Пожалуйств.
AK74 wrote: Может еще не откажете помочь советом?
Заморочился я логами.
Нужно, чтобы выводился лог в отдельное окошко, как LogWindow, но без вывода DialogBox, т.е тихий "стукачек", который может сворачиваться/разворачиваться в родительской форме.
Но! Нужно чтобы выводимые сообщения "окрашивались" в зависимости от LogLevel либо к ним добавлялись значки, как у LogGUI.
Среди стандартных, как я понял, такого нет. Т.е нужно писать самому.
Самое простое - переписать LogWindow, но в TextCtrl не возможно ни красить текст, ни добавлять значки.
Может, подскажете куда рыть?

ЗЫ. Если имеет значение, VStudio 2008+wxWidgets 3.0.2

Заранее спасибо.
Проще всего действительно переписать. Но при этом либо использовать RICHTEXT флаг, либо wxRichTextCtrl. Посмотрите в примере text. Там это показано.
AK74
Earned a small fee
Earned a small fee
Posts: 17
Joined: Thu Nov 27, 2014 5:41 pm

Re: wxWidgets & VCL

Post by AK74 »

ONEEYEMAN wrote: Проще всего действительно переписать. Но при этом либо использовать RICHTEXT флаг, либо wxRichTextCtrl. Посмотрите в примере text. Там это показано.
Мне он показался избыточным и тяжеловесным, для подобного применения.
Я склоняюсь к мысли переписать LogWindow на использование wxListCtrl вместо TextCtrl.
Если все выводить в одну колонку, без заголовка.
Там вроде и цвет айтимов можно задавать и иконки задавать.

Или фигня получится? Как считаете?
Win XP, Win 7-64, VS2008, VS2010, wxWidgets 3.0.2
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: wxWidgets & VCL

Post by ONEEYEMAN »

AK74 wrote:
ONEEYEMAN wrote: Проще всего действительно переписать. Но при этом либо использовать RICHTEXT флаг, либо wxRichTextCtrl. Посмотрите в примере text. Там это показано.
Мне он показался избыточным и тяжеловесным, для подобного применения.
Я склоняюсь к мысли переписать LogWindow на использование wxListCtrl вместо TextCtrl.
Если все выводить в одну колонку, без заголовка.
Там вроде и цвет айтимов можно задавать и иконки задавать.

Или фигня получится? Как считаете?
В данном конкретном случае есть выбор - либо использовать стиль wxTE_RICH либо действительно наследоваться от wxListCtrl.

Судя по всему для лога редактирование не обязательно поэтому наверно проше будет использовать wxListCtrl.
AK74
Earned a small fee
Earned a small fee
Posts: 17
Joined: Thu Nov 27, 2014 5:41 pm

Re: wxWidgets & VCL

Post by AK74 »

ONEEYEMAN wrote: Судя по всему для лога редактирование не обязательно поэтому наверно проше будет использовать wxListCtrl.
А зачем нужна возможность редактировать лог?
Конечно только режим read-only, с возможность сохранить в файл.
Я даже переписал стандартный wxLogWindow на использование wxListCtrl. И даже работает, но не совсем так, как хотелось бы:
1. Фрейм лога никак не хочет "рождаться" в родительском фейме, а веде себя как независимый фрейм. Появляется в стороне от родительского окна, собственно и оригинал себя вел так же. Может это такое ограничение, что фрейм не может содержать в себе фрейм?
2. Иконки не появляются, но цвет сообщений меняется. Может иконки не могут "жить" в одной колонке с текстовым сообщением?

Еще раз спасибо, камрад! Ваши подсказки существенны для "чайника", т.е меня.
Win XP, Win 7-64, VS2008, VS2010, wxWidgets 3.0.2
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: wxWidgets & VCL

Post by ONEEYEMAN »

AK74 wrote:
ONEEYEMAN wrote: Судя по всему для лога редактирование не обязательно поэтому наверно проше будет использовать wxListCtrl.
А зачем нужна возможность редактировать лог?
Конечно только режим read-only, с возможность сохранить в файл.
Судя по всему из-за сохранения в файл и произошло наследование от wxTextCtrl. Птому что сбрасывать в файл поточно строки из листа утомительно.
AK74 wrote: Я даже переписал стандартный wxLogWindow на использование wxListCtrl. И даже работает, но не совсем так, как хотелось бы:
1. Фрейм лога никак не хочет "рождаться" в родительском фейме, а веде себя как независимый фрейм. Появляется в стороне от родительского окна, собственно и оригинал себя вел так же. Может это такое ограничение, что фрейм не может содержать в себе фрейм?
2. Иконки не появляются, но цвет сообщений меняется. Может иконки не могут "жить" в одной колонке с текстовым сообщением?

Еще раз спасибо, камрад! Ваши подсказки существенны для "чайника", т.е меня.
Начну с более простого.
2. Посмотрите как это реализовано в примере listctrl. И еще - если есть желание выводить иконку не в первой колонке - работать не булет. Если я правильно помнб был тикет на эту тему и большая дискуссия.

1. Не совсем понял: у вас есть главное окно приложения и вы в нем создаете еще одно окно где-то там внизу которое должно отображать Ваш лог? Зачем? Не проще ли положить лог в главное окно напрямую?
А для того что Вы хотите проще использовать wxAUI.
AK74
Earned a small fee
Earned a small fee
Posts: 17
Joined: Thu Nov 27, 2014 5:41 pm

Re: wxWidgets & VCL

Post by AK74 »

Доброго всем времени суток.
AK74 wrote: А зачем нужна возможность редактировать лог?
Конечно только режим read-only, с возможность сохранить в файл.
ONEEYEMAN wrote: Судя по всему из-за сохранения в файл и произошло наследование от wxTextCtrl. Птому что сбрасывать в файл поточно строки из листа утомительно.
Я имел ввиду, что логу, имхо, не нужны возможности редактирования. Только возможность очистить или скинуть в файл.
Да и зачем каждую строчку сбрасывать в файл? Можно ведь собрать все строки в буфер и затем скинуть уже его в файл.
Или я чего-то не понял?
AK74 wrote: 1. Фрейм лога никак не хочет "рождаться" в родительском фейме, а веде себя как независимый фрейм. Появляется в стороне от родительского окна, собственно и оригинал себя вел так же. Может это такое ограничение, что фрейм не может содержать в себе фрейм?
ONEEYEMAN wrote: 1. Не совсем понял: у вас есть главное окно приложения и вы в нем создаете еще одно окно где-то там внизу которое должно отображать Ваш лог? Зачем? Не проще ли положить лог в главное окно напрямую?
Основной фрейм это только отладочный фрейм. Там только чекбокс (скрыть/показать лог) и три кнопки, имитирующие события (Info, warning, Error).
Т.е нажимая какую-либо из кнопок, я отсылаю в лог соответствующее сообщение (через 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
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: wxWidgets & VCL

Post by ONEEYEMAN »

AK74 wrote: Доброго всем времени суток.
AK74 wrote: А зачем нужна возможность редактировать лог?
Конечно только режим read-only, с возможность сохранить в файл.
ONEEYEMAN wrote: Судя по всему из-за сохранения в файл и произошло наследование от wxTextCtrl. Птому что сбрасывать в файл поточно строки из листа утомительно.
Я имел ввиду, что логу, имхо, не нужны возможности редактирования. Только возможность очистить или скинуть в файл.
Да и зачем каждую строчку сбрасывать в файл? Можно ведь собрать все строки в буфер и затем скинуть уже его в файл.
Или я чего-то не понял?
Лог обычно в программах бывает очень большим, по нескольку сотен а то и тысяч строк. Создавать буфер только для сохранения лога - накладно.
AK74 wrote:
AK74 wrote: 1. Фрейм лога никак не хочет "рождаться" в родительском фейме, а веде себя как независимый фрейм. Появляется в стороне от родительского окна, собственно и оригинал себя вел так же. Может это такое ограничение, что фрейм не может содержать в себе фрейм?
ONEEYEMAN wrote: 1. Не совсем понял: у вас есть главное окно приложения и вы в нем создаете еще одно окно где-то там внизу которое должно отображать Ваш лог? Зачем? Не проще ли положить лог в главное окно напрямую?
Основной фрейм это только отладочный фрейм. Там только чекбокс (скрыть/показать лог) и три кнопки, имитирующие события (Info, warning, Error).
Т.е нажимая какую-либо из кнопок, я отсылаю в лог соответствующее сообщение (через wxLogMessage/wxLogWarning/wxLogError).
Так вот, по моей задумке, лог должен родиться в основном фрейме и быть одним из окон. А у меня получается, что он "самостоятельный" фрейм (можно переключаться Alt+Tab)
А можно на код взглянуть. Я так понимаю у Вас его не очень много...
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();
}
Так вот, цвет меняется, текстовая часть выводится как надо, нет только иконок.
ЗЫ. По шагам проходил дебагером, все условия срабатывают.
ОК, иконки читаются из ресурсов или файла? InitAllImageHandlers() вызывалм в начале прграммы?
AK74
Earned a small fee
Earned a small fee
Posts: 17
Joined: Thu Nov 27, 2014 5:41 pm

Re: wxWidgets & VCL

Post by AK74 »

ONEEYEMAN wrote: А можно на код взглянуть. Я так понимаю у Вас его не очень много...
Не много, но в ветке гадить не хочется. Может скинуть на файлообменник, а сюда дам линк?
Только я уже заменил wxFrame на wxWindow, стал выводится в родительском фрейме. Но тоже не так как хотелось.
ONEEYEMAN wrote: ОК, иконки читаются из ресурсов или файла? InitAllImageHandlers() вызывалм в начале прграммы?
[/quote]

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
Post Reply