在论坛上看一个贴,问能不能在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.
分享到:
相关推荐
标题提到的"xe8 移动开发之listview扩展"着重强调了对原生ListView的增强和优化,使其更适合于移动设备的界面设计和用户体验。 ListView控件的基础功能包括显示多项数据,每一项可以包含多个子项(SubItems),并且...
2. **ListView扩展控件** ListView控件允许展示数据的多种视图,如列表视图、小图标视图、大图标视图和详细信息视图。扩展后的ListView控件可能包含以下特性: - 多列排序:用户可以通过点击列头进行排序。 - ...
这个名为"Delphi 10_delphilistview_ListView扩展源码_ListView_源码.zip"的压缩包文件包含了一些针对Delphi 10的ListView组件的扩展源码,这些源码可能提供了对ListView功能的增强或定制,以满足开发者在实际项目中...
本资源"Delphi 10_delphilistview_ListView扩展源码_ListView_源码.rar"提供了对Delphi 10中的ListView组件的扩展源码,旨在增强其功能和定制性。 ListView组件的基本功能包括: 1. 多列:ListView可以展示多列数据...
"ListView扩展源码"通常指的是开发者为了增强ListView的功能或者优化其性能,对其进行的自定义和改进。这个压缩包文件名"BlurStickyHeaderListView-master"暗示了我们可能在探讨一个具有模糊背景效果(Blur)和粘性...
本项目名为“listview扩展控件”,显然,它是对标准ListView控件功能的增强和扩展,旨在提供更加丰富和多样化的显示效果。 首先,我们来了解一下ListView的基本特性。ListView控件通常用于显示一个项目的列表,每个...
通过以上步骤,我们就可以在Android Studio中实现一个具有图片和文字的扩展ListView。这只是一个基础示例,实际应用中还可以根据需求添加更多功能,如头尾视图、侧滑删除、动画效果等。记得在开发过程中,遵循...
本教程将聚焦于“控件重绘”这一主题,特别是针对ListView控件的美化和扩展。控件重绘允许开发者自定义控件的显示样式,以实现更丰富、更具吸引力的视觉效果。 ListView控件是Windows Forms中最常用的控件之一,它...
本项目“ListView功能扩展”旨在提供一个增强版的ListView控件,名为EXListView,它具备了更多的特性和定制选项。 1. 多视图模式:EXListView扩展了默认的视图模式,除了列表视图、小图标视图和大图标视图,还增加...
在提供的压缩包文件"www.NewXing.com"中,可能包含了关于VB ListView扩展使用的示例代码。通过研究这些代码,你可以更深入地了解如何在实际项目中实现上述技巧,优化ListView的性能和功能。记住,实践是最好的老师,...
有类似美团上的美食购物分类,有类似QQ分组的,有listview里面嵌套gridview的。几乎项目中个能用到的二级菜单这里都有,而且界面还是比较简洁的,很实用,又得直接可以在项目中应用。项目代码量也不是很多,而且都有...
ListView控件在Windows应用程序开发中扮演着重要角色,它用于展示数据列表,具有灵活的布局和多种视图模式。在VB(Visual Basic)环境中,ListView的美化和性能优化是开发者经常面临的问题。"超高速度显示最漂亮的...
本案例中的"扩展的自定义listview控件"是一个专门针对ListView控件进行增强和定制的源代码,可以帮助开发者创建更加复杂和功能丰富的用户界面。 首先,我们看到压缩包中的文件主要是Visual Basic 6(VB6)的工程...
在Android开发中,ListView是一种常用的组件,用于展示可滚动的列表数据。在许多场景下,我们需要在ListView中加入复选框(CheckBox),实现多选、全选和反选的功能,例如在选择联系人、设置菜单等场景。这个“带...
==== ListView 扩展,使列表视图可扩展。 ##Feature 如果你有父子关系结构数据,那么你可以让 listview 用这个扩展来显式显示它。这个扩展使用的示例包含在这个 repo 中,这是一些截图:##Screenshots 支持: :
2. **DragSortListView**:这个自定义的ListView扩展了原生的ListView,增加了拖放排序的特性。它会调用DragSortController来处理触摸事件,并在拖放过程中更新视图。 3. **ItemTouchHelper**:虽然这个名称在官方...
SwipeListView是一个强大的ListView扩展,它提供了滑动显示更多操作的功能。用户可以通过左右滑动ListView的项来显示额外的内容或执行特定的操作,如删除、收藏等。这个特性在许多应用中都很常见,例如邮件应用中的...
本示例主要探讨如何在单文档界面(SDI)应用中实现ListView的可扩展性,涵盖多种表现形式以及数据的添加方法。以下是关于ListView可扩展性的详细解释和实践要点。 1. **ListView的基本概念** - ListView控件是MFC...
本文将深入探讨如何在Android中创建一个自定义的可扩展ListView。 首先,我们要理解可扩展ListView的基本概念。这种ListView允许子项(items)展开或折叠,通常用于展示具有层级结构的数据。例如,我们可能有一个...