【问题标题】:oddity with edit controls in property sheet属性表中编辑控件的奇怪之处
【发布时间】:2013-04-07 23:43:04
【问题描述】:

我有一个包含几页的属性表。大多数页面都有一个或多个编辑控件。 大多数控件不是从页面对话框初始化,而是从创建属性表的对话框初始化;但是有些是在页面对话框中初始化的,它们的行为相同。

一切开始都很好。可以在页面之间移动。所有控件都没有输入焦点。

如果单击属性表页面中的编辑控件之一建立输入焦点,则可以修改该控件。一切似乎都井然有序。

如果随后移动到不同的属性页,则该页中的第一个编辑控件将获得输入焦点,并且该控件中的所有文本都将被选中!此行为适用于所有页面,但具有只读样式的编辑控件的页面除外。之后可以移回其他页面,并且最初没有选择任何输入焦点行为。

所有页面都处理 PSN_QUERYINITIALFOCUS 通知并通过 SetWindowLong 机制返回零。

这是预期的行为吗?

为什么一开始没有给予一些控制?

我在这里的主要兴趣是以某种方式杀死选择。我尝试在 PSN_SETACTIVE 通知中使用 EM_SETSEL 终止选择,但无济于事。

MSDN 在 PSN_QUERYINITIALFOCUS 下说:“否则,返回零,焦点将转到默认控件。”如何将控件设置为默认值?

【问题讨论】:

    标签: windows winapi propertysheet


    【解决方案1】:

    我觉得上面描述的动作很奇怪!我还想知道

    如果它们正常。
    为什么最初没有控件接收焦点。

    我能够通过向属性表页面添加代码来终止选择,以处理任何编辑控件的 WM_COMMAND/EN_SETFOCUS 消息。不知道有没有其他控件 发送 EN_SETFOCUS 消息。

    case EN_SETFOCUS:
        {
           char cn[16];
           HWND H = (HWND) lParam;
           GetClassName (H, cn, 15);
           if (strcmp (cn,"Edit") == 0)
           {
                SendMessage (H, EM_SETSEL, -1, 0);
           }
           return true;
        }                   
    

    我认为可以在 EN_KILLFOCUS 处理程序中保存任何选择并恢复它 在 EN_SETFOCUS 处理程序中,但对未知数量的控件这样做会很乏味。

    【讨论】:

      猜你喜欢
      • 2015-08-04
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      相关资源
      最近更新 更多