Как стать автором
Обновить

Комментарии 23

Перечитал 2 раза, конкретики не извлёк :(
а что конкретнее, кусок кода выложить из своего проекта?
кстати я был бы рад увидеть пример использования этого VMem, сам когда-то текстуры им генерировал, интересно сравнить
А мне было интересно почитать! Жду продолжения! :-)

Вот у нас есть картинка в памяти, мы её можем вывести в окно, а как поверх нее сделать прозрачные контролы? Стандартные контролы поддерживают прозрачность? Или тоже как картинку их делать)))
Думаю дальше автор будет писать про вывод через SDL, который на Windows использует Direct3D.

Только с заботой о красоте заказчик забыл про производительность и совместимость. Скорее всего пользователю придётся обновлять компоненты DirectX. Да ещё нужно помнить, что у 60% целевой аудитории всё ещё Windows XP, и даже у той части у кого уже Windows 7 у многих тема Basic. А в обоих этих случаях даже Windows Media Player выводит видео через оверлей и имеет непрозрачный интерфейс. Ведь в Microsoft ребята не дураки…

Короче, вывод через Direct3D создаёт гораздо большую нагрузку на CPU и видеокарту. А это самое главное и ради этого лучше пожертвовать прозрачностью.
Подозреваю, что софтина писалась для какого-то специфичного устройства. Может быть что-то типа терминала самообслуживания.
Уже лет 6 вывожу видео через Direct3D с прозрачностями шейдерами и т.п. О какой нагрузке речь? Уже шесть лет назад средняя машина тянула спокойно более 4-х DivX видео роликов. См. пример из DirectX 9.0 SDK — там где карусель их роликов.
Имелись ввиду ролики в стандартном разрешении.
Также не понятно, что надо обновлять. DirectX 9.0 и все работает из коробки что под Win7, что под XP.
SDL обычно требует определённой версии d3dx9_??.dll
Я d3dx9_??.dll просто включаю в свой пакет установки. Правда, с этим, кажется, есть лицензионные проблемы. Или были. Давно не интересовался этим вопросом.
Не использую SDL.
Короче, вывод через Direct3D создаёт гораздо большую нагрузку на CPU и видеокарту.

по сравнению с чем?
Нет, вывод работает через Direct3D. Система такая же как и в плагине VLC — direct3d video output плюс отрисовка примитивов в качестве ГУИ
Кстати, сами авторы VLC рекомендуют писать для кастомного вывода свой плагин. Лучше б об этом кто написал :-). Сам тоже пользую libvlc_video_set_callbacks. Но у меня основной способ декодирования видео все же через DirectShow. LibVLC использую на случай, когда с DirectShow сложности. Например, для потокового видео.
у меня как таки только потоковое видео ну а насчет плагина были идеи, но не заладилось, ну а писать свой почему бы и нет? самое главное научиться компилять под Windows(благо и статейка соответствующая имеется)а с добавлением нового не должно быть проблем, берешь уже существующие и правишь. С плагином VMem я так и сделал, пришлось допилить его
я так и не понял каким же образом увязать абсолютно прозрачное окно с полупрозрачными элементами
А в чём проблема? Рисуем полупрозрачные png или svg и вперёд. Пример:
#include <QMainWindow>
#include <QApplication>
#include <QPushButton>
#include <QHBoxLayout>

class TranWin : public QMainWindow
{
public:
  TranWin( QWidget* Parent = 0 );
}; // TranWin

TranWin::TranWin( QWidget* Parent ) : QMainWindow( Parent, Qt::FramelessWindowHint )
{
  setAttribute( Qt::WA_TranslucentBackground );
  setAttribute( Qt::WA_NoSystemBackground );
  QWidget* Wid = new QWidget( this );
  QHBoxLayout* Layout = new QHBoxLayout( Wid );
  QPushButton* Button = new QPushButton( QIcon( "stop.png" ), "Quit", Wid );
  Button->setFlat( true );
  connect( Button, SIGNAL( clicked( bool ) ), qApp, SLOT( quit() ) );
  Layout->addWidget( Button );
  Button = new QPushButton( QIcon( "play.png" ), "About Qt", Wid );
  Button->setFlat( true );
  connect( Button, SIGNAL( clicked( bool ) ), qApp, SLOT( aboutQt() ) );
  Layout->addWidget( Button );
  Wid->setLayout( Layout );
  setCentralWidget( Wid );
} // TranWin()

int main( int argc, char* argv[] )
{
  QApplication App( argc, argv );
  TranWin* Win = new TranWin;
  Win->show();
  return App.exec();
} // main( int, char*[] )
Выглядит как-то так: .
угу, прям сейчас решил затестить твой код: привязал видео к главному окну, затем к виджету — итог один — ничего не рисуется при включенном transcluent. пробовал комбинировать(привязал видео к виджету, установил флаги другие) и получалось что рисуется либо элементы, либо видео. вот так вот…
А видео в данном случае должно быть в отдельном окне, расположенном под окном с контролами.
да идея была, я писал про синхронизацию окон. но насколько я знаю в Win7 при таком подходе эти два окна будут отображаться в таскбаре запущенного приложения, и это не очень хорошо, плюс надо еще сделать чтобы окно было постоянно поверх видео окна но не topmost поверх всех окон
есть возможность установки флагов для окон, можно сделать, чтоб не отображалось в таскбаре
QWidget::raise() окну с контролами при активации окна с видео не поможет?
Мне кажется, что синхронизация окон будет проще, чем ручное управление специальными контролами. Хотя, возможно, это скучнее.
что за флаги? а как быть с topmost?
если говорить о Qt,setWindowFlags(Qt::Tool) убирает окно из таскбара.С topmost тоже, я думаю, можно что-нибудь придумать
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации