3.2 窗口滚动条

news2024/11/24 1:27:11

本节讲述窗口滚动条的简单使用方法。如果窗口客户区的内容太多,为了方便浏览窗口客户区的所有内容,就需要在创建窗口时添加窗口垂直或水平滚动条样式。窗口过程处理WM_CREATE消息时初始化滚动条的位置和滚动范围。窗口过程处理WM_VSCROLL或WM_HSCROLL消息时响应滚动条的操作,改变滚动条滑块的位置。

本节必须掌握的知识点:

        滚动条

        第20练:简单的窗口滚动条

3.2.1 滚动条

滚动条

在Windows系统中,滚动条(Scrollbar)是一种常见的用户界面元素,用于在有限的显示区域中查看较大的内容。滚动条通常出现在窗口的右侧和底部,用户可以通过点击或拖动滚动块(Thumb)来查看不同部分的内容。既可以用鼠标单击滚动条两端的箭头,也可以单击箭头之间的区域。一个“滑块”在滚动条中移动,表明当前显示的内容在整个文档中的大概位置。可以用鼠标拖动滑块到特定的位置。

程序员和用户看待滚动条的角度不同,当用户向下滚动时,实际是程序将文件相对于显示窗口向上移动。windows文档和头文件中的标识符都是从用户的角度出发:向上滚动意味着移向文档的开始,而向下滚动意味着移向文档的结束。

在Windows编程中,你可以通过几种方式来为窗口添加滚动条:

       1.将滚动条作为窗口的一部分,在创建窗口(CreateWindow)时添加滚动条。这是本章将要实现的滚动条。

       2.将滚动条作为一个独立的子窗口,添加滚动条子窗口控件。我们将在第八章讲解滚动条子窗口控件。

滚动条的范围和位置

每个滚动条都有相应地“范围”和“位置”。滚动条的范围是一对整数,分别代表滚动条的最小值和最大值。位置是指滑块在范围中所处的值。当滑块在滚动条的顶端(或最左)时,滑块的位置是范围的最小值。相应的,当滑块在滚动条的底部(或最右)时,位置是范围的最大值。在默认状态下,滚动条的范围是0~100。

在Windows编程中,可以使用一组API函数来管理窗口滚动条的范围(即滚动条能代表的最大最小值)和位置(即滚动条滑块当前表示的值)。

1.设置滚动条范围:使用SetScrollRange函数,可以设定滚动条可以表示的最小值和最大值。

BOOL SetScrollRange(

  HWND hWnd,

  int  nBar,

  int  nMinPos,

  int  nMaxPos,

  BOOL bRedraw

);

这个函数将滚动条的最小位置值设置为nMinPos,最大位置值设置为nMaxPos。nBar参数指定设置哪一个滚动条,如果是水平滚动条,则传入SB_HORZ,垂直滚动条则传入SB_VERT。

       2.获取滚动条范围:使用GetScrollRange函数,可以获取滚动条当前的最小值和最大值。

BOOL GetScrollRange(

  HWND hWnd,

  int  nBar,

  LPINT lpMinPos,

  LPINT lpMaxPos

);

3.设置滚动条当前位置:使用SetScrollPos函数。

int SetScrollPos(

  HWND hWnd,

  int  nBar,

  int  nPos,

  BOOL bRedraw

);

这个函数将滚动条的当前位置设置为nPos。nBar参数指定设置哪一个滚动条,如果是水平滚动条,则传入SB_HORZ,垂直滚动条则传入SB_VERT。如果bRedraw参数为TRUE,则滚动条会被立即重绘。

4.获取滚动条当前位置:使用GetScrollPos函数。

int GetScrollPos(

  HWND hWnd,

  int  nBar

);

上述涉及到的所有函数的hWnd参数都是要控制滚动条的那个窗口的句柄。

在使用滚动条时,一个常见的模式是,在响应滚动条相关的Windows消息(如WM_SCROLL)时,获取和设置滚动条的位置。滚动条的位置信息经常用于决定窗口内容的绘制,以实现在大尺寸内容上滑动查看的效果。

Windows负责如下任务

●处理滚动条中的所有鼠标消息。

●当使用者单击管道条时,提供一种反向显示的闪烁。

●当使用者拖动滚动块时,在滚动条内移动滚动块。

●向拥有滚动条的窗口的窗口过程发送滚动条消息。

■程序需要负责的任务:

●初始化滚动条的范围和位置 。

●处理传送给窗口过程的滚动条消息 。

