SHGetFileInfo函数获取48x48图标并在ListControl平铺视图中显示

news2024/11/24 20:15:07

VS2010工程下载链接:https://pan.baidu.com/s/1ACXQSpoNdFVFLdvWntT7mA?pwd=wfy5

C语言写法:

#define COBJMACROS
#include <stdio.h>
#include <Windows.h>
#include <CommCtrl.h>
#include <commoncontrols.h>

HICON load_icon_48x48(const char *ext)
{
	HICON hicon = NULL;
	HRESULT hr;
	IImageList *iiml;
	SHFILEINFOA sfi;

	SHGetFileInfoA(ext, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX);
	hr = SHGetImageList(SHIL_EXTRALARGE, &IID_IImageList, &iiml);
	if (SUCCEEDED(hr))
	{
		IImageList_GetIcon(iiml, sfi.iIcon, ILD_TRANSPARENT, &hicon);
		IImageList_Release(iiml);
	}
	return hicon;
}

void display_icon_size(HICON hicon)
{
	BITMAP bm;
	ICONINFO info;

	GetIconInfo(hicon, &info);
	GetObject(info.hbmColor, sizeof(BITMAP), &bm);
	printf("size: %dx%d\n", bm.bmWidth, bm.bmHeight);
	DeleteObject(info.hbmColor);
	DeleteObject(info.hbmMask);
}

int main(void)
{
	HICON hicon;

	hicon = load_icon_48x48(".png");
	if (hicon != NULL)
	{
		display_icon_size(hicon);
		DestroyIcon(hicon);
	}
	return 0;
}

C++写法:

#include <iostream>
#include <Windows.h>
#include <CommCtrl.h>
#include <commoncontrols.h>

using namespace std;

HICON load_icon_48x48(const char *ext)
{
	HICON hicon = NULL;
	HRESULT hr;
	IImageList *iiml;
	SHFILEINFOA sfi;

	SHGetFileInfoA(ext, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX);
	hr = SHGetImageList(SHIL_EXTRALARGE, IID_PPV_ARGS(&iiml));
	if (SUCCEEDED(hr))
	{
		iiml->GetIcon(sfi.iIcon, ILD_TRANSPARENT, &hicon);
		iiml->Release();
	}
	return hicon;
}

void display_icon_size(HICON hicon)
{
	BITMAP bm;
	ICONINFO info;

	GetIconInfo(hicon, &info);
	GetObject(info.hbmColor, sizeof(BITMAP), &bm);
	cout << "size: " << bm.bmWidth << "x" << bm.bmHeight << endl;
	DeleteObject(info.hbmColor);
	DeleteObject(info.hbmMask);
}

int main(void)
{
	HICON hicon;

	hicon = load_icon_48x48(".png");
	if (hicon != NULL)
	{
		display_icon_size(hicon);
		DestroyIcon(hicon);
	}
	return 0;
}

C语言示例窗口程序:

#define COBJMACROS
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <CommCtrl.h>
#include <commoncontrols.h>
#include <windowsx.h>
#include "resource.h"

#pragma comment(lib, "comctl32.lib")
#pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' language='*' publicKeyToken='6595b64144ccf1df'\"")

HINSTANCE hinstMain;
HWND hwndDlg, hwndList;

HICON load_icon_48x48(const char *ext)
{
	HICON hicon = NULL;
	HRESULT hr;
	IImageList *iiml;
	SHFILEINFOA sfi;

	SHGetFileInfoA(ext, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX);
	hr = SHGetImageList(SHIL_EXTRALARGE, &IID_IImageList, &iiml);
	if (SUCCEEDED(hr))
	{
		IImageList_GetIcon(iiml, sfi.iIcon, ILD_TRANSPARENT, &hicon);
		IImageList_Release(iiml);
	}
	return hicon;
}

