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;
第一个弄错了,改为: 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;
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,郁闷, 由于子窗口创建不成功,所以下面的代码暂时不贴,以免显得太乱, 请楼主和各位高手也来讨论讨论,本人抛砖引玉而已。
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;
procedure WMVSCROLL(var Message: TWMVScroll); message WM_VSCROLL;
procedure WMHSCROLL(var Message: TWMHScroll); message WM_HSCROLL;
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;
能不能再具体一些,你写的只是去掉窗口的滚动条好久没有这么认真的研究一个问题了,中午研究了一下,思路是有了,但是创建窗口的滚动控制老是创建不成功,也无法进行下一步的调试。下面讲一下我的思路:
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,郁闷,
由于子窗口创建不成功,所以下面的代码暂时不贴,以免显得太乱,
请楼主和各位高手也来讨论讨论,本人抛砖引玉而已。
网易泡泡都是这样做的!
我认为你的方法和QQ的思想其实一样!
但认为QQ的方法简单一些!
实现容易!
其实都一样
有QQ吗?好好聊聊
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.
怎么得滑动块和两端的按钮的画刷呢?
fim(镇江DJ)(DJ=DelphiJava)大哥的只改变了滚动条的背影.
我想得到了它们的画刷句柄就应该可以了吧
只需要重载相应的消息即可,太多的消息了,没必要一一重载了,如果想做成一个
专业的控件还有很长的路要走。有兴趣的朋友可以自己查msdn,我觉得最重要的应该
不是这些消息,而是程序整体的思路