//By 冯思锐
unit srListview;
interface
uses
SysUtils, windows, Classes, Controls, ComCtrls, Types, messages, Graphics;
type
Tsrlistview = class(TListView)
private
{ Private declarations }
FhdHandle: integer;
FHdNewProc: pointer;
FHdOldProc: pointer;
FTextoffSet: integer;
FclSelected: TColor;
FclTitleEnd: TColor;
FclTitleBegin: TColor;
bmp: TbitMap;
FclBegin: TColor;
FclFrame: TColor;
function GetHeaderSectionRect(Index: Integer): TRect;
procedure HeaderProc(var Message: TMessage);
procedure DrawHeaderSection(Cnvs: TCanvas; Column: TListColumn; index: integer;
Active, Pressed: Boolean; R: TRect);
procedure WMParentNotify(var Message: TWMParentNotify); message WM_PARENTNOTIFY;
procedure WMNCPAINT(var Message: TWMNCPAINT); message WM_NCPAINT;
procedure SetclSelected(const Value: TColor);
procedure SetclTitleBegin(const Value: TColor);
procedure SetclTitleEnd(const Value: TColor);
procedure SetTextoffSet(const Value: integer);
procedure SetclBegin(const Value: TColor);
procedure SetclFrame(const Value: TColor);
protected
{ Protected declarations }
procedure Drawheader(Dc: HDc);
public
{ Public declarations }
procedure invalidate; override;
constructor Create(Aowner: TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
property clTitleBegin: TColor read FclTitleBegin write SetclTitleBegin;
property clTitleEnd: TColor read FclTitleEnd write SetclTitleEnd;
property clSelected: TColor read FclSelected write SetclSelected;
property TextoffSet: integer read FTextoffSet write SetTextoffSet;
property clBegin: TColor read FclBegin write SetclBegin;
property clFrame: TColor read FclFrame write SetclFrame;
end;
procedure Register;
implementation
uses Commctrl, myfunctions;
procedure Register;
begin
RegisterComponents('rui', [Tsrlistview]);
end;
{ Tsrlistview }
constructor Tsrlistview.Create(Aowner: TComponent);
begin
inherited Create(AOwner);
FhdHandle:=0;
FHdNewProc := MakeObjectInstance(HeaderProc);
FhdOldProc := nil;
FTextoffSet:=3;
FclSelected:=clBlue;
FclTitleBegin:=clSilver;
FclTitleEnd:=clBtnFace;
FclBegin:=clBtnFace;
FclFrame:=clBlack;
bmp:=TbitMap.Create;
end;
destructor Tsrlistview.Destroy;
begin
DestroyHandle;
if FhdHandle <> 0 then
SetWindowLong(Fhdhandle, GWL_WNDPROC, LongInt(FHdOldProc));
FreeObjectInstance(FhdNewProc);
Fhdhandle := 0;
bmp.Free;
inherited Destroy;
end;
procedure Tsrlistview.Drawheader(Dc: HDc);
var
R : TRect;
i : integer;
ps: TPaintStruct;
cvs: TControlCanvas;
begin
if DC = 0 then DC := BeginPaint(FhdHandle, PS);
Cvs := TControlCanvas.Create;
try
if not GetWindowRect(FhdHandle, R) then exit;
Cvs.Handle := DC;
// cvs.Brush.Color:=FclTitleBegin;
// cvs.FillRect(R);
with Cvs do
begin
for i := 0 to Header_GetItemCount(FhdHandle) - 1 do
begin
R := GetHeaderSectionRect(i);
DrawHeaderSection(Cvs, Columns, i, False, false, R);
end;
end;
finally
cvs.Free;
if DC = 0 then EndPaint(FhdHandle, PS);
end;
end;
procedure Tsrlistview.DrawHeaderSection(Cnvs: TCanvas; Column: TListColumn;
index: integer; Active, Pressed: Boolean; R: TRect);
var
s: string;
RT: TRect;
function GetColumnCaption(index: integer): string;
var
Col: TLVColumn;
begin
Col.Mask := LVCF_TEXT;
GetMem( Col.pszText, 255 );
Col.cchTextMax := 255;
try
if ListView_GetColumn( Handle, Index, Col ) then
Result := Col.pszText
else
Result := '';
finally
FreeMem( Col.pszText );
end;
end;
begin
bmp.Width:=RectWidth(R);
bmp.Height:=Rectheight(R);
RT:=Rect(0, 0, bmp.Width, bmp.Height);
FillTubeGradientRect(bmp.Canvas.Handle, RT, FclTitleBegin, FclTitleEnd, false);
bmp.Canvas.Pen.Color:=FclTitleEnd;
if R.Left>0 then
begin
bmp.Canvas.MoveTo(0, 0);
bmp.Canvas.LineTo(0, bmp.Height);
end;
if index=Columns.Count-1 then
begin
bmp.Canvas.MoveTo(bmp.Width, 0);
bmp.Canvas.LineTo(bmp.Width, bmp.Height);
end;
if Column.ID mod 2=0 then
BlendBmp(Bmp, FclBegin, 24)
else
BlendBmp(Bmp, clWhite, 24);
s:=GetColumnCaption(index);
inflateRect(RT, -FTextoffSet, 0);
bmp.Canvas.Brush.Style:=bsClear;
DrawText(bmp.Canvas.Handle, pchar(s), length(s), RT,
DT_SINGLELINE or DT_VCENTER or DT_END_ELLIPSIS);
cnvs.Draw(R.Left, R.Top, bmp);
end;
function Tsrlistview.GetHeaderSectionRect(Index: Integer): TRect;
var
R: TRect;
begin
Header_GETITEMRECT(Fhdhandle, Index, @R);
Result := R;
end;
procedure Tsrlistview.HeaderProc(var Message: TMessage);
var
R: TRect;
clBkgn: TColor;
begin
case Message.Msg of
WM_PAINT : DrawHeader(TWMPAINT(MESSAGE).DC);
WM_ERASEBKGND :
begin
windows.GetClientRect(Fhdhandle, R);
clBkgn:=getAlphaColor(FclTitleEnd, FclTitleBegin, 160);
fillRect(TWMPAINT(MESSAGE).DC, R, createSolidbrush(clBkgn));
Message.Result := 1;
end;
else
with Message do
Result := CallWindowProc(FHdOldProc, FhdHandle, Msg, WParam, LParam);
end;
end;
procedure Tsrlistview.invalidate;
begin
inherited invalidate;
if FhdHandle<>0 then InvalidateRect(FhdHandle, nil, True);
end;
procedure Tsrlistview.SetclBegin(const Value: TColor);
begin
FclBegin := Value;
invalidate;
end;
procedure Tsrlistview.SetclFrame(const Value: TColor);
begin
FclFrame := Value;
invalidate;
end;
procedure Tsrlistview.SetclSelected(const Value: TColor);
begin
FclSelected := Value;
invalidate;
end;
procedure Tsrlistview.SetclTitleBegin(const Value: TColor);
begin
FclTitleBegin := Value;
invalidate;
end;
procedure Tsrlistview.SetclTitleEnd(const Value: TColor);
begin
FclTitleEnd := Value;
invalidate;
end;
procedure Tsrlistview.SetTextoffSet(const Value: integer);
begin
FTextoffSet := Value;
invalidate;
end;
procedure Tsrlistview.WMNCPAINT(var Message: TWMNCPAINT);
const
InnerStyles: array[TBevelCut] of Integer = (0, BDR_SUNKENINNER, BDR_RAISEDINNER, 0);
OuterStyles: array[TBevelCut] of Integer = (0, BDR_SUNKENOUTER, BDR_RAISEDOUTER, 0);
EdgeStyles: array[TBevelKind] of Integer = (0, 0, BF_SOFT, BF_FLAT);
Ctl3DStyles: array[Boolean] of Integer = (BF_MONO, 0);
var
DC: Hdc;
SaveRW, RW, Rc: TRect;
EdgeSize: integer;
WinStyle: Longint;
begin
inherited;
DC := GetWindowDC(Handle);
try
Rc:=Rect(0, 0, width, height);
Windows.DrawEdge(DC, Rc, BDR_RAISEDOUTER, BF_RECT);
FrameRect(Dc, Rc, createSolidBrush(clFrame));
Finally
ReleaseDc(handle, DC);
end;
end;
procedure Tsrlistview.WMParentNotify(var Message: TWMParentNotify);
begin
inherited;
with Message do
if (Event = WM_CREATE) and (FhdHandle = 0) then
begin
FhdHandle := ChildWnd;
FhdOldProc := Pointer(GetWindowLong(FhdHandle, GWL_WNDPROC));
SetWindowLong(FhdHandle, GWL_WNDPROC, LongInt(FhdNewProc));
end;
end;
end.
相关推荐
嵌入式GUI开发:emWin LISTVIEW控件从入门到精通
在嵌入式系统开发中,图形用户界面(GUI)是连接用户与设备的关键桥梁,其核心在于高效、直观地展示和管理结构化数据。表格视图作为GUI的基础组件,通过行列结构将复杂数据可视化,其实现原理涉及控件组合、消息传递和数据模型管理。掌握表格控件不仅能提升界面交互的专业性,更能为工业HMI、智能家居中控等应用场景提供强大的数据展示能力。emWin图形库中的LISTVIEW控件正是这样一个集成了表头、排序、自定义绘制等高级功能的完整表格解决方案。本文将以LISTVIEW控件为例,深入解析其核心架构、数据排序机制以及Own
OwnerDraw Listview
// test.cpp : 定义应用程序的入口点。//#include "stdafx.h"#include "test.h"#include #include #include #define MAX_LOADSTRING 100// 全局变量:HINSTANCE g_hInst; // 当前实例HWND g_hWndMenuBar; // 菜单栏句柄HWND
emWin高级控件实战:LISTVIEW、LISTWHEEL与MENU开发指南
在嵌入式GUI开发中,控件库是构建用户界面的核心组件,它将复杂的交互逻辑、状态管理与图形渲染封装为可复用的模块。其工作原理通常基于模型-视图-控制器(MVC)架构,实现数据与显示的分离,从而提升开发效率和运行性能。这类技术的核心价值在于为资源受限的嵌入式系统提供高效、稳定的图形交互能力,广泛应用于工业HMI、智能家居面板、医疗仪器等设备的触摸屏界面开发。本文聚焦于emWin GUI库中的三个高级交互控件:适用于结构化数据表格展示的LISTVIEW、提供直觉式触摸滚动选择的LISTWHEEL,以及用于构建层级
vb.net 中给ListView 添加进度条
-------------------------------------------------- 窗体 - 带进度条的 ListView namespace: WoodCoal.Library.Windows.Forms.ListViewProgress author: 木炭(WoodCoal) home
数字IC后端PR阶段Innovus,ICC,ICC2修复short万能脚本分享
数字IC后端PR阶段Innovus,ICC,ICC2修复short万能脚本分享
MTK Tunning ISP 模块面试总结
ISP面试问答
使用OwnerDraw改变ListView的ColumnHeader
当我使用了OwnerDraw改变ListView的ColumnHeader的颜色之后,发现行无法显示内容了.其原因就是OwnerDraw属性设置为True造成了,也就是说,这个属性需要我们重画ListView中的各种内容,我们先是使用DrawColumnHeader消息重画了ColumnHeader,使其改变了颜色,但没有重画Item和SubItem,也就是行,因此行中的数据无法显示了,所以我们还...
Python大数据舆情分析系统开发实战
舆情监测系统是大数据分析的重要应用场景,通过自然语言处理(NLP)技术解析社交媒体文本情感倾向。基于Python技术栈的解决方案整合了Scrapy爬虫框架进行数据采集,PySpark处理海量文本数据,结合SnowNLP和Jieba实现中文语义分析。系统采用微服务架构设计,包含数据采集层、处理层、存储层和应用层,通过情感分析优化和实时热点检测算法提升监测准确率。典型应用包括企业品牌监测、公共事件预警等场景,开发过程中需特别注意数据合规性和分布式集群的性能调优。
C# WinForm 控件美化之改变ListView Head 的背景色
// 需要设置ListView的OwnerDraw属性为 true // 用以改变标题的颜色 private void listView_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) { e.Graphics.Fi...
代码的自由之旅:用AI写出无版权烦恼的Verilog
他们还基于这个数据集,训练了一个名叫“FreeV”的AI模型,不仅能写出好用的Verilog代码,还把版权侵权的风险降到了仅3%。为了让AI安全地写Verilog,研究团队提出了三个“法宝”:一个检测AI是否会生成侵权代码的测试方法、一个干净的Verilog数据集FreeSet,还有一个基于FreeSet训练的AI模型FreeV。AI的记忆力超强,能记住训练时见过的代码。测试发现,一些用Verilog数据训练过的AI,比如VeriGen,生成侵权代码的概率从9%涨到了15%,说明它们可能学了不该学的代码。
Qt实现YOLO目标检测及其界面制作(附完整源码)
Qt实现YOLO目标检测及其界面制作(附完整源码)
listview winfrom 表头_C# 设置Listview的Columns标头颜色和高度
首先,需要设置ListView控件的OwnerDraw属性为true,这使得ListView控件在绘制控件时会引发绘制事件,而我们可以响应这些事件并按照我们的要求绘制出想要的效果。以下三个事件响应方法完成了对标题列的背景色的设置,而对项和子项的绘制则采用系统默认方式绘制,事件的名称可以从方法名称中看出来:private void listView1_DrawColumnHeader(object ...
SAP_SD模块_SAP 消息号VF501(科目确定期间出错)
摘要: SAP SD模块中执行VF02销售开票时出现“科目确定期间出错”(VF501)问题,主要原因是系统无法找到匹配的总账科目。解决方案包括:检查物料主数据和客户主数据中的科目分配组是否维护,核对发票中的对应字段,并通过VKOA事务代码分析科目确定逻辑。若定价过程中配置的科目代码(如Z01)未在VKOA中完整映射(如缺少H1+S5+Z01组合),则会导致内部价格无法关联总账科目。需在SPRO路径下完善科目代码分配配置,确保定价类型与科目代码匹配。本文提供了详细的排查步骤和配置方法,帮助解决开票过账错误。
如何设置ListView控件中的列头的颜色(含标题列居中问题)!
转自https://www.cnblogs.com/chuncn/archive/2009/07/13/1522594.html与 http://www.datazx.cn/dotnetframeworkyibanxingwentitao/2018082553/csharpsharp35774bsharp32622blistviewsharp3 整理如下: 将listview的OwnerD...
图文:银行核心账务处理逻辑(白话篇)
银行账务系统分为对内账(记录银行自身资产负债)和对外账(处理客户交易),通过特定编码规则的账号体系进行管理。采用T型账户结构和凭证制度确保每笔交易可追溯,通过明细核算与综合核算双线并行、每日轧账核对(科目日结单、总账、日计表)实现账务精准平衡。从业务触发到最终账平的全流程体现了银行账务"分层记录、双向核对、闭环校验"的核心原则,保障资金流动的透明性与安全性。
BUG调试案例一:RK3588+YT8531网络无法PING通调试案例
在使用 RK3588 搭配 YT8531S PHY 芯片进行网络调试时,遇到了“网络无法 Ping 通”的棘手问题。排查了两天,终于找到问题原因。为了避免大家在类似项目中走弯路,也为了加深自己对调试细节的理解,我们特意整理了本次问题的完整排查过程。本篇文章将围绕以下四个方面展开分享: 问题现象&描述 调试过程&分析 问题根源定位 注意事项提醒 举一反三(走两步)
OwnerDraw in C#
对于像ComboBox等控件,我们可以通过设置它们的DrawMode特性(Attribute)来对其进行绘制. 为了方便起见,我们先定义一个类StringColorObject(这与OwnerDraw本身没有关系,只是针对这里要使用到的ComboBox而特意书写的一个类.类的命名得益于QuickStart).这个类本身很简单: using System.Drawing; nam
jre9下载 jdk9
(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】
emWin LISTVIEW控件API全解析:从基础应用到高级定制
在嵌入式GUI开发中,列表视图控件是构建复杂人机交互界面的核心组件,广泛应用于数据展示、文件管理和参数配置等场景。其设计基于模型-视图-控制器架构,通过数据模型、表头控件和视图控制器的分离,实现了高度的灵活性和可定制性。该控件的核心价值在于能够高效管理动态数据,并通过颜色索引系统、排序机制和自绘功能满足多样化的视觉与交互需求。在嵌入式系统开发中,深入理解其API函数集对于优化内存使用、提升渲染性能至关重要。本文聚焦emWin的LISTVIEW控件,详细拆解其API设计原理,涵盖数据操作、外观定制、交互控制以
汉书HE8,好用的汇编代码编写工具
汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大
ssm框架搭建
这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载
嵌入式GUI开发实战:emWin高级控件LISTVIEW、LISTWHEEL、MENU深度解析
在嵌入式系统开发中,图形用户界面(GUI)是实现人机交互的核心组件,其性能与内存效率直接影响产品体验。emWin作为一款成熟的嵌入式图形库,通过其窗口管理系统和丰富的控件集,为开发者提供了构建高效界面的基础。理解控件的设计原理与消息机制,是优化交互逻辑、提升运行效率的关键。其中,LISTVIEW控件采用表格化数据管理,适用于结构化信息展示;LISTWHEEL控件模拟物理滚轮惯性,专为流畅选择体验设计;MENU控件则实现了层级化命令导航。掌握这些控件的核心API、数据绑定方法及自定义绘制技术,能够帮助开发者在
迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)
迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)
嵌入式GUI开发:emWin LISTVIEW控件核心原理与实战应用详解
在嵌入式系统开发中,图形用户界面(GUI)是实现人机交互的关键组件,而列表视图(LISTVIEW)控件则是处理结构化数据展示的核心工具。其设计原理基于模型-视图分离,通过封装表头、滚动区域和单元格渲染逻辑,将数据呈现与用户交互解耦,从而提升开发效率和界面专业性。在嵌入式资源受限环境下,LISTVIEW控件的价值在于提供了一种高效、可维护的数据展示方案,广泛应用于智能仪表、工业HMI、车载中控等场景。本文以emWin图形库为例,深入解析LISTVIEW控件的创建方式、数据管理、排序机制和自定义绘制等高级功能,
ListView 图标显示在subitem中
ListView 图标显示在subitem中 2009-12-22 10:16:28 1. 把需要用的图片存入imageList控件中。2. 设置listview的OwnerDraw属性:true。 3. 在listview的DrawColumnHeader事件中写如下代码private void listView1_DrawColumnHeader(object se
【Winform】OwnerDraw(自绘) 的用法
用绘制换控件数量 → 用 CPU 换 GDI 句柄 → 性能更可控。
emWin LISTVIEW控件全解析:从基础API到高级自定义绘制实践
在嵌入式GUI开发中,列表视图(LISTVIEW)是用于展示和操作表格数据的基础控件,其核心原理是通过行列结构组织数据,并提供了丰富的API接口进行动态管理。从技术价值角度看,LISTVIEW控件不仅实现了数据的结构化显示,还支持排序、滚动、单元格自定义渲染等高级功能,极大地提升了嵌入式界面的交互性和信息展示效率。在实际应用场景中,它常被用于设备配置菜单、数据日志查看器、文件浏览器等需要分栏展示信息的界面。本文聚焦于emWin图形库中的LISTVIEW控件,详细解析了其全套API函数,包括LISTVIEW_
383



被折叠的 条评论
为什么被折叠?



