一个关于toolbar的问题

voodoo82 2010-11-15 11:10:10
一个Form窗口,里面有一个ToolStrip控件,ToolStrip里面再添加一个button。

程序运行的时候,使另一个程序窗口为最前,这样Form失去焦点,然后点击ToolStrip中的button,只能使Form为最前,而button的click事件没有被引发。所以只能点击两次才能触发button的click事件。

而在Form为非最前时,点击Form窗体中的button,或者点击窗体右上角的关闭按钮,则一次点击就可以把Form送至最前并引发Click事件。

这个现象很奇怪,有人知道怎么解决吗?谢谢了。
...全文
114 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lonyjianhui 2010-11-16
  • 打赏
  • 举报
回复
具体情况具体分析,LZ肯定代码有错,点击两次才能触发button的click事件这种情况是没可能出现的,除非Click事件是你自己写的,看看Click事件里你自己有没有加控制变量吧,或者发代码看看
熙风 2010-11-16
  • 打赏
  • 举报
回复
友情帮顶······
voodoo82 2010-11-16
  • 打赏
  • 举报
回复
在网上搜索了一下,找到了结果,结贴了。

解决方法如下:从ToolStrip派生类,重载WndProc函数,处理WM_MOUSEACTIVE消息。具体可见下面的代码


/// <summary>
/// This class is derived from ToolStrip. It is used to fix the problem that
/// buttons in toolstrip can't get Click event if user click them when the form
/// is not focused.
/// </summary>
class ToolStripEx
: ToolStrip
{
private const uint WM_MOUSEACTIVATE = 0x21;
private const uint MA_ACTIVATE = 1;
private const uint MA_ACTIVATEANDEAT = 2;
private const uint MA_NOACTIVATE = 3;
private const uint MA_NOACTIVATEANDEAT = 4;

/// <summary>
/// This field is used to control whether buttons in ToolStrip get Click event
/// when the form is not focused.
///
/// Type : System.Boolean
///
/// false is the same behavior provided by the base ToolStrip class
/// true is that buttons can get Click event even the form is not focused
/// Default value is false
/// </summary>
private bool _clickThrough = false;

/// <summary>
/// This property is used to control whether buttons in ToolStrip get Click event
/// when the form is not focused.
///
/// Type : System.Boolean
///
/// false is the same behavior provided by the base ToolStrip class
/// true is that buttons can get Click event even the form is not focused
/// Default value is false
/// </summary>
public bool ClickThrough
{
get { return _clickThrough; }
set { _clickThrough = value; }
}

protected override void WndProc(ref Message m)
{
base.WndProc(ref m);

if (_clickThrough &&
m.Msg == WM_MOUSEACTIVATE &&
m.Result == (IntPtr)MA_ACTIVATEANDEAT)
{
m.Result = (IntPtr)MA_ACTIVATE;
}
}
}
voodoo82 2010-11-16
  • 打赏
  • 举报
回复
我没有任何加任何代码,只是拖些空间到窗体,然后加个Click函数

请看清楚我的条件,是窗口在后台,然后点击ToolBar里按钮,这时不能触发Click事件,只能让窗口跳到前台。

而窗体上的按钮,就可以直接让窗口跳前台,并且出发Click事件
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