大家好,欢迎来到IT知识分享网。
本文还有配套的精品资源,点击获取
简介:MFC是一个用于构建Windows应用程序的C++类库,简化了Win32 API程序的开发过程。滑动滚条是GUI中用于浏览大量数据或图像的常见组件。本文将指导如何在MFC中实现滑动滚条功能,涵盖初始化滚条、设置属性、处理消息、更新视图、反馈滚动事件以及自定义滚条外观等方面。通过分析文件”*”中的代码示例,读者将掌握滑动滚条的实际应用,这对于提升Windows桌面应用开发者的技能至关重要。
1. MFC基础与滑动滚条介绍
1.1 MFC概述
MFC(Microsoft Foundation Classes)是微软公司为了方便Windows应用程序的开发而提供的一个C++类库框架。它封装了Windows API,使得开发者可以使用面向对象的方法来创建Windows应用程序。MFC不仅支持传统的Win32 API开发方式,还提供了大量的预定义控件,如按钮、编辑框、滑动滚条等,这些控件极大地简化了程序员的工作量。
1.2 滑动滚条的作用
滑动滚条(Scroll Bar)是MFC中常用的界面元素之一,它提供了一种在有限空间内浏览大量信息或数据的机制。用户通过拖动滑块或者点击轨道上的箭头来实现滚动。滑动滚条特别适用于文档查看器、图像浏览器、日志文件查看等场景。
1.3 MFC中的滑动滚条
在MFC中,滑动滚条主要由CWnd类的派生类CScrollBar实现。开发者可以通过创建CScrollBar对象,并将其与相应的窗口关联来实现滑动滚条的功能。CScrollBar类提供了多种方法,使得开发者可以控制滑块的位置、大小和响应用户操作。在接下来的章节中,我们将详细探讨滑动滚条的组成结构、功能组件、初始化方法以及属性设置和消息处理。
2. 滑动滚条的组成结构解析
2.1 滑动滚条的物理组成
2.1.1 滑块的特性与功能
滑块是滑动滚条组件中最为直观的部分,通常以矩形按钮的形式出现在滚条轨道上,用户可以点击滑块并拖动它到轨道上的任意位置。滑块的大小、颜色和形状可以根据实际应用的需求进行自定义设置。在功能上,滑块的主要作用是指示当前滚动位置,并允许用户直接进行位置的调整。
代码示例:在MFC中创建滑块的代码段,注意滑块的颜色和大小设置。
// 创建一个标准的滑动条控件 CSliderCtrl m_Slider; // 创建并添加到对话框中 m_Slider.Create(WS_CHILD|WS_VISIBLE|TBS_AUTOTICKS|TBS_VERT, rect, this, IDC_MY_SCROLLBAR); m_Slider.SetRange(0, 100); // 设置滑块可移动的范围 m_Slider.SetPos(0); // 初始位置设置为0 m_Slider.SetPageSize(10); // 设置页面大小,即每次按键移动的距离 m_Slider.SetBuddy(控件ID); // 设置与滑动条关联的控件,当滑块移动时,该控件可以得到通知
参数说明: – WS_CHILD
:窗口是一个子窗口。 – WS_VISIBLE
:窗口是可见的。 – TBS_AUTOTICKS
:自动在滑动条旁绘制刻度。 – TBS_VERT
:垂直滚动条。
2.1.2 轨道的设计要素与作用
轨道是滑动滚条中容纳滑块的部分,轨道的长度与滑块的可移动范围相对应。轨道的设计需要考虑用户体验,包括其长度、颜色、是否显示刻度等。在视觉上,轨道的设计往往需要与应用的整体风格保持一致,以保证界面的美观性。
2.1.3 箭头的交互意义
滚条的两端通常会设有箭头,它们提供了一种快速地、小范围滚动的交互方式。当用户点击箭头时,滑块会以一个固定步长进行移动,这个步长通常由程序预设。在MFC中,滚条箭头的交互是通过消息映射来实现的,开发者可以自定义点击箭头时滑块移动的具体步长。
2.2 滑动滚条的功能组件
2.2.1 滑块的响应机制
滑块的响应机制涉及到用户的交互动作和程序的反馈。当用户拖动滑块时,系统会产生一系列的事件,例如鼠标移动、鼠标释放等。程序需要响应这些事件,并对滑块的位置进行更新,进而影响与滑块绑定的其他界面元素。
2.2.2 轨道的位置反馈机制
轨道不仅提供滑块的移动路径,还要提供位置反馈,使用户了解滑块在轨道中的相对位置。在MFC中,可以通过设置滑动条的样式来启用或禁用轨道上的刻度。若启用,滑动条会在轨道上绘制刻度线来标识不同的位置。
2.2.3 箭头的导航功能
箭头是提供微调滑块位置的导航工具。点击箭头会按照设定的步长移动滑块。开发者需要在程序中实现一个消息处理函数来响应箭头点击事件,并更新滑块位置。MFC中,可以通过处理 SB_LINELEFT
和 SB_LINERIGHT
消息来响应左、右箭头的点击。
BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx) ON_BN_CLICKED(IDC_MY_SCROLLBAR_LINELEFT, &CMyDialog::OnBnClickedLeftArrow) ON_BN_CLICKED(IDC_MY_SCROLLBAR_LINERIGHT, &CMyDialog::OnBnClickedRightArrow) END_MESSAGE_MAP() void CMyDialog::OnBnClickedLeftArrow() { int nPos = m_Slider.GetPos(); m_Slider.SetPos(nPos - m_Slider.GetLineSize()); // 移动滑块到上一个刻度位置 } void CMyDialog::OnBnClickedRightArrow() { int nPos = m_Slider.GetPos(); m_Slider.SetPos(nPos + m_Slider.GetLineSize()); // 移动滑块到下一个刻度位置 }
参数说明: – GetPos()
:获取当前滑块的位置。 – SetPos(int nPos)
:设置滑块的新位置。 – GetLineSize()
:获取一次点击箭头滑块移动的距离。
2.2.4 滚动条的动态行为
动态行为是指滑动条在运行时对用户交互的响应方式,例如在拖动滑块时是否显示一个临时的位置提示,以及滑块快速移动时是否有视觉动画效果。这些特性可以通过编程来实现,例如在用户拖动滑块时更新控件提示,或者在快速移动时模拟动画效果。
2.2.5 界面反馈与用户交互
用户与滑动条的每次交互都应该得到及时的界面反馈。这包括视觉上滑块的移动,以及在其他控件上的同步更新。在MFC中,可以通过设置滑动条控件的消息通知来实现这一功能。例如,通过 WM_VSCROLL
消息来响应垂直滚动条的事件。
// 在对话框的消息映射中处理WM_VSCROLL消息 BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx) ON_WM_VSCROLL() END_MESSAGE_MAP() void CMyDialog::OnVScroll(UINT nSBCode, UINT nPos, CWnd* pWndScroll) { // nSBCode包含了滑动条事件类型,nPos是滑块的新位置 CDialogEx::OnVScroll(nSBCode, nPos, pWndScroll); // 根据滑动条事件更新界面元素 UpdateUIElements(nPos); }
参数说明: – nSBCode
:代表滑动条事件类型的代码,如 SB_LINELEFT
、 SB_LINERIGHT
等。 – nPos
:滑块的位置信息。 – pWndScroll
:发出消息的窗口指针,即滑动条控件的指针。
2.2.6 代码与数据结构的关联
在设计滑动滚条时,代码与数据结构之间的关联至关重要。设计良好的数据结构可以简化代码逻辑,提高程序的效率。例如,定义一个结构体来存储滑动条的属性,如位置、大小、颜色等,然后在程序中通过函数或方法来修改这些属性。
struct ScrollBarData { int nMin; // 最小值 int nMax; // 最大值 int nPos; // 当前位置 int nStep; // 步长 }; // 全局变量或成员变量 ScrollBarData g_ScrollBarData; // 设置滑动条最大值 void SetScrollBarMax(int nMax) { g_ScrollBarData.nMax = nMax; // 更新UI等操作... }
参数说明: – nMin
:滑动条的最小值。 – nMax
:滑动条的最大值。 – nPos
:滑动条的当前位置。 – nStep
:每次滑动的步长。
2.3 滑动滚条的交互逻辑分析
2.3.1 用户操作的理解
理解用户的操作意图,对于设计好的用户界面至关重要。用户操作滑动条时,有意识地去滚动视图、精确定位或者微调当前位置。了解这些操作意图,能够让程序在响应用户交互时做出更加贴切的反馈。
2.3.2 程序对用户意图的响应
响应用户意图的程序,不仅要实时地更新滑块的位置,还要考虑其他的界面元素如何与滑块的移动同步。例如,在滚动时更新显示的内容,或者在定位时提供更精确的界面提示。
2.3.3 反馈的优化
优化用户反馈能够提升用户体验。这包括视觉上的反馈(例如使用动画或者颜色变化来标示滑块位置的移动),以及触觉上的反馈(例如在移动滑块时有轻柔的声音提示)。
2.3.4 交互设计的考量
滑动滚条的设计要考虑实际的应用场景。例如,在需要快速浏览的场合,可以设置大的步长和较快的移动速度。而在需要精细控制的场合,则应该使用较小的步长和较慢的移动速度。
2.3.5 代码实现的难点
代码实现滑动条时的难点在于处理各种用户交互和同步更新界面元素。这包括:正确地处理滚动事件,准确计算位置,以及在多线程环境下安全地更新界面。
2.3.6 设计模式的应用
在更复杂的滑动条交互设计中,可以应用设计模式来简化代码逻辑。例如使用观察者模式来监控滑块的位置变化,或者使用工厂模式来创建不同的滑动条样式。
// 使用工厂模式创建滑动条 CSliderCtrl* CreateSlider(int style) { CSliderCtrl* pSlider = new CSliderCtrl(); pSlider->Create(style, rect, this, IDC_MY_SCROLLBAR); return pSlider; }
参数说明: – style
:滑动条控件的样式,可以是 TBS_HORZ
或 TBS_VERT
等。
2.3.7 交互流程的流程图示例
为了更好地理解和设计滑动条的交互流程,可以创建一个流程图来表示用户与滑动条交互的过程。下面是一个用mermaid格式制作的流程图示例:
graph TD A[用户点击滑块] -->|拖动| B[滑动条滑块移动] B --> C[计算滑块位置] C --> D[更新视图内容] D --> E[在界面上显示滑块新位置] E --> F[检查是否到达边界] F --> |否| B F --> |是| G[滑动条停止移动]
以上为第二章的内容,详细介绍了滑动滚条的组成结构,解析了物理组成和功能组件,强调了代码实现的细节和交互设计的重要考量,同时通过代码块、参数说明和mermaid流程图,清晰地展示了滑动滚条的工作机制。
3. 滑动滚条的类型与初始化
3.1 滑动滚条的类型选择
3.1.1 水平滚条(HSCROLL)的使用场景
水平滚条(HSCROLL)是用户界面中常见的控件之一,主要用于当视图内容超出可视区域宽度时提供导航。在处理文本编辑器、图片查看器等应用时,水平滚条能够帮助用户水平移动视图以查看隐藏的内容。其主要的使用场景包括:
- 文本处理应用 :如文档编辑器或代码编辑器中,用户可借助水平滚条来浏览长行文本。
- 多媒体播放器 :当播放音乐或视频的波形图过长无法完全显示时,使用水平滚条浏览。
- 图像浏览器 :在查看大尺寸图像时,水平滚条能够帮助用户平滑移动图像,查看细节。
水平滚条的使用应考虑用户体验,例如在视觉设计上保持滚条与界面整体风格的一致性,以及在功能上确保滚动操作的流畅性。
3.1.2 垂直滚条(VSCROLL)的适用性
垂直滚条(VSCROLL)同样在用户界面设计中扮演着关键角色,主要用于内容垂直超出显示范围的情况。它在多种应用类型中都发挥着不可替代的作用,适用性广泛,具体包括:
- 网页浏览器 :在浏览网页时,遇到内容超出屏幕高度的情况,用户可使用垂直滚条上下滚动以阅读完整的网页内容。
- 表格和列表控件 :在展示大量数据的表格或列表中,垂直滚条使得用户能够轻松浏览每一行数据。
- 复杂窗口布局 :在复杂的窗口设计中,如选项卡界面或多面板布局,垂直滚条有助于浏览各个部分的内容。
使用垂直滚条时,开发者需要确保其直观易用,并且在布局中合理安排其位置,避免遮挡重要内容或操作按钮。
3.2 滑动滚条的初始化方法
3.2.1 初始化过程中的关键步骤
滑动滚条的初始化过程涉及多个关键步骤,以确保控件能够正常工作并提供良好的用户体验。主要步骤包括:
- 确定控件尺寸 :根据内容大小和显示区域确定滚条的尺寸,确保其能够容纳所有的滚动操作。
- 设置滚动范围 :明确滚动范围的最大值与最小值,这与内容的长度密切相关。
- 配置滚动步长 :确定每次滚动的单位长度,例如,一行文本或一个像素,以适应不同的使用场景。
- 初始化滚动位置 :设置默认的滚动位置,通常为0,表示滚条的起始位置。
以上步骤是初始化滑动滚条的基础,开发者需根据实际应用场景进行适当的调整与优化。
3.2.2 初始化代码的编写与执行
滑动滚条初始化代码的编写需要结合具体的开发环境和编程语言。以 MFC (Microsoft Foundation Classes) 为例,初始化代码通常包含在窗口的创建过程中。下面是一个简化的代码示例,展示了如何在 MFC 应用程序中初始化一个垂直滑动滚条:
BOOL CYourDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // 假设 m_ScrollBar 是 CScrollBar 成员变量 m_ScrollBar.Create(WS_CHILD | WS_VISIBLE | SBS_VERT, CRect(300, 10, 320, 200), this, SCROLLBAR_ID); m_ScrollBar.SetScrollRange(0, 100); // 假设滚动范围是0到100 m_ScrollBar.SetScrollPos(0); // 初始滚动位置为0 return TRUE; }
在上述代码中:
-
Create
函数用于创建滑动滚条控件,WS_CHILD
和WS_VISIBLE
标志分别表示这是一个子窗口并且初始是可见的,SBS_VERT
表示这是一个垂直滑动滚条,CRect
指定了控件的大小和位置。 -
SetScrollRange
设置了滚动范围,其中第一个参数是滚动条的最小值,第二个参数是最大值。 -
SetScrollPos
设置了滚动条的初始位置。
需要注意的是,初始化滑动滚条并不是一次性的,可能需要根据应用运行时的数据变化动态更新滚动范围和位置。
在本章中,我们深入了解了滑动滚条类型的选择和初始化方法,明白了如何根据不同的应用场景选择合适的滚条类型,并且掌握了初始化滑动滚条的关键步骤和代码编写。下一章,我们将探讨滑动滚条的属性设置与消息处理,进一步深化对 MFC 滑动滚条的理解。
4. 滑动滚条的属性设置与消息处理
4.1 设置滚条属性技巧
滑动滚条的属性设置是构建良好用户体验的关键一步。合适的滚条属性能确保滑动操作的流畅性和准确性,提升界面的响应速度和准确性。
4.1.1 属性设置的基本原则
在设置滑动滚条属性时,需要考虑以下基本原则:
- 一致性 :确保滚条的视觉样式在整个应用中保持一致,以便用户能快速识别并使用。
- 直观性 :滚条的属性应直观反映出其功能,如方向和大小。
- 性能 :合理设置属性以确保滚条的响应时间符合用户的期望。
- 自适应 :滚条属性应能够根据不同设备和屏幕分辨率自适应调整。
4.1.2 常见属性的配置方法
以下是一些在MFC中常见的滚条属性及其配置方法:
- 步长 :
SetScrollSizes
函数用于定义滚条的步长。 - 滚动范围 :通过
SetScrollRange
函数设置滚条的滚动范围,这决定了滚动条的最大和最小值。 - 页面大小 :
SetScrollPageSize
函数用于设置滚条的页面大小,即单次滚动操作所滚动的距离。 - 当前位置 :
SetScrollPos
函数用于设置滚条的当前位置,这通常在页面初始化或特定交互发生后更新。
代码示例
void CMyDialog::OnInitialUpdate() { CDialogEx::OnInitialUpdate(); // 设置滚动范围 CRect rect; GetClientRect(&rect); int cy = *; int cx = rect.right - rect.left; // 垂直滚动范围设置为视口大小 SetScrollSizes(MM_TEXT, CSize(cx, cy)); // 设置滚条位置 SetScrollPos(VSCROLL, 0); }
这段代码在对话框初始化时设置了滚动范围和滚条位置,确保滚条能够根据视口大小进行正确配置。
4.2 处理滚条消息方法
滚条消息处理是MFC应用程序中响应用户滚动操作的关键机制。理解和实现滚条消息处理,可以帮助我们创建更加动态和交互性强的应用程序。
4.2.1 消息的分类与重要性
滚条消息可以分为两类: 滚动消息 和 位置消息 。滚动消息通知应用程序用户已经执行了滚动操作,而位置消息则告知应用程序滚动条的当前位置。在MFC中, WM_VSCROLL
和 WM_HSCROLL
是两种主要的滚动消息类型。
4.2.2 实现消息处理函数的步骤
实现滚条消息处理函数的步骤如下:
- 创建消息映射宏 :使用
ON_CBN_SCROLL
宏来创建滚动条消息处理映射。 - 实现消息处理函数 :编写一个函数来处理滚动条消息。这个函数将处理用户滚动输入,并执行相应的操作。
- 更新界面 :在消息处理函数中,根据滚条的新位置更新界面元素。
代码示例
BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx) // 滚动条消息映射 ON_CBN_SCROLL(IDC_MY_SCROLLBAR, &CMyDialog::OnVScroll) END_MESSAGE_MAP() void CMyDialog::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar); // 处理滚动条消息 // nSBCode 表示滚动代码 // nPos 表示新的滚动位置 // pScrollBar 表示发送消息的滚动条控件 // 根据滚动条位置更新视图或其他界面元素 UpdateView(); }
在这个示例中, OnVScroll
函数被映射到了一个滚动条控件。当用户滚动滚条时, OnVScroll
函数将被调用,执行滚动相关的更新。
在实现滚动条属性设置和消息处理时,合理的逻辑设计和代码编写是至关重要的。通过详细的属性配置和精确的消息处理,开发者可以打造更符合用户需求的应用界面,增强用户体验。
5. MFC滑动滚条的高级应用与实例分析
在实际的MFC应用程序开发中,滑动滚条不仅仅是一个简单的控件,它常常涉及到复杂的交互和视觉反馈。要真正有效地使用滑动滚条,开发者必须深入理解其高级应用,并能够通过实例来分析其行为和逻辑。
5.1 视图内容更新实践
使用滑动滚条时,视图内容的同步更新是提高用户体验的关键因素之一。更新策略的选择与实现必须确保滚动条与内容变化之间高度一致。
5.1.1 更新策略的选择与实现
更新策略的选择取决于应用的特定需求。例如,滚动视图时,可以采用以下几种策略:
- 即时更新 :每当滚动条移动时,立即更新视图。这种方法虽然响应速度快,但如果视图内容复杂,可能会导致滚动过程中出现卡顿。
- 按需更新 :只在滚动条停止移动后更新视图。这种方法可以提高滚动时的流畅度,但会增加停止时的延迟。
- 分段更新 :根据滚动速度和位置,动态决定更新的频率。此策略试图平衡流畅度和响应速度。
5.1.2 视图内容与滚条同步的逻辑
为实现视图内容与滚条同步,需要编写相关逻辑代码:
void CYourView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); // 设置滚动区域大小和初始位置 CSize sizeTotal(1000, 1000); SetScrollSizes(MM_TEXT, sizeTotal); // 初始滚动位置 ScrollToPosition(CPoint(0, 0)); } void CYourView::OnScroll(CSize scroll) { // 根据滚动位置更新视图 UpdateContents(scroll); // 调用基类函数继续处理滚动事件 CScrollView::OnScroll(scroll); } void CYourView::UpdateContents(const CPoint& scrollPos) { // 这里实现根据滚动位置更新视图内容的代码 }
5.2 滚动事件反馈策略
良好的滚动事件反馈对于用户来说至关重要,它不仅可以指导用户的操作,还能提高用户的满意度。
5.2.1 反馈机制的构建与优化
构建反馈机制通常包括滚动位置的即时反馈、滚动速度的视觉变化等。优化反馈策略可能需要考虑以下几个方面:
- 动画效果 :为滑块添加淡入淡出等动画,以平滑视觉效果。
- 声音效果 :在用户滚动时添加声音反馈,如拖动滑块或快速滚动的声音。
- 触觉反馈 :如果是在触摸屏上使用,可以通过震动等触觉反馈增强用户体验。
5.2.2 事件处理与用户体验的平衡
在处理滚动事件时,开发人员需要在性能和用户体验之间找到平衡点。过度的反馈可能会导致性能问题,而不足的反馈则可能让用户感到困惑。
5.3 自定义滚条外观
自定义外观能够帮助滑动滚条更好地融入应用程序的整体设计风格,提供统一的用户体验。
5.3.1 外观定制的设计原则
自定义外观时,需要遵循以下设计原则:
- 一致性 :滚条的外观应该与应用的主题和风格保持一致。
- 可识别性 :即使在自定义外观的情况下,用户也应该能够轻易识别出滚条的功能。
- 简洁性 :避免过于复杂的外观设计,以免分散用户注意力。
5.3.2 实现自定义外观的方法
可以通过修改资源模板或使用自定义绘制方法来实现滚条的外观定制:
void CYourView::OnNMCustomDraw(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLVCUSTOMDRAW pNMDC = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR); switch(pNMDC->nmcd.dwDrawStage) { case CDDS_PREPAINT: *pResult = CDRF_NOTIFYITEMDRAW; break; case CDDS_ITEMPREPAINT: *pResult = CDRF_NOTIFYSUBITEMDRAW; break; case CDDS_SUBITEM | CDDS_ITEMPREPAINT: // 自定义绘制每个子项 break; } *pResult = 0; }
5.4 MFC滑动滚条代码示例分析
通过具体代码示例来分析MFC滑动滚条的行为和逻辑,可以加深对其高级应用的理解。
5.4.1 示例代码的结构与功能
示例代码将展示如何通过编程方式创建一个带有自定义绘制的滑动滚条:
// 假设你有一个CScrollView派生类 class CCustomScrollView : public CScrollView { public: // 重写绘制方法 virtual void OnDraw(CDC* pDC); // 重写滚动事件处理函数 virtual void OnScroll(CSize scroll); // 其他方法... }; // OnDraw中实现自定义绘制逻辑 void CCustomScrollView::OnDraw(CDC* pDC) { // 获取视图尺寸等信息 CRect rect; GetClientRect(&rect); // 绘制背景 pDC->FillSolidRect(&rect, RGB(255, 255, 255)); // 绘制其他界面元素... } // OnScroll中处理滚动逻辑 void CCustomScrollView::OnScroll(CSize scroll) { // 更新内容 UpdateContents(scroll); // 通知父窗口进行重绘 CScrollView::OnScroll(scroll); }
5.4.2 代码中关键点的详细解读
通过深入解读代码,可以明白如何将绘制和滚动逻辑整合到MFC应用程序中。特别需要注意的是:
- OnDraw函数 是自定义绘制的核心,可以用来改变滚条和视图的外观。
- OnScroll函数 则是在滚条滚动时被调用,用于同步更新视图内容。
- 重写 是面向对象编程中扩展和修改类行为的一种常见手段。
在以上各段代码中,我们详细分析了MFC滑动滚条的高级应用以及实例应用的实现方式,从中可以看出,深入掌握这些技术细节对于提升MFC应用程序的用户体验和视觉效果至关重要。
本文还有配套的精品资源,点击获取
简介:MFC是一个用于构建Windows应用程序的C++类库,简化了Win32 API程序的开发过程。滑动滚条是GUI中用于浏览大量数据或图像的常见组件。本文将指导如何在MFC中实现滑动滚条功能,涵盖初始化滚条、设置属性、处理消息、更新视图、反馈滚动事件以及自定义滚条外观等方面。通过分析文件”*”中的代码示例,读者将掌握滑动滚条的实际应用,这对于提升Windows桌面应用开发者的技能至关重要。
本文还有配套的精品资源,点击获取
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/140843.html