PB 如何禁止popup 窗口获得焦点

sonata_001 2011-10-06 08:06:49
我常常使用popup窗口来显示一些信息,但是一个恼人的问题是,由于PB对任何类型的窗口,创建后使其获得焦点,这样一来,主窗口就被剥夺了焦点。即便我编程使主窗口强制获得焦点,但是这个过程,在视觉上表现出一个窗口间的焦点切换,显得很不友好。

要解决这个问题,似乎只能通过重载 窗口 的 create 事件。但是PB 的事件列表中找不到(自定义中)。我想这个问题应该是个普遍的问题。请教大家了!
...全文
492 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sonata_001 2011-10-07
  • 打赏
  • 举报
回复
楼上兄弟,请看看迅雷的主窗口,当你鼠标停留在一行上时,弹出一个透明窗口显示相关的信息。这个手段非常好,我就是要实现这个。
baiynije 2011-10-07
  • 打赏
  • 举报
回复
顯示信息為何又不讓獲得焦點呢,要實現什么功能?
sonata_001 2011-10-07
  • 打赏
  • 举报
回复
回楼上,这窗口是用来显示信息的,岂能掩藏!
baiynije 2011-10-07
  • 打赏
  • 举报
回复
把popup窗口隱藏呢?
sonata_001 2011-10-07
  • 打赏
  • 举报
回复
我想通过 加载 窗口 的 WM_CREATE 消息,来改变窗口的风格(通过 setwindowlong )。无奈在 other 消息中通过 代码监视 WM_CREATE (消息号是 1 )消息,不能捕获到:

if message.number = 1 then
f_g_msgbox('asdad')
end if

没有打印出来。
sonata_001 2011-10-07
  • 打赏
  • 举报
回复
这样似乎不行的吧,这样的方法我也试过的。还是有闪速(焦点切换)。
yyoinge 2011-10-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sonata_001 的回复:]
哦,我的代码如下:
setredraw(false)
openwithparm(w_poplistconsist, ls_data)


pos.l_x = UnitsToPixels(pointerx(), XUnitsToPixels!)
pos.l_y = UnitsToPixels(pointery(), YUnitsToPixels!)

ClientToScreen(h……
[/Quote]


我在主窗口的mousemove事件中写以上代码,也不会出现闪烁,不知道楼中的为什么会闪烁

如果openwithparm pop类型窗口的窗口是通过opensheet方式打开的,则应该是MDI主窗口w_mdi.setredraw(false)

如果不行,加我Q吧:865359042
sonata_001 2011-10-07
  • 打赏
  • 举报
回复
哦,我的代码如下:
setredraw(false)
openwithparm(w_poplistconsist, ls_data)


pos.l_x = UnitsToPixels(pointerx(), XUnitsToPixels!)
pos.l_y = UnitsToPixels(pointery(), YUnitsToPixels!)

ClientToScreen(handle(this), pos)

ll_x = PixelsToUnits(pos.l_x, XPixelsToUnits!)
ll_y = PixelsToUnits(pos.l_y, YPixelsToUnits!)

w_poplistconsist.x = ll_x
w_poplistconsist.y = ll_y


/* changed focus back to main window */
this.setfocus()
setredraw(true)

------------------------------------------------

另外说明的是闪烁是指:应用程序的主框架的标题栏闪烁(颜色变化),不是指主窗口中的内容闪烁。



另外,在open中应该不行,open 时,windows已经创建完成了这个对象了。
yyoinge 2011-10-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sonata_001 的回复:]
我想通过 加载 窗口 的 WM_CREATE 消息,来改变窗口的风格(通过 setwindowlong )。无奈在 other 消息中通过 代码监视 WM_CREATE (消息号是 1 )消息,不能捕获到:

if message.number = 1 then
f_g_msgbox('asdad')
end if

没有打印出来。
[/Quote]

在pb中使用setwindowlong,不需要再other事件中写,直接在窗口的open事件中写就可以了
yyoinge 2011-10-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yyoinge 的回复:]
假设在某个窗口中,单击某按钮时打开一个popup类型的窗口w_pop,则在该按钮的clicked事件中写:
parent.setredraw(false)
open(w_pop)
parent.setfocus()
parent.setredraw(true)
[/Quote]
楼主你再试试,我用这个方法是没有问题的,不会闪的
yyoinge 2011-10-07
  • 打赏
  • 举报
回复
假设在某个窗口中,单击某按钮时打开一个popup类型的窗口w_pop,则在该按钮的clicked事件中写:
parent.setredraw(false)
open(w_pop)
parent.setfocus()
parent.setredraw(true)

604

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 控件与界面
社区管理员
  • 控件与界面社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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