void list_init()
{
	char *list[] = {".avi", ".docx", ".jpg", ".gif", ".rxdata", ".png", ".txt", ".rmvb", ".mov", ".pptx", ".xlsx", ".accdb", ".pcbdoc", ".schdoc"};
	char name[50];
	char str[50];
	int i, j;
	HICON hicon;
	HIMAGELIST himl;
	LVCOLUMNA lvc;
	LVITEMA lvi;
	LVTILEVIEWINFO tvi;
	UINT tile_columns[2] = {1, 2};

	// 创建48x48图像列表
	himl = ImageList_Create(48, 48, ILC_COLOR32, 0, 1);
	ListView_SetImageList(hwndList, himl, LVSIL_NORMAL);
	for (i = 0; i < _countof(list); i++)
	{
		hicon = load_icon_48x48(list[i]);
		if (hicon != NULL)
		{
			ImageList_AddIcon(himl, hicon); // 将图标复制到图像列表 (注意是复制!!!)
			DestroyIcon(hicon); // 最后一定要记得删除图标
		}
	}

	// 添加列信息
	lvc.mask = LVCF_TEXT | LVCF_WIDTH;
	lvc.cx = 150;
	lvc.pszText = "文件名";
	SendMessage(hwndList, LVM_INSERTCOLUMNA, 0, (LPARAM)&lvc);
	lvc.cx = 100;
	lvc.pszText = "i";
	SendMessage(hwndList, LVM_INSERTCOLUMNA, 1, (LPARAM)&lvc);
	lvc.cx = 80;
	lvc.pszText = "namelen";
	SendMessage(hwndList, LVM_INSERTCOLUMNA, 2, (LPARAM)&lvc);

	// 设置平铺视图属性
	tvi.cbSize = sizeof(LVTILEVIEWINFO);
	tvi.dwFlags = LVTVIF_FIXEDSIZE;
	tvi.dwMask = LVTVIM_COLUMNS;
	tvi.cLines = _countof(tile_columns);
	ListView_SetTileViewInfo(hwndList, &tvi);

	// 添加项目
	for (i = 0; i < _countof(list); i++)
	{
		for (j = 0; list[i][j + 1] != '\0'; j++)
			name[j] = toupper(list[i][j + 1]);
		name[j] = '\0';
		strcat_s(name, sizeof(name), "文件");
		strcat_s(name, sizeof(name), list[i]);

		lvi.mask = LVIF_IMAGE | LVIF_TEXT | LVIF_COLUMNS;
		lvi.iItem = i;
		lvi.iSubItem = 0;
		lvi.pszText = name;
		lvi.iImage = i;
		lvi.cColumns = _countof(tile_columns); // 平铺视图灰色文字行数
		lvi.puColumns = tile_columns; // 平铺视图每一行灰色文字对应的列号
		lvi.iItem = (int)SendMessage(hwndList, LVM_INSERTITEMA, 0, (LPARAM)&lvi);
		
		_snprintf_s(str, sizeof(str), sizeof(str), "i=%d", i);
		lvi.mask = LVIF_TEXT;
		lvi.iSubItem = 1;
		lvi.pszText = str;
		SendMessage(hwndList, LVM_SETITEMA, 0, (LPARAM)&lvi);
		
		_snprintf_s(str, sizeof(str), sizeof(str), "namelen=%d", strlen(name));
		lvi.iSubItem = 2;
		lvi.pszText = str;
		SendMessage(hwndList, LVM_SETITEMA, 0, (LPARAM)&lvi);
	}

	ListView_SetExtendedListViewStyle(hwndList, LVS_EX_DOUBLEBUFFER); // 使用半透明选择框
	ListView_SetView(hwndList, LV_VIEW_TILE); // 切换到平铺视图
}

INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;

	switch (uMsg)
	{
	case WM_COMMAND:
		wmId = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		switch (wmId)
		{
		case IDCANCEL:
			EndDialog(hDlg, 0);
			hwndDlg = NULL;
			hwndList = NULL;
			break;
		}
	case WM_INITDIALOG:
		hwndDlg = hDlg;
		hwndList = GetDlgItem(hDlg, IDC_LIST1);
		list_init();
		break;
	}
	return 0;
}

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
	LRESULT ret;

	hinstMain = hInstance;
	InitCommonControls();

	ret = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
	return (int)ret;
}

示例应用:合泰(holtek)单片机串口OTA程序烧写软件(见链接中的download_code5.zip)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cocos基本介绍

一、下载Dashboard Cocos Creator 3.8 手册 - 安装和启动 二、编辑器结构 1.资源管理器&#xff1a;显示了项目资源文件夹(assets)中的所有资源 2.场景编译器&#xff1a;用于展示和编辑场景中可是内容的工作区域 3.层级管理器&#xff1a;用树状列表的形式展示场景中的所有…

Linux文件读取

#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>int main(int argc, char * * argv){printf("输入了参数个数&#xff1a;%d \n",argc);if (argc !3 ){printf("参数不…

系统架构设计专业技能 · 软件工程(一)【系统架构设计师】

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;二&#xff09;【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…

python接口自动化之正则用例参数化

前言 ​ 我们在做接口自动化的时候&#xff0c;处理接口依赖的相关数据时&#xff0c;通常会使用正则表达式来进行提取相关的数据。 ​ 正则表达式&#xff0c;又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(Regular Expression&#xff0c;在代码中常简写…

目标检测YOLOv3基于DarkNet53模型测试-笔记

目标检测YOLOv3基于DarkNet53模型测试-笔记 预测和试测结果&#xff1a; 预测代码如下所示&#xff1a; testInsects.py #YOLOv3网模型测试-单图片文件测试并显示测试结果 import time import os import paddle import numpy as np import cv2 import random from PIL impor…

ROS实现自定义信息以及使用

常见的消息包 消息包定义一般如下&#x1f447; &#xff08;1&#xff09;创建包和依赖项 &#xff08;2&#xff09;在新建的qq_msgs的包新建msgs的文件夹&#xff0c;在该文件夹里面新建Carry.msg类型的文件。 其实&#xff0c;Carry.msg就是你自己定义的消息类型&am…

CentOS软件包管理rpm、yum

一、软件包概述 Linux常见软件包分为两种&#xff0c;分别是源代码包、二进制文件包。源代码包是没有经过编译的包&#xff0c;需要经过GCC、C编译器编译才能运行&#xff0c;文件内容包含源代码文件&#xff0c;通常以.tar.gz、.zip、.rar结尾&#xff1b;二进制包无需编译&am…

尚硅谷大数据项目《在线教育之采集系统》笔记003

视频地址&#xff1a;尚硅谷大数据项目《在线教育之采集系统》_哔哩哔哩_bilibili 目录 P036 P037 P038 P039 P041 P042 P043 P044 P045 P046 P036 先启动zookeeper&#xff0c;在启动kafka&#xff0c;启动hadoop中的hdfs node003启动flume&#xff0c;node001启动f…

用户稳定增长,拆解美团立足于“吃”的刚需价值

近期&#xff0c;QuestMobile发布了《中国移动互联网2023年上半年大报告》。报告显示&#xff0c;上半年&#xff0c;我国移动互联网月人均单日使用时长同比增长7.7%至7.2小时&#xff0c;移动互联网月活用户增长至12.13亿。 尽管在几年前&#xff0c;互联网流量触顶就已经成为…

re学习(30)攻防世界-hackme(代码复原2)

思路&#xff1a; 1.输出成功&#xff0c;v26不为0,说明关系式&#xff1a;v21((unsigned __int8)v24 ^ v20) →2.在汇编代码第37行&#xff0c;输入v16v20&#xff0c;所以求的值为v20 →3.根据关系式&#xff0c;求的值v20v21^v24 →4.v21在第汇编代码第36行也可以提取出来…

