C++ Win32窗口编程中窗口风格(Window Styles)的使用经验与相关要点总结(附源码)

目录

1、WS_CHILD和WS_POPUP

2、WS_VISIBLE

3、WS_MINIMIZE和WM_MAXIMIZE

4、WS_MINIMIZEBOX和WS_MAXIMIZEBOX

5、WS_BORDER和WS_CAPTION

6、WS_THICKFRAME和WS_SIZEBOX

7、WS_SYSTEMMENU

8、WS_EX_APPWINDOW和WS_EX_TOOLWINDOW

9、WS_EX_TOPMOST

10、WS_EX_LAYEREDWINDOW

11、WS_EX_TRANSPARENT


C++软件异常排查从入门到精通系列教程(核心精品专栏,订阅量已达8000多个,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931C/C++实战专栏(重点专栏,专栏文章已更新500多篇,订阅量已达6000多个,欢迎订阅,持续更新中...)https://blog.csdn.net/chenlycly/article/details/140824370C++ 软件开发从入门到实战(重点专栏,专栏文章已更新300多篇,欢迎订阅,持续更新中...)https://blog.csdn.net/chenlycly/category_12695902.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_2276111.html最近项目中遇到了几个与窗口风格相关的UI界面问题,因未设置指定的窗口风格或者错误设置了某些窗口风格导致了窗口出现了一些bug。本文借此机会将窗口风格的使用经验与相关要点进行详细的总结,在此分享出来,给大家提供一些借鉴和参考。

本文讲解的内容基于Windows Win32界面窗口编程,会涉及到directui开源库duilib的一些内容。

1、WS_CHILD和WS_POPUP

WS_CHILD: The window is a child window. A window with this style cannot have a menu bar. This style cannot be used with the WS_POPUP style.
WS_POPUP: The window is a pop-up window. This style cannot be used with the WS_CHILD style.

这两个风格是相对的,WS_CHILD是指定子窗口的,Child窗口必须要设置承载的父窗口。Child窗口自动跟随父窗口移动,即父窗口移动的过程中,子窗口相对父窗口的是不变的。

WS_POPUP是用来指定弹出窗口的,可以设置父窗口,也可以不指定父窗口(父窗口句柄为空),Popup窗口和父窗口其实不是真正意义上的父子关系,而是owner与被own的关系。

不管是Child窗口还是Popup窗口,始终是悬浮在父窗口之上的。Popup窗口不会随着父窗口的移动而自动移动,如果Popup窗口要做到对其父窗口的跟随,则需要编写代码去实现对父窗口的实时跟随。具体可以启动定时器去跟随,也可以在父窗口中实时拦截WM_MOVE、WM_WINDOWPOSCHANGING、WM_SIZE等消息,实时去跟随父窗口。

2、WS_VISIBLE

WS_VISIBLE: The window is initially visible.This style can be turned on and off by using the ShowWindow or SetWindowPos function.

该窗口风格可以直接反映窗口当前是处在显示状态,还是处于掩藏状态。我们可以使用SPY++探查窗口风格确定是否包含该风格。

以研究QQ主窗口在任务栏不显示窗口的实现方法为例,之前听说是通过将QQ主窗口的父窗口设置为一个掩藏的窗口,实现QQ主窗口在任务栏没有窗口的。我们后来使用SPY++验证了一下,先SPY了一下QQ的主窗口:

在探测到的窗口信息页面的Tab页下查看到其父窗口的句柄:

点击父窗口句柄查看父窗口信息,看到父窗口没有WS_VISIBLE风格

说明父窗口一直是掩藏的。另外查看了一下这个掩藏的父窗口的尺寸也是很小的:

说明这个隐藏窗口不做他用,就是为了实现QQ主窗口在任务栏不显示窗口的功能。

3、WS_MINIMIZE和WM_MAXIMIZE

WS_MAXIMIZE: The window is initially maximized.
WS_MINIMIZE: The window is initially minimized. Same as the WS_ICONIC style.

这两个风格是用来指定窗口创建时的初始显示状态,WS_MINIMIZE用来指定窗口初始最小化(到任务栏)显示,WM_MAXIMIZE用来指定窗口初始最大化显示。注意要将这两个风格和WS_MINIMIZEBOX、WS_MAXIMIZEBOX两个风格区分开来,下面会详细介绍WS_MINIMIZEBOX、WS_MAXIMIZEBOX窗口风格。

4、WS_MINIMIZEBOX和WS_MAXIMIZEBOX

WS_MAXIMIZEBOX: The window has a maximize button. Cannot be combined with the WS_EX_CONTEXTHELP style.
WS_MINIMIZEBOX: The window has a minimize button. Cannot be combined with the WS_EX_CONTEXTHELP style.

对于Win32原生的一些窗口,比如Dialog对话框窗口,设置这两种属性会给窗口添加最小化和最大化按钮。其实这点并不重要,因为我们在编程时一般不会直接使用原生的win32窗口,而是使用基于Win32的UI框架(比如duilib开源库)。

下面两点与窗口操作行为有关的才比较重要。一种情况是,如果窗口设置了WS_MAXIMIZEBOX风格,在Win7以上的系统中,将窗口拖动到桌面边界时,系统自动会有个将窗口最大化的效果,如下:

仔细观察一下,桌面的边界区域有个可以放置最大化的效果。如果程序中窗口是固定大小的,不需要这个系统默认最大化的操作,则需要将WS_MAXIMIZEBOX风格去除掉。

另一种情况是目标窗口中添加了最大化和最小化按钮,窗口在任务栏也是有对应的窗口的,则必须要有WS_MINIMIZEBOX,否则点击任务栏窗口不能将目标窗口最小化到任务栏。

5、WS_BORDER和WS_CAPTION

WS_BORDER: The window has a thin-line border.
WS_CAPTION: The window has a title bar (includes the WS_BORDER style).

WS_BORDER是用来给窗口设置一个默认的四周窄边界的,WS_CAPTION则用来指定窗口有标题栏(包含了WS_BORDER,即包含了窗口四周的窄边界)。

在duilib开源库界面框架中,会自动将窗口的WS_CAPTION风格取消掉:

LONG styleValue = ::GetWindowLong( *this, GWL_STYLE ); styleValue &= ~WS_CAPTION;

即创建的Win32窗口都没有默认的系统标题栏,因为WS_CAPTION属性中包含了WS_BORDER,所以取消了WS_CAPTION之后,除了窗口没有标题栏,窗口也没有边界了,这样窗口整个都是客户区域,而duilib框架是直接在客户区做各种绘制,随意的放置按钮、布局等控件,也可以设置视觉上看到的虚拟出来的标题栏区域(并不是真正的窗口标题栏,是仿系统标题栏的)。

在duilib中,可以给窗口设置caption属性,即设置一个虚拟的标题栏区域,点击该区域可以拖动窗口:

LRESULT CDuiWindow::OnNcHitTest( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ) { POINT pt; pt.x = GET_X_LPARAM( lParam ); pt.y = GET_Y_LPARAM( lParam ); ::ScreenToClient( *this, &pt ); RECT rcClient; ::GetClientRect( *this, &rcClient ); // 1、设置sizebox属性,设置窗口的拖动区域,拖动改变窗口大小 if( !::IsZoomed(*this) ) { RECT rcSizeBox = m_pm.GetSizeBox(); if( pt.y < rcClient.top + rcSizeBox.top ) { if( pt.x < rcClient.left + rcSizeBox.left ) return HTTOPLEFT; if( pt.x > rcClient.right - rcSizeBox.right ) return HTTOPRIGHT; return HTTOP; } else if( pt.y > rcClient.bottom - rcSizeBox.bottom ) { if( pt.x < rcClient.left + rcSizeBox.left ) return HTBOTTOMLEFT; if( pt.x > rcClient.right - rcSizeBox.right ) return HTBOTTOMRIGHT; return HTBOTTOM; } if( pt.x < rcClient.left + rcSizeBox.left ) return HTLEFT; if( pt.x > rcClient.right - rcSizeBox.right ) return HTRIGHT; } // 2、设置caption属性,设置虚拟标题栏,拖动标题栏以拖动窗口 RECT rcCaption = m_pm.GetCaptionRect(); if( pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right && pt.y >= rcCaption.top && pt.y < rcCaption.bottom ) { // 考虑到标题栏区域会放置控件,比如常见的右上角的最小化、最大化和关闭按钮, // 所以要将按钮等控件过滤掉 CControlUI* pControl = static_cast<CControlUI*>( m_pm.FindControl( pt ) ); if( pControl && _tcscmp(pControl->GetClass(), _T("ButtonUI")) != 0 && _tcscmp(pControl->GetClass(), _T("OptionUI")) != 0 && _tcscmp(pControl->GetClass(), _T("TextUI")) != 0 ) { return HTCAPTION; } } return HTCLIENT; }

6、WS_THICKFRAME和WS_SIZEBOX

WS_THICKFRAME: The window has a sizing border. Same as the WS_SIZEBOX style.

这两个风格是完全等价的风格,效果是一样的,都是用来指定窗口有个可拖动的边界,设置该风格后,可以拖动窗口的边界改变窗口的大小。

在duilib窗口编程中,因为窗口被取消了WS_CAPTION风格,所以是没有边界区域的,所以即使设置了WS_THICKFRAME属性后窗口也是不可拖动改变大小的。duilib中可以给窗口设置sizebox属性,会虚拟出一个可拖动的边界区域,以拖动改变窗口大小,相关代码如下:

LRESULT CDuiWindow::OnNcHitTest( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ) { POINT pt; pt.x = GET_X_LPARAM( lParam ); pt.y = GET_Y_LPARAM( lParam ); ::ScreenToClient( *this, &pt ); RECT rcClient; ::GetClientRect( *this, &rcClient ); // 1、设置sizebox属性,设置窗口的拖动区域,拖动改变窗口大小 if( !::IsZoomed(*this) ) { RECT rcSizeBox = m_pm.GetSizeBox(); if( pt.y < rcClient.top + rcSizeBox.top ) { if( pt.x < rcClient.left + rcSizeBox.left ) return HTTOPLEFT; if( pt.x > rcClient.right - rcSizeBox.right ) return HTTOPRIGHT; return HTTOP; } else if( pt.y > rcClient.bottom - rcSizeBox.bottom ) { if( pt.x < rcClient.left + rcSizeBox.left ) return HTBOTTOMLEFT; if( pt.x > rcClient.right - rcSizeBox.right ) return HTBOTTOMRIGHT; return HTBOTTOM; } if( pt.x < rcClient.left + rcSizeBox.left ) return HTLEFT; if( pt.x > rcClient.right - rcSizeBox.right ) return HTRIGHT; } // 2、设置caption属性,设置虚拟标题栏,拖动标题栏以拖动窗口 RECT rcCaption = m_pm.GetCaptionRect(); if( pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right && pt.y >= rcCaption.top && pt.y < rcCaption.bottom ) { // 考虑到标题栏区域会放置控件,比如常见的右上角的最小化、最大化和关闭按钮, // 所以要将按钮等控件过滤掉 CControlUI* pControl = static_cast<CControlUI*>( m_pm.FindControl( pt ) ); if( pControl && _tcscmp(pControl->GetClass(), _T("ButtonUI")) != 0 && _tcscmp(pControl->GetClass(), _T("OptionUI")) != 0 && _tcscmp(pControl->GetClass(), _T("TextUI")) != 0 ) { return HTCAPTION; } } return HTCLIENT; }

关于窗口相关问题的实战分析案例,可以查看我之前写的多篇基于项目实战的总结文章

对窗口调用SetParent后改变了窗口的诸多行为和特性说明与总结https://blog.csdn.net/chenlycly/article/details/148627449C++处理Windows窗口的常用API函数及窗口处理经验总结(附源码)https://blog.csdn.net/chenlycly/article/details/139592691C++如何通过代码打开Windows系统中的一些窗口【选择程序对话框 | 照片查看器 | 设备管理器窗口 | 系统扬声器设备窗口 | 系统麦克风设备窗口】(附完整源码)https://blog.csdn.net/chenlycly/article/details/140296394C++两万字总结Windows系统中的Layered分层窗口技术(附源码)https://blog.csdn.net/chenlycly/article/details/120960399【开发实例分享】使用Layered分层窗口实现视频会议中的桌面区域共享(使用分层窗口将部分区域透掉,鼠标可穿透)https://blog.csdn.net/chenlycly/article/details/140733610C++程序调用SetWindowsHookEx全局拦截键盘按键消息和窗口消息的Hook实例分享https://blog.csdn.net/chenlycly/article/details/140636727C++使用SDL开源库中SDL定时器替代Windows窗口定时器消息(附源码)https://blog.csdn.net/chenlycly/article/details/139592979WM_TIMER定时器消息优先级低,可能会被系统丢弃,导致定时任务无法正常执行https://blog.csdn.net/chenlycly/article/details/147922173


7、WS_SYSTEMMENU

WS_SYSMENU: The window has a window menu on its title bar. The WS_CAPTION style must also be specified.

该风格用来给窗口标题栏设置默认的系统右键菜单,该系统菜单中包含关闭等菜单项,如下:

设置该风格时必须同时设置WS_CAPTION风格才会生效,因为设置WS_CAPTION后才会有真实的标题栏,而systemmenu右键菜单是右键点击标题栏时的右键菜单。

这里有个很重要的点需要注意一下,是在测试我们软件的过程中发现的。在Win10系统中将显示比例设置成150%时,如果将没设置WS_SYSTEMMENU风格的窗口上边界移动到桌面上边界后,鼠标移动到窗口上边界与桌面上边界交接处:

鼠标光标会变成可拖动大小的光标形状,此时鼠标如果向下拖,可以改变窗口的高度,但实际上我们这些窗口是固定大小的,不允许改变大小的!

这个问题在100%、125%和175%显示比例下是没有的,只有将显示比例设置成150%才有这个问题。我们通过和其他窗口对比发现,只有我们的部分窗口才有这个问题,其他程序的窗口和系统的窗口都没有这个问题。通过对比窗口属性并添加测试代码,最终确定是因为我们软件中有问题的窗口没有设置WS_SYSTEMMENU属性引起的,设置该属性后就不再有问题了。至于为什么不设置WS_SYSTEMMENU就有问题、非150%的显示比例下才有问题,我们就不得而知了!不知道这是不是Windows系统的bug?

对于我们的duilib窗口,是不需要有这种系统默认的标题栏右键菜单的,添加该属性后我们每个dui窗口是否会添加上右键系统菜单?其实是不会有的,因为我们的dui窗口都取消了WS_CAPTION窗口风格,没有系统默认的标题栏,所以即使添加了WS_SYSTEMMENU风格后,也不会有系统默认的标题栏右键菜单的。

8、WS_EX_APPWINDOW和WS_EX_TOOLWINDOW

WS_EX_APPWINDOW: Forces a top-level window onto the taskbar when the window is visible.
WS_EX_TOOLWINDOW: The window is intended to be used as a floating toolbar. A tool window has a title bar that is shorter than a normal title bar, and the window title is drawn using a smaller font. A tool window does not appear in the taskbar or in the dialog that appears when the user presses ALT+TAB. If a tool window has a system menu, its icon is not displayed on the title bar. However, you can display the system menu by right-clicking or by typing ALT+SPACE.

WS_EX_APPWINDOW会强制让目标窗口在任务栏有个窗口,WS_EX_TOOLWINDOW则会让窗口不在任务栏显示一个窗口。

一般情况下,创建的Win32窗口在任务栏都有对应的窗口,如果想让窗口在任务栏没有窗口,则可以给窗口添加WS_EX_TOOLWINDOW风格。

但这个方法可以用于临时弹出的窗口,但一般不能用于常态显示的窗口,比如程序的主窗口,主窗口会有很多UI交互和业务操作的,如果给主窗口直接设置WS_EX_TOOLWINDOW属性,则会导致主窗口在某些场景下会出现问题,几年前我们在开发客户端软件时就领教过!

对于主窗口,要让其在任务栏不显示窗口,则需要参考QQ主窗口的做法,将主窗口的父窗口设置为一个掩藏的窗口。关于这一点,我们上面已经提到过。

9、WS_EX_TOPMOST

WS_EX_TOPMOST: The window should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. To add or remove this style, use the SetWindowPos function.

WS_EX_TOPMOST用来将窗口置顶在所有窗口前面显示。也可以调用系统API函数SetWindowPos传入HWND_TOPMOST参数实现窗口置顶。

有时要把窗口拉到前面显示(调用SetForegroundWindow不生效),但又不能置顶窗口,可以采用一种规避的手法:调用系统API函数SetWindowPos,先传入HWND_TOPMOST将窗口置顶,然后再传入HWND_NOTOPMOST将窗口取消置顶,这样就变相地将窗口拉到前面显示了,相关文章可以查看:

C++程序把“消失的”窗口“拽”出来显示(先传入HWND_TOPMOST将窗口置顶,再传入HWND_NOTOPMOST取消窗口置顶)https://blog.csdn.net/chenlycly/article/details/121974188

10、WS_EX_LAYEREDWINDOW

WS_EX_LAYERED: The window is a layered window. This style cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
Windows 8: The WS_EX_LAYERED style is supported for top-level windows and child windows. Previous Windows versions support WS_EX_LAYERED only for top-level windows.

WS_EX_LAYEREDWINDOW用来将窗口设置为分层窗口。设置为分层窗口后,就可以给窗口设置透明度,可以在窗口中做鼠标可以完全穿透的全透明区域,也可以做出各种奇异形状的异形窗口。

这里需要注意一下,只有具有WS_POPUP风格的窗口才能设置WS_EX_LAYEREDWINDOW,不能对WS_CHILD窗口设置,即使设置了也不会生效。

关于Layered分层窗口能实现什么样的功能和效果,之前专门写过一篇专题文章,感兴趣的可以去看一下:

C++两万字总结Windows系统中的Layered分层窗口技术(附源码)https://blog.csdn.net/chenlycly/article/details/120960399

11、WS_EX_TRANSPARENT

WS_EX_TRANSPARENT: The window should not be painted until siblings beneath the window (that were created by the same thread) have been painted. The window appears transparent because the bits of underlying sibling windows have already been painted.To achieve transparency without these restrictions, use the SetWindowRgn function.

WS_EX_TRANSPARENT用来将窗口设置成透明的,不仅窗口区域是完全透明的(可以看到窗口后面的内容),而且鼠标可以完全穿透当前的窗口(可以用鼠标直接操作当前窗口后面的内容)。我们在实现窗口的阴影边界时会用到该窗口属性,比如360窗口边界的阴影窗口:

阴影区域可以直接穿透的!阴影窗口的实现,也可以参看我的这篇专题文章:

C++两万字总结Windows系统中的Layered分层窗口技术(附源码)https://blog.csdn.net/chenlycly/article/details/120960399

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

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

相关文章

索磷布韦维帕他韦Sofosbuvir/velpatasvir治疗丙型肝炎的病毒学治愈周期与泛基因型疗效

丙型肝炎&#xff08;HCV&#xff09;作为一种全球性公共卫生挑战&#xff0c;其治疗策略随着直接抗病毒药物&#xff08;DAA&#xff09;的发展经历了革命性变革。索磷布韦维帕他韦&#xff08;Sofosbuvir/velpatasvir&#xff09;作为首个泛基因型DAA复方制剂&#xff0c;凭借…

收藏!大模型面试必问:为什么有KV-Cache却没有Q-Cache?

在大模型相关的技术面试中&#xff0c;“为什么存在KV-Cache却没有Q-Cache”是高频考点&#xff0c;不少刚入门大模型的程序员和小白都会被这个问题难住。今天这篇文章就从核心原理出发&#xff0c;结合具体生成流程拆解分析&#xff0c;帮你彻底搞懂这个问题&#xff0c;面试遇…

揭秘大厂数据库基石:RocksDB 读写原理与 LSM-Tree 架构深度图解

标签&#xff1a; #RocksDB #Database #LSM-Tree #Architecture #Backend #Interview&#x1f4c9; 前言&#xff1a;B 树跌落神坛&#xff1f; 在传统机械硬盘时代&#xff0c;MySQL 的 InnoDB 选择了 B 树。它对读非常友好&#xff0c;但面对海量并发写入时&#xff0c;随机 …

COOH-TK-Glucose-COOH,羧基-酮缩硫醇键-葡萄糖-羧基,化学特性与反应机制

COOH-TK-Glucose-COOH&#xff0c;羧基-酮缩硫醇键-葡萄糖-羧基&#xff0c;化学特性与反应机制COOH–TK–Glucose–COOH 是一种功能化小分子&#xff0c;其结构由以下组成部分构成&#xff1a;羧基&#xff08;–COOH&#xff09;&#xff1a;分子两端的羧基为活性位点&#x…

COOH-TK-Amino-COOH,羧基-酮缩硫醇键-氨基-羧基,化学反应特性

COOH-TK-Amino-COOH&#xff0c;羧基-酮缩硫醇键-氨基-羧基&#xff0c;化学反应特性COOH–TK–Amino–COOH 是一种功能化小分子&#xff0c;结合了 羧基、酮缩硫醇键&#xff08;TK&#xff09;以及氨基-羧基&#xff08;Amino–COOH&#xff09; 的结构特性。其分子可表示为&…

JAVA如何实现文件夹结构的大文件上传示例?

大文件传输系统解决方案设计与实现 一、项目背景与需求分析 作为河南XX软件公司的Java高级工程师&#xff0c;近期负责公司核心项目的大文件传输模块重构工作。原百度WebUploader方案在20G文件传输、跨浏览器兼容性、断点续传稳定性等方面存在严重缺陷&#xff0c;尤其在IE8和…

新手进阶Python:给办公看板加自动备份+异常监控,数据安全不翻车

大家好&#xff01;我是CSDN的Python新手博主&#xff5e; 上一篇我们给云端看板集成了AI智能分析功能&#xff0c;大幅提升了数据处理效率&#xff0c;但很多小伙伴反馈两个核心痛点&#xff1a;① 服务器上的Excel报表、用户配置文件一旦丢失&#xff08;比如服务器故障、误删…

医院电子病历怎样导入PDF中的医学公式至XHEDITOR?

企业网站Word粘贴与导入功能解决方案 作为山西IT行业的PHP工程师&#xff0c;我最近正在评估如何为企业网站后台管理系统集成Word粘贴和文档导入功能。以下是针对这一需求的详细技术分析方案。 需求分析 客户需要实现两个核心功能&#xff1a; Word粘贴功能&#xff1a;从W…

外泌体介导的IFN-α抗HBV效应传递机制研究

摘要 干扰素α在乙型肝炎病毒治疗中发挥核心作用&#xff0c;但其作用机制尚未完全阐明。复旦大学袁正宏团队最新研究发现&#xff0c;巨噬细胞来源的外泌体可通过模拟病毒入侵的分子机制&#xff0c;将IFN-α诱导的抗病毒效应传递至HBV感染的肝细胞内。该过程涉及TIM-1受体介…

使用JAVA http请求实现超大附件上传的示例教程?

《Java老哥的100元奇迹》 各位同行好啊&#xff01;我是一名来自甘肃的Java老程序员&#xff0c;最近接了个"史诗级"外包项目——预算高达100元人民币&#xff01;这价格连兰州牛肉面都吃不了几碗&#xff0c;但客户要的功能怕是马化腾来了都得摇头… 一、需求分析…

EchoEar喵伴智能AI开发套件的技术核心与应用展望

EchoEar喵伴智能AI开发套件是乐鑫科技与火山引擎扣子大模型团队联合打造的典型产品。其核心智能与交互能力的实现&#xff0c;高度依赖于所搭载的ESP32-S3-WROOM-1-N16R16VA模组。这款模组不仅是设备的运算中枢&#xff0c;更是其实现端侧AI、全双工语音交互等先进特性的硬件基…

石油化工车间的“通讯救星”:耐达讯自动化Profibus总线光纤中继器有多实用?

在石油化工车间里&#xff0c;现场变送器和中控系统的通讯简直是“生命线”——压力、温度数据传不准&#xff0c;轻则影响产品质量&#xff0c;重则可能引发安全事故。但老车间的通讯问题真的让人头大&#xff1a;要么是不同品牌的变送器和中控系统“语言不通”&#xff0c;得…

ppo价值函数是用当前图像提取的特征来计算的吗

价值函数是否用“当前图像提取的特征”来计算&#xff1f; 简短回答&#xff1a; ✅ 是的&#xff0c;在基于视觉输入&#xff08;如图像&#xff09;的深度强化学习中&#xff0c;价值函数通常是通过从当前图像中提取的特征来计算的。但这不是“必须”的——它取决于状态表示的…

教育信息化如何实现Word公式粘贴到XHEDITOR在线作业?

山西PHP程序员的逆袭之路&#xff1a;用代码搞钱&#xff0c;用QQ群发家&#xff01; 各位老铁们好&#xff01;我是老张&#xff0c;一个在山西太原窝着写PHP的"码农"。最近接了个CMS企业官网的外包项目&#xff0c;客户提出了个"变态"需求&#xff1a;要…

LeetCode 2943.最大化网格图中正方形空洞的面积:小小思维

【LetMeFly】2943.最大化网格图中正方形空洞的面积&#xff1a;小小思维 力扣题目链接&#xff1a;https://leetcode.cn/problems/maximize-area-of-square-hole-in-grid/ 给你一个网格图&#xff0c;由 n 2 条 横线段 和 m 2 条 竖线段 组成&#xff0c;一开始所有区域均为…

别让通讯拖后腿!耐达讯自动化Profibus总线光纤中继器,助力焊接精度“一臂之力”

汽车焊装车间的工程师们&#xff0c;是不是常被这几个问题搞得头大&#xff1f;机械臂焊接精度忽高忽低、不同品牌设备“鸡同鸭讲”、改造成本高还耽误生产……这些通讯痛点&#xff0c;今天咱们就用耐达讯自动化的Profibus总线光纤中继器来解决&#xff01;电缆VS光纤&#xf…

吐血推荐10个AI论文写作软件,自考毕业论文轻松搞定!

吐血推荐10个AI论文写作软件&#xff0c;自考毕业论文轻松搞定&#xff01; 自考论文写作的救星&#xff1a;AI工具如何帮你轻松应对挑战 在自考论文写作过程中&#xff0c;许多学生常常面临时间紧张、思路混乱、格式不规范等问题。而随着AI技术的不断进步&#xff0c;越来越多…

如何在C++中使用Redis的事务功能?

一、Redis 事务核心原理&#xff08;C 视角&#xff09;Redis 事务通过 MULTI&#xff08;开启事务&#xff09;→ 执行多个命令&#xff08;入队&#xff09;→ EXEC&#xff08;提交事务&#xff09;/DISCARD&#xff08;取消事务&#xff09;完成&#xff0c;hiredis 库中需…

医疗数据用Apache Beam实时流处理稳预警

&#x1f4dd; 博客主页&#xff1a;jaxzheng的CSDN主页 实时医疗预警&#xff1a;Apache Beam驱动的流处理架构与稳健性革命目录实时医疗预警&#xff1a;Apache Beam驱动的流处理架构与稳健性革命 引言&#xff1a;医疗数据实时化浪潮中的关键瓶颈 一、技术应用场景&#xff…

C++ 中解锁 Redis

一、核心前提&#xff1a;选择 Redis C 客户端库C 本身没有内置 Redis 客户端&#xff0c;主流选择是hiredis&#xff08;官方推荐的 C 语言客户端&#xff0c;轻量、稳定&#xff0c;C 可直接调用&#xff09;&#xff0c;也是最基础、最常用的库。1. 环境安装&#xff08;以 …