属性表中编辑控件的奇怪之处

时间:2013-04-15 18:32:04

标签: windows winapi propertysheet

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

一切都很好。人们可以在页面之间移动。没有控件具有输入焦点。

如果单击属性表页面中的一个编辑控件来建立输入焦点,则可以修改控件。所有这些似乎都是有序的。

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

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

这是预期的行为吗?

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

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

MSDN在PSN_QUERYINITIALFOCUS下面显示以下内容“否则,返回零并且焦点将转到默认控件。”如何将控件设置为默认值?

1 个答案:

答案 0 :(得分: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处理程序中,但对于未知数量的控件这样做会很乏味。