国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

C#中在應(yīng)用程序和DLL使用消息

2024-07-21 02:19:25
字體:
供稿:網(wǎng)友
c#中在應(yīng)用程序和dll使用消息
在c#中采用的是事件驅(qū)動方式,但在我們使用的過程中,有時候通過調(diào)用系統(tǒng)原有的消息,處理起來會比較簡單一些,特別是在處理與dll文件的交互時,的確是非常的方便。
在c#中使用自定義消息
在c#中使用自定義消息非常簡單,只需要下面幾個簡單的步驟就可以了:
1、 定義消息
定義消息的方法和vc中定義消息有一點點不同
比如在vc中申明一個自定義消息:
#define wm_test wm_user + 101
而在c#中消息需要定義成windows系統(tǒng)中的原始的16進(jìn)制數(shù)字,比如自定義消息
public const int user = 0x0400;
那么我們在vc中申明的自定義消息,在c#中就可以做對應(yīng)的聲明:
public const int wm_test = user+101;

2、 發(fā)送消息
消息發(fā)送是通過windows提供的api函數(shù)sendmessage來實現(xiàn)的,它的原型定義: [dllimport("user32.dll",entrypoint="sendmessage")]
private static extern int sendmessage(
intptr hwnd, // handle to destination window
uint msg, // message
uint wparam, // first message parameter
uint lparam // second message parameter
);
3、 消息接收
消息發(fā)出之后,在form中如何接收呢?我們可以重載defwinproc函數(shù)來接收消息。
protected override void defwndproc ( ref system.windows.forms.message m )
{
switch(m.msg)
{
case message.wm_test: //處理消息
break;
default:
base.defwndproc(ref m);//調(diào)用基類函數(shù)處理非自定義消息。
break;
}
}
在c#中使用系統(tǒng)消息
我們以wm_paint消息的處理為例,在c#中處理消息與mfc的消息處理是類似的,但更為簡單。mfc中需要使用declare_message_map來定義消息映射,在c#就不需要了。比如wm_paint消息,我們只要重載父類中的onpaint虛擬方法即可,方法如下:
在菜單view->other windows->object browser打開對象瀏覽窗口(或用ctrl+alt+j打開),在我們的工程名下找到form并選中,這時在右邊的窗口列出所有form類的成員函數(shù),如圖所示:

我們選中onpaint(system.winforms.painteventargs)此時在下面會顯示完整的onpaint函數(shù)protected void onpaint ( system.winforms.painteventargs e )我們將這一行字符串copy下來。打開form1.cs進(jìn)行代碼編輯,我們把剛才拷貝下來的函數(shù)定義復(fù)制到form1類里面,并加上override關(guān)鍵字,此時我們便可以在里面添加我們的消息處理代碼了,請參考如下代碼段:
protected override void onpaint (system.windows.forms.painteventargs e )
{
font font = new font("黑體",28);///定義字體:黑體,大?。?8
solidbrush bluepen = new solidbrush(color.blue);///創(chuàng)建藍(lán)色畫筆
solidbrush blackpen = new solidbrush(color.fromargb(0xa0,0xa0,0xb0));///創(chuàng)建黑色畫筆
e.graphics.drawstring("vc知識庫",font,blackpen,65,25);///寫字符串
e.graphics.drawstring("vc知識庫",font,bluepen,61,21);///偏移4個象素用不同的顏色再寫一次,達(dá)到立體效果
}
示例應(yīng)用
1、 定義消息
我們在工程中添加一個message類用來定義消息。然后添加了三個成員變量,其中user為自定義消息的初始值,相當(dāng)與mfc中的wm_user。wm_test為自定義的用來響應(yīng)應(yīng)用程序的消息,wm_msg為自定義的用來響應(yīng)dll傳遞過來的消息。如何在dll定義消息請參考文章:vc.net從dll傳遞消息到dll。
public class message
{
public const int user = 0x0400;
//as mfc define wm_test wm_user + 101
public const int wm_test = user+101;
public const int wm_msg = user+102;
}
2、 聲明引用函數(shù)
在使用消息的地方,申明引用的函數(shù),我們這里在msgform.cs文件中申明:
//申明發(fā)送消息函數(shù)
[dllimport("user32.dll",entrypoint="sendmessage")]
private static extern int sendmessage(
intptr hwnd, // handle to destination window
uint msg, // message
uint wparam, // first message parameter
uint lparam // second message parameter
);

//申明dll中啟動消息函數(shù)
[dllimport("messagedll.dll",entrypoint="startsendmessage")]
private extern static void startsendmessage(intptr hwnd);

3、 處理系統(tǒng)消息
protected override void onpaint ( system.windows.forms.painteventargs e )
{
///定義字體:黑體,大?。?8
font font = new font("黑體",28);
///創(chuàng)建藍(lán)色畫筆
solidbrush bluepen = new solidbrush(color.blue);
///創(chuàng)建黑色畫筆
solidbrush blackpen = new solidbrush(color.fromargb(0xa0,0xa0,0xb0));
///寫字符串
e.graphics.drawstring("vc知識庫",font,blackpen,65,25);
///偏移4個象素用不同的顏色再寫一次,達(dá)到立體效果
e.graphics.drawstring("vc知識庫",font,bluepen,61,21);
}
4、 觸發(fā)自定義消息

//測試應(yīng)用程序消息
private void testappbutton_click(object sender, system.eventargs e)
{
sendmessage(this.handle,message.wm_test,100,200);
}
//測試dll消息
private void testdllbutton_click(object sender, system.eventargs e)
{
startsendmessage(this.handle);
}

5、 響應(yīng)和處理自定義消息
protected override void defwndproc ( ref system.windows.forms.message m )
{
string message;
switch(m.msg)
{
case message.wm_test://處理消息
message = string.format("收到從應(yīng)用程序發(fā)出的消息!參數(shù)為:{0},{1}",m.wparam,m.lparam);
messagebox.show(message);///顯示一個消息框
break;
case message.wm_msg:
message = string.format("收到從dll發(fā)出的消息!參數(shù)
為:{0},{1}",m.wparam,m.lparam);
messagebox.show(message);///顯示一個消息框
break;
default:
base.defwndproc(ref m);//調(diào)用基類函數(shù)處理非自定義消息。

break;
}
}
程序運行結(jié)果:
當(dāng)我們點擊測試dll消息時,彈出消息框顯示收到消息的參數(shù),窗口也會調(diào)用wm_pain函數(shù)對窗口進(jìn)行重新繪制。


說明:本文是參考《c#開發(fā)windows應(yīng)用程序時消息的處理》一文,整理而成
參考:http://www.51pub.net/class/project.asp?cat_id=12
程序源碼:msgapp.rar (24k)
  • 網(wǎng)站運營seo文章大全
  • 提供全面的站長運營經(jīng)驗及seo技術(shù)!
  • 發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發(fā)表
    主站蜘蛛池模板: 玉山县| 湟源县| 武冈市| 亚东县| 永登县| 涟源市| 宜兰县| 辰溪县| 永寿县| 武邑县| 资兴市| 五台县| 罗源县| 河曲县| 岑巩县| 晋宁县| 大连市| 彰化市| 宁都县| 神池县| 梓潼县| 吉安市| 中阳县| 岳西县| 霍州市| 沛县| 三穗县| 韩城市| 海晏县| 宜君县| 柯坪县| 乌恰县| 田阳县| 曲阜市| 仁化县| 浙江省| 额济纳旗| 兴城市| 定南县| 永吉县| 新乐市|