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

news2024/11/16 13:39:08

一般情况下,我们是用不带边框的对话框来充当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.coloradmin.cn/o/1911912.html

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

相关文章

C++相关概念和易错语法(17)(适配器模式、仿函数)

1.stack和queue stack和queue的相关接口如下&#xff1a; stack queue 我们发现不管是stack还是queue&#xff0c;它们都有push和pop&#xff0c;不区分push_back和push_front&#xff0c;这是由它们的入栈特定顺序特性决定的&#xff0c;并且它们都没有迭代器&#xff0c;st…

【系统架构设计】计算机组成与体系结构(一)

计算机组成与体系结构 计算机系统组成计算机硬件组成控制器运算器主存储器辅助存储器输入设备输出设备 计算机系统结构的分类存储程序的概念Flynn分类 复杂指令集系统与精简指令集系统总线 存储器系统流水线 兜兜转转&#xff0c;最后还是回到了4大件&#xff0c;补基础&#x…

【力扣】数组中的第K个最大元素

一、题目描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入: [3,2,1,5,…

图片像素坐标转实际坐标的一种转换方案

原图 红色的点是我们标注的像素点&#xff0c;这些红色的点我们知道它的像素坐标&#xff0c;以及以右下角相机位置为原点的x y 实际坐标数值 通过转换&#xff0c;可以得到整个图片内部其余像素点的实际坐标&#xff0c; 这些红色的点是通过转换关系生成的&#xff0c;每隔一米…

python破解密码·筛查和选择

破解密码时可能遇到的几种情况 ① 已知密码字符&#xff0c;破排序 ② 已知密码位数&#xff0c;破字符 ③ 已知密码类型&#xff0c;破字位 ④ 已知部分密码&#xff0c;破未知 ⑤ 啥都不知道&#xff0c;盲破&#xff0c;玩完 ⑥ 已知位数、字符、类型、部分密码中的几个&am…

2024全网最全面及最新且最为详细的网络安全技巧五 之 SSRF 漏洞EXP技巧,典例分析以及 如何修复 (下册)———— 作者:LJS

五.SSRF 漏洞EXP技巧&#xff0c;典例分析以及 如何修复 (下册) 目录 五.SSRF 漏洞EXP技巧&#xff0c;典例分析以及 如何修复 (下册) 5.4gopher 协议初探 0x01 Gopher协议 0x02 协议访问学习 复现环境 centos7 kali 2018 发送http get请求 发送http post请求 5.5 SSRF…

☺初识c++(语法篇)☺

目录 一命名空间&#xff08;namespace&#xff09;&#xff1a; 二cout与cin简述&#xff1a; 三缺省参数&#xff1a; 四函数重载&#xff1a; 五引用&#xff1a; 六内联函数: 七c中的nullptr简述&#xff1a; 一命名空间&#xff08;namespace&#xff09;&#xff1…

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

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

2024第六届上海国际新材料展览会-12月精彩呈现

2024第六届上海国际新材料展览会 The 6th shanghai International New Materials Exhibition in 2024 时 间&#xff1a;2024年12月18-20日 地 点&#xff1a;上海新国际博览中心 CIME 2024专业、权威&#xff0c;涵盖整个新材料行业的国际盛会。 期待与您在CIME 2024现场相…

24-7-9-读书笔记(九)-《爱与生的苦恼》[德]叔本华 [译]金玲

文章目录 《爱与生的苦恼》阅读笔记记录总结 《爱与生的苦恼》 《爱与生的苦恼》叔本华大佬的名书&#xff0c;里面有其“臭名昭著”的《论女人》&#xff0c;抛开这篇其他的还是挺不错的&#xff0c;哲学我也是一知半解&#xff0c;这里看得也凭喜好&#xff0c;这里记录一些自…

大模型/NLP/算法面试题总结2——transformer流程//多头//clip//对比学习//对比学习损失函数

用语言介绍一下Transformer的整体流程 1. 输入嵌入&#xff08;Input Embedding&#xff09; 输入序列&#xff08;如句子中的单词&#xff09;首先通过嵌入层转化为高维度的向量表示。嵌入层的输出是一个矩阵&#xff0c;每一行对应一个输入单词的嵌入向量。 2. 位置编码&…

Qt 创建的窗口一闪而过【已解决】

Qt 创建的窗口一闪而过 引言一、详细的解决方案 - 附代码二、参考博文 引言 创建的窗口一闪而过&#xff0c;就是创建完立马被销毁了&#xff0c;常见情况是在一个函数中创建窗口并show() - 即创建在了栈上&#xff0c;函数结束局部变量(窗口)自动被释放。主流的解决方法有两种…

(HAL)stm32f407+freertos通过usb驱动移远4G模块-EC600U

概述 本篇文章主要介绍: 如何使用STM32CubeMX创建stm32F407+freertos+usb host的基础工程。USB-HOST-CDC驱动运行过程。如何根据4G模块的具体信息修改usb相关代码。MCU如何通过usb与4G模块通信,收发数据。调试过程中遇到的问题以及解决办法。 整个过程中在网上搜罗了很多参考…

机场的出租车问题折线图

分析并可视化机场离场车辆数数据 本文将详细介绍如何使用Python的正则表达式库re和绘图库matplotlib对机场离场车辆数数据进行分析和可视化。以下是具体步骤和代码实现。 数据资源&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rU-PRhrVSXq-8YdR6obc6Q?pwd1234 提…

干货:高水平论文写作思路与方法

前言:Hello大家好,我是小哥谈。高水平论文的写作需要扎实的研究基础和严谨的思维方式。同时,良好的写作技巧和时间管理也是成功的关键。本篇文章转载自行业领域专家所写的一篇文章,希望大家阅读后可以能够有所收获。🌈 目录 🚀1.依托事实/证据,通过合理的逻辑,…

每日刷题(二分查找,匈牙利算法,逆序对)

目录 1.Sarumans Army 2.Catch That Cow 3.Drying 4.P3386 【模板】二分图最大匹配 5. Swap Dilemma 1.Sarumans Army 3069 -- Sarumans Army (poj.org) 这道题就是要求我们在给的的位置放入 palantir&#xff0c;每个 palantir有R大小的射程范围&#xff0c;要求求出最少…

C# Bitmap类型与Byte[]类型相互转化详解与示例

文章目录 一、Bitmap类型转Byte[]类型使用Bitmap类的Save方法使用Bitmap类的GetBytes方法 二、Byte[]类型转Bitmap类型使用MemoryStream将Byte[]数组转换为Bitmap对象使用System.Drawing.Imaging.BitmapImage类 总结 在C#编程中&#xff0c;Bitmap类型和Byte[]类型之间的相互转…

【刷题汇总 -- 求最小公倍数、数组中的最长连续子序列、字母收集】

C日常刷题积累 今日刷题汇总 - day0081、求最小公倍数1.1、题目1.2、思路1.3、程序实现 -- 穷举法1.2、程序实现 -- 辗转相除法 2、数组中的最长连续子序列2.1、题目2.2、思路2.3、程序实现 3、字母收集3.1、题目3.2、思路3.3、程序实现 4、题目链接 今日刷题汇总 - day008 1、…

01:简易的电动车防盗报警器

简易的电动车防盗报警器 1、震动传感器模块的使用2、使用震动传感器模块控制继电器开关3、433M无线发射接收模块的使用 需要材料&#xff1a; 1、51单片机 2、震动传感器模块 3、继电器模块 4、高功率喇叭 5、433M无线发射接收模块 6、弱干杜邦线 1、震动传感器模块的使用 接好…

13 - matlab m_map地学绘图工具基础函数 - 介绍创建管理颜色映射的函数m_colmap和轮廓图绘制颜色条的函数m_contfbar

13 - matlab m_map地学绘图工具基础函数 - 介绍创建管理颜色映射的函数m_colmap和轮廓图绘制颜色条的函数m_contfbar 0. 引言1. 关于m_colmap2. 关于m_contfbar3. 结语 0. 引言 本篇介绍下m_map中用于创建和管理颜色映射函数&#xff08;m_colmap&#xff09;和 为轮廓图绘制颜…