我正在开发一个可与智能主板配合使用的Windows Forms C#应用程序。它发送我的表格必须注册接收的特殊事件。此代码取自其SDK的示例,并且工作正常;我能够收到特殊的OnXYDown(等)事件,告诉我有人用笔在画板上画画。
public partial class Form1 : Form
{
private ISBSDKBaseClass2_4 Sbsdk;
private _ISBSDKBaseClass2_4Events_Event SbsdkEvents;
[DllImport("user32.dll")]
public static extern int RegisterWindowMessageA([MarshalAs(UnmanagedType.LPStr)] string lpString);
private int SBSDKMessageID;
public Form1()
{
InitializeComponent();
this.SetStyle(ControlStyles.EnableNotifyMessage, true);
SBSDKMessageID = RegisterWindowMessageA("SBSDK_NEW_MESSAGE");
// set up smart board SDK
try
{
Sbsdk = new SBSDKBaseClass2_4();
}
catch (Exception e)
{
}
if (Sbsdk != null)
SbsdkEvents = (_ISBSDKBaseClass2_4Events_Event)Sbsdk;
if (SbsdkEvents != null)
{
SbsdkEvents.OnNoTool += new SBSDKComWrapperLib._ISBSDKBaseClass2_4Events_OnNoToolEventHandler(this.OnNoTool);
SbsdkEvents.OnPen += new SBSDKComWrapperLib._ISBSDKBaseClass2_4Events_OnPenEventHandler(this.OnPen);
SbsdkEvents.OnXYDown += new SBSDKComWrapperLib._ISBSDKBaseClass2_4Events_OnXYDownEventHandler(this.OnXYDown);
SbsdkEvents.OnXYMove += new SBSDKComWrapperLib._ISBSDKBaseClass2_4Events_OnXYMoveEventHandler(this.OnXYMove);
SbsdkEvents.OnXYUp += new SBSDKComWrapperLib._ISBSDKBaseClass2_4Events_OnXYUpEventHandler(this.OnXYUp);
if (Sbsdk != null)
Sbsdk.SBSDKAttachWithMsgWnd(Handle.ToInt32(), false, Handle.ToInt32());
}
int count = 0;
protected override void OnNotifyMessage(Message m)
{
if (m.Msg == SBSDKMessageID)
{
// process sdk events on our apps main thread
Console.WriteLine("notify message happened " + count++);
Sbsdk.SBSDKProcessData();
}
}
private void OnXYDown(int x, int y, int z, int iPointerID)
{
Console.WriteLine("OnXYDown event (" + iPointerID + ") " + count++);
}
private void OnXYMove(int x, int y, int z, int iPointerID)
{
Console.WriteLine("OnXYMove event " + count++);
}
private void OnXYUp(int x, int y, int z, int iPointerID)
{
Console.WriteLine("OnXYUp event " + count++);
}
private void OnPen(int iPointerID)
{
Console.WriteLine("OnPen event " + count++);
}
private void OnNoTool(int iPointerID)
{
Console.WriteLine("OnNoTool event " + count++);
}
}
如您所见,我在父表单上的SetStyle允许发送通知消息,然后注册一个智能板将用于指示其事件的ID。如果我将笔放在屏幕上,会发生一条"通知消息流"和" OnXY"打印输出发生,直到我拿起笔,表明一切都在发送。
但是,如果我在窗口顶部放置一个OpenTK.GLControl
用户定义的控件(我的应用程序将使用OpenGL绘制用户笔划),则只要笔触及GLControl,就不会发送任何内容;我没有收到OnXY事件,也没有在OnNotifyMessage中收到任何消息。如果我在屏幕上放置一个Button
,但是如果我放置某些其他界面元素,如Panel
,则会发生这种情况(如果我在面板上绘制,则会在OnNotifyMessage中收到事件,但如果我画在按钮上则不行。)这些控件似乎阻止事件被发送到父表单。
这是什么解决方案?我误解了这里发生的事情,或者事件是如何被提出的?似乎SetStyle
不能在任何不是父表单本身的控件上调用,所以我不能说,注册GLControl来接收事件而不是表单。由于这些事件是特殊的Windows消息,我不知道如何转发"他们到了他们需要去的地方。