C# 採事件驅動,但實際使用中透過系統原有訊息處理有時更簡單,特別是處理 DLL 交互時極方便。使用自訂訊息只需幾個簡單步驟:
C# 訊息需定義為 Windows 系統原始 16 進制數字。VC 中 #define WM_TEST WM_USER + 101,C# 對應宣告:
public const int USER = 0x0400;
public const int WM_TEST = USER + 101;
透過 Windows API SendMessage 實現:
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(
IntPtr hWnd, uint Msg, uint wParam, uint lParam);
覆寫 DefWndProc 接收:
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case Message.WM_TEST:
// 處理訊息
break;
default:
base.DefWndProc(ref m); // 基類處理非自訂訊息
break;
}
}
以 WM_PAINT 為例,類似 MFC 但更簡單(無需 DECLARE_MESSAGE_MAP)。覆寫父類別 OnPaint 虛擬方法:
Ctrl+Alt+J),專案下找到 Form 選中,右側列出所有成員。OnPaint(System.WinForms.PaintEventArgs),複製完整定義 protected void OnPaint(System.WinForms.PaintEventArgs e)。Form1.cs 類別內,加上 override 關鍵字,即可添加繪圖代碼。protected override void OnPaint(PaintEventArgs e)
{
Font font = new Font("黑體", 28);
SolidBrush bluepen = new SolidBrush(Color.Blue);
SolidBrush blackpen = new SolidBrush(Color.FromArgb(0xa0, 0xa0, 0xb0));
e.Graphics.DrawString("VC知識庫", font, blackpen, 65, 25);
e.Graphics.DrawString("VC知識庫", font, bluepen, 61, 21); // 偏移 4 像素立體效果
}