●更新滚动块的位置 。

●根据滚动条的变化更新客户区的内容 。

滚动条消息

当用户单击滚动条或拖动滑块时,Windows向窗口过程发送WM_VSCROLL消息或WM_HSCROLL消息,分别用于处理水平和垂直滚动条的操作。这些消息通常产生于用户直接互动,如拖动滚动条的滑块,点击滚动条的箭头等。

这两个消息的格式如下:

WM_HSCROLL

WM_VSCROLL

wParam = LOWORD(wParam)   //(action)通知码

         HIWORD(wParam)   //滑块当前的位置

lParam = hwndScrollBar //跟踪条控件的句柄。如果为NULL,则消息由滚动条控件发送。

两个消息的参数中,wParam的低字节(LOWORD)表示具体的滚动操作(action),可以是以下的一些常数:

SB_LINEUP 或 SB_LINELEFT:向上或向左滚动一行。

SB_LINEDOWN 或 SB_LINERIGHT:向下或向右滚动一行。

SB_PAGEUP 或 SB_PAGELEFT:向上或向左滚动一页面。

SB_PAGEDOWN 或 SB_PAGERIGHT:向下或向右滚动一页面。

SB_THUMBPOSITION:滑块(thumb)已经拖动到新的位置,只有当用户释放滑块时才会发送。

SB_THUMBTRACK:滑块(thumb)正在被拖动。

当收到滚动条消息时,应用程序通常会在其消息处理函数中(WndProc函数),根据wParam的值进行相应的处理。这可能包括调用GetScrollPos获取当前滚动位置,调整内容的显示,然后使用SetScrollPos设置新的滚动位置。

3.2.2 第20练:简单的窗口滚动条

/*---------------------------------------------------------

SYSMETS.H -- 系统配置信息结构数组

-----------------------------------------------------------*/

#define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0]))

//结构数组

struct

{

     int iIndex;    //索引

     TCHAR * szLabel;//系统信息

     TCHAR * szDesc;//描述

}

(略)

/*------------------------------------------------------------------------

 020 编程达人win32 API每日一练

     第20个例子SYSMETS2.C:获取系统配置信息2---带滚动条的窗口   

     WM_VSCROLL消息

     SetScrollRange函数

     SetScrollPos函数

局限:1、超出滚动范围;

     2、滑块大小和客户区不成比例

     3、拖动滑块,没有实时滚动客户区

 (c) www.bcdaren.com 编程达人

-----------------------------------------------------------------------*/

#include <windows.h>

#include <tchar.h>

#include "sysmets.h" //定义系统信息结构数组及NUMLINES(显示行数)

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

     PSTR szCmdLine, int iCmdShow)

{

     static TCHAR szAppName[] = TEXT("SysMets1");

    (略)

     hwnd = CreateWindow(szAppName, TEXT("Get System Metrics No. 1"),

          WS_OVERLAPPEDWINDOW | WS_VSCROLL, //添加垂直滚动条

          CW_USEDEFAULT, CW_USEDEFAULT,

          CW_USEDEFAULT, CW_USEDEFAULT,

          NULL, NULL, hInstance, NULL);

     ShowWindow(hwnd, iCmdShow);

     UpdateWindow(hwnd);

     while (GetMessage(&msg, NULL, 0, 0))

     {

          TranslateMessage(&msg);

          DispatchMessage(&msg);

     }

     return msg.wParam;

}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

     static int cxChar, cxCaps, cyChar;

     static int cyClient;     //新的客户区高度

     static int iVscrollPos//滚动条滑块位置,默认值0~100之间

     HDC hdc;

     int i,y;

     PAINTSTRUCT ps;

     TCHAR szBuffer[10];

     TEXTMETRIC tm;//存储装置字体结构信息

     switch (message)

     {

     case WM_CREATE:

          hdc = GetDC(hwnd);  //获取设备环境句柄

//把程序当前的字体信息,存放到TEXTMETRIC结构变量中

          GetTextMetrics(hdc, &tm);

          cxChar = tm.tmAveCharWidth;//字符平均宽度

          //tm.tmPitchAndFamily字体间距,tmPitchAndFamily字段的低位决定字体是否

//为等宽字体:1代表变宽字体,0代表等宽字体。

          //字体间距cxCaps设为cxChar的1.5倍。1表示变宽字体

          cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;

          //字符行距=字符高+字符顶部空间的数目

          cyChar = tm.tmHeight + tm.tmExternalLeading;

          ReleaseDC(hwnd, hdc);//释放设备环境句柄

          //设置所指定滚动条范围的最小值和最大值。

          //SB_VERT垂直滚动调,FALSE不立即重绘滚动条,标准滚动条的默认范围是0到

//100,nMaxPos = -1,表示默认值

          SetScrollRange(hwnd, SB_VERT, 0, NUMLINES - 1, FALSE);

          //设置所指定滚动条中的滚动按钮的位置。

          SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE);//TRUE重绘

          return 0;

     case WM_SIZE:

          cyClient = HIWORD(lParam);//客户区的新高度

          return 0;

      //当窗口的标准垂直滚动条中有滚动的事件发生时,操作系统捕捉到后发送

