选中时隐藏滑动条控件周围的虚线轮廓

4
在C# Winforms中,当使用Trackbar控件时,有没有一种方法可以不显示虚线焦点轮廓边框?
详情:这个轮廓对我来说看起来有点俗气,所以我只想为了美观不显示它。
谢谢,
亚当
3个回答

19

ShowFocusCues 对我没有起作用,但这个方法行:

   internal class NoFocusTrackBar : System.Windows.Forms.TrackBar
   {
      [System.Runtime.InteropServices.DllImport("user32.dll")]
      public extern static int SendMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

      private static int MakeParam(int loWord, int hiWord)
      {
         return (hiWord << 16) | (loWord & 0xffff);
      }

      protected override void OnGotFocus(EventArgs e)
      {
         base.OnGotFocus(e);
         SendMessage(this.Handle, 0x0128, MakeParam(1, 0x1), 0);
      }
   }

请参阅关于 WM_UPDATEUISTATE 的文档以了解其工作原理(基本上发送一条消息来关闭轨迹条上的愚蠢东西以获取焦点)。


非常感谢您提供的信息。我已经到处寻找这个答案了。在我的情况下,这适用于子类化的TabControl。 - Chris Weber
2
对于任何有兴趣将此代码翻译成其他语言的人,C语言等效代码为SendMessage(handle, WM_UPDATEUISTATE, MAKEWPARAM(UIS_SET, UISF_HIDEFOCUS), 0) - Josh Kelley
不错 :) 在 Delphi 中运行得很好:procedure TdmlTrackBar.WM_SETFOCUS(var Message: TWMSetFocus); begin inherited; SendMessage(Handle, $128, 1 shl 16 + 1, 0); end; - Jaap Versteegh

1

我知道这是一个老问题,但如果有人感兴趣,这会更简单:

public class TrackBarWithoutFocus : TrackBar
{
    private const int WM_SETFOCUS = 0x0007;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_SETFOCUS)
        {
            return;
        }

        base.WndProc(ref m);
    }
}

这将防止键盘调整控件,因为它停止了获取焦点。 - Ian Goldby

0
private void trackBar1_MouseLeave(object sender, EventArgs e)
    {
        button2.Select();
    }

虽然很老,但我用可见性设置为false创建了一个按钮,并在离开滑动条区域时选择了它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接