在论坛上看一个贴,问能不能在ListView的列表头移动时响应事件,随翻查了ListView的事件,发现竟没有。于是自己动手来写一个。
其实要响应这个事件也不算难,关键是了解ListView的结构,ListView的列头其实也是一个窗口,不信用Spy看一下。我们只要获得了这个头的句柄,那它的一举一动便逃不过程序的眼睛了(^ ^)。
获得了句柄,再用一个新的窗口过程代替旧的窗口过程,当然这个新的窗口过程最后得成一个类的成员,这个用Delphi的MakeObjectInstance可以轻松完成。这样就可以在新的窗口过程中操纵列表头。
理论已经具备,接下来就是动手,想了一想,该功能还是挺常用的,不如扩展到控件去,造福他人,岂不是快哉!
于是就有了下面的控件,可以装上去,用起来更方便,OnHeadMoved事件,处理这个事件即可。不过先声明,这个事件可是等你移动完成之后才触发的:
unit ListviewEx;
{*******************************************
* brief: 一个可以响应列表头移动事件的ListView
* autor: linzhenqun
* date: <chsdate w:st="on" isrocdate="False" islunardate="False" day="14" month="8" year="2005">2005-8-14</chsdate>
* email: linzhengqun@163.com
* blog: http://blog.csdn.net/linzhengqun
********************************************}
interface
uses
Windows, Messages, SysUtils, Classes, Controls, ComCtrls, CommCtrl;
type
TListviewEx = class(TListView)
private
FHeaderHandle: THandle;
FHeaderInst: Pointer;
FOldHeaderProc: Pointer;
FOnHeaderMoved: TNotifyEvent;
FDown: Boolean;
FColsWidth: array of Integer;
procedure SaveColumnsWidth;
function ColumnsWidthChange: Boolean;
protected
procedure CreateWnd; override;
procedure NewHeaderProc(var Message: TMessage);
public
destructor Destroy; override;
published
property OnHeadMoved: TNotifyEvent read FOnHeaderMoved
write FOnHeaderMoved;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TListviewEx]);
end;
{ TListviewEx }
function TListviewEx.ColumnsWidthChange: Boolean;
var
i, C: Integer;
begin
Result := False;
if Length(FColsWidth) > Columns.Count then
C := Columns.Count
else
C := Length(FColsWidth);
for i := 0 to C - 1 do
if FColsWidth[i] <> Columns[i].Width then
begin
Result := True;
break;
end;
end;
procedure TListviewEx.CreateWnd;
begin
inherited;
FDown := False;
FHeaderHandle := ListView_GetHeader(Handle);
if FHeaderHandle <> 0 then
begin
FHeaderInst := MakeObjectInstance(NewHeaderProc);
FOldHeaderProc := Pointer(GetWindowLong(FHeaderHandle, GWL_WNDPROC));
SetWindowLong(FHeaderHandle, GWL_WNDPROC, Longint(FHeaderInst));
end;
end;
destructor TListviewEx.Destroy;
begin
if FHeaderHandle <> 0 then
begin
SetWindowLong(FHeaderHandle, GWL_WNDPROC, Longint(FOldHeaderProc));
FreeObjectInstance(FHeaderInst);
end;
inherited;
end;
procedure TListviewEx.NewHeaderProc(var Message: TMessage);
begin
Message.Result := CallWindowProc(FOldHeaderProc, FHeaderHandle,
Message.Msg, Message.WPARAM, Message.LPARAM);
if not (csDesigning in ComponentState) then
if Message.Msg = WM_LBUTTONDOWN then
begin
FDown := True;
SaveColumnsWidth;
end
else if Message.Msg = WM_LBUTTONUP then
begin
if FDown and ColumnsWidthChange then
if Assigned(FOnHeaderMoved) then
FOnHeaderMoved(Self);
FDown := False;
end
else if Message.Msg = WM_LBUTTONDBLCLK then
begin
if ColumnsWidthChange then
if Assigned(FOnHeaderMoved) then
FOnHeaderMoved(Self);
FDown := False;
end;
end;
procedure TListviewEx.SaveColumnsWidth;
var
i: Integer;
begin
FColsWidth := nil;
SetLength(FColsWidth, Columns.Count);
for i:= 0 to Columns.Count - 1 do
FColsWidth[i] := Columns[i].Width;
end;
end.
分享到:
相关推荐
Android ListView扩展(图片+文字)(开发工具:Android Studio 3.1.4)
Delphi 10_delphilistview_ListView扩展源码_ListView_源码.zip
Delphi 10_delphilistview_ListView扩展源码_ListView_源码.rar
控件重绘 C# WinForm控件美化扩展系列之ListView
delphi xe8 移动开发框架中需要使用的三方控件,listview此控件扩展后能更好的使界面友好,可以定制很多功能,比自带的listview 操作简单,感谢作者分离。
WinForm开发系列 - ListBox/ListView/Panel 扩展控件,共有22个控件
ListView扩展源码,对ListView进行扩展,新空间
C#对话框开发,扩展了C#默认的ListView控件的功能,看看吧,或许对你有用!
有类似美团上的美食购物分类,有类似QQ分组的,有listview里面嵌套gridview的。几乎项目中个能用到的二级菜单这里都有,而且界面还是比较简洁的,很实用,又得直接可以在项目中应用。项目代码量也不是很多,而且都有...
扩展的自定义listview控件[ExpandListview.rar]-精品源代码
带CheckBox的listView 支持多选,全选,反选, 的功能,网上有好多遇见的这种需求做起来有bug,在这里都完美解决了
==== ListView 扩展,使列表视图可扩展。 ##Feature 如果你有父子关系结构数据,那么你可以让 listview 用这个扩展来显式显示它。这个扩展使用的示例包含在这个 repo 中,这是一些截图:##Screenshots 支持: :
自定义的listview控件,显示的灵活和多样性
Android 可扩展ListView,自定义实现ListView 代码中关键位置已有相关注释
可扩展的listView
博客http://blog.csdn.net/u012925323/article/details/49444153实现了ListView item滑出和扩展效果。ListView item点击时候动态地扩展相应的View视图,有利于美观和节约屏幕空间。
这是一个可扩展的listView源码,使用eclipse打开
listview控件功能扩展--自定义可编辑列(源码) listview控件功能扩展--自定义可编辑列(源码) listview控件功能扩展--自定义可编辑列(源码)