去除Win32 Tab Control控件每个选项卡上的深色对话框背景

一般情况下,我们是用不带边框的对话框来充当Tab Control的每个选项卡的内容的。
例如,主对话框IDD_TABBOX上有一个Tab Control,上面有两个选项卡,第一个选项卡用的是IDD_DIALOG1充当内容,第二个用的则是IDD_DIALOG2。IDD_DIALOG1和IDD_DIALOG2的Border属性设为None,Style属性设为Child,如下三张图所示。

但是用对话框充当选项卡内容会有烦人的深色对话框背景,和选项卡的样式并不搭,看起来也不好看,如下图所示。

其实,要去掉这个深色对话框背景很简单,只需要在每个选项卡的对话框的消息处理函数的WM_INITDIALOG里面加一句EnableThemeDialogTexture(hdlg, ETDT_ENABLETAB);就行了。有多少个选项卡,就加多少句这句话。
使用EnableThemeDialogTexture函数前,需要包含头文件Uxtheme.h和库文件Uxtheme.lib。该函数支持Windows XP系统。
#include <Uxtheme.h>
#pragma comment(lib, "Uxtheme.lib")

注意:使用这个函数后,如果程序处理了Static控件的WM_CTLCOLORSTATIC消息,直接return 0就可以用渐变背景了。不需要返回HBRUSH背景刷,SetTextColor设置的文字颜色就能生效。

 运行之后是这样的:

深色的对话框背景就成功去除掉了。话说XP系统的选项卡界面真的挺好看的,是一个渐变色。

【完整C语言代码】

main.c:

/* 参考资料:https://stackoverflow.com/questions/43768291/how-to-get-correct-background-and-control-colors-in-property-pages */
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <WindowsX.h>
#include <CommCtrl.h>
#include <Uxtheme.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'\"")
#pragma comment(lib, "Uxtheme.lib")

#define COLOR_BLUE   RGB(0, 0, 255)
#define COLOR_RED    RGB(255, 0, 0)
#define COLOR_ORANGE RGB(255, 201, 14)
#define COLOR_GREEN  RGB(0, 255, 0)

COLORREF msg_color = COLOR_RED;
HFONT big_font;
HINSTANCE main_instance;
HWND main_dlg;

/* 获取指定选项卡的对话框窗口 */
HWND get_tab_page(int index)
{
	HWND tabctrl;
	TCITEM item;

	tabctrl = GetDlgItem(main_dlg, IDC_TAB1);
	item.mask = TCIF_PARAM;
	TabCtrl_GetItem(tabctrl, index, &item);
	return (HWND)item.lParam;
}

/* 修改文本内容和颜色 */
void change_static2_text(const char *str, COLORREF color)
{
	HWND page;

	page = get_tab_page(0);
	msg_color = color;
	SetDlgItemTextA(page, IDC_STATIC2, str);
}

/* 在下拉菜单框中显示串口列表 */
int display_comm_ports(HWND combobox)
{
	char name[50];
	char value[50];
	DWORD index, type, namelen, valuelen;
	HKEY key;
	LSTATUS status;

	ComboBox_ResetContent(combobox);
	status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_READ, &key);
	if (status != ERROR_SUCCESS)
		return -1;

	index = 0;
	while (1)
	{
		namelen = sizeof(name);
		valuelen = sizeof(value);
		status = RegEnumValueA(key, index, name, &namelen, NULL, &type, (LPBYTE)value, &valuelen);
		if (status != ERROR_SUCCESS)
			break;
		SendMessageA(combobox, CB_ADDSTRING, 0, (LPARAM)value);
		index++;
	}
	if (index != 0)
		ComboBox_SetCurSel(combobox, 0);

	RegCloseKey(key);
	return 0;
}

