星期五, 11月 23, 2007

為網頁上多個元件加入相同的事件處理 - 鍵盤

加入事件handler (兩種方法 擇一即可)

//為input element加入事件handler
HtmlElementCollection tt = divDeviceChoosing.GetElementsByTagName("input");
foreach (HtmlElement a in tt)
{
//Method 1: AttachEventHandler 據說利用+=不會覆蓋父物件的事件(i++與i=1)
a.AttachEventHandler("onclick", new EventHandler(Device_Click));

//Method 2: +=
a.Click +=new HtmlElementEventHandler(teachAni_Click);
}

//事件處理 (兩種方法 擇一即可)
private void teachAni_Click(object sender, EventArgs e)
{
//Method 1: 最快最簡單 (不過要注意事件handl要用HtmlElementEventHandler,而不是EventHandler,不然sender好像會null)
HtmlElement buster = (HtmlElement)sender;
choosing(buster.Id);

//Method 2: 剛被"激化"的ActiveElement
HtmlElement buster = divDeviceChoosing.Document.ActiveElement;
MessageBox.Show(buster.Id);
//int number = int.Parse(buster.Document.ActiveElement.GetAttribute("value"));
String MacAddr = buster.Document.ActiveElement.Id;
}


**動態加入元件及事件處理**

動態加入有兩種
1.利用HtmlDocument.CreateElement
注意:此方法可work,還沒有找到方法移除element ,法二就可以了

//建立一個input的html element
HtmlElement imgDevice = divDeviceChoosing.Document.CreateElement("input");
...
//加入事件處理
imgDevice.AttachEventHandler("onclick", new EventHandler(teachAni_Click));
//再接入某位置
divDeviceChoosing.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd, imgDevice);

2.利用innerHtml

//加入多個可利用樣版
for (;;;)
{
string Butstr = "";
//套文字
string OutStr=OutStr.Replace("##id##",id);
}
//加入某段div裡
div.InnerHtml = OutStr;
//事件處理同上

星期三, 11月 14, 2007

JavaScript 與 Flash 的通訊範例

JavaScript 與 Flash 的通訊範例

有3種不同的方式
1.JavaScript 對 Flash 的通訊
2.Flash 對 JavaScript 的通訊
*主要通過fscommand 指令
3.Flash 對 Flash 的通訊

另外還有javascirpt call c# function

星期二, 11月 13, 2007

javascript call c# function

1.c#裡的function
public void test()
{
Messagebox.show(""Are you shit on me?");
}

2.加入com
在namespace後的第一行
比public class 更之前 加入 [System.Runtime.InteropServices.ComVisibleAttribute(true)]
ex.
namespace ezLa
{
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public partial class ezLa : Form
...
}


2.為webBrowser加入指定物件
webBrowser1.ObjectForScripting = this; //寫在建構子

3.在html裡加入要觸發
ex.利用button實作
在onclick="window.external.test()" 就ok啦

星期一, 11月 12, 2007

偵測影片是否播完

偵測影片是否播完
=>flv可利用obj.duration
=>swf,載入時去偵測 _totalframes

在第幾秒處設定觸發點
=>addCuePoint

聲音的現在放的毫秒數
=>soundid.duration

C#書籍

Windows Forms Programming with C#(中譯:實作手冊-使用c#),Erik Brown

星期三, 11月 07, 2007

WebBrowser 呼叫javascript

1.win form 呼叫javascript
方法:public Object InvokeScript (string scriptName)
實例:webBrowser1.Document.InvokeScript("Method"); //不用加括號,也可加啦

由於內嵌flv player的html無法用c#來設定style="display: none"
不過可使用visibility使之隱藏
但用display才是王道...因為visibility會留空白

而直接利用網頁上的javascipt卻可以讓display正常隱藏
因此得利用webbrowser呼叫javascript...


2.傳參數給javascript
方法:public Object InvokeScript (string scriptName, Object[] args)
範例:MSDN上的例子
private void InvokeTestMethod(String name, String address)
{
if (webBrowser1.Document != null)
{
Object[] objArray = new Object[2];
objArray[0] = (Object)name;
objArray[1] = (Object)address;
webBrowser1.Document.InvokeScript("test", objArray);
}
}

Javascript

<-HTML>
<-SCRIPT>
function test(name, address) { //自動變成兩個參數
window.alert("Name is " + name + "; address is " + address);
}
<-/SCRIPT>
<-/HTML>


搞半天,原來不是直接寫在裡面scriptName的括號裡
是要在後面加傳參數array,而且參數會自動依序拆成一個個的參數

3.Thread呼叫javascript
跨執行緒作業無效的呼叫法,寫法如下,簡化不寫參數
private void InvokeTestMethod()
{
if (wbContent.InvokeRequired)
{
wbContent.Invoke(new MethodInvoker(InvokeTestMethod)); //delgete型態,傳Method Name
else
{
webBrowser1.Document.InvokeScript("test");
}
}



下次研究看怎麼動態增加javascript進去


**備註**
呼叫javascript時,有時會因web page尚未讀完,所以呼叫javascript function會沒有反應
最好是等page loaded通知webbrowser,webbrowser再去call javascript