ownerDraw ListView 的标题

Win32 SDK Gui编程系列之--ListView自绘OwnerDraw 当然,与纵向滚动联动,行号会跟随。在这种情况下,为了使所有列的宽度相同,将最左边的列设置为假,将第一个宽度设置为0,横向滚动将列宽度设置为0时,将这个假列的宽度扩大。表软件的话,最左边显示的列从左端开始显示,但是列表视图的话,选择单元格的右端与列表视图的右端完全一致。因为下面的程序是左对齐显示的,所以没有问题,但是要把显示放在中间或改变第1列的背景颜色的话,需要第1列的区域。在箭头键↓、↑中选择行向下、向上移动时,新单元格的框架由所有者绘图的onItemDraw函数进行,但之前的选择单元格的边框会被删除。 阅读详情

//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.

C# ListView重绘,加图标、字体,重绘标题 新手小白,想要用listview做类似于windows自带文件管理界面的效果,走了很多坑,有需要来避坑啊~添加组件什么的就不细说了,主要说界面显示问题。首先一定要把ownerDraw属性设置为true。1.查找某文件下的文件并加到listview里。接下来直接放代码了,注释会写的比较清楚。 阅读详情

相关推荐

嵌入式GUI开发:emWin LISTVIEW控件从入门到精通

在嵌入式系统开发中,图形用户界面(GUI)是连接用户与设备的关键桥梁,其核心在于高效、直观地展示和管理结构化数据。表格视图作为GUI的基础组件,通过行列结构将复杂数据可视化,其实现原理涉及控件组合、消息传递和数据模型管理。掌握表格控件不仅能提升界面交互的专业性,更能为工业HMI、智能家居中控等应用场景提供强大的数据展示能力。emWin图形库中的LISTVIEW控件正是这样一个集成了表头、排序、自定义绘制等高级功能的完整表格解决方案。本文将以LISTVIEW控件为例,深入解析其核心架构、数据排序机制以及Own

weixin_34014555的博客 383

OwnerDraw Listview

// test.cpp : 定义应用程序的入口点。//#include "stdafx.h"#include "test.h"#include #include #include #define MAX_LOADSTRING 100// 全局变量:HINSTANCE   g_hInst;   // 当前实例HWND    g_hWndMenuBar;  // 菜单栏句柄HWND    

dao21hao的专栏 1869

emWin高级控件实战:LISTVIEW、LISTWHEEL与MENU开发指南

在嵌入式GUI开发中,控件库是构建用户界面的核心组件,它将复杂的交互逻辑、状态管理与图形渲染封装为可复用的模块。其工作原理通常基于模型-视图-控制器(MVC)架构,实现数据与显示的分离,从而提升开发效率和运行性能。这类技术的核心价值在于为资源受限的嵌入式系统提供高效、稳定的图形交互能力,广泛应用于工业HMI、智能家居面板、医疗仪器等设备的触摸屏界面开发。本文聚焦于emWin GUI库中的三个高级交互控件:适用于结构化数据表格展示的LISTVIEW、提供直觉式触摸滚动选择的LISTWHEEL,以及用于构建层级

weixin_29186249的博客 360

vb.net 中给ListView 添加进度条

--------------------------------------------------               窗体 - 带进度条的 ListView            namespace: WoodCoal.Library.Windows.Forms.ListViewProgress      author: 木炭(WoodCoal)         home

大树下那片阴凉 2353

数字IC后端PR阶段Innovus,ICC,ICC2修复short万能脚本分享

数字IC后端PR阶段Innovus,ICC,ICC2修复short万能脚本分享

weixin_37584728的博客 3458

MTK Tunning ISP 模块面试总结

ISP面试问答

m0_72053187的博客 4538

使用OwnerDraw改变ListView的ColumnHeader

当我使用了OwnerDraw改变ListView的ColumnHeader的颜色之后,发现行无法显示内容了.其原因就是OwnerDraw属性设置为True造成了,也就是说,这个属性需要我们重画ListView中的各种内容,我们先是使用DrawColumnHeader消息重画了ColumnHeader,使其改变了颜色,但没有重画Item和SubItem,也就是行,因此行中的数据无法显示了,所以我们还...

weixin_34146805的博客 715