//WM_VSCROLL到消息队列,然后GetMessage消息循环从消息队列中取出消息,并//DispatchMessage分发给操作系统调用WndProc。

//此实例暂时未处理键盘按键操作滚动条的消息

     case WM_VSCROLL:

          switch (LOWORD(wParam))//wParam低16位是滚动条值

          {

          case SB_LINEUP:     //向上滚动一行

               iVscrollPos -= 1;

               break;

          case SB_LINEDOWN:   //向下滚动一行

               iVscrollPos += 1;

               break;

          case SB_PAGEUP:     //向上滚动一页

               iVscrollPos -= cyClient / cyChar;//客户区高/行距=一页的行数

               break;

          case SB_PAGEDOWN:   //向下滚动页

               iVscrollPos += cyClient / cyChar;

               break;

          case SB_THUMBPOSITION:   //拖动滚动条

               iVscrollPos = HIWORD(wParam);//wParam高16位则指定滚动框的当前位

               break;

          default:

               break;

          }

          //更新滑块位置,滑块位置在0~NUMLINES - 1之间

          iVscrollPos = max(0, min(iVscrollPos, NUMLINES - 1));

          //如果与当前滚动条滑块的位置不相等,重新设置滑块位置并重绘

          if (iVscrollPos != GetScrollPos(hwnd, SB_VERT))

          {

              SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE);//重新设置滑块位置

               InvalidateRect(hwnd, NULL, TRUE);//并擦除背景

               UpdateWindow(hwnd);//立即更新

          }

          return 0;

     case WM_PAINT:

          hdc = BeginPaint(hwnd, &ps);

            (略)

          EndPaint(hwnd, &ps);

          return 0;

     case WM_DESTROY:

          PostQuitMessage(0);

          return 0;

     }

     return DefWindowProc(hwnd, message, wParam, lParam);

}

