我在做一个 触摸屏查询 程序,其中有一些地方用文本框显示相关内容,而这种程序不方便让用户点击滚动条来阅读,只能做"上一页","下一页"按钮,在按钮里写代码,首先让文本框获得焦点,然后用SendKeys "{PGDN}",来实现"下一页"的功能,可是这样写光标总是在文本框里闪呀闪的,看上去很不舒服,有没有办法可将"I"字型的光标隐藏?

解决方案 »

  1.   

    有光标在里面闪是因为Text接到了“光标闪烁”的消息,可以对窗口进行子类化处理拦截“光标闪烁”消息。其实不如自己用Label和Scroll做个控件。
      

  2.   

    ' 来个省事的办法吧,直接用API向那个Text发消息实现滚动,别SendKeys了。Private Declare Function SendMessageBynum Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongConst EM_LINESCROLL = &HB6' 控制文本框卷动
    ' hwnd 为文本框的句柄, Horizontal 为水平方向卷动的行数(可为负数), Vertical为垂直方向卷动的行数(可为负数)
    Function ScrollText(ByVal hwnd As Long, ByVal Horizontal As Long, ByVal Vertical As Long) As Boolean
    ScrollText = SendMessageBynum(hwnd, EM_LINESCROLL, Horizontal, Vertical)
    End Function
      

  3.   

    补充一下:
    把上面的代码复制到标准模块中就可以调用ScrollText函数了。
      

  4.   

    用这两个api:
    ShowCaret VB声明 
    Declare Function ShowCaret Lib "user32" Alias "ShowCaret" (ByVal hwnd As Long) As Long 
    说明 
    在指定的窗口里显示插入符(光标) 
    返回值 
    Long,非零表示成功,零表示失败。会设置GetLastError 
    参数表 
    参数 类型及说明 
    hwnd Long,包含了插入符的窗口的句柄。可以为零;此时,只有在插入符包含于由活动任务拥有的一个窗口时,它才会显示出来 
    注解 
    参考HideCaret函数
     
    HideCaret VB声明 
    Declare Function HideCaret Lib "user32" Alias "HideCaret" (ByVal hwnd As Long) As Long 
    说明 
    在指定的窗口隐藏插入符(光标) 
    返回值 
    Long,非零表示成功,零表示失败。会设置GetLastError 
    参数表 
    参数 类型及说明 
    hwnd Long,包含了插入符的窗口的句柄。可能是零;在这种情况下,只有包容了插入符的那个窗口由活动任务拥有时,插入符才会被隐藏 
    注解 
    针对插入符的显示,windows维护着一个内部计数器;类似于ShowCursor函数使用的那个。所以对HideCaret 和 ShowCaret的调用必须进行一番权衡
      

  5.   

    ' 用 HideCaret 比较好Option Explicit
    Private Declare Function HideCaret Lib "user32" (ByVal hwnd As Long) As LongPrivate Sub Text1_Change()
        HideCaret Text1.hwnd
    End SubPrivate Sub Text1_GotFocus()
        HideCaret Text1.hwnd
    End Sub
      

  6.   

    发送EM_LINESCROLL消息好些
    SendKeys的效率要低些
      

  7.   

    有测试,效果比较好,如下:Option Explicit
    Private Declare Function HideCaret Lib "user32" (ByVal hwnd As Long) As LongPrivate Sub Text1_KeyDown()
        DoEvents
        HideCaret Text1.hwnd
    End SubPrivate Sub Text1_GotFocus()
        DoEvents
        HideCaret Text1.hwnd
    End Sub