★★★★关于 TToolBar 的菜鸟问题! 快来拿分啊! (100分)

  • 主题发起人 主题发起人 Tempter
  • 开始时间 开始时间
T

Tempter

Unregistered / Unconfirmed
GUEST, unregistred user!
问题是这样的:


界面上放一个 TToolBar

在 TToolBar New 一个 TToolButton

给 TToolButton 的 DropdownMenu 关联一个 TPopupMenu

再把 TToolBar 的 Grouped 设定为 TRUE

好了!编译,运行!

  接着,点击 TToolButton

没错!TPopupMenu 被弹出了.

但是,你发现什么异样了吗?

  如果你眼力好,应该发现 TPopupMenu 的第一项被"高亮"显示了!

  鼠标并没有移动到 TPopupMenu 的第一项上,但为什么第一项自动以"高亮"显示?




提醒一点:
    
  如果Grouped属性是FALSE就不会有这个问题!

  我想问题应该出在 comctrls.pas 中,但是小弟对VCL认识浅薄,无法看出问题的所在,请各位大侠帮我看看,不胜感激!

 
我认为当Grouped属性设置成True时,而且当这个组被选择时,肯定有一个(组件)默认设置为激活状态的。所以上面的现象是很正常的,应该是对的。
 
楼上的大哥,我并不关心这个问题是否正常,我最关心的是:

在Grouped为TRUE时解决这个问题,谢谢!
 
有意义吗
 
看看
function TToolBar.CheckMenuDropdown(Button: TToolButton): Boolean;
 
设popumenu的属性AutoPopup为Flase,再加入以下代码:
procedure TForm1.ToolButton1Click(Sender: TObject);
var
p: TPoint;
begin
p := Point(ToolButton1.Left,ToolButton1.Top+ToolButton1.Height);
p := ToolButton1.ClientToScreen(p);
PopupMenu1.Popup(p.x,p.y);
end;
 
chengangsir

CheckMenuDropdown这个方法我夜注意看过,但是看不出所以然来!还请明示!
 
kingdeezj
很感谢你的方法!不过你的方法,治标,不治本,而且会引发很多其他问题!小弟更希望从VCL内部解决,最好通过继承类!谢谢!
 
在Comctrls.Pas中,第18575行开始,你可以看到如下代码:
if not InitDone then
begin
InitDone := True;
*** PostMessage(Msg.Hwnd, WM_KEYDOWN, VK_DOWN, 0);
//将上一语句屏蔽,并重新编译该文件,即可解决.
end;
 
同意以上观点,
 
呵呵,使用楼上的方法,你得重新编译一下包。很麻烦的 :(
 
后退
顶部