/* 选项卡1消息响应函数 */
INT_PTR CALLBACK page1_proc(HWND hdlg, UINT umsg, WPARAM wparam, LPARAM lparam)
{
	int id;

	switch (umsg)
	{
	case WM_COMMAND:
		id = LOWORD(wparam);
		switch (id)
		{
		case IDOK:
			// 点击“连接”按钮后执行的代码
			EnableWindow((HWND)lparam, FALSE);
			SetWindowTextA((HWND)lparam, "已连接");
			EnableWindow(GetDlgItem(hdlg, IDC_COMBO1), FALSE);
			EnableWindow(GetDlgItem(hdlg, IDC_RADIO1), FALSE);
			EnableWindow(GetDlgItem(hdlg, IDC_RADIO2), FALSE);
			change_static2_text("连接成功", COLOR_GREEN);
			break;
		case IDC_CHECK1:
			if (Button_GetCheck((HWND)lparam))
				EnableWindow(GetDlgItem(hdlg, IDC_EDIT1), TRUE);
			else
				EnableWindow(GetDlgItem(hdlg, IDC_EDIT1), FALSE);
			break;
		case IDC_CHECK2:
			if (Button_GetCheck((HWND)lparam))
			{
				EnableWindow(GetDlgItem(hdlg, IDC_EDIT2), TRUE);
				EnableWindow(GetDlgItem(hdlg, IDC_SPIN1), TRUE);
			}
			else
			{
				EnableWindow(GetDlgItem(hdlg, IDC_EDIT2), FALSE);
				EnableWindow(GetDlgItem(hdlg, IDC_SPIN1), FALSE);
			}
			break;
		}
		break;
	case WM_CTLCOLORSTATIC:
		// 设置文本颜色
		id = GetDlgCtrlID((HWND)lparam);
		if (id == IDC_STATIC2)
			SetTextColor((HDC)wparam, msg_color);
		break;
	case WM_INITDIALOG:
		EnableThemeDialogTexture(hdlg, ETDT_ENABLETAB); // 删除选项卡灰色背景

		display_comm_ports(GetDlgItem(hdlg, IDC_COMBO1)); // 在下拉菜单框中显示串口列表
		Button_SetCheck(GetDlgItem(hdlg, IDC_RADIO1), BST_CHECKED); // 选中第一个单选框
		SendDlgItemMessage(hdlg, IDC_STATIC2, WM_SETFONT, (WPARAM)big_font, TRUE); // 设置文本字体

		SendDlgItemMessage(hdlg, IDC_SPIN1, UDM_SETRANGE, 0, MAKELPARAM(100, 0)); // 设置数值上下调整框的调整范围
		SendDlgItemMessage(hdlg, IDC_SPIN1, UDM_SETPOS, 0, 25); // 设置数值上下调整框的当前值为25 (倒数第二个参数没有作用, 一般设置为0)
		break;
	}
	return 0;
}

/* 选项卡2消息响应函数 */
INT_PTR CALLBACK page2_proc(HWND hdlg, UINT umsg, WPARAM wparam, LPARAM lparam)
{
	char name[50];
	int i;
	HICON icon;
	HIMAGELIST imglist;
	HWND list_wnd;
	LVITEMA lvi;

	switch (umsg)
	{
	case WM_INITDIALOG:
		EnableThemeDialogTexture(hdlg, ETDT_ENABLETAB); // 删除选项卡灰色背景

		list_wnd = GetDlgItem(hdlg, IDC_LIST1);
		ListView_SetExtendedListViewStyle(list_wnd, LVS_EX_DOUBLEBUFFER); // 使用蓝色半透明选择框
		
		// 创建图像列表
		imglist = ImageList_Create(32, 32, ILC_COLOR24, 1, 1);
		ListView_SetImageList(list_wnd, imglist, LVSIL_NORMAL); // 绑定图像列表(绑定后,关闭窗口时会自动删除图像列表)
		icon = LoadImage(main_instance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR); // 加载图标
		ImageList_AddIcon(imglist, icon); // 将图标复制到图像列表中(注意是复制,不是绑定)
		DestroyIcon(icon); // 复制完后要删除刚才加载的图标

		// 添加显示项目
		for (i = 0; i < 50; i++)
		{
			lvi.mask = LVIF_IMAGE | LVIF_TEXT;
			lvi.iItem = i; // 行号
			lvi.iSubItem = 0; // 列号
			_snprintf_s(name, sizeof(name), sizeof(name) - 1, "测试项目%02d", i + 1); // 第三个参数MaxCount是字符数,不包括'\0',所以必须减1
			lvi.pszText = name; // 名称
			lvi.iImage = 0; // 使用的图标序号
			lvi.iItem = (int)SendMessage(list_wnd, LVM_INSERTITEMA, 0, (LPARAM)&lvi); // 返回值为排序后的行号 (若启用了自动排序功能的话)
		}
		break;
	}
	return 0;
}