Python大数据舆情分析系统开发实战

舆情监测系统是大数据分析的重要应用场景,通过自然语言处理(NLP)技术解析社交媒体文本情感倾向。基于Python技术栈的解决方案整合了Scrapy爬虫框架进行数据采集,PySpark处理海量文本数据,结合SnowNLP和Jieba实现中文语义分析。系统采用微服务架构设计,包含数据采集层、处理层、存储层和应用层,通过情感分析优化和实时热点检测算法提升监测准确率。典型应用包括企业品牌监测、公共事件预警等场景,开发过程中需特别注意数据合规性和分布式集群的性能调优。

weixin_34408624的博客 387

C# WinForm 控件美化之改变ListView Head 的背景色

     // 需要设置ListView的OwnerDraw属性为 true // 用以改变标题的颜色 private void listView_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) { e.Graphics.Fi...

weixin_33810302的博客 541

代码的自由之旅:用AI写出无版权烦恼的Verilog

他们还基于这个数据集,训练了一个名叫“FreeV”的AI模型,不仅能写出好用的Verilog代码,还把版权侵权的风险降到了仅3%。为了让AI安全地写Verilog,研究团队提出了三个“法宝”:一个检测AI是否会生成侵权代码的测试方法、一个干净的Verilog数据集FreeSet,还有一个基于FreeSet训练的AI模型FreeV。AI的记忆力超强,能记住训练时见过的代码。测试发现,一些用Verilog数据训练过的AI,比如VeriGen,生成侵权代码的概率从9%涨到了15%,说明它们可能学了不该学的代码。

步子哥的博客 1810

Qt实现YOLO目标检测及其界面制作(附完整源码)

