【Windows编程】windows窗口创建过程详解

news2025/7/18 23:18:25

文章目录

  • 前言
  • 1 应用程序的分类
  • 2 应用程序分类的对比
  • 3 编译工具
  • 4 windows库文件和头文件
  • 5 WinMain函数和MessageBox函数初始
  • 6 窗口类
  • 7 窗口类的分类
  • 8 注册窗口类函数
  • 9 注册窗口类的结构体
  • 10 注册全局和局部窗口类
  • 11 创建窗口的函数
  • 12 创建一个windows的过程步骤
  • 13 创建一个子窗口的方法
  • 14 消息的概念及其作用
  • 15 浅谈GetMessage 函数
  • 16 浅谈 TranslateMessage 函数
  • 17 使用消息
  • 18 消息循环的基本原理
  • 19 发送消息
  • 20 消息的分类
  • 21 消息队列
  • 22 消息队列分类
  • 23 消息和消息队列的关系
  • 24 GetMessage函数内部执行过程

前言

搞windows开发,必须熟悉vs自己的开发工具,这会提高你的开发效率;我用的是vs2013;感觉不错;

1 应用程序的分类

在windows平台上大致有一下三类:

在这里插入图片描述


其中,dos程序本身没有窗口,其实它的意思是:控制台程序自己并不会创建窗口,而DOS窗口仅仅是dos程序本身向OS借过来的一个窗口,也就是说,dos窗口是OS创建的;

窗口程序:自己拥有窗口的意思就是你自己程序本身就是可以创建一个窗口,比如你的QQ界面啥的这样


2 应用程序分类的对比

在这里插入图片描述


注意:动态库不能虽然有入口函数,但是不能够独立的执行;


3 编译工具

在这里插入图片描述


其中rc.exe是转呗编译资源文件的,这是在windows独有的,一般我们的窗口资源,图片资源,菜单资源,画饼画刷等资源都是在资源文件中,然后也需要进行编译;最后链接到可执行文件里;

这些编译工具都是可以找到的,在你的开发工具VS的路径中:
我的就在这里,可能你们会有 12.0 是11.0 13.0等不一样的差别,并且我存放在C盘,你们要看开发环境在哪个盘了;

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin

在这里插入图片描述


4 windows库文件和头文件

windows的源码API是不公开的,只提供动态库让我们去使用,只要我们有windows的库文件头文件就可以使用windowsAPI函数了;
在这里插入图片描述


在这里插入图片描述


其实我们开发时候,使用windows.h头文件就可以直接调用windowsAPI,并不需要专门包含其他windef.h winbase.h 。。。。。等头文件;


5 WinMain函数和MessageBox函数初始

在这里插入图片描述


WinMain函数:windows编程时候的入口函数
hInstance :当前实例句柄,可以理解:可以找到一块内存的变量,找到哪块内存呢?找到你的进程那一块内存;
可能还有朋友理解不了,想一想WinMain函数被调用之前,是不是进程已经形成了?那从时间角度上来说,WinMain函数就可以被传参进程的内存信息了;这完全没有毛病;
第二个参数:被废弃;
第四个参数:就是窗口最大化,最下化,还是正常 显示;


MessageBox函数功能:就是弹出一个提示框;
第一个参数:父窗口句柄,也就是希望你的弹出窗口显示在哪个窗口的中呗;如果填NULL,表示弹出的窗口的父窗口是桌面;
与此同时:HWND是窗口句柄,作用就是找到一块内存,什么内存?就是存放窗口的数据结构的内存;窗口数据结构?是什么?就是你的窗口大小,颜色,背景,菜单等信息组成的数据结构咯;


6 窗口类


7 窗口类的分类

在这里插入图片描述


系统窗口类:OS创建的窗口就是系统窗口类;比如我们的dos窗口,比如我们的桌面;
在这里插入图片描述


如果你在win32项目中,要使用系统窗口类,直接调用CreateWindows函数就可以创建成功,不需要注册窗口类的步骤;
比如这里创建一个编辑框的窗口类:(连RegisterWindows函数都没有调用)

在这里插入图片描述


8 注册窗口类函数

