<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=159836&amp;view=findpost&amp;p=2370918</guid>
        <pubDate>Fri, 18 Sep 2009 11:29:20 +0000</pubDate>
        <title>Windows.Forms и Flash</title>
        <link>https://forum.sources.ru/index.php?showtopic=159836&amp;view=findpost&amp;p=2370918</link>
        <description><![CDATA[conalex: Грузить в ActiveX-плеер ролик из ресурса можно, используя его интерфейс IPersistStreamInit.<br>
Как это делать в с++ с спользованием ATL примерно известно. <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">LRESULT LoadMovieFromResource(UINT id, WCHAR* type)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;HRESULT hr = S_FALSE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;HRSRC hResource = FindResource(hModule, MAKEINTRESOURCE(id), type);</div><div class="code_line">&nbsp;&nbsp; &nbsp;HGLOBAL hResourceData = LoadResource(hModule, hResource);</div><div class="code_line">&nbsp;&nbsp; &nbsp;LPVOID lpResourceData = LockResource(hResourceData);</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD dwResourceSize = SizeofResource(hModule, hResource);</div><div class="code_line">&nbsp;&nbsp; &nbsp;HGLOBAL hGlobalData = GlobalAlloc(GPTR, dwResourceSize+8);</div><div class="code_line">&nbsp;&nbsp; &nbsp;LPBYTE pMem = (LPBYTE)GlobalLock(hGlobalData);</div><div class="code_line">&nbsp;&nbsp; &nbsp;((long*)pMem)[0] = 0x55665566; // это &quot;загадочные&quot; байты, о которых мне ничего не известно, но без них не грузится</div><div class="code_line">&nbsp;&nbsp; &nbsp;((long*)pMem)[1] = dwResourceSize;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CopyMemory((void*)(&amp;(pMem[8])), lpResourceData, dwResourceSize);</div><div class="code_line">&nbsp;&nbsp; &nbsp;IStream* pStream = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;hr = CreateStreamOnHGlobal(hGlobalData, TRUE, &amp;pStream);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(SUCCEEDED(hr))</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//m_spPlayer - это инстанс плеера в хостящем окне</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;hr = m_spPlayer-&#62;QueryInterface(IID_IUnknown, (void**)&amp;m_spUnknown);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CComQIPtr&#60;IPersistStreamInit&#62; pPersistStream(m_spUnknown);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if(pPersistStream)hr = pPersistStream-&#62;Load(pStream);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pStream-&#62;Release();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pStream = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;return hr;</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Интересно, как такое провернуть на .NET? То, что можно - это точно. Смотрите www.f-in-box.com.]]></description>
        <author>conalex</author>
        <category>.NET FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=159836&amp;view=findpost&amp;p=2180837</guid>
        <pubDate>Wed, 28 Jan 2009 08:48:45 +0000</pubDate>
        <title>Windows.Forms и Flash</title>
        <link>https://forum.sources.ru/index.php?showtopic=159836&amp;view=findpost&amp;p=2180837</link>
        <description><![CDATA[zZLOiz: На самом деле как то это провернуть можно. Например для Delphi существует компонент, который позволяет грузить из ресурсов, выводить на экран без окна формы (с поддержкой прозрачности). Но насколько я помню, там автор взламывал flash.ocx и переписывал его под свои нужды.]]></description>
        <author>zZLOiz</author>
        <category>.NET FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=159836&amp;view=findpost&amp;p=1901690</guid>
        <pubDate>Mon, 17 Mar 2008 08:00:07 +0000</pubDate>
        <title>Windows.Forms и Flash</title>
        <link>https://forum.sources.ru/index.php?showtopic=159836&amp;view=findpost&amp;p=1901690</link>
        <description><![CDATA[PIL: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=159836&view=findpost&p=1900907'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>GRIENDERS &#064; <time class="tag-quote__quoted-time" datetime="2008-03-16T06:49:48+00:00">16.03.08, 06:49</time></span><div class='quote '>без распаковывания и создания файла?</div></div> - вряд ли будет такая возможность, сомневаюсь :(<br>
Я этим направлением давно не занимался. Если разберешься - допиши]]></description>
        <author>PIL</author>
        <category>.NET FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=159836&amp;view=findpost&amp;p=1900907</guid>
        <pubDate>Sun, 16 Mar 2008 06:49:48 +0000</pubDate>
        <title>Windows.Forms и Flash</title>
        <link>https://forum.sources.ru/index.php?showtopic=159836&amp;view=findpost&amp;p=1900907</link>
        <description><![CDATA[GRIENDERS: PIL, все хорошо.<br>Но а как во втором случае загрузить ролик из ресурса, без распаковывания и создания файла?]]></description>
        <author>GRIENDERS</author>
        <category>.NET FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=159836&amp;view=findpost&amp;p=1326455</guid>
        <pubDate>Thu, 02 Nov 2006 10:29:48 +0000</pubDate>
        <title>Windows.Forms и Flash</title>
        <link>https://forum.sources.ru/index.php?showtopic=159836&amp;view=findpost&amp;p=1326455</link>
        <description><![CDATA[PIL: Данная статья посвящена тому, какими способами можно отображать Flash ролики на Windows.Forms и какими способами можно ими управлять.<br>
Окружение: Windows XP, .NET 2.0, Flash Player<br>
<br>
Задача может и не относится к распространенным, но возможно кому-то захочется добавить &quot;изюминку&quot; в свое приложение в виде векторной графики, анимации, звуков и т д. :)<br>
Способов встроить Flash ролик в форму - 2 (представлены ниже).<br>
<strong class='tag-b'>1. С помощью компонента обозревателя - System.Windows.Forms.WebBrowser.</strong><br>
<em class='tag-i'>Действия: </em>перетянуть на форму компонент WebBrowser или создать и настроить его руками, установить ему свойство Url - путь к ролику (.swf) или к .html в котором всторен флеш объект.<br>
	<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">private System.Windows.Forms.WebBrowser webBrowser1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;...</div><div class="code_line">&nbsp;&nbsp; &nbsp;this.webBrowser1 = new System.Windows.Forms.WebBrowser();</div><div class="code_line">&nbsp;&nbsp; &nbsp;this.webBrowser1.Location = new System.Drawing.Point(14, 236);</div><div class="code_line">&nbsp;&nbsp; &nbsp;this.webBrowser1.MinimumSize = new System.Drawing.Size(20, 20);</div><div class="code_line">&nbsp;&nbsp; &nbsp;this.webBrowser1.Name = &quot;webBrowser1&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;this.webBrowser1.Size = new System.Drawing.Size(250, 131);</div><div class="code_line">&nbsp;&nbsp; &nbsp;this.webBrowser1.Url = new System.Uri(&quot;c:\tmp\simple.swf&quot;, System.UriKind.Absolute);</div></ol></div></div></div></div><br>
<em class='tag-i'>Достоинства:</em> простота<br>
<em class='tag-i'>Недостатки: </em>нет возможности получать комманды от ролика и управлять им<br>
Способ подходит для простого отображения флеш контента. Если роликом нужно управлять или получать от него комманды, - необходимо воспользоваться вторым способом.<br>
<br>
<strong class='tag-b'>2. С помощью AxtiveX компонента Shockware Flash Object.</strong><br>
<em class='tag-i'>Действия:</em><br>
 - в VS 2005 правой кнопкой кликнуть на поле Toolbox, в контекстном меню выбрать Choose Items.<br>
 - в появившемся окне Choose Toolbox Items перейти на закладку COM Components, выбрать Shokware Flash Object <br>
	(я использую Debug версию 9 плеера, у меня это - c:&#092;Windows&#092;system32&#092;Macromed&#092;Flash&#092;FlDbg9.ocx).<br>
 - теперь на закладке у нас появился Shockware Flash Object, который можно смело перетянуть на форму.<br>
	<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">private AxShockwaveFlashObjects.AxShockwaveFlash flashPlayer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;this.flashPlayer = new AxShockwaveFlashObjects.AxShockwaveFlash();</div><div class="code_line">&nbsp;&nbsp; &nbsp;this.flashPlayer.Enabled = true;</div><div class="code_line">&nbsp;&nbsp; &nbsp;this.flashPlayer.Location = new System.Drawing.Point(13, 12);</div><div class="code_line">&nbsp;&nbsp; &nbsp;this.flashPlayer.Name = &quot;flashPlayer&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;this.flashPlayer.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject(&quot;flashPlayer.OcxState&quot;)));</div><div class="code_line">&nbsp;&nbsp; &nbsp;this.flashPlayer.Size = new System.Drawing.Size(300, 200);</div></ol></div></div></div></div><br>
 - замеченные баги: Если при первой компиляции после добавления ролика выдает ошибку, что не найден только что добавленный компонент - необходимо удалить папки obj, bin в проекте.<br>
<em class='tag-i'>Работа с компонентом:</em><br>
 - загрузка ролика в компонент:<br>
	<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">string path = &quot;c:\tmp\simple.swf&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;flashPlayer.LoadMovie(0, path);</div></ol></div></div></div></div><br>
	здесь я надеюсь все понятно, смущение может вызвать первый параметр - для тех, кто знает флеш - это слой, на который будет загружен ролик.<br>
 - получение команд от ролика:<br>
	флеш ролик может взаимодействовать с окружением с помощью команды языка Action Sript - fscommand, например(обработчик нажатия кнопки во флеш ролике) - <br>
	<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">on(click) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fscommand(&quot;sendCmd&quot;, 1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div></ol></div></div></div></div><br>
	первый параметр - имя комманды, второй - аргумент комманды.<br>
	Ловим эту комманду из Windows.Forms :<br>
	//подписываемся на событие от ролика на получение fscommand<br>
	<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">flashPlayer.FSCommand += new AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEventHandler(flashPlayer_FSCommand);</div><div class="code_line">&nbsp;&nbsp; &nbsp;//подписчик:</div><div class="code_line">&nbsp;&nbsp; &nbsp;void flashPlayer_FSCommand(object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEvent e)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;tbOut.Text += e.command + &quot; (&quot; + e.args + &quot;)&quot; + &quot;\r\n&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div></ol></div></div></div></div><br>
	при этом - e.command - команда (строка), e.args - аргумент команды (строка). В примере команда добавляется в текстовое поле для отображения.<br>
	- управление роликом:<br>
	для управления роликом у компонента есть блок методов, начинающихся с T, вот некоторые:<br>
	<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">flashPlayer.TPlay(&quot;rect_mc&quot;); &nbsp; //стартует MovieClip rect_mc, который находится на сцене ролика</div><div class="code_line">&nbsp;&nbsp; &nbsp;flashPlayer.TGotoFrame(&quot;rect_mc&quot;, 1); &nbsp; //переводит rect_mc на первый кадр</div><div class="code_line">&nbsp;&nbsp; &nbsp;flashPlayer.TCallFrame(&quot;rect_mc&quot;, 1); &nbsp; //вызывает первый кадр rect_mc</div><div class="code_line">&nbsp;&nbsp; &nbsp;flashPlayer.TStopPlay(&quot;rect_mc&quot;); &nbsp; &nbsp; &nbsp; //останавливает проигрывание rect_mc</div><div class="code_line">&nbsp;&nbsp; &nbsp;flashPlayer.TSetProperty(&quot;rect_mc&quot;, 1, &quot;50&quot;);//установить свойство c индексом 1 в значение &quot;50&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;string s = flashPlayer.TGetProperty(&quot;rect_mc&quot;, 1); &nbsp;//считать первое свойство</div><div class="code_line">&nbsp;&nbsp; &nbsp;int frame = flashPlayer.TCurrentFrame(&quot;rect_mc&quot;); &nbsp; //узнать на каком кадре находится ролик.</div></ol></div></div></div></div><br>
	и еще много вкусного :)<br>
Данная статья расчитана наверное не на очень широкий круг читателей форума, но вопрос не достаточно освещен в рунете, поэтому я думаю кому-то, но она пригодится. Может кто-то мечтал написать флеш игрушку, но при этом не знал Action Script, прочитав эту статью, это можно сделать теперь на родном C# :-)<br>
Проект с примером не выкладываю, по причине распространенности разных версий флеш плееров и ocx компонентов, но работоспособность приведенного кода будет соблюдаться при наличии флеш плеера версии 6 и старше, возможно и младше - не проверял.<br>
Вопросы и комментарии приветствуются. Спасибо прочитавшим, при распространении ставьте копирайты ;-)]]></description>
        <author>PIL</author>
        <category>.NET FAQ</category>
      </item>
	
      </channel>
      </rss>
	