Qt实现YOLO目标检测及其界面制作(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 2739

listview winfrom 表头_C# 设置Listview的Columns标头颜色和高度

首先,需要设置ListView控件的OwnerDraw属性为true,这使得ListView控件在绘制控件时会引发绘制事件,而我们可以响应这些事件并按照我们的要求绘制出想要的效果。以下三个事件响应方法完成了对标题列的背景色的设置,而对项和子项的绘制则采用系统默认方式绘制,事件的名称可以从方法名称中看出来:private void listView1_DrawColumnHeader(object ...

weixin_33155857的博客 3511

SAP_SD模块_SAP 消息号VF501(科目确定期间出错)

摘要: SAP SD模块中执行VF02销售开票时出现“科目确定期间出错”(VF501)问题,主要原因是系统无法找到匹配的总账科目。解决方案包括:检查物料主数据和客户主数据中的科目分配组是否维护,核对发票中的对应字段,并通过VKOA事务代码分析科目确定逻辑。若定价过程中配置的科目代码(如Z01)未在VKOA中完整映射(如缺少H1+S5+Z01组合),则会导致内部价格无法关联总账科目。需在SPRO路径下完善科目代码分配配置,确保定价类型与科目代码匹配。本文提供了详细的排查步骤和配置方法,帮助解决开票过账错误。

我小时候很黑的博客 354

如何设置ListView控件中的列头的颜色(含标题列居中问题)!

转自https://www.cnblogs.com/chuncn/archive/2009/07/13/1522594.html与 http://www.datazx.cn/dotnetframeworkyibanxingwentitao/2018082553/csharpsharp35774bsharp32622blistviewsharp3 整理如下: 将listview的OwnerD...

dd_zhouqian的专栏 8289

图文:银行核心账务处理逻辑(白话篇)

银行账务系统分为对内账(记录银行自身资产负债)和对外账(处理客户交易),通过特定编码规则的账号体系进行管理。采用T型账户结构和凭证制度确保每笔交易可追溯,通过明细核算与综合核算双线并行、每日轧账核对(科目日结单、总账、日计表)实现账务精准平衡。从业务触发到最终账平的全流程体现了银行账务"分层记录、双向核对、闭环校验"的核心原则,保障资金流动的透明性与安全性。

银行信息系统应用架构详解 541

BUG调试案例一:RK3588+YT8531网络无法PING通调试案例

在使用 RK3588 搭配 YT8531S PHY 芯片进行网络调试时,遇到了“网络无法 Ping 通”的棘手问题。排查了两天,终于找到问题原因。为了避免大家在类似项目中走弯路,也为了加深自己对调试细节的理解,我们特意整理了本次问题的完整排查过程。本篇文章将围绕以下四个方面展开分享: 问题现象&描述 调试过程&分析 问题根源定位 注意事项提醒 举一反三(走两步)

案例文章,高速信号 2336

OwnerDraw in C#

对于像ComboBox等控件,我们可以通过设置它们的DrawMode特性(Attribute)来对其进行绘制. 为了方便起见,我们先定义一个类StringColorObject(这与OwnerDraw本身没有关系,只是针对这里要使用到的ComboBox而特意书写的一个类.类的命名得益于QuickStart).这个类本身很简单: using System.Drawing; nam

St0ne82的专栏 2105

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

emWin LISTVIEW控件API全解析:从基础应用到高级定制

在嵌入式GUI开发中,列表视图控件是构建复杂人机交互界面的核心组件,广泛应用于数据展示、文件管理和参数配置等场景。其设计基于模型-视图-控制器架构,通过数据模型、表头控件和视图控制器的分离,实现了高度的灵活性和可定制性。该控件的核心价值在于能够高效管理动态数据,并通过颜色索引系统、排序机制和自绘功能满足多样化的视觉与交互需求。在嵌入式系统开发中,深入理解其API函数集对于优化内存使用、提升渲染性能至关重要。本文聚焦emWin的LISTVIEW控件,详细拆解其API设计原理,涵盖数据操作、外观定制、交互控制以

注重长远 天天积累 cqujsjcyj 507

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

嵌入式GUI开发实战:emWin高级控件LISTVIEW、LISTWHEEL、MENU深度解析

在嵌入式系统开发中,图形用户界面(GUI)是实现人机交互的核心组件,其性能与内存效率直接影响产品体验。emWin作为一款成熟的嵌入式图形库,通过其窗口管理系统和丰富的控件集,为开发者提供了构建高效界面的基础。理解控件的设计原理与消息机制,是优化交互逻辑、提升运行效率的关键。其中,LISTVIEW控件采用表格化数据管理,适用于结构化信息展示;LISTWHEEL控件模拟物理滚轮惯性,专为流畅选择体验设计;MENU控件则实现了层级化命令导航。掌握这些控件的核心API、数据绑定方法及自定义绘制技术,能够帮助开发者在

all00747的博客 400

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

嵌入式GUI开发:emWin LISTVIEW控件核心原理与实战应用详解

在嵌入式系统开发中,图形用户界面(GUI)是实现人机交互的关键组件,而列表视图(LISTVIEW)控件则是处理结构化数据展示的核心工具。其设计原理基于模型-视图分离,通过封装表头、滚动区域和单元格渲染逻辑,将数据呈现与用户交互解耦,从而提升开发效率和界面专业性。在嵌入式资源受限环境下,LISTVIEW控件的价值在于提供了一种高效、可维护的数据展示方案,广泛应用于智能仪表、工业HMI、车载中控等场景。本文以emWin图形库为例,深入解析LISTVIEW控件的创建方式、数据管理、排序机制和自定义绘制等高级功能,

weixin_33946020的博客 409

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

chencknj的专栏 8174

【Winform】OwnerDraw(自绘) 的用法

用绘制换控件数量 → 用 CPU 换 GDI 句柄 → 性能更可控。

u013136510的博客 311

emWin LISTVIEW控件全解析:从基础API到高级自定义绘制实践

在嵌入式GUI开发中,列表视图(LISTVIEW)是用于展示和操作表格数据的基础控件,其核心原理是通过行列结构组织数据,并提供了丰富的API接口进行动态管理。从技术价值角度看,LISTVIEW控件不仅实现了数据的结构化显示,还支持排序、滚动、单元格自定义渲染等高级功能,极大地提升了嵌入式界面的交互性和信息展示效率。在实际应用场景中,它常被用于设备配置菜单、数据日志查看器、文件浏览器等需要分栏展示信息的界面。本文聚焦于emWin图形库中的LISTVIEW控件,详细解析了其全套API函数,包括LISTVIEW_

weixin_30781107的博客 421
上一篇: How to store an Object into an integer?
下一篇: 将Word嵌入Delphi中
iseekcode
博客等级 码龄18年 36粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值