首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在WM_DRAWITEM中绘制多列ListView

在WM_DRAWITEM消息中绘制多列ListView,可以通过以下步骤实现:

  1. 确定ListView的样式为LVS_REPORT,即报表样式,可以显示多列数据。
  2. 在WM_DRAWITEM消息的处理函数中,获取绘制的相关信息,包括绘制的设备上下文(HDC)、绘制的矩形区域(RECT)以及绘制的项索引(itemID)。
  3. 创建一个临时的内存设备上下文(MemDC),并将其与一个临时的位图(MemBitmap)关联起来,用于绘制ListView的内容。
  4. 获取ListView的列数(columnCount)和每列的宽度(columnWidth),可以通过ListView_GetColumnCount和ListView_GetColumnWidth函数获取。
  5. 根据绘制的项索引,获取该项的数据,并根据列宽度将数据绘制到临时的位图上。
  6. 将临时的位图绘制到ListView的设备上下文中,完成绘制。

以下是一个示例代码:

代码语言:txt
复制
case WM_DRAWITEM:
{
    LPDRAWITEMSTRUCT lpDrawItem = (LPDRAWITEMSTRUCT)lParam;
    HDC hdc = lpDrawItem->hDC;
    RECT rcItem = lpDrawItem->rcItem;
    int itemID = lpDrawItem->itemID;

    // 创建临时的内存设备上下文和位图
    HDC memDC = CreateCompatibleDC(hdc);
    HBITMAP memBitmap = CreateCompatibleBitmap(hdc, rcItem.right - rcItem.left, rcItem.bottom - rcItem.top);
    HBITMAP oldBitmap = (HBITMAP)SelectObject(memDC, memBitmap);

    // 获取ListView的列数和每列的宽度
    int columnCount = ListView_GetColumnCount(hwndListView);
    int columnWidth = ListView_GetColumnWidth(hwndListView, 0);

    // 获取项的数据并绘制到临时位图上
    LVITEM lvItem;
    lvItem.mask = LVIF_TEXT;
    lvItem.iItem = itemID;
    lvItem.iSubItem = 0;
    lvItem.pszText = new TCHAR[MAX_PATH];
    lvItem.cchTextMax = MAX_PATH;
    ListView_GetItem(hwndListView, &lvItem);

    // 绘制第一列数据
    DrawText(memDC, lvItem.pszText, -1, &rcItem, DT_LEFT);

    // 绘制其他列数据
    for (int i = 1; i < columnCount; i++) {
        rcItem.left += columnWidth;
        rcItem.right += columnWidth;

        lvItem.iSubItem = i;
        ListView_GetItem(hwndListView, &lvItem);

        DrawText(memDC, lvItem.pszText, -1, &rcItem, DT_LEFT);
    }

    // 将临时位图绘制到ListView的设备上下文中
    BitBlt(hdc, rcItem.left, rcItem.top, rcItem.right - rcItem.left, rcItem.bottom - rcItem.top, memDC, 0, 0, SRCCOPY);

    // 清理资源
    SelectObject(memDC, oldBitmap);
    DeleteObject(memBitmap);
    DeleteDC(memDC);

    delete[] lvItem.pszText;
}
break;

这样,在WM_DRAWITEM消息的处理函数中,就可以实现绘制多列ListView的功能。注意,以上示例代码仅为演示目的,实际使用时需要根据具体情况进行适当的修改和优化。

推荐的腾讯云相关产品:腾讯云云服务器(CVM)和腾讯云对象存储(COS)。

  • 腾讯云云服务器(CVM):提供弹性计算能力,可根据业务需求灵活选择配置,支持多种操作系统,适用于各类应用场景。产品介绍链接:https://cloud.tencent.com/product/cvm
  • 腾讯云对象存储(COS):提供安全、稳定、低成本的云端存储服务,可用于存储和管理各类非结构化数据,如图片、音视频文件等。产品介绍链接:https://cloud.tencent.com/product/cos
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Flutter构建布局 顶

在这个例子,四个元素排列成一:一个图像,两行和一个文本块。 ? ? ? ? 接下来,绘制每一行。 第一行称为标题部分,有三个孩子:一文字,一个星形图标和一个数字。...()(它接受一个Icon和Text)并返回一个以其主要颜色绘制的小部件的效率最高。...将文本放入容器,以便沿每条边添加32像素的填充。 softwrap属性指示文本是否应在软换行符(句点或逗号)上断开。...这些小部件安排在ListView,而不是,因为在小设备上运行应用程序时,ListView会自动滚动。...反过来,每个孩子本身可以是一排或一,依此类推。 以下示例显示如何在行或内嵌套行或。 此布局按行组织。 该行包含两个孩子:左侧的一和右侧的图片: ? 左的小部件树嵌套行和。 ?

