明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

C#開(kāi)發(fā)WINDOWS應(yīng)用程序時(shí)消息的處理(C#學(xué)習(xí)筆記之二)

[摘要]作者:浙江省溫嶺市電信局 王駿WINDOWS應(yīng)用程序是靠消息驅(qū)動(dòng)的,在VC中我們通過(guò)CLASSWIZARD可以為某窗口類添加消息處理函數(shù),CLASSWIZARD將為你添加消息映射,對(duì)于WINDOWS...
作者:浙江省溫嶺市電信局 王駿


WINDOWS應(yīng)用程序是靠消息驅(qū)動(dòng)的,在VC中我們通過(guò)CLASSWIZARD可以為某窗口類添加消息處理函數(shù),CLASSWIZARD將為你添加消息映射,對(duì)于WINDOWS消息,生成的消息處理函數(shù)重載了基類的虛擬方法。而在C#中如何處理消息呢?本文針對(duì)VS.NET BETA1環(huán)境下的C#簡(jiǎn)單地介紹WINDOWS消息以及自定義消息的處理方法。

示例代碼下載 17K

一、生成一個(gè)名為MSGApplication的工程
工程的建立方法請(qǐng)參考:C#學(xué)習(xí)筆記之一

二、處理WM_PAINT消息
我們以WM_PAINT消息的處理為例,在C#中處理消息與MFC的消息處理是類似的,但更為簡(jiǎn)單。MFC中需要使用DECLARE_MESSAGE_MAP來(lái)定義消息映射,在C#就不需要了。比如WM_PAINT消息,我們只要重載父類中的OnPaint虛擬方法即可(雖然在BETA1中重載父類虛擬方法的操作過(guò)程有點(diǎn)繁瑣),方法如下:
在菜單View->Other Windows->Object Browser打開(kāi)對(duì)象瀏覽窗口(或用CTRL+ALT+J打開(kāi)),在我們的工程名下找到Form并選中,這時(shí)在右邊的窗口列出所有Form類的成員函數(shù),如圖所示:
我們選中OnPaint(System.WinForms.PaintEventArgs)此時(shí)在下面會(huì)顯示完整的OnPaint函數(shù)protected void OnPaint ( System.WinForms.PaintEventArgs e )我們將這一行字符串Copy下來(lái)。打開(kāi)Form1.cs進(jìn)行代碼編輯,我們把剛才拷貝下來(lái)的函數(shù)定義復(fù)制到Form1類里面,并加上override關(guān)鍵字,此時(shí)我們便可以在里面添加我們的消息處理代碼了,請(qǐng)參考如下代碼段:


protected override void OnPaint ( System.WinForms.PaintEventArgs e )
{
Font font = new Font("黑體",28);///定義字體:黑體,大。28
SolidBrush bluepen = new SolidBrush(Color.Blue);///創(chuàng)建藍(lán)色畫(huà)筆
SolidBrush blackpen = new SolidBrush(Color.FromARGB(0xa0,0xa0,0xb0));///創(chuàng)建黑色畫(huà)筆
e.Graphics.DrawString("VC知識(shí)庫(kù)",font,blackpen,65,25);///寫(xiě)字符串
e.Graphics.DrawString("VC知識(shí)庫(kù)",font,bluepen,61,21);///偏移4個(gè)象素用不同的顏色再寫(xiě)一次,達(dá)到立體效果
}

對(duì)于其它消息的處理以及對(duì)其它父類虛擬函數(shù)的重載都可以采用同樣的方法。

三、自定義消息的處理
為了處理的方便,在這里我們將需要使用到的自定義消息封裝成一個(gè)類,類的添加過(guò)程如下:
在ClassView中選中我們的工程MSGApplication,按下鼠標(biāo)右鍵,在彈出菜單中選擇Add->Add Class,彈出Class Wizard,我們將類命名為WM,其余選項(xiàng)不便,確認(rèn)完成類的添加。我們?yōu)閃M類添加兩個(gè)成員變量,見(jiàn)如下代碼:


public class WM
{
public const int USER = 0x0400;
public const int TEST1 = USER+1;
}

我們?cè)贔orm1中添加一個(gè)按鈕,并為該按鈕添加事件處理代碼(假如您對(duì)這個(gè)過(guò)程不熟悉,請(qǐng)參考:C#學(xué)習(xí)筆記之一)
向主視窗發(fā)送TEST1自定義消息,具體代碼如下:
protected void button1_Click (object sender, System.EventArgs e)
{
SendMessage(WM.TEST1,100,200);
}

消息已經(jīng)發(fā)出了,在Form1中我們?nèi)绾螌?duì)該消息作出響應(yīng)呢?我們可以重載 DefWndProc方法。

protected override void DefWndProc ( ref System.WinForms.Message m )
{
switch(m.msg)
{
case WM.TEST1:
///string與MFC中的CString的Format函數(shù)的使用方法有所不同
string message = string.Format("收到消息!參數(shù)為:{0},{1}",m.wParam,m.lParam);
MessageBox.Show(message);///顯示一個(gè)消息框
break;
default:
base.DefWndProc(ref m);///調(diào)用基類函數(shù)處理非自定義消息。
break;
}
}

程序運(yùn)行結(jié)果如圖

當(dāng)我們點(diǎn)發(fā)送消息按鈕,彈出消息框并顯示收到的參數(shù)。

后記:可以預(yù)料在VS.NET BETA1的后繼版本中對(duì)上述過(guò)程的操作會(huì)有很大改變,但原理是一致的。讓我們期待更完美的C#展現(xiàn)在我們面前。