表单的OnNotifyMessage被用户控件阻止

时间:2014-05-12 22:42:50

标签: c# events user-controls

我正在开发一个可与智能主板配合使用的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消息,我不知道如何转发"他们到了他们需要去的地方。

0 个答案:

没有答案