/******************************************************************************

WM_VSCROLL消息:当窗口的标准垂直滚动条中有滚动的事件发生时,在我们的窗口应用程序的消息队列中将产生一条WM_VSCROLL消息。

参数解释:

wParam

HIWORD指定在滚动框的当前位置

LOWORD是SB_THUMBPOSITION或SB_THUMBTRACK; 否则,将不使用该词。

LOWORD做为指定一个滚动条值,指出用户的滚动要求。这个参数可以是下列值之一。

SB_PAGEDOWN 向下滚动一页

SB_LINEDOWN 向下滚动一行

SB_PAGEUP 向上滚动一页

SB_LINEUP 向上滚动一行

SB_TOP 滚动到顶端

SB_BOTTOM 滚动到底部

SB_THUMBPOSITION 用户有拖动滚动框 (滑块),并释放鼠标按钮。HIWORD 指示在拖动操作结束时滚动框的位置。

SB_THUMBTRACK 用户正在拖动滚动框。直到用户释放鼠标按钮,反复发送此邮件。HIWORD 指示滚动框已被拖动到的位置。

lParam

如果lParam参数等于0,就说明它是窗口滚动条;如果等于滚动条窗口句柄,就说明它是滚动条控件。

返回值:如果应用程序处理此消息,则应返回零。

【备注】

SB_THUMBTRACK请求代码通常由在用户拖动滚动框时提供反馈的应用程序使用。

如果应用程序滚动窗口的内容,则它还必须使用SetScrollPos函数重置滚动框的位置。

请注意,WM_VSCROLL消息仅携带16位滚动框位置数据。因此,仅依靠WM_VSCROLL(和WM_HSCROLL)

获取滚动位置数据的应用程序实际的最大位置值为65,535。

但是,由于SetScrollInfo,SetScrollPos,SetScrollRange,GetScrollInfo,GetScrollPos

和GetScrollRange函数支持32位滚动条位置数据,因此有一种方法可以绕开WM_HSCROLL和WM_VSCROLL消息的16位障碍。

有关该技术的说明,请参见GetScrollInfo。

*******************************************************************************

SetScrollRange函数:设置所指定滚动条范围的最小值和最大值。

BOOL SetScrollRange(

  HWND hWnd, //处理滚动条控件或具有标准滚动条的窗口,具体取决于nBar参数的值 。

  int  nBar,   //指定要设置的滚动条。此参数可以是以下值之一。

               //SB_CTL设置滚动条控件的范围。该 HWND参数必须是句柄滚动条控制。

               //SB_HORZ设置窗口的标准水平滚动条的范围。

               //SB_VERT设置窗口的标准垂直滚动条的范围。

  int  nMinPos,//指定最小滚动位置。

  int  nMaxPos,//指定最大滚动位置。

  BOOL bRedraw//指定是否应重绘滚动条以反映更改。如果此参数为TRUE,则会重新绘制滚动条。如果为FALSE,则不会重画滚动条。

);

返回值

类型:布尔

如果函数成功,则返回值为非零。

如果函数失败,则返回值为零。要获取扩展的错误信息,请调用GetLastError。

【备注】

通过将nMinPos和 nMaxPos设置为相同的值,可以使用SetScrollRange隐藏滚动条 。

应用程序不应在处理滚动条消息时调用SetScrollRange函数来隐藏滚动条。新应用程序应使用ShowScrollBar函数隐藏滚动条。

如果调用SetScrollRange紧跟在调用SetScrollPos功能, bRedraw参数SetScrollPos必须为零,以防止滚动条被吸入两次。

标准滚动条的默认范围是0到100。滚动条控件的默认范围是空的( nMinPos和 nMaxPos参数值均为零)。由nMinPos和 nMaxPos参数指定的值之间的差不得大于MAXLONG的值。

因为指示滚动条位置的消息 WM_HSCROLL和 WM_VSCROLL限于位置数据的16位,所以对于SetScrollRange函数的 nMaxPos参数,仅依赖于这些消息来获取位置数据的应用程序的实际最大值为65,535 。但是,因为SetScrollInfo,SetScrollPos,SetScrollRange,GetScrollInfo,GetScrollPos和GetScrollRange函数支持32位滚动条位置数据,

所以有一种方法可以绕过WM_HSCROLL和 WM_VSCROLL消息的16位障碍 。有关该技术的说明,请参见GetScrollInfo。

如果nBar参数是SB_CTL并且hWnd参数指定的窗口不是系统滚动条控件,则系统将SBM_SETRANGE消息发送到该窗口以设置滚动条信息。

这使SetScrollRange可以在模仿滚动条的自定义控件上进行操作。如果窗口不处理SBM_SETRANGE消息,则SetScrollRange函数将失败。

*******************************************************************************

SetScrollPos函数:用于设置所指定滚动条中的滚动按钮的位置。

int SetScrollPos(

  HWND hWnd,//处理滚动条控件或具有标准滚动条的窗口,具体取决于nBar参数的值。

  int  nBar,//指定要设置的滚动条。

  int  nPos,//指定滚动框的新位置。该位置必须在滚动范围内。

  BOOL bRedraw//指定是否重新绘制滚动条以反映新的滚动框位置。如果此参数为TRUE,

则会重新绘制滚动条。如果为FALSE,则不会重画滚动条。

);

返回值

类型:int

如果函数成功,则返回值是滚动框的上一个位置。

如果函数失败,则返回值为零。要获取扩展的错误信息,请调用GetLastError。

*/

3-4 窗口滚动条

 

总结

       1.上述实例中,窗口滚动条是作为窗口的一种风格样式添加的。在调用CreateWindow函数创建窗口时,将窗口的风格设置为WS_OVERLAPPEDWINDOW | WS_VSCROLL,选择添加垂直滚动条。

       2.在处理WM_CREATE消息时,初始化窗口滚动条:调用SetScrollRange函数设置窗口滚动条的范围0~NUMLINS-1。并将滚动条滑块的当前位置设置为VscrollPos(初始值为0)。

       3.处理垂直滚动条消息WM_VSCROLL时使用了一个switch结构。取WM_VSCROLL消息的wParam参数低字(通知码),分别将滚动条滑块的为向上或向下滚动一行,向上或向下滚动一页。如果是鼠标拖动滚动条滑块,则WM_VSCROLL消息的wParam参数的高字记录当前滑块的位置。接下来更新滑块的位置。【注意】先判断滑块位置是否超出范围。如果位置小于0,则等于0。如果位置大于NUMLINES – 1,则等于NUMLINES – 1。然后调用GetScrollPos函数获取滑块位置,如果和之前的位置不等,则调用SetScrollPos函数重新设置滑块位置,并调用InvalidateRect函数使窗口客户区无效,调用UpdateWindow函数立即重绘窗口。

       4.虽然实例添加了窗口滚动条,可以显示所有内容,但是仍然具有3个局限:一是超出实际需要的滚动范围,存在空白区域。二是滑块大小和客户区大小不成比例。三是拖动滑块,没有实时滚动客户区。我们将在下一个实例中解决上述3个局限性。

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

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

