当前位置:C++技术网 > 精选软件 > 插入符(光标)的使用说明:一个消息队列只能有一个插入符

插入符(光标)的使用说明:一个消息队列只能有一个插入符

更新时间:2016-01-08 22:09:41浏览次数:1+次

    在文章《win32使用插入符(光标)来辅助编辑文字的功能实现分析》中,我们分析和实现了插入符的使用方法。因为我是直接在一个窗口中实现编辑功能的,所以,也就在WM_CREATE中创建了插入符,然后在WM_DESTROY中销毁插入符。
    在本程序中,没有任何问题。然而不得不说明的是,如果你的程序存在多个窗口,并且多个窗口都可以输入文本,即多个窗口都有键盘输入焦点,这就有问题了。
    我们学习,是要摸清楚问题的根本,然后再灵活的使用。我们不能只按照一些人的建议,而只按照某种方法使用。
    插入符的使用,我们需要知道一个基本的规则:一个消息队列只能支持一个插入符。而一个消息队列与多个窗口对应,消息队列中的窗口句柄可以关联到窗口。同时,我们需要知道,在一个时刻,程序中只能有一个键盘输入焦点,甚至整个系统中,在某一个时刻,也只能有一个窗口具有输入焦点。这个窗口可以是主窗口,也可以是子窗口,甚至是子窗口的子窗口。
    只有具有输入焦点的窗口,才应该有插入符来提示用户输入。为什么是这样呢?这是Windows系统发展以来形成的一个用户习惯。倘若你在多个窗口中同时显示插入符,让用户情何以堪!当然,系统保证了一个消息队列中只能有一个插入符。
    我们之前的用法就是在一个窗口过程中的WM_CREATE消息创建插入符。加入有两个窗口,两个窗口都有各自的窗口过程。如果在A窗口的窗口过程创建的插入符,那么只有A窗口能够使用。而B窗口与A窗口是同一个线程的两个窗口,共享一个消息队列,如此一来,B窗口就没法使用插入符了。因为插入符已经被创建,因此不能再被创建。而B窗口又无法得到插入符的句柄,所以,就没法使用插入符了。
    CreateCaret根本就不会返回插入符的句柄,或者说,根本就没有插入符句柄的说法。这是Windows系统的规定。
    所以,既然一个消息队列只能有一个插入符,而且插入符还没有插入符句柄,所以,无法通过全局的方式共享插入符。如果是单窗口,可以先将插入符创建好,然后随时显示和隐藏。如果是多窗口,而且都可能具有输入焦点,那么就必须在一个窗口需要的时候创建,用完就销毁。这样就可以让其他窗口可以创建,始终保持一个插入符。
    插入符隐藏多次,必须要多次显示才能显示出插入符。这个需要记住,这是一点规定,Windows内部已经这样实现了。