【问题标题】:How to make a form move when mouse is clicked within a label ? C#在标签内单击鼠标时如何使表单移动? C#
【发布时间】:2017-04-09 20:19:50
【问题描述】:

基本上,我有一个可以通过鼠标单击Mouse_Down 移动的表单,并且该表单的中间有一个标签,显示一些文本。问题是,当在标签框架内发生点击时,表单不会移动,当我禁用标签时,表单会移动,但是文本颜色会更改为黑色,而它应该是白色的。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    这是我使用的标准代码(当我有无边框表单时):

    using System.Runtime.InteropServices;
    ..
    public const int WM_NCLBUTTONDOWN = 0xA1;
    public const int HT_CAPTION = 0x2;
    
    [DllImportAttribute("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    [DllImportAttribute("user32.dll")]
    public static extern bool ReleaseCapture();
    
    private void YourLabel_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            ReleaseCapture();
            SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
        }
    } 
    

    我认为它假装点击了表单的标题栏。

    当然,您可以将来自任意数量的其他控件(包括表单)的 MouseDown 事件连接到相同的代码。

    【讨论】:

      【解决方案2】:

      有两种解决方案:

      1.

      通过覆盖表单的Control.PreProcessMessage 来编写消息预处理方法。在这种方法中,您必须处理 Windows 消息,这并不难,但您必须习惯它。 pinvoke.net 在这里可以提供很多帮助。

      2.

      MouseDown 事件处理程序添加到表单中的所有控件,如下所示:

      foreach( Control control in this.Controls )
      {
           control.MouseDown += myMouseDownHandler;
      }
      

      myMouseDownHandler 本质上与您用于表单本身的方法相同。 如果您的表单包含嵌套控件,例如在面板或用户表单中,您将必须扩展循环,以便它还处理表单控件的子控件。

      如果您的表单中唯一的控件是这个 laben,那么您当然不需要循环。

      【讨论】:

      • This 是第一种方法的示例。
      猜你喜欢
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多