Win32 SDK Gui编程系列之--ListView自绘OwnerDraw

ListView自绘OwnerDraw

1.ListView自绘OwnerDraw

正在试错是否使用了列表视图,尽量制作出智能的表格编辑器。本页显示了业主抽签的表格数据(二维数组数据)的显示方法。

显示画面和整个程序如下所示。使用ListView_GetSubItemRect宏的话,就不需要getRect函数了。

当nCol的值为0时得到的区域不是第一列,而是全列即整个行的区域。因为下面的程序是左对齐显示的,所以没有问题,但是要把显示放在中间或改变第1列的背景颜色的话,需要第1列的区域。为此,第1列的右端需要从第2列的左端进行修正。

Listview51.c

//ListView#include <windows.h>
#include <commctrl.h>
#pragma  comment(lib, "comctl32.lib")#define  NROW   12
#define  NCOL   4
char  *colname[NCOL] = { "No.", "Name", "Attr", "Age" };
char  *table[NROW][NCOL] = { {"01","张三","老大", "15"}, {"02","李四","老二","11"}, {"03","王五","老三","9"}, {"04","张三","老大", "15"}, {"05","李四","老二","11"}, {"06","王五","老三","9"}, {"07","张三","老大", "15"}, {"08","李四","老二","11"}, {"09","王五","老三","9"}, {"10","张三","老大", "15"}, {"11","李四","老二","11"}, {"12","王五","老三","9"}, 
};HWND   hList;//  ListView_GetSubItemRect(hwnd, nRow, nCol, LVIR_BOUNDS, pRect);
BOOL getRect(HWND hwnd, int nRow, int nCol, RECT *pRect) {pRect->left = LVIR_BOUNDS;pRect->top = nCol;return (BOOL)SendMessage(hwnd, LVM_GETSUBITEMRECT, (WPARAM)nRow, (LPARAM)pRect);
}// ListView的所有者抽签。行单位。
int onDrawItem(HWND hwnd, WPARAM wp, LPARAM lp) {DRAWITEMSTRUCT *pds = (DRAWITEMSTRUCT *)lp;if (pds->hwndItem == hList) {int  nCol, nRow = pds->itemID;HDC  hdc = pds->hDC;for (nCol = 0; nCol < NCOL; nCol++) {RECT rc;getRect(hList, nRow, nCol, &rc);rc.left += 4;DrawText(hdc, table[nRow][nCol], -1, &rc, DT_VCENTER|DT_SINGLELINE|DT_LEFT);}}return TRUE;
}void onCreate(HWND hWnd) {int iCol, iRow;hList = CreateWindowEx(0, WC_LISTVIEW, NULL, WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_OWNERDRAWFIXED,0, 0, 1, 1, hWnd, (HMENU)777, NULL, NULL);SendMessage(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_GRIDLINES);for (iCol = 0; iCol < NCOL; iCol++) {LVCOLUMN col = { LVCF_FMT|LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM, 0, 70, colname[iCol], 0, iCol };SendMessage(hList, LVM_INSERTCOLUMN, iCol, (LPARAM)&col);}for (iRow = 0; iRow < NROW; iRow++) {LVITEM item = { LVIF_TEXT, iRow };SendMessage(hList, LVM_INSERTITEM, 0, (LPARAM)&item);}
}LRESULT CALLBACK WindowProc(HWND hwnd, UINT umsg, WPARAM wp, LPARAM lp) {switch (umsg) {case WM_CREATE: onCreate(hwnd); return 0;case WM_DRAWITEM: return onDrawItem(hwnd, wp, lp);case WM_SIZE: MoveWindow(hList, 0, 0, lp&0xffff, lp>>16, TRUE); return 0;case WM_DESTROY: PostQuitMessage(0); return 0;}return DefWindowProc(hwnd, umsg, wp, lp);
}int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) {MSG msg;WNDCLASS wc = { 0, WindowProc, 0, 0, hInst, NULL, LoadCursor(NULL,IDC_ARROW), NULL, NULL, "mh" };if (!RegisterClass(&wc)) return FALSE;InitCommonControls();if (!CreateWindowEx(0, "mh", "ListView", WS_OVERLAPPEDWINDOW|WS_VISIBLE,100, 100, 250, 200, NULL, NULL, hInst, NULL)) return FALSE;while (GetMessage(&msg,NULL,0,0) > 0) {TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/457732.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux基础开发工具使用【Yum | Vim | 编译器 | 调试器 | GDB | Makefile | Git】

本节目标&#xff1a; 学习yum工具&#xff0c;进行软件安装掌握vim编辑器使用&#xff0c;学会vim的简单配置掌握简单的Makefile编写&#xff0c;了解其运行思想编写自己的第一个Linux 程序&#xff1a;进度条掌握gcc/g编译器的使用&#xff0c;并了解其过程&#xff0c;原理掌…

蓝桥杯-求阶乘-python

问题描述 满足N!的末尾恰好有K个0的最小的N是多少&#xff1f; 如果这样的N不存在输出一1。 思路解析 末尾的0是由10产生的&#xff0c;而10是由质数2和5产生的 在求阶乘的过程中&#xff0c;只要是偶数就会有2&#xff0c;而5相对2更少&#xff0c;所以对于10的数量我们可以…

Python程序员面试题精选(1)

本文精心挑选了10道Python程序员面试题&#xff0c;覆盖了Python的多个核心领域&#xff0c;包括装饰器、lambda函数、列表推导式、生成器、全局解释器锁(GIL)、单例模式以及上下文管理器等。每道题都附有简洁的代码示例&#xff0c;帮助读者更好地理解和应用相关知识点。 题目…

redis:七、集群方案(主从复制、哨兵模式、分片集群)和面试模板

redis集群方案 在Redis中提供的集群方案总共有三种&#xff08;一般一个redis节点不超过10G内存&#xff09; 主从复制哨兵模式分片集群 主从复制&#xff08;主从数据同步&#xff09; replid和offset Replication Id&#xff1a;简称replid&#xff0c;是数据集的标记&a…

离谱!英国大学53%本科生用AI写论文!留学生该如何面对AI冲击?

随着AI的不断强化和更新换代&#xff0c;越来越多的学生开始使用人工智能辅助写论文&#xff0c;能省去不少信息搜集的时间。 英国大学从最开始的明令禁止&#xff0c;到如今也在逐步接受学生将它用做辅助工具&#xff1a; 然而&#xff0c;AI的使用其实还存在很多问题&#xf…

Files的常用方法都有哪些

Files的常用方法都有哪些 Java的java.nio.file包提供了Files工具类&#xff0c;用于对文件和目录进行常见的操作。以下是一些Files类的常用方法&#xff0c;以及简单的代码演示&#xff1a; 复制文件或目录&#xff1a; import java.io.IOException; import java.nio.file.*;pu…

寒假 day6

1.请编程实现二又树的操作。 1.1二又树的创建 1.2二又树的先序遍历 1.3二又树的中序遍历 1.4二又树的后序遍历 1.5二又树各个节点度的个数 1.6二叉树的深度 #include<stdio.h> #include<string.h> #include<stdlib.h> typedef char datatype; //定义节点结…

隧道穿透:端口转发、socket隧道代理

目录 端口转发 lcx工具 Lcx工具正向连接 Lcx工具反向连接 SOCKET隧道代理 socks常见利用场景 Proxifier SocksCap64 Proxychains 端口转发 本篇会和搭建介绍一下端口转发和socket隧道代理的概念和简单演示 lcx工具 lcx工具是一个红队人员在内网渗透测试中最典型的端…

【Django】Cookie和Session的使用

Cookies和Session 1. 会话 从打开浏览器访问一个网站&#xff0c;到关闭浏览器结束此次访问&#xff0c;称之为一次会话。 HTTP协议是无状态的&#xff0c;导致会话状态难以保持。 Cookies和Session就是为了保持会话状态而诞生的两个存储技术。 2. Cookies 2.1 Cookies定…

SpringCloud--Gateway解析

一、Gateway简介 Gateway是Spring Cloud官方推出的第二代微服务网关&#xff0c;它旨在提供统一的路由方式以及为微服务应用提供强大的负载均衡能力。与第一代Spring Cloud Netflix Zuul相比&#xff0c;Spring Cloud Gateway在性能、可扩展性、易用性等方面都有了显著的提升。…

Spring框架入门指南

文章目录 Spring特点IoCAOPSpring事务事务隔离级别Spring注解Spring生命周期Spring创建完毕想要初始化一些操作注解的使用与开发Spring配置类加载XML配置文件静态工厂方法和实例工厂方法循环依赖&#xff08;循环引用&#xff09;三级缓存解决循环依赖问题SpringAOP延申动态代理…

Stable Diffusion 模型下载:Schematics(原理图)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 “Schematics”是一个非常个性化的LORA&#xff0c;我的目标是创建一个整体风格&#xff0c;但主要面向某些风格美学&#xff0c;因此它可以用于人物、物体、风景等…