【问题标题】:Programmatically scrolling a Windows edit control以编程方式滚动 Windows 编辑控件
【发布时间】:2012-07-27 16:40:30
【问题描述】:

有没有办法在 Windows 中以编程方式滚动单行编辑控件?

例如,如果编辑控件中的文本太大而无法立即显示,则编辑控件获得焦点时的默认行为是选择所有文本并显示文本的结尾。我想改为显示文本的开头(同时仍然选中所有文本)。

【问题讨论】:

  • 这不是默认行为。控件(或其子类)必须明确选择焦点上的所有文本。
  • @Deanna - 你确定吗?我记得自 Windows 95 天以来就看到了全选焦点行为;我确定这是默认行为。
  • 大部分 Windows Shell 似乎都这样做了,但我没有在“本机”win32 应用程序上看到它,而且 MSDN 并没有说它在 WM_GOTFOCUS 上这样做,只是显示了现有的选择。不过我可能完全错了 :) (我无法在 atm 编译任何 C++ 内容 :(

标签: windows winapi scroll editcontrol


【解决方案1】:

虽然(显然)没有用于滚动到开头并选择所有文本的 API,但它似乎可以模拟可以执行相同操作的击键:

#ifndef CTRL               
#define CTRL(x) (x&037)    
#endif

SendMessage(edit_handle, WM_KEYDOWN, VK_HOME, 0);
SendMessage(edit_handle, WM_CHAR, CTRL('A'), 0);

【讨论】:

    【解决方案2】:

    您可以致电SetScrollPos 或将WM_VSCROLL/WM_HSCROLL 消息直接发送到窗口。您可以找到滚动功能的完整列表here

    【讨论】:

    • 我已经尝试过了,但我无法让它用于普通的单行编辑控件。 SetScrollPos 失败并出现 ERROR_NO_SCROLLBARS。
    • 啊,错过了关于单行编辑控件的部分。那个控件根本就没有滚动条。
    • 你试过Edit_SetSel/EM_SETSEL 以起始值为结束(长度),结束值为0吗?
    • 据我所知,Edit_SetSel(h, length, 0) 也不起作用。 (事实上​​,它的行为似乎与Edit_SetSel(h, 0, length) 相同,这很奇怪,因为MSDN 不是这样描述它的。)
    • "编辑控件:无论开始和结束的相对值如何,控件都会在结束位置显示一个闪烁的插入符号。" - 这解释了为什么它不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2011-01-15
    相关资源
    最近更新 更多