springboot人事管理系统设计与实现

126springboot人事管理系统java web员工信息管理系统 人事管理系统&#xff0c;属于ERP的一个部分。它单指汇集成功企业先进的人力资源管理理念、人力资源管理实践、人力资源信息化系统建设的经验&#xff0c;以信息技术实现对企业人力资源信息的高度集成化管理&#xff0c;为…

dijkstra算法相关(使用邻接表和优先队列两种方法)力扣题:743. 网络延迟时间(有向图);1334. 阈值距离内邻居最少的城市(无向图)

具体dijkstra算法就不展开说了&#xff0c;因为太多帖子来解释了&#xff0c;并且这也只是我的个人总结/记录&#xff0c;我会把自己的思考过程写在代码的注释中。 743. 网络延迟时间&#xff08;有向图&#xff09; 有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列…

ArduPilot开源飞控之MAVProxy简介

ArduPilot开源飞控之MAVProxy简介 1. 源由2. 特点3. 安装 & 更新3.1 安装Step 1: 烧录raspberryPi镜像Step 2&#xff1a;apt软件包更新Step 3&#xff1a;Raspian系统更新Step 4&#xff1a;安装依赖环境Step 5&#xff1a;安装mavproxyStep 6&#xff1a;配置bash环境 3.…

HttpRunner自动化测试之脚手架工具使用(一键搭建)

脚手架工具使用&#xff1a; 每一个成熟的系统工具&#xff0c;都会有对应的脚手架工具&#xff0c;它可以快速构建项目的必要目录&#xff0c;不必自己一个一个的配置与搭建&#xff0c;只需要执行一些命令即可。 httprunner也提供了脚手架工具&#xff0c;使用步骤如下&…

Python接口自动化-requests模块之post请求

一、源码解析 def post(url, dataNone, jsonNone, **kwargs):r"""Sends a POST request.:param url: URL for the new :class:Request object.:param data: (optional) Dictionary, list of tuples, bytes, or file-likeobject to send in the body of the :cla…

微服务——ES实现自动补全

效果展示 在搜索框根据拼音首字母进行提示 拼音分词器 和IK中文分词器一样的用法&#xff0c;按照下面的顺序执行。 # 进入容器内部 docker exec -it elasticsearch /bin/bash# 在线下载并安装 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch…

迭代器模式-遍历聚合对象中的元素

在开发中&#xff0c;我们经常使用到Iterator这个接口&#xff0c;我们很疑惑于这个接口的作用&#xff0c;认为集合已经实现了数据访问的方法&#xff0c;增加Iterator的意义在哪。本文我们将学习迭代器模式&#xff0c;用以探讨Iterator的作用。 1.1 迭代器模式概述 提供一…

地图 SDK gitlab 测试代码环境配置

文章目录 1、Gradle 插件版本和 Gradle 版本2、NDK 路径3、JDK 版本4、修改变量5、重新 BuildQ&A&#xff1a; test 用例启动之后问题问题描述 拉下项目的 dev 分支&#xff0c;然后依赖的 mapsdk-base 也完成下载 &#xff0c;之后就是Android Studio 配置环境 1、Gradle …

【Git】保姆级详解:Git配置SSH Key(密钥和公钥)到github

博主简介&#xff1a;22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a;是瑶瑶子啦每日一言&#x1f33c;: “当人们做不到一些事情的时候&#xff0c;他们会对你说你也同样不能。”——《当幸福来敲门》 克里斯加德纳 Git配置SSH Key 一、什么是Git?二、什么…

如何给Google Chrome增加proxy

1. 先打开https://github.com/KaranGauswami/socks-to-http-proxy/releases 我的电脑是Liunx系统所以下载第一个 2. 下载完之后把这个文件变成可执行文件&#xff0c;可以是用这个命令 chmod x 文件名 3. 然后执行这个命令&#xff1a; ./sthp-linux -p 8080 -s 127.0.0.1:…