прозрачный wxwindow

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
tolstik
In need of some credit
In need of some credit
Posts: 7
Joined: Sat Feb 26, 2011 3:31 pm

прозрачный wxwindow

Post by tolstik »

Доброго времени суток.

Есть несколько самодельных контролов, наследуемых от wxwindow. Если точнее, то каждый из них выводит график функции. они накладываются друг на друга. Как можно сделать фон контролов прозрачным?

если задать стиль wxtransparent_window, то
the window is transparent, that is, it will not receive paint events. windows only.
такой вариант не подходит( Т.к. программа кроссплатформенная, и отрисовка графиков происходит при paint events.
User avatar
T-Rex
Moderator
Moderator
Posts: 1249
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex »

Отрисовывать несколько графиков на одном контроле.
tolstik
In need of some credit
In need of some credit
Posts: 7
Joined: Sat Feb 26, 2011 3:31 pm

Post by tolstik »

T-Rex wrote:Отрисовывать несколько графиков на одном контроле.
К сожалению такой вариант не подходит. а фон прозрачным сделать никак?
User avatar
T-Rex
Moderator
Moderator
Posts: 1249
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex »

К сожалению такой вариант не подходит. а фон прозрачным сделать никак?
Скорее нет чем да. Если хочется кросс-платформенно, то наверное нет. А чем именно не устраивает рисование нескольких графиков на одном контроле? Вон на wxCode есть даже что-то рабочее и оно умеет делать что надо.
tolstik
In need of some credit
In need of some credit
Posts: 7
Joined: Sat Feb 26, 2011 3:31 pm

Post by tolstik »

T-Rex wrote:
К сожалению такой вариант не подходит. а фон прозрачным сделать никак?
Скорее нет чем да. Если хочется кросс-платформенно, то наверное нет. А чем именно не устраивает рисование нескольких графиков на одном контроле? Вон на wxCode есть даже что-то рабочее и оно умеет делать что надо.
У меня каждая ось - контрол со своим "внутренним я". Горизонтальная - общая. А вертикальные цепляются каждый со своим "контролом-графиком". В итоге все это по хитрому алгоритму выкладывается на окне. Все отлично, кроме того, что они закрывают друг-друга.

Хм, может их тогда наследовать от wxBitmap или wxImage?
User avatar
T-Rex
Moderator
Moderator
Posts: 1249
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex »

wxBitmap/wxImage жрут кучу памяти. Лучше тогда уже сделать OpenGL сцену.
А по поводу осей - надо подумать. Можно сделать управляющий контрол с тоглбаттонами который будет показывать графики если кнопка нажата.
Можно разными цветами отображать.
Наверное, есть смысл посмотреть как в Google Charts сделано. Они вроде умеют отображать несколько графиков. Там можно посмотреть как гугл реализовывают такую ситуацию.
Или еще где-то, в dotnetcharting например.
tolstik
In need of some credit
In need of some credit
Posts: 7
Joined: Sat Feb 26, 2011 3:31 pm

Post by tolstik »

T-Rex wrote:wxBitmap/wxImage жрут кучу памяти. Лучше тогда уже сделать OpenGL сцену.
А по поводу осей - надо подумать. Можно сделать управляющий контрол с тоглбаттонами который будет показывать графики если кнопка нажата.
Можно разными цветами отображать.
Наверное, есть смысл посмотреть как в Google Charts сделано. Они вроде умеют отображать несколько графиков. Там можно посмотреть как гугл реализовывают такую ситуацию.
Или еще где-то, в dotnetcharting например.
Да с отрисовкой на одном "канвасе" проблем нет. я могу все оси и графики вывести на одном канвасе, например в wxWindow или wxPanel. Просто в таком случае, если я хочу просматривать только n графиков, а не все, то приходится заново перерисовывать все. или если у одной из осей поменять максимум/минимум тоже все перерисовывать. А так просто сделал Show(false) / Enable(false) для нужный осей и графиков и все. У меня так сказал оси скрыться, а он уже сам сцепленным с ним графиком командует. Или задал оси макс/мин и рефреш.

А учитывая, что количество графиков и данных может быть сколько угодно велико, то отрисовывать все графики при каждом телодвижении не самый лучший вариант((
User avatar
T-Rex
Moderator
Moderator
Posts: 1249
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex »

Ну с OpenGL должно быть отлично.
glBegin(GL_LIST)/glEnd(GL_LIST) и оно последовательность команд отрисовки запомнит, потом просто из листа апдейтить. В общем, вполне достойное решение может получиться.
А отображать только выбранные - ну вот, контрол управляющий сделать, можно прям там на GL сцене чекбоксы порисовать, можно отдельно где-то.
tolstik
In need of some credit
In need of some credit
Posts: 7
Joined: Sat Feb 26, 2011 3:31 pm

Post by tolstik »

T-Rex wrote:Ну с OpenGL должно быть отлично.
glBegin(GL_LIST)/glEnd(GL_LIST) и оно последовательность команд отрисовки запомнит, потом просто из листа апдейтить. В общем, вполне достойное решение может получиться.
А отображать только выбранные - ну вот, контрол управляющий сделать, можно прям там на GL сцене чекбоксы порисовать, можно отдельно где-то.
Эх, с OpenGL мало знаком.. пойду читать. Даже не знал, что там есть список команд.
Спасибо за советы.

А управление переключением и прочим - этим у меня отдельный виджет заведует. Там и цвет линий графиков задается и шрифт и прочее. Все эти данный хранятся в соответствующий виджетах-"осях". Поменял параметры одной оси - он сам себя перерисовал. Красота)) Остальные стоят как были. Надеюсь списки команд позволят реализовать подобное.
tolstik
In need of some credit
In need of some credit
Posts: 7
Joined: Sat Feb 26, 2011 3:31 pm

Post by tolstik »

T-Rex wrote:Ну с OpenGL должно быть отлично.
glBegin(GL_LIST)/glEnd(GL_LIST) и оно последовательность команд отрисовки запомнит, потом просто из листа апдейтить. В общем, вполне достойное решение может получиться.
А отображать только выбранные - ну вот, контрол управляющий сделать, можно прям там на GL сцене чекбоксы порисовать, можно отдельно где-то.
Я все таки сделал без GL.

Я задал wxTRANSPARENT_WINDOW, а кроме того, перехватил wxEraseEvent и там отрисовываю прямоугольник прозрачной кистью и карандашом. Вроде сработало. При этом PaintEvent рисует. Правда, говорят, что при этом он рисует на родителе. Но пока тормозов нет. Буду проверять на 10^9 записей.
Post Reply