关于焦点的问题

foxmsdn 2003-07-13 09:58:21
我在VB的自定义控件中用CreateWindow创建了一个窗体,但是不知道为什么,我在处理了该窗体的键盘消息(如KEY_DOWN、KEY_UP等)之后,有时会失去焦点,即窗体焦点转移到了一个VB自身的控件上(如textBox,Comman等),有谁知道为什么会这样,100分谢你。
...全文
45 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
foxmsdn 2003-07-19
  • 打赏
  • 举报
回复
看了http://www.vbaccelerator.com/home/index.asp,虽然不是很明白,但问题已经解决了,谢谢大家关心.
mms:foxmsdn@hotmail.com
ttty 2003-07-18
  • 打赏
  • 举报
回复
up
ClassicWuHao 2003-07-15
  • 打赏
  • 举报
回复
用Setfocus API试试!!!
waterw 2003-07-15
  • 打赏
  • 举报
回复
天哪!不会这么复杂吧?
自定义控件,只有当你的控件中没有可以聚集的标准控件时,才会出现这种情况。
jordi2014 2003-07-15
  • 打赏
  • 举报
回复
mark
foxmsdn 2003-07-15
  • 打赏
  • 举报
回复
!!!
lylmsdn 2003-07-15
  • 打赏
  • 举报
回复
这其实是一个COM方面的问题。VB在处理自定义控件(包括窗体)的焦点问题时使用了COM中的IOleInPlaceActiveObject接口,然后通过TranslateAccelerator方法来确定按键如何处理(包括Tab、Up、Down、Page等),由于你的窗体是自己用CreateWindowEx创建的,VB不知道该窗体的存在,所以在焦点问题上就出现了一些异常。

解决这个问题最简单的方法就是修改控件中IOleInPlaceActiveObject接口。代码不长,不过原理挺复杂的。
部分代码如下:
子类控件窗体,在消息WM_SETFOCUS中实现如下代码:
Dim pOleObject As IOleObject
Dim pOleInPlaceSite As IOleInPlaceSite
Dim pOleInPlaceFrame As IOleInPlaceFrame
Dim pOleInPlaceUIWindow As IOleInPlaceUIWindow
Dim pOleInPlaceActiveObject As IOleInPlaceActiveObject
Dim PosRect As RECT
Dim ClipRect As RECT
Dim FrameInfo As OLEINPLACEFRAMEINFO

'Get in-place frame and make sure it is set to our in-between
'implementation of IOleInPlaceActiveObject in order to catch
'TranslateAccelerator calls
Set pOleObject = Me
Set pOleInPlaceSite = pOleObject.GetClientSite
pOleInPlaceSite.GetWindowContext pOleInPlaceFrame, pOleInPlaceUIWindow, VarPtr(PosRect), VarPtr(ClipRect), VarPtr(FrameInfo)
CopyMemory pOleInPlaceActiveObject, m_IPAOISHook.ThisPointer, 4
pOleInPlaceFrame.SetActiveObject pOleInPlaceActiveObject, vbNullString
If Not pOleInPlaceUIWindow Is Nothing Then
pOleInPlaceUIWindow.SetActiveObject pOleInPlaceActiveObject, vbNullString
End If
CopyMemory pOleInPlaceActiveObject, 0&, 4
这样可以处理TAB键的焦点问题,但方向键就无效了。
完整的解决方案你可以参看http://www.vbaccelerator.com/home/index.asp,作者在自己的自定义控件里都解决了你所说的问题,细心研究一下就可以了。
lylmsdn 2003-07-15
  • 打赏
  • 举报
回复
没有人回答吗?晚上给你答案。
foxmsdn 2003-07-14
  • 打赏
  • 举报
回复
说具体一点。我做了一个自绘制的Listbox控件,方法是创建一个自定义控件,然后用API:CreateWindowEx创建一个ListBox窗体。细分子类UserCotnrol窗体(通过消息WM_DRAWITEM)来实现重绘。运行正常。但无法加入自己生成的ListBox窗体到VB的Tab序列中(正常的控件在窗体用TAB键可以依次切换焦点,设置TabIndex属性调整先后顺序),但我生成的Listbox窗体在所在窗体上无法用Tab键切换焦点。
这样写能不能明白。
csdngoodnight 2003-07-14
  • 打赏
  • 举报
回复
说的不清楚
James0001 2003-07-14
  • 打赏
  • 举报
回复
KEY_DOWN、KEY_UP 里做了什么?
qingming81 2003-07-14
  • 打赏
  • 举报
回复
创建的窗体,在它显示的时候,它的焦点是会转移到它自身内部的一个控件上的。这个仍然是正常的呀!可以使用逐句调试看看,当完成键盘消息后,又有什么语句在执行转移焦点。
minajo21 2003-07-14
  • 打赏
  • 举报
回复
这个问题我也碰到过...



狠晕...



我只能在多写很多控制光标的代码

742

社区成员

发帖
与我相关
我的任务
社区描述
VB 版八卦、闲侃,联络感情地盘,禁广告帖、作业帖
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