之前发了一个帖子http://topic.csdn.net/u/20101214/22/6228f14a-4690-4589-8375-9f97d3ece0c0.html,等了两天没有得到答案。很久很多次想要这个效果,今天开了个夜车终于自己解决了。分享、庆祝、散分!
效果如下图:
百度上搜到的一篇博文证明了我的想法是实际存在的
“下拉按钮有两种样式:
1、在按钮的右边显示箭头,两者之间有间隔,单击按钮的时候象其它正常
按钮一样,发送的是WM_COMMAND消息,只有在单击箭头的时候才发送TBN_DROPDOWN 消息,弹出下拉
菜单。这种按钮使用比较多,需要 4.72 版(IE 4.01 和Win98以后)支持。
2、在按钮的图案右边显示一个箭头,单击按钮的时候,整个按钮都下沉,并且弹出下拉菜单。需要
添加BTNS_WHOLEDROPDOWN属性,版本要求比较高,需要 5.80版Comctl32.dll(IE 5)支持。”
(摘自書童自留地 工具条研究手记7
注意到BTNS_WHOLEDROPDOWN这个常量,发现CommCtrl.pas里已经定义好了,只是Delphi没有使用到。于是动手修改了ComCtrls.pas的TToolBar.UpdateItem方法,果然成功了!

解决方案 »

  1.   

    首先祝贺,然后,楼主,贴点儿代码出来,让我们see一see,学一学啊。
      

  2.   

    首先祝贺,然后,楼主,贴点儿代码出来,让我们see一see,学一学啊。
      

  3.   

    最后一幅截图就是修改ComCtrls.pas的TToolBar.UpdateItem方法的代码,其他没什么了呀。
      

  4.   

    截图的开发环境是 Delphi 2010
      

  5.   

    楼主帖出代码,大家look look啊
      

  6.   

    楼主帖出代码,大家look look啊
      

  7.   

    不错   楼主帖出代码,大家look look啊
      

  8.   

    楼主无需修改VCL源代码的.给楼主的东西来个锦上添花:uses
      CommCtrl;//设置工具条某个按钮为BTNS_WHOLEDROPDOWN样式
    function SetBtnWholeDropdown(tb : TToolBar; BtnIndex : Integer) : boolean;
    var
      btnInfo : TTBBUTTONINFO;
      r : Integer;
      e : Integer;
    begin
      ZeroMemory(@btnInfo, sizeof(btnInfo));
      btnInfo.cbSize := sizeof(btnInfo);
      btnInfo.dwMask := TBIF_STYLE;  //返回值是按钮的索引
      if tb.Perform(TB_GETBUTTONINFO, BtnIndex, WParam(@btnInfo)) < 0 then
      begin
        Result := False;
      end
      else
      begin
        btnInfo.fsStyle := btnInfo.fsStyle and (not BTNS_DROPDOWN)or BTNS_WHOLEDROPDOWN;
        //非零就是成功
        Result := tb.Perform(TB_SETBUTTONINFO, BtnIndex, WParam(@btnInfo)) <> 0;
      end;
    end;
      

  9.   

    恭喜 不过貌似C# 和VB里面都有框架啊!