0

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

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

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

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

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

这是预期的行为吗?

为什么最初没有给予一些控制?

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

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

4

1 回答 1

0

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

如果他们是正常的。
为什么最初没有控件获得焦点。

我能够通过向属性表页面添加代码来处理任何编辑控件的 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 处理程序中恢复它,但是对于未知数量的控件这样做会很乏味。

于 2013-04-16T12:34:33.850 回答