相关文章

讲透计算机网络知识(实战篇)01——计算机网络和协议

一、计算机网络和协议 1、网络和互联网络 1.1 网络、互联网、Internet 用交换机、集线器连接在一起的计算机构成一个网络。 用路由器连接多个网络&#xff0c;形成互联网。 全球最大的互联网&#xff1a;Internet。 1.2 网络举例 家庭互联网 图中的无线拨号路由器既是路由…

281 基于matlab的路径规划GUI交互

基于matlab的路径规划GUI交互。包括蚁量系统、蚁周系统、蚁密系统、蚁群系统、免疫混合算法。11种路径规划数据&#xff0c;最多225个规划点。蚁群和免疫算法的参数可进行设置&#xff0c;使得效果最佳。动态显示可视化规划结果。程序已调通&#xff0c;可直接运行。

防止Selenium被检测 Google Chrome 125

背景 最近在使用selenium自动播放学习课程&#xff0c;相信大家也有一些类似的使用场景。 能自动化的事情&#xff0c;绝不自己干。 为防止被检测是机器人做题&#xff0c;刷视频&#xff0c;需要做一些小调整。 先来看作为服务方维护者&#xff0c;是如何检测是Selenium打…

8.transformers量化

Transformers 核心设计Auto Classes Transformers Auto Classes 设计:统一接口、自动检索 AutoClasses 旨在通过全局统一的接口 from_pretrained() ,实现基于名称(路径)自动检索预训练权重(模 型)、配置文件、词汇表等所有与模型相关的抽象。 灵活扩展的配置AutoConfig…

uniapp地图自定义文字和图标

这是我的结构&#xff1a; <map classmap id"map" :latitude"latitude" :longitude"longitude" markertap"handleMarkerClick" :show-location"true" :markers"covers" /> 记住别忘了在data中定义变量…

pip 配置缓存路径

在windows操作平台&#xff0c;默认情况&#xff0c;pip下使用的系统目录 C:\Users\用名名称\AppData\Local\pip C盘是系统盘&#xff0c;如果常常使用pip安装会占用大量的空间很快就满&#xff0c;这时候就有必要变更一下缓存保存路径了。 pip 配置缓存路径&#xff1a; Win…

【NoSQL数据库】Redis Cluster集群(含redis集群扩容脚本)

Redis Cluster集群 Redis ClusterRedis 分布式扩展之 Redis Cluster 方案功能数据如何进行存储 redis 集群架构集群伸缩向集群中添加一个新的master节点&#xff0c;并向其中存储 num10 .脚本对redis集群扩容缩容&#xff0c;脚本参数为redis集群&#xff0c;固定从6001移动200…

创建第一个Springboot项目HelloWorld

目录 一、准备工作 一、创建springboot项目 三、使用git上传到代码仓库gitee 四、git使用过程问题总结 一、准备工作 安装jdk&#xff1a;8u201&#xff08;可以使用高一点的版本&#xff09; jdk所有版本下载&#xff1a;Java Archive | Oracle 安装maven&#xff1a;不用…

Kafka生产者消息发送流程原理及源码分析

Kafka是一个分布式流处理平台,它能够以极高的吞吐量处理数据。在Kafka中,生产者负责将消息发送到Kafka集群,而消费者则负责从Kafka集群中读取消息。本文将探讨Kafka生产者消息发送流程的细节,包括消息的序列化、分区分配、记录提交等关键步骤。 先看一个生产者发送消息的代…

【五】Linux软件仓库Yum源--SSH远程控制--SCP远程传输

RPM&#xff08;红帽软件包管理器&#xff09; RPM建立统一的数据库文件&#xff0c;记录软件信息并分析依赖关系。目前RPM的优势已经被公众所认可&#xff0c;使用范围也已不局限在红帽系统中了。常见RPM命令如下&#xff1a; 安装软件 rpm -ivh file…