/* 加载字体 */
void create_font()
{
	LOGFONTA font = {0};

	font.lfCharSet = DEFAULT_CHARSET;
	strcpy_s(font.lfFaceName, sizeof(font.lfFaceName), "Times New Roman");
	font.lfHeight = 24;
	font.lfWeight = FW_BOLD;
	big_font = CreateFontIndirectA(&font);
}

/* 删除字体 */
void delete_font()
{
	DeleteObject(big_font);
}

/* 初始化选项卡控件 */
void init_tabs()
{
	char *titles[2] = {"第一个选项卡", "第二个选项卡"};
	int pages[2] = {IDD_DIALOG1, IDD_DIALOG2};
	DLGPROC procs[2] = {page1_proc, page2_proc};

	int i;
	HWND tabctrl, page;
	RECT rect;
	TCITEMA item;
	UINT flags;
	
	tabctrl = GetDlgItem(main_dlg, IDC_TAB1);
	for (i = 0; i < _countof(pages); i++)
	{
		item.mask = TCIF_TEXT;
		item.pszText = titles[i];
		SendMessage(tabctrl, TCM_INSERTITEMA, i, (LPARAM)&item);
	}

	GetClientRect(tabctrl, &rect);
	TabCtrl_AdjustRect(tabctrl, FALSE, &rect);
	for (i = 0; i < _countof(pages); i++)
	{
		page = CreateDialog(main_instance, MAKEINTRESOURCE(pages[i]), tabctrl, procs[i]);
		flags = (i == 0) ? SWP_SHOWWINDOW : 0;
		SetWindowPos(page, NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, flags);

		item.mask = TCIF_PARAM;
		item.lParam = (LPARAM)page;
		TabCtrl_SetItem(tabctrl, i, &item);
	}
}

/* 切换选项卡 */
void switch_tab()
{
	int i, n, curr;
	HWND tabctrl;
	TCITEM item;
	
	tabctrl = GetDlgItem(main_dlg, IDC_TAB1);
	n = TabCtrl_GetItemCount(tabctrl);
	curr = TabCtrl_GetCurSel(tabctrl);
	for (i = 0; i < n; i++)
	{
		item.mask = TCIF_PARAM;
		TabCtrl_GetItem(tabctrl, i, &item);
		if (i == curr)
			ShowWindow((HWND)item.lParam, SW_SHOW);
		else
			ShowWindow((HWND)item.lParam, SW_HIDE);
	}
}