在这里插入图片描述
该函数,失败返回0,可以用来检测是否注册窗口类成功,注册窗口类:说直白就是向OS写入一个变类型为WNDXLASS的结构体变量,并且初始化他而已;

9 注册窗口类的结构体

在这里插入图片描述


10 注册全局和局部窗口类

在这里插入图片描述


不建议用全局窗口类,微软官方手册说的;
CS_DBLCLKS:该参数如果没有,那么你的窗口无论点多块的双击都是两次单击;


11 创建窗口的函数

在这里插入图片描述


后缀有Ex的函数,和没有Ex的函数,区别就是Ex的函数多路第一个参数,但是这个参数没有实际的用途,所以也不必要关心;


先关注,第二个和倒数第二个参数:
第二个参数:表示注册窗口类的名称;
倒数第二个参数:表示该窗口和哪个进程相关联;
在这里插入图片描述


CreateWindow内部的执行过程:

在这里插入图片描述


在这里插入图片描述

一般来说:我们调用CreateWindow都是为了创建局部窗口了类:
大概执行步骤就是拿到传入的窗口类名字去内核查找窗口类名字是否匹配(内核的窗口类,是你提前注册好的);
找到就继续匹配,你传入的instance 局部是否匹配内核的instance, 如果匹配表示你的窗口就是创建在本进程;
成功后返回一个窗口句柄,供你使用;


12 创建一个windows的过程步骤

在这里插入图片描述


基本基本代码框架:

#include <Windows.h>