43.1K10
  • C++ Qt开发:StringListModel字符串列表映射组件

    QStringListModel 是 Qt 中用于处理字符串列表数据的模型类之一,它是 QAbstractListModel 的子类,用于在 Qt 的视图类( QListView、QComboBox...该组件通常会配合ListView一起使用,例如将ListView组件与Model模型绑定,当ListView组件内有数据更新时,就可以利用映射将数据模型的数值以字符串格式提取出来,同理也可实现将字符串赋值到指定的...首先绘制UI界面,如下图中所示,左侧是一个ListView组件,右侧是一个PlainTextEdit组件; 1.1 初始化模型 如下代码演示了如何在 MainWindow 中使用 QStringListModel...然后,通过 ui->listView->setModel(model) 将模型设置到 QListView ,从而使模型的数据在 QListView 显示。...组将将被初始化为城市地址,如下图所示; 1.2 添加与插入 如下代码演示了如何在 MainWindow 通过按钮的点击事件向 QStringListModel 添加或插入数据。

    22510

    SDK平台三态按钮的实现

    重绘按钮需要在消息WM_DRAWITEM,这个消息的处理是在相应控件的父窗口中实现的,而在一般情况下父窗口不会收到该消息,需要我们手工指定控件资源的属性为的OWNERDRAW为真,或者在创建相应的按钮窗口时将样式设置为...设置完成后就可以在对应的父窗口处理函数接收并处理WM_DRAWITEM,在该消息重绘按钮 该消息主要使用的参数是lpParam它里面包含的是一个指向DRAWITEMSTRUCT的结构体: typedef...UINT CtlType; //控件类型 UINT CtlID; //控件ID UINT itemID; //子菜单项的ID主要用于菜单 UINT itemAction; //控件发出的动作,ODA_SELECT...,同时结构体的itemAction、itemState是可以由多个值通过位或组成在判断是否具有某种状态时需要使用位与运算 而绘制控件时我们可以使用函数DrawFrameControl,该函数可以根据指定的控件类型...、控件所处的状态来绘制控件的样式,绘制出来的任然是系统的之前的标准样式,处理WM_DRAWITEN消息的具体代码如下: LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT

    79440

    Android RecyclerView 使用完全解析 体验艺术般的控件

    而RecyclerView基本需要上面一系列的步骤,那么为什么会添加这么的步骤呢?...获取到listDivider以后,该属性的值是个Drawable,在getItemOffsets,outRect去设置了绘制的范围。onDraw实现了真正的绘制。...去判断如果是最后一行,则不需要绘制底部;如果是最后一,则不需要绘制右边,整个判断也考虑到了StaggeredGridLayoutManager的横向和纵向,所以稍稍有些复杂。...但是如果我们有这么个需求,纵屏的时候显示为ListView,横屏的时候显示两的GridView,我们RecyclerView可以轻松搞定,而如果使用ListView去实现还是需要点功夫的~~~ 当然了...通过简单改变下LayoutManager,就可以产生不同的效果,那么我们可以根据手机屏幕的宽度去动态设置LayoutManager,屏幕宽度一般的,显示为ListView;宽度稍大的显示两的GridView

    1.6K10

    Android开发笔记(二十二)瀑布流网格WaterfallGridView

    瀑布流网格的产生背景 Android展示门类信息一般使用列表视图ListView或者网格视图GridView,特别是电商类APP的首页,除了顶部导航、底部标签、上方横幅外,主要页面都是展示各种商品和活动的网格视图...再比如像新闻摘要,每篇摘要的字数都不一样,为了把文字显示完全,也需要对每个网格自适应高度,字数的网格分配较小的高度,字数较多的网格分配较大的高度。...如果是ListView,每行高度一样,一行内每个元素的长度是可以自定义的,但每元素的长度必须一样,所以改造ListView的效果也很有限。...改造GridView也不行,改造ListView也不行,看来得换个思路了,把复杂问题简单化试试。...前面我们在自定义视图章节,已经提到尺寸测量以及视图绘制的相关知识,之所以在onLayout而不是在onDraw和dispatchDraw中排列视图,是因为onDraw和dispatchDraw都通过画布来绘制

    2.4K60

    .NET 封装的Windows平台轻量DirectUI框架

    运行系统 win10+, win7 需要安装KB2670838补丁 .net 4.6.1 编译 Visual Studio 2019 Visual Studio 2022 特点 绘制函数是DirectX11...生成的动态链接库支持被其它语言python、java、go、dephi、C#、VB、易语言等调用。 扩展组件自由灵活,引擎处理底层逻辑。用户只需编写绘制代码,不需要考虑复杂的消息处理。...window label layout absolute layout flow layout linear layout relative layout table listbutton listview...drag obj progressbar notify obj titlebar datebox colorpicker scorebutton carousel template listview...的实战项目 程序员开发者神器:10个.Net开源项目 一份阅读量突破10万+的C#/.NET/.NET Core面试宝典(基础版) 【微信自动化】使用c#实现微信自动化 细聊C# AsyncLocal如何在异步间进行数据流转

    31441

    Andriod基础——Adapter类

    指定一个XML layout定义,然后将数据集中的每一的值绑定到layout的一个View上。 ...在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),然后根据这个长度,调用getView()逐一绘制每一行...系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件inflate来的布局。...至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。...好了,绘制完这一行了。那再绘制下一行,直到绘完为止。

    1.7K50

    【愚公系列】2023年10月 WPF控件专题 ListView控件详解

    一、ListView控件详解WPFListView控件是一个非常强大的控件,它可以用来显示列表数据,例如文件列表、电子邮件列表、联系人列表等等。...>在这个示例,我们将MyList属性作为数据源绑定到ListView控件,然后使用一个简单的DataTemplate来显示每个列表项。...2.常用场景WPFListView控件常用于以下场景:数据展示:可以使用ListView来展示大量的数据,以帮助用户快速查找所需的数据。...用户可以通过ListView控件进行快速编辑和更新数据。布局:ListView控件提供了布局的功能,可以使用户更加清晰地看到数据。可以使用GridView来实现布局。...用户可以在ListView控件按照自己的需求进行数据排序。ListView控件是WPF中非常强大和灵活的控件,可以帮助我们展示和操作各种类型的数据。

    60811

    《Flutter》-- 6.高级组件

    目前,可滚动组件的大部分组件都支持基于Sliver的延迟构建模型,ListView、GridView。...}) SliverGridDelegate是一个抽象类,是一个控制子元素排列方式的接口,有两个实现类: 1)SliverGridDelegateWithFixedCrossAxisCount:用于数固定的场景...6.5.2 自绘组件 在Flutter创建自绘组件需要用到CustomPaint和CustomPainter两个类:CustomPaint在绘制阶段提供一个Canvas,即画布;CustomPainter...在绘制阶段提供画笔,可配置画笔的颜色、样式和粗细等属性。...,返回false即可;如果绘制过程需要依赖外部状态,可以在shouldRepaint()判断依赖的状态是否改变,如果已改变,则返回true并执行重绘操作,反之则返回false不执行重绘; 2)绘制应尽可能地进行分层

    10.6K20

    【Android】RecyclerView的使用

    优点 他可以通过设置LayoutManager来快速实现listview、gridview、瀑布流的效果,而且还可以设置横向和纵向显示,你想要控制Item间的间隔(可绘制),添加动画效果也非常简单(自带了...ItemAnimation,可以设置加载和移除时的动画,方便做出各种动态浏览的效果) 用法 1、导入 在Module的build.gradle的Dependencies添加依赖(对应自己appcompat-v7...LinearLayoutManager layoutManager = new LinearLayoutManager(this); 改为 int arrayNum = 2;//GridView样式时的数...int style = StaggeredGridLayoutManager.VERTICAL;//垂直排布 StaggeredGridLayoutManager layoutManager1 =...效果 我们在使用ListView的时候,一般都会使用分割线,只要在布局说明就好了。相比ListView,RecyclerView添加分割线就有些复杂了。

    1.1K50

    Flutte部件目录-基本部件(一)

    绘制过程,容器首先应用给定的transform,然后绘制decoration来填满填充范围,然后绘制子组件,最后绘制foregroundDecoration,并填满填充范围。...如果该行的非弹性内容比该行(那些不包含在Expanded或Flexible部件的)本身,则该行被认为已经溢出。当一行溢出时,该行没有任何剩余空间Expanded和Flexible的子项。...或者在一个ListView,或者在其它没有为该提供最大高度限制的上下文中时,你会在运行时说这个异常存在弹性子部件,但垂直约束是无界的。...发生这种情况的一个常见原因是已被放置在另一(没有使用Expanded或Flexible围绕内部嵌套)。...在这种情况下,解决方案通常只是将内部包装在Expanded,以表明它应该占用外部的剩余空间,而不仅仅是它需要的空间。 显示此消息的另一个原因是将嵌套到ListView或其他垂直滚动条

    7.5K20

    Android ListView 与 RecyclerView 对比浅析:缓存机制

    PS:相关知识: ListView与RecyclerView缓存机制原理大致相似,如下图所示: 滑动过程,离屏的ItemView即被回收至缓存,入屏的ItemView则会优先从缓存获取,只是ListView...层级不同: RecyclerView比ListView两级缓存,支持多个离ItemView缓存,支持开发者自定义缓存处理逻辑,支持所有RecyclerView共用同一个RecyclerViewPool...ListView通过pos获取的是view,即pos-->view; RecyclerView通过pos获取的是viewholder,即pos --> (view,viewHolder,flag);...(1)为例,最终会调用requestLayout(),使整个RecyclerView重新绘制,过程为: onMeasure()-->onLayout()-->onDraw() 其中,onLayout()...,或者频繁更新,局部刷新,建议使用RecyclerView,更加强大完善,易扩展;其它情况(微信卡包列表页)两者都OK,但ListView在使用上会更加方便,快捷。

    6.7K41
    领券