2011-04-15 235 views
0

假设我有一个创建的Form类和一个CustomControl类。C#手动触发的MouseDown无法触发MouseUp

在我的窗体上我有两个CustomControl实例和一个Panel。 (MouseEnter)(用于指定不同的游标),MouseLeave(用于重置游标),MouseDown(用于启动拖动线程)和MouseUp(用于杀死拖动线程并执行后拖动逻辑)。 )。

我可以将面板拖到CustomControl上。当我这样做时,Form中的代码检测到我做了什么,并从Form.Controls中删除Panel,将一些元信息传递给CustomControl,然后它自己创建一个Panel。

基本上,它是一个交接。 Panel对象现在属于CustomControl。 (这是必要的。这是复杂的,解释为什么,但想象中的自定义控件具有类似滚动条,而对于面板属于CustomControl,使其与CustomControl滚动这是必要的。)

现在,当我点击CustomControl中的面板时,面板的MouseDown被触发,它从CustomControl.Controls中被删除,并发送一些元信息返回到Parent(表单),然后重新创建Panel,因为它是在开始 - 然而已经处于拖动状态,以便用户可以将Panel重新定位到第二个CustomControl上,或者可以将其重新放回到Form上。 Form首次初始化时创建Panel的函数与现在创建它的函数完全相同。

但是,面板的MouseDown没有被触发。鼠标,但事件未触发,因为鼠标在创建时已关闭。所以,我在Form中的函数中手动调用MouseDown处理函数,该函数接受来自CustomControl的元信息。

不幸的是,这只有一半工作。 MouseUp处理程序未触发。我可以按照预期从CustomControl中取出面板并在窗体上拖动它,但当释放鼠标时,面板将卡在光标上。

我不确定如何解决这个问题?

一个理想的解决办法是,当元信息被传递回形式,是创建新的面板,MouseDown事件以某种方式自然就像用户刚刚点击在面板上的火。

+0

仅仅因为您调用了Mousedown事件,并不意味着面板认为鼠标已被按下。看看实际发送的mousedown窗口消息到面板。 – 2011-04-15 02:53:29

回答

0

听起来好像你正在创建一个Panel的新实例,当你将它从CustomControl移动到Form并返回并丢失它的状态时。

您应该尝试将Form所拥有的实际实例传递给CustomControl而不创建新的实例,或者您可以在另一个对象中捕获Panel的状态,您可以在创建新Panel时将其传递给构造函数,它与你正在拖动的那个处于相同的状态?

看起来好像您尝试手动触发鼠标事件来弥补设计中的问题。

如果你可以比冗长的文本解释更好地给出一些示例代码。

+0

CustomControl和Form中的面板必须是两个不同的面板,外观和控件略有不同。他们有不同这个模块有几百行 - 我可能会找到一个解决方法,当我在这里修剪它的例子。 – Ozzah 2011-04-15 02:43:10