我想改变treeview 滚动条.加个图片!
或改变treeview 滚动条的颜色
感谢大家!

解决方案 »

  1.   

    楼主的问题有难度,因为滚动条的窗口过程是由Windows内部控制的,所以直接无法得到滚动条的句柄,而自绘控件本身根本就不会对滚动条起任何作用,我想只能借助于窗口子类化的形式来做。先一下,中午下班的时候再研究,思路应该没有错。
      

  2.   

    first:
        procedure CreateParams(var Params: TCreateParams); override;procedure TMyTreeView.CreateParams(var Params: TCreateParams);
    begin
      inherited CreateParams(Params);
      with Params do
      begin
        ExStyle := ExStyle and not WS_EX_CLIENTEDGE;
        ExStyle := Exstyle and not WS_EX_Transparent;
      end;
    end;
      

  3.   

    second:    procedure WMMOUSEWHEEL(var Message: TMessage); message WM_MOUSEWHEEL;
        procedure WMVSCROLL(var Message: TWMVScroll); message WM_VSCROLL;
        procedure WMHSCROLL(var Message: TWMHScroll); message WM_HSCROLL;
      

  4.   

    第一个弄错了,改为:
    first:
        procedure CreateParams(var Params: TCreateParams); override;procedure TMyTreeView.CreateParams(var Params: TCreateParams);
    begin
      inherited CreateParams(Params);
      with Params do
      begin
        Style := Style and not WS_VSCROLL and not WS_HSCROLL;
      end;
    end;
      

  5.   

    to xzhifei(星级饭桶(抵制日货)·飞) 
      能不能再具体一些,你写的只是去掉窗口的滚动条好久没有这么认真的研究一个问题了,中午研究了一下,思路是有了,但是创建窗口的滚动控制老是创建不成功,也无法进行下一步的调试。下面讲一下我的思路:
    1。先是如xzhifei所说的,去掉窗口的自动滚动条
    2。创建窗口的滚动控制
    3。给该滚动控制定义一个回调函数,并设置窗口过程,也就是窗口子类化
    下面是我刚测试的代码:
    function ScrollProc(hwnd : HWND;uMessage : Cardinal;wParam : WParam;
        lParam : LParam) : LResult;stdcall;
    begin
      Result := windows.CallWindowProc(p,hwnd,uMessage,wParam,lParam);
    end;procedure TForm1.CreateParams(var Params: TCreateParams);
    begin
      inherited;
     with Params do
      begin
        Style := Style and not WS_VSCROLL and not WS_HSCROLL;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      hwndScroll : THandle;
      hInstan: Integer;
    begin
      hInstan := GetWindowLong(Handle,GWL_HINSTANCE);
      hwndScroll := CreateWindow('scrollbar',nil,WS_CHILD or WS_VISIBLE or WS_TABSTOP or
        SBS_VERT,0,0,0,0,1,Handle,hInstan,nil);
    //执行的时候hwndScroll句柄总是为0,郁闷,
    由于子窗口创建不成功,所以下面的代码暂时不贴,以免显得太乱,
    请楼主和各位高手也来讨论讨论,本人抛砖引玉而已。
      

  6.   

    不知道大家注意QQ了吗!它不完全是treeview控件.在treeview上还有个ScrollBar!
    网易泡泡都是这样做的!
      

  7.   

    TO  fim(镇江DJ)(DJ=DelphiJava)   
       我认为你的方法和QQ的思想其实一样!
       但认为QQ的方法简单一些!
       实现容易!
       其实都一样
       有QQ吗?好好聊聊
      

  8.   

    unit Unit1;
    interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        procedure CreateParams(var Params: TCreateParams); override;
        procedure WMVSCROLL(var Msg : TMessage);message WM_VSCROLL;
        procedure WMCTLCOLORSCROLLBAR(var Msg : TMessage);message WM_CTLCOLORSCROLLBAR;
        { Public declarations }
      end;var
      Form1: TForm1;
      P : Pointer;          //存储窗口过程的指针
      hwndScroll : THandle; //滚动控制句柄
      nPos : Integer;       //滚动控制的当前位置
      hwndBrush : HBrush;   //内部画刷句柄
    implementation{$R *.dfm}//滚动控制的窗口过程
    function ScrollProc(hwnd : HWND;uMessage : Cardinal;wParam : WParam;
        lParam : LParam) : LResult;stdcall;
    begin
      Result := CallWindowProc(P,hwnd,uMessage,wParam,lParam);
    end;//隐藏掉窗口本身的滚动条
    procedure TForm1.CreateParams(var Params: TCreateParams);
    begin
      inherited;
      with Params do
      begin
        Style := Style and not WS_VSCROLL and not WS_HSCROLL;
      end;end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      //创建窗口的滚动控制
      hwndScroll := CreateWindow('scrollbar',nil,
          WS_CHILD or WS_VISIBLE or WS_TABSTOP or SBS_VERT,
        10,10,200,300,Handle,0,hInstance,nil);  //设置滚动属性
      SetScrollRange(hwndScroll,SB_CTL,0,255,False);
      SetScrollPos(hwndScroll,SB_CTL,0,False);
      
      //设置滚动控制的窗口过程
      P := Pointer(SetWindowLong(hwndScroll,GWL_WNDPROC,LongInt(@ScrollProc)));
      nPos := 0;
      hwndBrush := CreateSolidBrush($00996633);
      //设置画刷
      SetWindowLong(hwndScroll,GCL_HBRBACKGROUND,hwndBrush);
    end;//该消息返回当前的画刷句柄
    procedure TForm1.WMCTLCOLORSCROLLBAR(var Msg: TMessage);
    begin
      Msg.Result := hwndBrush;
    end;procedure TForm1.WMVSCROLL(var Msg: TMessage);
    var
      R : TRect;
    begin
      case Msg.WParamLo of
        SB_LINEDOWN : Inc(nPos);
        SB_LINEUP   : Dec(nPos);
      end;
      SetScrollPos(hwndScroll,SB_CTL,nPos,True);
    end;end.
      

  9.   

    学习中...
    怎么得滑动块和两端的按钮的画刷呢?
    fim(镇江DJ)(DJ=DelphiJava)大哥的只改变了滚动条的背影.
    我想得到了它们的画刷句柄就应该可以了吧
      

  10.   

    注:其实不光背景色可以改,甚至连滚动控制两端的按钮,还有小方块都可以改的
    只需要重载相应的消息即可,太多的消息了,没必要一一重载了,如果想做成一个
    专业的控件还有很长的路要走。有兴趣的朋友可以自己查msdn,我觉得最重要的应该
    不是这些消息,而是程序整体的思路