/* 主对话框(仅包含选项卡控件)消息响应函数 */
INT_PTR CALLBACK tabbox_proc(HWND hdlg, UINT umsg, WPARAM wparam, LPARAM lparam)
{
	int id;
	LPNMHDR lpnmhdr;

	switch (umsg)
	{
	case WM_COMMAND:
		id = LOWORD(wparam);
		switch (id)
		{
		case IDCANCEL:
			EndDialog(hdlg, 0);
			main_dlg = NULL;
			delete_font();
			break;
		}
		break;
	case WM_INITDIALOG:
		main_dlg = hdlg;
		lparam = (LPARAM)LoadImage(main_instance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
		SendMessage(hdlg, WM_SETICON, ICON_BIG, lparam);
		lparam = (LPARAM)LoadImage(main_instance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
		SendMessage(hdlg, WM_SETICON, ICON_SMALL, lparam);

		create_font();
		init_tabs();
		break;
	case WM_NOTIFY:
		lpnmhdr = (LPNMHDR)lparam;
		switch (lpnmhdr->code)
		{
		case TCN_SELCHANGE:
			switch_tab();
			break;
		}
		break;
	}
	return 0;
}

/* 主函数 */
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
	LRESULT ret;

	main_instance = hInstance;
	InitCommonControls();

	ret = DialogBox(hInstance, MAKEINTRESOURCE(IDD_TABBOX), NULL, tabbox_proc);
	return (int)ret;
}

resource.h:

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by remove_tab_page_background.rc
//
#define IDI_ICON1                       101
#define IDD_DIALOG1                     102
#define IDD_DIALOG2                     103
#define IDD_TABBOX                      104
#define IDC_COMBO1                      1001
#define IDC_RADIO1                      1002
#define IDC_RADIO2                      1003
#define IDC_STATIC2                     1004
#define IDC_CHECK1                      1005
#define IDC_EDIT1                       1006
#define IDC_CHECK2                      1007
#define IDC_EDIT2                       1008
#define IDC_SPIN1                       1009
#define IDC_LIST1                       1010
#define IDC_TAB1                        1011

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        105
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1012
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

remove_tab_page_background.rc:

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/
#undef APSTUDIO_READONLY_SYMBOLS

/
// 中文(简体,中国) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

#ifdef APSTUDIO_INVOKED
/
//
// TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1               ICON                    "icon1.ico"

/
//
// Dialog
//

IDD_DIALOG1 DIALOGEX 0, 0, 354, 138
STYLE DS_SETFONT | WS_CHILD | WS_SYSMENU
FONT 9, "新宋体", 400, 0, 0x0
BEGIN
    LTEXT           "串口号: ",IDC_STATIC,14,18,33,8
    COMBOBOX        IDC_COMBO1,52,15,81,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
    DEFPUSHBUTTON   "连接",IDOK,137,15,50,14
    CTEXT           "未连接串口",IDC_STATIC2,197,14,139,37,SS_CENTERIMAGE | SS_SUNKEN
    CONTROL         "模式1",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,52,39,36,10
    CONTROL         "模式2",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,105,39,36,10
    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,63,340,1
    CONTROL         "电池电压",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,115,81,48,10
    EDITTEXT        IDC_EDIT1,170,79,67,14,ES_AUTOHSCROLL | WS_DISABLED
    LTEXT           "V",IDC_STATIC,242,82,8,8
    CONTROL         "温度",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,115,105,32,10
    EDITTEXT        IDC_EDIT2,170,103,40,14,ES_AUTOHSCROLL | WS_DISABLED
    CONTROL         "",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | WS_DISABLED,263,103,11,14
    LTEXT           "℃",IDC_STATIC,214,106,15,8
END

IDD_DIALOG2 DIALOGEX 0, 0, 354, 138
STYLE DS_SETFONT | WS_CHILD | WS_SYSMENU
FONT 9, "新宋体", 400, 0, 0x0
BEGIN
    CONTROL         "",IDC_LIST1,"SysListView32",WS_BORDER | WS_TABSTOP,7,7,338,121
END

IDD_TABBOX DIALOGEX 0, 0, 374, 166
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "移除选项卡灰色背景"
FONT 9, "新宋体", 400, 0, 0x0
BEGIN
    CONTROL         "",IDC_TAB1,"SysTabControl32",0x0,7,7,360,152
END


/
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    IDD_DIALOG1, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 347
        TOPMARGIN, 7
    END

    IDD_DIALOG2, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 345
        TOPMARGIN, 7
    END

    IDD_TABBOX, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 309
        TOPMARGIN, 7
    END
END
#endif    // APSTUDIO_INVOKED

#endif    // 中文(简体,中国) resources
/



#ifndef APSTUDIO_INVOKED
/
//
// Generated from the TEXTINCLUDE 3 resource.
//


/
#endif    // not APSTUDIO_INVOKED

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git本地仓库的搭建与使用

目录 一、前言 二、Linux下搭建 git 仓库 三、Windows下搭建 git 仓库 一、前言 做项目时&#xff0c;我们常常需要将自己的代码进行托管&#xff0c;但有时候 Github 的速度属实叫人流泪。有的人会选择 Gitee 等进行托管代码&#xff0c;这当然是可以的。那如果没有其他代码…

linux使用chattr与lsattr设置文件/目录防串改

背景 linux服务器下,防止某个文件/目录被串改(增删改),可以使用chattr与lsattr设置,这是一种保护机制,用于防止意外地修改或删除重要的文件内容。 chattr与lsattr使用 1.设置目录 图中/tmp/zhk,设置目录属性文件可能被设置为不可更改(immutable)或者只追加(append …

java Web学习笔记(一)

1. 前置学习知识 JavaScript学习笔记 CSS3学习笔记 html学习笔记 2. Tomcat介绍 前端App的运行环境&#xff1a; 服务器 --> JRE --> Tomcat --> App Tomcat目录文件介绍 bin:该目录下存放的是二进制可执行文件&#xff0c;如果是安装版&#xff0c;那么这个目…

leetcode判断二分图

判断二分图 图的问题肯定要用到深度优先遍历或者广度优先遍历&#xff0c;但又不是单纯的深度优先遍历算法和广度优先遍历算法&#xff0c;而是需要在遍历的过程中加入与解决题目相关的逻辑。 题干中说了&#xff0c;这个图可能不是连通图&#xff0c;这个提示有什么作用呢&a…

【状态估计】非线性非高斯系统的状态估计——离散时间的批量估计

上一篇文章介绍了离散时间的递归估计&#xff0c;本文着重介绍离散时间的批量估计。 上一篇位置&#xff1a;【状态估计】非线性非高斯系统的状态估计——离散时间的递归估计。 离散时间的批量估计问题 最大后验估计 目标函数 利用高斯-牛顿法来解决估计问题的非线性版本&a…

了解Adam和RMSprop优化算法

优化算法是机器学习和深度学习模型训练中至关重要的部分。本文将详细介绍Adam&#xff08;Adaptive Moment Estimation&#xff09;和RMSprop&#xff08;Root Mean Square Propagation&#xff09;这两种常用的优化算法&#xff0c;包括它们的原理、公式和具体代码示例。 RMS…

Studying-代码随想录训练营day34| 62.不同路径、63.不同路径II、343.整数拆分、96.不同的二叉搜索树

第34天&#xff0c;动态规划part02&#xff0c;牢记五部曲步骤&#xff0c;编程语言&#xff1a;C 目录 62.不同路径 63.不同路径II 343.整数拆分 96.不同的二叉搜索树 总结 62.不同路径 文档讲解&#xff1a;代码随想录不同路径 视频讲解&#xff1a;手撕不同路径 题目…

AI赋能,全面筑牢防线:重点非煤矿山重大灾害风险防控系统探析

一、背景需求 随着工业化和现代化的快速发展&#xff0c;非煤矿山作为重要的资源开采基地&#xff0c;其安全生产问题日益受到社会各界的广泛关注。非煤矿山在开采过程中&#xff0c;面临着诸多重大灾害风险&#xff0c;如滑坡、坍塌、水害、火灾等&#xff0c;这些灾害一旦发…

C基础day7

一、思维导图 二、课后练习 1、提示并输入一个字符串&#xff0c;统计该字符串中字母、数字、空格以及其他字符的个数 #include<myhead.h> #define M 20 int main(int argc, const char *argv[]) {int sum_a0,sum_b0,sum_c0,sum_d0;char str[M];printf("please en…

用流式数据库解决「自动化检测服务器性能异常」难题

对 DevOps 团队来说&#xff0c;检测大量服务器的性能异常并尽快响应一直是个挑战。他们设置了各种指标来监控服务器性能&#xff0c;但诊断性能问题复杂且耗时&#xff0c;因为诊断数据的量可能非常大。越来越多的人认为这个过程应该自动化。但怎么做呢&#xff1f; 流式系统…

Chromium编译指南2024 Linux篇-同步Chromium第三方库(四)

1.引言 在成功拉取Chromium源码并创建新分支后&#xff0c;我们需要进一步配置开发环境。这包括拉取必要的第三方库以及设置hooks&#xff0c;以确保我们能够顺利进行编译和开发工作。以下步骤将详细介绍如何进行这些配置。 2.拉取第三方库以及hooks Chromium 使用了大量的第…

2024年7月1日,公布的OpenSSH的漏洞【CVE-2024-6387】

目录 ■概要 ■概要&#xff08;日语&#xff09; ■相关知识 openssh 和 ssh 有区别吗 如何查看 openssh的版本 漏洞描述 glibc Linux是什么 如何查看系统是不是基于 Gibc RHEL Linux 是基于Glibc的Linux吗 还有哪些 Linux版本是基于 GNU C库&#xff08;glibc&…

opencv读取视频文件夹内视频的名字_时长_帧率_分辨率写入excel-cnblog

看视频的时候有的视频文件名贼长。想要翻看&#xff0c;在文件夹里根本显示不出来&#xff0c;缩短又会丢失一些信息&#xff0c;所以我写了一份Python代码&#xff0c;直接获取视频的名字&#xff0c;时长&#xff0c;帧率&#xff0c;还有分辨率写到excel里。 实际效果如下图…

【2024——CUMCM】Matlab快速入门

目录 常识 disp and input 字符串合并 sum 提取矩阵指定位置的元素 指定行列 指定行or指定列&#xff08;返回行/列向量&#xff09; 指定某些行 指定全部元素&#xff0c;按列拼接 size repmat 矩阵的运算 基本运算 形状相同的矩阵运算 每个元素同时和常数相乘或相…

gitee及git的简单使用、下载教(保姆级教程)

前言&#xff1a; GitHub&#xff0c;一个由外国研发的代码开源网站&#xff0c;我们可以通过它获得别人优秀的项目源码&#xff0c;也可以在上面上传自己的劳动成果。但是&#xff0c;我们很难访问外网。于是&#xff0c;我们将目光转向国内一个类似的网站---码云&#xff08…

基于jeecgboot-vue3的Flowable流程-集成仿钉钉流程(四)支持json和xml的显示

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、相应的界面前端代码 <template><div class"formDesign"><FlowDesign :process"process" :fields"fields" :readOnly"readOnly&quo…

OR-3H7-4晶体管光耦,可对标替代TLP281-4等

提供隔离反馈 逻辑电路之间的接口 提供1通道和4通道 电平转换 DC和AC输入 SMPS中的调节反馈电路 消除接地环路 特征 电流传输比&#xff1a;IF 1mA&#xff0c;VCE 5V&#xff0c;Ta 25 C时最小50% 高输入输出隔离电压。&#xff08;VISO3&#xff0c;750Vrms&#xf…

MySQL GROUP_CONCAT 函数详解与实战应用

提示&#xff1a;在需要将多个值组合成一个列表时&#xff0c;GROUP_CONCAT() 函数为 MySQL 提供了一种强大的方式来处理数据 文章目录 前言什么是 GROUP_CONCAT()基本语法 示例使用 GROUP_CONCAT()去除重复值排序结果 前言 提示&#xff1a;这里可以添加本文要记录的大概内容…

16:9横屏短视频素材库有哪些?横屏短视频素材网站分享

在这个视觉内容至关重要的时代&#xff0c;16:9横屏视频因其宽广的画面和优越的观赏体验&#xff0c;已经成为无数创作者和营销专家的首选格式。但要创造出吸引人的横屏视频&#xff0c;高质量的视频素材库是不可或缺的。不管你是资深视频制作人还是刚入行的新手&#xff0c;下…

Proteus + Keil单片机仿真教程(五)多位LED数码管的静态显示

Proteus + Keil单片机仿真教程(五)多位LED数码管 上一章节讲解了单个数码管的静态和动态显示,这一章节将对多个数码管的静态显示进行学习,本章节主要难点: 1.锁存器的理解和使用; 2.多个数码管的接线封装方式; 3.Proteus 快速接头的使用。 第一个多位数码管示例 元件…