Office中国论坛/Access中国论坛

标题: 今人迷惑的CreateCaret [打印本页]

作者: andymark    时间: 2008-2-17 17:20
标题: 今人迷惑的CreateCaret
CreateCaret 按功能说明,允许以位图创建新的标记形状,允许调节插入符的宽度和高度
在网上找到一篇在ACCESS调用CreateCaret文章(Dev Ashish)

  1. Private Declare Function apiCreateCaret Lib "user32" _
  2. Alias "CreateCaret" _
  3. (ByVal hwnd As Long, _
  4. ByVal hBitmap As Long, _
  5. ByVal nWidth As Long, _
  6. ByVal nHeight As Long) _
  7. As Long

  8. Private Declare Function apiShowCaret Lib "user32" _
  9. Alias "ShowCaret" _
  10. (ByVal hwnd As Long) _
  11. As Long
  12. Private Declare Function apiGetFocus Lib "user32" _
  13. Alias "GetFocus" _
  14. () As Long

  15. Sub sMakeCaret(ctl As Control, _
  16. intX As Integer, _
  17. intY As Integer)
  18. Dim hwnd As Long
  19. hwnd = fhWnd(ctl)
  20. Call apiCreateCaret(hwnd, 0&, intX, intY)
  21. Call apiShowCaret(hwnd)
  22. End Sub


  23. Function fhWnd(ctl As Control) As Long
  24. On Error Resume Next
  25. ctl.SetFocus
  26. If Err Then
  27. fhWnd = 0
  28. Else
  29. fhWnd = apiGetFocus
  30. End If
  31. On Error GoTo 0
  32. End Function



  33. Private Sub Form_GotFocus()
  34. sMakeCaret Me.Text0, 10, 10

  35. End Sub
复制代码



令人迷惑的是,执行上面的代码并不能在ACCESS感觉有任务改变,用GetSystemMetrics查看光标的大小也没任何变化

  备注:在VB能正常调用位图
作者: andymark    时间: 2008-2-17 17:54
CreateCaret用法说明:
函数功能;该函数为系统插入标记创建一个新的形状,并且将插入标记的属主关系指定给特定的窗口。插入标记的形状。可以是线、块或位图。
参数:
hWnd:指定佣有插入标记的窗口。
hBitmap:标识用于定义插入标记形状的位图。如果该参数为NULL,那么插入标记是实心的(原色),如果该参数为(HBITMAP)1,那么插入标记是灰色的。如果该参数是位图句柄,那么插入标记就是指定的位图。位图句栖必须已中由CreateBitmap、CreatDIBitmap或LoadBitmap函数创建。
    如果hBitmap为位图句栖,那么CreateCaret函数将忽略参数nWidth和nHeight,因为该位图定义了自己的宽度和高度。
nWidth:按逻辑单位指定插入标记的宽度,如果该参数为零,那么宽度就设为系统定义的窗口边界宽度。如果hBitmap是位图句柄,那么函数CreateCaret忽略该参数。
nHeight:按逻辑单位指定插入标记的高度。如果该参数为零,那么高度就设为系统定义的窗口边界高度如果hBitmap是位图句柄,那么函数CreateCaret忽略该参数。
返回值:如果函数执行成功,返回值为非零;如果函数执行失败,那么返回值为零。若想获取更多错误  信息,请调用GetLastError函数。
备注:参数nWidth和nHeight指定了插入标记的宽度和高度,这些值按逻辑单位表示;按像素表示的真正  宽度和高度与窗口的映射模式有关。
    CreateCaret函数自动清除前一个插入标记的形状,不考虑拥有该插入标记的窗口。新创建的插入标记一直隐藏,直到应用程序调用ShowCaret函数使该插入标记可见为止。
系统为每个队列提供一个插入标记。窗口只有在它有键盘焦点(focus)或者它是活动窗口时才创建插入标记。该窗口应在键盘焦点消失或窗口变为不活动之前,清除插入标记。            
可以通过使用GetSystemMetrics函数,并指定SM_CXBORDER和SM_CYBORDER值来检索系统窗口边界的宽度或高度。使用窗口边界的宽度或高度可以保证插入标记在高分辨率屏幕上可见。
对于Windows CE:Windows CE不支持hBitmap参数,并且该参数应设为NULL。Windows CE缺省的是实心(Solid)插入标记。
作者: tmtony    时间: 2008-2-17 20:52
我以前试过,也是不能成功,使用ActiveX控件,好像又可以控制,但Access本身的Text不行
但发现有些奇怪的现象,或许能有些帮助
1.在窗体上加一个单独按钮, 来设置光标, 是可以得到效果
2.在文本框的Getfocus或Enter事件 调用事件,则不起作用
3.一个文本框的GetFocus事件设置另一个文本框的光标,则起作用

好像是文本框的获得焦点事件阻止了事件
作者: andymark    时间: 2008-2-17 21:47
谢谢王兄的指点,在按钮上调用的确可以,在ACCESS调用位图还是不成功
要是能解决文本框的GetFocus调用,会使程序增色不少
作者: tmtony    时间: 2008-2-18 08:52
是的, 弄了一晚,好像没有找到好的解决方法.
今天再试过
作者: yq_guilin    时间: 2008-2-18 09:10
很好, 非常感谢, 顶啊
作者: sgrshh29    时间: 2008-2-18 09:27
acc中同一个窗体的所有文本框、组合框、命令按钮的句柄都是一样的,这点与vb不同。所以这个方法可能行不通。曾经为图片框的句柄费了N多周折,最后放弃了。
为什么vb中很简单的事情,到了acc中就这么复杂呢?
作者: tmtony    时间: 2008-2-18 09:46
是这样的,Access的控件句柄处理比较麻烦
作者: chinj    时间: 2008-5-11 10:04
顶起来。
作者: chinj    时间: 2008-5-11 12:30
收藏,备用。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3