LRESULT CALLBACK WndPro(HWND hWnd,UINT msgID,WPARAM wParam,LPARAM lParam)
{
	switch (msgID)
	{
	case WM_DESTROY: //点击关闭按钮
		PostQuitMessage(0); //使得GetMessage返回0
		break;
	default:
		break;
	}
	return DefWindowProc(hWnd,msgID,wParam,lParam);
}
int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE pHinstance,LPSTR lpCmdLine,int nShowLine)
{
	//注册主窗口类
	WNDCLASS wc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wc.hCursor = NULL;						//默认光标
	wc.hIcon = NULL;						//默认图标 图标就是标题栏左上角那个东西
	wc.hInstance = hinstance;
	wc.lpfnWndProc = WndPro;				//窗口过程函数
	wc.lpszClassName = "WinBase";			//窗口类名字,随便起也行
	wc.lpszMenuName = NULL;					//无菜单
	wc.style = CS_HREDRAW | CS_VREDRAW;		//窗口垂直水平变化时候,窗口自动重画
	RegisterClass(&wc);						//向OS写入 wc变量


	// 在内存中创建一个窗口
	HWND hWnd = CreateWindow("WinBase", /*窗口的类名*/
		"Windows",						/*窗口标题*/
		WS_OVERLAPPEDWINDOW,			/*窗口样式*/
		100, 100, 100, 100,				/*窗口x,y,width,height*/
		NULL, NULL, hinstance, NULL);	/*父窗口:桌面 菜单:无 窗口是当前进程的 无附加参数*/
	//显示窗口
	ShowWindow(hWnd, SW_SHOW);			//SW_SHOW按原样显示,也就是说Create设置的参数
	//刷新窗口-->就是在此显示一次
	UpdateWindow(hWnd);
	//消息循环
	MSG msg;
	while(GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return 0;
}

TranslateMessage(&msg)的大致执行过程,当我们按下大写字母键盘a时候;

在这里插入图片描述


13 创建一个子窗口的方法

和创建一个Windows一样,只不过,需要一点区别:
首先肯定也要注册一个子窗口类,当然,这个类只要有一个就可以,一个窗口类是可以被创建为多个窗口的;也就是说,我们又一个子窗口类,就可以调用多次CreateWindow来进行创建窗口了;


对于CreateWindows函数。必要设置的参数是:
在这里插入图片描述


这是创建主窗口,和子窗口的基本框架:

#include <Windows.h>

LRESULT CALLBACK WndPro(HWND hWnd,UINT msgID,WPARAM wParam,LPARAM lParam)
{
	switch (msgID)
	{
	case WM_DESTROY: //点击关闭按钮
		PostQuitMessage(0); //使得GetMessage返回0
		break;
	default:
		break;
	}
	return DefWindowProc(hWnd,msgID,wParam,lParam);
}
int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE pHinstance,LPSTR lpCmdLine,int nShowLine)
{
	//注册主窗口类
	WNDCLASS wc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wc.hCursor = NULL;						//默认光标
	wc.hIcon = NULL;						//默认图标 图标就是标题栏左上角那个东西
	wc.hInstance = hinstance;
	wc.lpfnWndProc = WndPro;				//窗口过程函数
	wc.lpszClassName = "WinBase";			//窗口类名字,随便起也行
	wc.lpszMenuName = NULL;					//无菜单
	wc.style = CS_HREDRAW | CS_VREDRAW;		//窗口垂直水平变化时候,窗口自动重画
	RegisterClass(&wc);						//向OS写入 wc变量

	//注册子窗口类
	WNDCLASS wc_child;
	wc_child.cbClsExtra = 0;
	wc_child.cbWndExtra = 0;
	wc_child.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wc_child.hCursor = NULL;						//默认光标
	wc_child.hIcon = NULL;						//默认图标 图标就是标题栏左上角那个东西
	wc_child.hInstance = hinstance;
	wc_child.lpfnWndProc = DefWindowProc;				//窗口过程函数
	wc_child.lpszClassName = "Child";			//窗口类名字,随便起也行
	wc_child.lpszMenuName = NULL;					//无菜单
	wc_child.style = CS_HREDRAW | CS_VREDRAW;		//窗口垂直水平变化时候,窗口自动重画
	RegisterClass(&wc_child);


	// 在内存中创建一个窗口
	HWND hWnd = CreateWindow("WinBase", /*窗口的类名*/
		"Windows",						/*窗口标题*/
		WS_OVERLAPPEDWINDOW,			/*窗口样式*/
		100, 100, 100, 100,				/*窗口x,y,width,height*/
		NULL, NULL, hinstance, NULL);	/*父窗口:桌面 菜单:无 窗口是当前进程的 无附加参数*/
	// 创建一个子窗口

	HWND hWnd_child = CreateWindow("Child",
		"child___",
		WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
		0, 0, 40, 40, hWnd, NULL, hinstance, NULL);

	//显示窗口
	ShowWindow(hWnd, SW_SHOW);			//SW_SHOW按原样显示,也就是说Create设置的参数
	//刷新窗口-->就是在此显示一次
	UpdateWindow(hWnd);
	//消息循环
	MSG msg;
	while(GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return 0;
}

重点关注这里:
其他样式方面可以按你的场景进行设计;


在这里插入图片描述


14 消息的概念及其作用

在这里插入图片描述


在Windows下的消息,其实就是一个结构体信息而已,里面包含了上面PPT的一些成员,组成了一个消息;
在这里插入图片描述


注意每个窗口都对应一个窗口处理函数:也就是说,每当你调用一个CreateWindow都会对应一个窗口处理函数;
但是多个窗口是可以复用一个窗口处理函数的;


要理解:消息是你应用程序产生的,然后由你操作系统抓到,并把它放入消息队列,再由GetMessage从中取出消息,交给DispatchMessage函数进行派发给窗口处理函数进行处理(这个过程就是OS拿到你的消息,找到你对应的处理消息的函数,进行处理,这里使用的机制就是回调函数的机制,DispatchMessage内部就是回调了你窗口过程函数);


如DispatchMessage大致的工作流程:
拿到你的消息,就可以拿到你的窗口句柄,又知道每个窗口句柄对应一个窗口处理函数,自然而然,可以找到你的消息对应窗口处理函数进行调用处理消息;
并且你发现,在函数内部调用你的窗口处理函数进行传参的四个参数,也就是说我们MSG结构体的前4个成员变量,所以说,我们只要有了消息,就可以进行消息处理是完全没有问题的;
在这里插入图片描述


在这里插入图片描述


所以我们要清楚,当消息产生是要要关注消息是哪个窗口产生的,产生的消息是什么,产生的消息交给谁去处理;


15 浅谈GetMessage 函数

函数:该函数获取本进程消息队列中的消息;
在这里插入图片描述


第二个参数:指定为NULL,抓取本进程所有窗口的消息,如果为指定句柄,那么他只会抓取该句柄的消息;
返回值:该函数的返回值,只有在GetMessage抓到一个WM_QUIT消息时候,才会返回0;这个消息是PostQuitMessage(0) 函数调用发出的;


16 浅谈 TranslateMessage 函数

在这里插入图片描述


该函数只会翻译键盘消息,并且翻译可见字符消息,也就是在ASCII表中可见字符,比如字母和数字等;如果不是可见字符的按键消息那么就不会做任何事情;


17 使用消息

在微软中,提供了大概有1000多个消息,我们可以直接拿来用;使用消息时候,需要关注三点:
消息的产生时间;
消息的附带两个参数,告知的信息;
消息的一般用法;


使用消息时候,并不是使用消息的变量去使用,而是使用消息的ID去使用;
也就是说,不是直接去用MSG定义变量使用消息,而是用我们的MSG里面的一个messageID 去使用;


WM_DESTROY 消息:
请注意:这个消息并不是你鼠标点击右上角那个叉叉才产生的,而是窗口被销毁前系统自动把你产生的一个消息哦;
在这里插入图片描述


WM_SYSCOMMND:
点击菜单框都会产生,包括你的边界滚动条,所以一般这个消息在处理的时候,还要通过WParam参数进行判断你按的位置是哪个地方,比如wParam == SC_CLOSE 表示你按的是 关闭按钮,那么你就可以对其进行处理,假如你按的是其他菜单的其他位置你就可以不处理;
在这里插入图片描述


在这里插入图片描述


该消息是自己发送,调用PostQuitMessage发送,并且该消息不用自己处理,让系统处理;


其实消息种类太多,无法一一说明,这里只是举例,需要还是自己查手册啊;


18 消息循环的基本原理

在这里插入图片描述


GetMessage是个阻塞函数,如果没有抓不到消息,那么就阻塞,如果抓到消息就返回;
阻塞可不是一个好习惯;所以我们经常需要配合非阻塞函数PeekMessage来使用;


对比:阻塞和非阻塞的写法:

// 主消息循环: 阻塞
	while (GetMessage(&msg, NULL, 0, 0))
	{	
			TranslateMessage(&msg);
			DispatchMessage(&msg);
	}
	/****************************************************************/
	/****************************************************************/
	/****************************************************************/
	// 主消息循环: 非阻塞
	while (1)
	{
		if (!PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
		{
			//没有消息,空闲处理
		}
		else
		{
			//有消息
			if (!GetMessage(&msg, NULL, 0, 0))
			{
				return 0;
			}
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

19 发送消息

我们知道,GetMessage可以从消息队列中抓消息进行处理
在这里插入图片描述


但是我们并不知道,消息到底是谁发送的;


在这里插入图片描述


首先得明白,不管是系统发的消息,还是程序员自己手动发的消息,在windows中发送消息,只能由这两个函数进行发送;
SendMessage: 阻塞函数,发送消息,消息没被处理完都不会返回;
PostMessage: 非阻塞函数;
我们自己只需要拿到消息的四个参数信息即可使用该两个函数,但是我们知道消息的信息是有6个成员信息组成,其实该函数内部会自己通过一些方式拿到剩余的两个信息:也就是说消息的坐标,消息的时间;我们不关心这两个消息;
我们要知道,PostMessage函数,发送消息,直接发送到消息队列中的,而SendMessage并不是直接发送消息到消息队列,至于发到哪?后面会讲到;


20 消息的分类

在这里插入图片描述


自定义消息的基本使用步骤:

在这里插入图片描述


21 消息队列

在这里插入图片描述


22 消息队列分类

在这里插入图片描述
系统的消息队列:保存所有进程产生的消息,该消息队列很大:
消息的产生首先交由给系统的消息队列,再由OS每隔一段时间将消息转发到各个进程的消息队列中;
GetMessage只会抓取本进程的消息;
在这里插入图片描述


23 消息和消息队列的关系

在这里插入图片描述


队列消息:消息进队列;
非队列消息:消息不进队列;
在这里插入图片描述


有些消息必须进队列,如WM_QUIT,因为GetMessage要返回,必须在队列抓到该消息;有些消息必须不进队列,如WM_CREATE,因为该消息,在窗口处理函数之前就会产生;
有些消息可进可不进,如WM_SIZE;


24 GetMessage函数内部执行过程

在这里插入图片描述

  1. GetMessage 是阻塞函数,GetMessage 只会从进程还是线程中消息队列获取消息;
  2. 该函数若发现消息队列无消息,就会询问系统的消息队列是否有消息;如果有系统就会吧消息刷新到本进程的消息队列中;
  3. 如果本进程消息队列无消息,系统队列无消息,没有绘图消息,没有定时器消息,没有整理资源,释放内存,那么GetMessage就会阻塞;PeekMessage干的事和GetMessage一样,区别就是最后一个步骤他不会阻塞;

WI_PAINT消息:在窗口从0到1被创建前,系统会发送一个消息,且该消息不进消息队列,直接调用窗口处理函数;


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

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

相关文章

C语言文件操作——打开 关闭 顺序读写 随机读写

1.文件的打开和关闭 1.1 文件指针 在打开一个文件的时候&#xff0c;会创建一个文件信息区&#xff0c;而文件指针指向的内容就是文件信息区。 文件信息区中存储的到底是什么内容的&#xff0c;我们可以在VS2013中查看一下文件信息区的内容(不同编译器下有所差异)。 struct …

shell脚本的条件判断2:文件属性的判断与比较

一 文件属性的判断与比较 Shell支持大量对文件属性的判断&#xff0c;常用的文件属性操作符很多&#xff0c;如下表所示。更多文件属性操作符可以参考命令帮助手册&#xff08;man test&#xff09;。 二 实例 实例&#xff1a;文件和目录判断 可以创建新的文件&#xff0c;…

属性值最大长度为30个字符(15个汉字)

上图是一位做成人用品店主反馈的问题&#xff0c;查看发过来的错误列表后&#xff0c;发现这份错误列表主要是有两个问题&#xff1a;一、属性值最大长度为30个字符(15个汉字)&#xff1b;二、手机端宝贝描述中每张图片的宽要在480到1500之间&#xff0c;最大高度为2500, 以下图…

深度学习之路=====11=====>>ShuffleNet(tensorflow2)

简介 来源&#xff1a;CVPR2017 作者&#xff1a;张祥雨&#xff0c;西安交通大学本硕博&#xff0c;原微软亚洲研究院研究员 特点 逐点分组卷积&#xff08;pointwise group conv)&#xff1a;使用了kernel_size1的分组卷积&#xff0c;大大降低模型参数量和计算量深度卷积…

阅读书《电子电路原理》截取的一些最核心的思想,找了个课程上海交通大学 郑益慧主讲做辅助(保证基本的理解是对的)。电路要以基本特性为基础从设计角度理解

一、戴维南 和 诺顿 物理量 过程戴维南等效诺顿等效步骤 l将负载电阻开路将负载电阻短路步骤 2计算或测量开路电 压&#xff0c; 即戴维南电压计算或测量短路电流&#xff0c;即诺顿电流步骤 3将电压源短路&#xff0c;电流源开路将电压源短路&#xff0c;电流源开路&#xff…

学生网页课程设计期末作业 HTML+CSS+JavaScript甜品蛋糕网页设计(5页)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

如何使用 Nginx 部署 React App 到 linux server

油鹳视频&#xff1a;How To Deploy A React App - Using NGINX & Linux https://www.youtube.com/watch?vKFwFDZpEzXY&t547s 1. 获得一个 linux server 方法很多种&#xff0c;例如 aws EC2 , 阿里云 ECS &#xff0c; linode 等 2. 登录远程服务器并设置服务器 命…

二十八、CANdelaStudio实践-10服务(SessionControl)

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍10服务(DiagnosticSessionControl)的查看与编辑,欢迎…

看我如何连夜自建网站背刺我的求职对手们

摘要&#xff1a;在竞争如此激烈的当下&#xff0c;作为一名IT新人&#xff0c;怎么才能让HR眼前一亮&#xff0c;从万千简历中脱颖而出成为最亮的那个崽呢&#xff1f;本文分享自华为云社区《【一行代码秒上云】连夜自建网站背刺我的求职对手们 &#xff01;》&#xff0c;作者…

红队隧道加密之OpenSSL加密反弹Shell(一)

前言 在红队的后渗透阶段中, 往往需要反弹shell进行下一步的内网横向渗透, 而这种反弹shell大多数都有一个缺点, 那就是其传输的流量都是明文传输, 相当容易被内网的防火软件所捕捉, 要是蓝队对此流量进行朔源分析, 很容易就能复现攻击的整个流程 例如此处用netcat反弹Shell进…

十、CANdelaStudio入门-States

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的States概念,欢迎各位朋友订阅、评论,可…

AcWing245. 你能回答这些问题吗 线段树详解

3.2线段树 例题分析 245. 你能回答这些问题吗 - AcWing题库 **题意&#xff1a;**给一条序列&#xff0c;如何动态维护区间的最大子段和&#xff0c;包括询问某区间的最大字段和和修改某个数。 分析&#xff1a;线段树struct保留什么信息。能否通过左右儿子的这些信息求出父…

HA RabbitMQ on K8s helm部署实战

RabbitMQ on K8s helm部署实战获取helm chart修改必要参数外部如何访问&#xff1f;安装rabbitmq登录管理界面导入mq metadata优化helm chart 生成的statefuleset yamlhelm chart 生成的pod yaml调整mq log等级promethrus 监控mq配置prometheus采集metrics查看prometheus rabbi…

零基础借助arpl自动编译工具在一小时之内将旧笔记本、嵌入式设备等改造成黑群辉

文章目录1. 前言2. 编译2.1. 到GitHub把编译引导需要用的img文件下载到电脑上2.2. 将下载下来的IMG文件解压为img文件&#xff0c;用rufus或者其他写盘工具写入到U盘中&#xff0c;2.3. 进行引导启动2.4. 获得编译系统的IP地址2.5. 在同一局域网下&#xff0c;打开这个IP地址2.…

Java学习笔记 --- IO流

一、文件 什么是文件 文件是保存数据的地方 文件流 文件在程序中是以流的形式来操作的 流&#xff1a;数据在数据源&#xff08;文件&#xff09;和程序&#xff08;内存&#xff09;之间经历的路径 输入流&#xff1a;数据从数据源&#xff08;文件&#xff09;到程序&a…

Pr:文本面板之转录文本

Pr菜单&#xff1a;窗口/文本Text在文本面板的转录文本 Transcript选项卡中&#xff0c;单击“转录序列” Transcribe sequence按钮&#xff0c;然后设置好选项并进行语音到文本的转录。创建转录文本对话框Create transcript语言Language选择视频中语音所使用的语言。也可选择不…

2.7 基本放大电路的派生电路

在实际应用中&#xff0c;为了进一步改善放大电路的性能&#xff0c;可用多只晶体管构成复合管来取代基本电路中的一只晶体管&#xff1b;也可根据需要将两种基本接法组合起来&#xff0c;以得到多方面性能俱佳的放大电路。 一、复合管放大电路 1、复合管 &#xff08;1&…

【路径规划】(1) Dijkstra 算法求解最短路,附python完整代码

好久不见&#xff0c;我又回来了&#xff0c;这段时间把路径规划的一系列算法整理一下&#xff0c;感兴趣的点个关注。今天介绍一下机器人路径规划算法中最基础的 Dijkstra 算法&#xff0c;文末有 python 完整代码&#xff0c;那我们开始吧。 1. 算法介绍 1959 年&#xff0c…

Bugku MISC 啊哒 贝斯手

啊哒 下载文件&#xff0c;解压后发现是一张图片&#xff0c;用010editor打开 可以看到里面有个flag.txt 。使用kali中的binwalk进行文件分离 查看文件 &#xff1a; binwalk ada.jpg 分离文件 &#xff1a; binwalk -e ada.jpg --run-asroot 打开分离后的文件夹 可以看到有一…

T288401 B-莲子的机械动力学

专攻超统一物理学的莲子&#xff0c;对机械结构的运动颇有了解。如下图所示&#xff0c;是一个三进制加法计算器的&#xff08;超简化&#xff09;示意图。 一个四位的三进制整数&#xff0c;从低到高位&#xff0c;标为 x_1,x_2,x_3,x_4x1​,x2​,x3​,x4​。换言之&#xff0…