为了账号安全,请及时绑定邮箱和手机立即绑定

面板未获得焦点

面板未获得焦点

C#
慕桂英4014372 2019-07-13 15:07:26
面板未获得焦点我继续在我的简单图形程序(使用C#)中编写某种键盘导航程序。我又一次遇到了麻烦。我的问题是,我想要处理键盘输入,以移动一层左右。用鼠标移动图层已经很好了,但是控件没有得到焦点(此控件既不触发KeyUp/Keydown/KeyPress,也不触发GotFocus/LostFocus。)。因为我的类来自Panel(并且覆盖了几个事件),所以我也重写了上面提到的事件,但是我无法成功地触发这些事件。我认为我可以使用类似Keyboard.GetState()或ProcessCmdWnd之类的工具来实现键盘响应。然而:我仍然必须能够知道控制什么时候得到了关注。是否有某种优雅的方法将此功能添加到用户控件(这是基于Panel的)?我在这里检查了很多线程,我可能会使用这种方法用于键盘输入。然而,焦点问题仍然存在。非常感谢您事先提供的信息!伊戈尔。P.S.:我正在使用VS 2008用C#.NET v3.5编程。这是一个Windows,Forms应用程序,不是WPF.
查看完整描述

3 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

Panel类被设计为容器,它避免了焦点,因此子控件总是会得到它。你需要做些手术来解决这个问题。我还添加了代码,以便在Keydown事件中获得光标键笔画:

using System;using System.Drawing;using System.Windows.Forms;class SelectablePanel : Panel {
    public SelectablePanel() {
        this.SetStyle(ControlStyles.Selectable, true);
        this.TabStop = true;
    }
    protected override void OnMouseDown(MouseEventArgs e) {
        this.Focus();
        base.OnMouseDown(e);
    }
    protected override bool IsInputKey(Keys keyData) {
        if (keyData == Keys.Up || keyData == Keys.Down) return true;
        if (keyData == Keys.Left || keyData == Keys.Right) return true;
        return base.IsInputKey(keyData);
    }
    protected override void OnEnter(EventArgs e) {
        this.Invalidate();
        base.OnEnter(e);
    }
    protected override void OnLeave(EventArgs e) {
        this.Invalidate();
        base.OnLeave(e);
    }
    protected override void OnPaint(PaintEventArgs pe) {
        base.OnPaint(pe);
        if (this.Focused) {
            var rc = this.ClientRectangle;
            rc.Inflate(-2, -2);
            ControlPaint.DrawFocusRectangle(pe.Graphics, rc);
        }
    }}


查看完整回答
反对 回复 2019-07-13
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

要获得焦点,请检查Properties窗口中的MouseEnter事件。

编写以下代码:

private void mainPanel_MouseEnter(object sender, EventArgs e){
    mainPanel.Focus();}


查看完整回答
反对 回复 2019-07-13
  • 3 回答
  • 0 关注
  • 559 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信