数据结构(DS)学习笔记(二):数据类型与抽象数据类型

参考教材&#xff1a;数据结构C语言版&#xff08;严蔚敏&#xff0c;杨伟民编著&#xff09; 工具&#xff1a;XMind、幕布、公式编译器 正在备考&#xff0c;结合自身空闲时间&#xff0c;不定时更新&#xff0c;会在里面加入一些真题帮助理解数据结构 目录 1.1数据…

【DevOps】 什么是容器 - 一种全新的软件部署方式

目录 引言 一、什么是容器 二、容器的工作原理 三、容器的主要特性 四、容器技术带来的变革 五、容器技术的主要应用场景 六、容器技术的主要挑战 七、容器技术的发展趋势 引言 在过去的几十年里,软件行业经历了飞速的发展。从最初的大型机时代,到后来的个人电脑时代,…

neo4j 3.5.5版本创建新的数据库

neo4j 3.5.5版本创建新的数据库 1.找到neo4j的conf文件 点进去 2.点击neo4j.conf 选择记事本打开 3.把graph.db换成自己想要创建的数据库名称 4.打开neo4j服务 出现新的数据库

信息系统项目管理师0151:输出(9项目范围管理—9.4收集需求—9.4.3输出)

点击查看专栏目录 文章目录 9.4.3 输出9.4.3 输出 需求文件 需求文件描述各种单一需求将如何满足项目相关的业务需求。一开始可能只有高层级的需求,然后随着有关需求信息的增加而逐步细化。只有明确的(可测量和可测试的)、可跟踪的、完整的、相互协调的,且主要干系人愿意认…

FreeRTOS学习笔记-基于stm32(14)内存管理

一、FreeRTOS 内存管理简介 FreeRTOS有两种方法来创建任务&#xff0c;队列&#xff0c;信号量等&#xff0c;一种动态一种静态。静态方法需要手动定义任务堆栈。使用动态内存管理的时候 FreeRTOS 内核在创建任务、队列、信号量的时候会动态的申请 RAM。 我们在移植FreeRTOS时可…

采用java+springboot+vue+uniapp自主研发的智慧城管源码,城管综合执法平台源代码

智慧城管执法平台源码&#xff0c;PCAPP端全套源码&#xff0c;城管综合执法系统源码。 智慧城管系统拥有自主版权&#xff0c;项目落地案例&#xff0c;有演示&#xff0c;适合二次开发项目使用。 智慧城管执法系统旨在提高城市管理效率&#xff0c;涵盖了城市管理中的很多业务…

RabbitMQ从入门到入土

同步与异步 同步调用 优势&#xff1a; 时效性强&#xff0c;等到结果后就返回 问题&#xff1a; 扩展性差 性能下降 级联失败问题 异步调用 优势&#xff1a; 耦合度低&#xff0c;扩展性强 无需等待&#xff0c;性能好 故障隔离&#xff0c;下游服务故障不影响上游 缓…

探索乡村振兴新模式:发挥科技创新在乡村振兴中的引领作用,构建智慧农业体系,助力美丽乡村建设

随着科技的不断进步&#xff0c;乡村振兴工作正迎来前所未有的发展机遇。科技创新作为推动社会发展的重要力量&#xff0c;在乡村振兴中发挥着越来越重要的引领作用。本文旨在探讨如何发挥科技创新在乡村振兴中的引领作用&#xff0c;通过构建智慧农业体系&#xff0c;助力美丽…

汉语翻译藏语的软件,有3款宝藏软件!

在数字化飞速发展的今天&#xff0c;语言不再是沟通的障碍。对于想要学习藏语或需要与藏区人民交流的朋友们来说&#xff0c;一款优质的汉语翻译藏语的软件无疑是一大福音。那么&#xff0c;市面上究竟有哪些值得推荐的汉语翻译藏语的软件呢&#xff1f;接下来&#xff0c;就让…

PostgreSQL 快速入门与实战

1、概述 前面2篇博客给大家详细的介绍了PostgreSQL的安装和配置&#xff0c;本篇文章就带着大家一起学习一下PostgreSQL的用法&#xff0c;主要内容包括 基本的数据库操作、用户管理、数据备份、SCHEMA(模式)以及和MySQL的区别。 2、数据库基本操作 PostgreSQL是严格遵守SQL规…