在本文中,我们将深入探讨如何在MFC框架下实现CListCtrl控件的项之间拖放功能。MFC(Microsoft Foundation Classes)是微软提供的一种C++库,用于简化Windows应用程序开发,而CListCtrl则是MFC中用于创建列表视图控件的类。 **一、MFC与CListCtrl概述** MFC是微软开发的一套面向对象的C++库,它封装了Windows API,提供了更高级别的抽象,使得开发者能够更加高效地编写Windows应用程序。CListCtrl是MFC提供的一个用于展示列表数据的控件,它支持多种视图模式,如图标、列表、详细信息等,并且具有良好的可定制性,能够进行排序、选择、编辑等功能。 **二、CListCtrl的拖放功能** 在MFC中,实现CListCtrl的拖放功能主要涉及以下几个步骤: 1. **启用拖放支持**:需要在CListCtrl对象上启用拖放操作。这可以通过调用`EnableDragDrop()`函数实现,该函数会启动内置的拖放支持。 2. **注册拖放标识符**:在程序中定义并注册数据对象的格式,通常使用CF_HDROP格式,这表示被拖放的数据是一个文件列表。可以使用`RegisterDragDrop()`函数完成此操作。 3. **处理拖放消息**:为了响应拖放事件,需要重写CListCtrl的成员函数,例如`OnBeginDrag()`, `OnDrop()`, `OnDropEx()`等。这些函数会处理拖动开始、结束以及在列表控件上的放下动作。 4. **创建数据对象**:当开始拖放时,需要创建一个包含被拖项数据的数据对象。在MFC中,这通常是通过继承`COleDataSource`类并重写其`OnRenderData()`或`OnRenderGlobalData()`函数来实现的。 5. **设置拖动效果**:通过调用`DoDragDrop()`函数开始拖放操作,并传入适当的标志,以设置拖动效果,如DROPEFFECT_COPY或DROPEFFECT_MOVE。 6. **处理接收端操作**:在目标CListCtrl控件中,需要处理`OnDrop()`或`OnDropEx()`消息,以处理被放下项的操作,例如插入、移动或复制。 **三、示例代码分析** 在"DragTest_demo"项目中,我们可能可以看到以下关键代码片段: - 在类的初始化部分启用拖放: ```cpp m_ListCtrl.EnableDragDrop(TRUE); ``` - 注册拖放标识符: ```cpp if (!RegisterDragDrop(m_hWnd, (IDropTarget*)this)) { // 错误处理... } ``` - 重写处理函数: ```cpp void CMyListCtrl::OnBeginDrag(NMHDR* pNMHDR, LRESULT* pResult) { // 创建数据源,设置拖放数据... } void CMyListCtrl::OnDrop(COleDropTarget* pDropTarget, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point) { // 处理放下操作,例如插入数据... } ``` **四、注意事项** 在实现拖放功能时,需要注意以下几点: - 确保正确处理了各种错误条件,如注册失败或内存分配失败。 - 拖放操作应具有良好的用户反馈,例如通过改变鼠标光标形状显示允许的操作类型。 - 操作完成后,记得释放资源,如释放数据对象和解除注册拖放支持。 通过以上的讨论,我们可以看到实现CListCtrl项之间的拖放功能涉及到多个MFC和Windows API的交互。理解这些步骤并熟练应用是构建功能丰富的MFC应用程序的关键。在"DragTest_demo"这个示例中,你可以看到一个完整的实现,通过研究和实践,可以进一步提升你的MFC编程技能。
2025-06-25 01:52:54 4.41MB CListCtrl
1
Origin中【CorrelationPlot】插件资源,下载后直接拖拽到右侧+app处即可安装 **正文** Origin是一款广泛应用于科学研究和工程领域的数据分析与图形绘制软件。它提供了丰富的功能和工具,使得用户可以方便地处理、分析数据并创建高质量的图表。在Origin中,【CorrelationPlot】插件是一个非常实用的功能,专为探索数据间的相关性而设计。通过这个插件,用户可以轻松地可视化不同变量之间的相关性,从而更好地理解和解释数据模式。 1. **安装与使用CorrelationPlot插件** 插件的安装过程简单快捷,只需将下载后的压缩包文件"CP.opx"解压,然后直接将其拖放到Origin主界面右侧的APP界面中。一旦完成此步骤,该插件将被添加到Origin的应用程序库中。从那以后,每次启动Origin时,无需再次设置,用户可以直接调用CorrelationPlot插件来生成相关性图。 2. **插件功能** - **相关系数计算**:CorrelationPlot插件能够计算两列或多列数据的相关系数,如皮尔逊相关系数、斯皮尔曼等级相关系数或肯德尔秩相关系数等,这些系数反映了变量间线性或非线性的关联程度。 - **可视化相关性**:生成美观且易于理解的相关矩阵图或热力图,颜色深浅表示相关性的强弱,负相关用冷色调,正相关用暖色调,帮助用户直观地识别数据中的趋势。 - **自定义设置**:用户可以根据需求调整图的样式,包括颜色映射、图例位置、网格线、标签等,使图表更符合报告或论文的要求。 - **批量处理**:对于大量的数据集,CorrelationPlot可以批量处理,一次性生成多个变量对的相关性图,节省了用户的时间和精力。 3. **应用场景** - **科研数据分析**:在生物学、化学、物理学等科学研究中,经常需要分析不同实验条件或测量指标
2025-06-24 17:19:59 243KB origin 相关性分析
1
基于免编程拖拽的C#源码开发平台:功能强大,支持节点连接与二次开发,轻松创建工控软件方案,基于免编程拖拽的C#源码开发平台:功能强大,支持节点连接与二次开发,轻松创建工控软件方案,免编程拖拽C#源码,可以进行二次开发,功能强大 1.支持节点连接,和删除 2.功能块任意拖拽,节点跟随,功能块属性设置输入输出和删除 3.连接节点,触发各功能块任务,可以把触发结果传给下个输入 4.功能块支持二次开发 可以保存读取编辑方案,开发工控软件非常好用的开发启发案例 ,免编程拖拽; C#源码二次开发; 功能强大; 支持节点连接删除; 功能块拖拽; 节点跟随; 属性设置输入输出删除; 触发任务传递; 功能块二次开发; 保存读取编辑方案; 开发工控软件。,C#源码开发工具:拖拽式节点连接,功能块二次开发,工控软件开发利器
2025-06-19 18:12:40 5.32MB scss
1
在C# WinForm开发中,用户界面的交互性是至关重要的。`ListBox`控件是常用的展示列表数据的组件,但默认情况下它不支持直接通过拖拽来改变条目的顺序。本示例将介绍如何为`ListBox`添加拖拽排序功能,使用户能够更直观、便捷地对列表进行排序。 我们需要在`Form1.cs`文件中定义`ListBox`控件,并为其设置一些基本属性,如`SelectionMode`和`AllowDrop`。`SelectionMode`应设置为`SelectionMode.MultiExtended`,这样用户可以选中多个项目;`AllowDrop`应设置为`true`,以便允许拖放操作。 ```csharp public partial class Form1 : Form { public Form1() { InitializeComponent(); listBox1.SelectionMode = SelectionMode.MultiExtended; listBox1.AllowDrop = true; } } ``` 接下来,我们需要处理几个关键的事件:`DragEnter`, `DragLeave`, `DragOver`, 和 `Drop`。这些事件会在用户拖动鼠标时触发,帮助我们实现拖拽排序的功能。 在`DragEnter`事件中,我们将检查数据是否可以被拖放到`ListBox`中。如果是,我们将设置`DragEffect`为`DragDropEffects.Move`,表示可以移动项目。 ```csharp private void listBox1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(typeof(string))) { e.Effect = DragDropEffects.Move; } else { e.Effect = DragDropEffects.None; } } ``` `DragOver`事件用于更新鼠标下方项的位置。我们需要计算出鼠标的相对位置,并调整`ListBox`的选中项。 ```csharp private void listBox1_DragOver(object sender, DragEventArgs e) { Point mousePosition = Control.MousePosition; Point controlPoint = listBox1.PointToClient(mousePosition); int index = listBox1.IndexFromPoint(controlPoint); // 防止越界 if (index < 0) index = 0; else if (index > listBox1.Items.Count - 1) index = listBox1.Items.Count - 1; // 如果当前选中的项和新位置不同,更新选中项 if (listBox1.SelectedIndex != index) { listBox1.SelectedIndex = index; } } ``` 在`Drop`事件中,我们实际上执行了项目的移动操作。我们获取到被拖放的数据,然后交换当前选中项和新位置的项。 ```csharp private void listBox1_Drop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(typeof(string))) { string[] data = (string[])e.Data.GetData(typeof(string)); int currentIndex = listBox1.SelectedIndex; listBox1.Items[currentIndex] = listBox1.Items[index]; listBox1.Items[index] = data[0]; listBox1.SelectedIndex = index; } } ``` 同时,为了启动拖放操作,我们还需要在`ListBox`的`MouseDown`事件中设置`DoDragDrop`,以便在用户点击并拖动时开始拖放。 ```csharp private void listBox1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && listBox1.SelectedItem != null) { string[] selectedItems = new string[listBox1.SelectedItems.Count]; listBox1.SelectedItems.CopyTo(selectedItems, 0); listBox1.DoDragDrop(selectedItems, DragDropEffects.Move); } } ``` 以上代码实现了一个基本的`ListBox`拖拽排序功能。在`Form1.Designer.cs`中,你需要确保`listBox1`已经被正确初始化,并且在`InitializeComponent`方法中调用了上面的事件处理器。 `Program.cs`文件通常包含了应用程序的主入口点,`WindowsFormsApplication1.csproj`是项目文件,而`Form1.resx`和`Properties`文件夹则包含了窗体资源和其他配置信息,这些文件在实现拖拽排序功能中并不直接涉及。 通过处理`ListBox`控件的相关事件,我们可以为用户提供一种直观的交互方式,让他们通过拖拽来轻松调整列表的顺序。这种增强的用户体验使得C# WinForm应用更加符合现代软件设计的要求。
2025-06-19 17:38:14 10KB winform ListBox
1
在Delphi7编程环境中,实现拖拽文件并获取文件列表是一项常见的操作,尤其在开发桌面应用程序时。这个功能可以极大地提升用户体验,使用户能够通过简单的拖放动作来选择需要处理的文件。以下将详细讲解如何在Delphi7中实现这一功能。 我们需要了解Windows消息系统中的`WM_DROPFILES`消息。当用户在应用程序窗口上释放一个拖放操作时,操作系统会发送这个消息。为了接收这个消息,我们需要在窗体(Form)的`OnDropFiles`事件处理程序中进行处理。 1. **添加组件**: 在Delphi7的工具箱中,找到`TDropTarget`组件并将其拖放到窗体上。这个组件允许窗体成为可拖放的目标。 2. **配置TDropTarget**: 双击`TDropTarget`组件进入其属性设置。确保`DragAcceptFiles`属性设置为`True`,这样窗体就能接受文件拖放。 3. **处理OnDropFiles事件**: 在窗体的代码部分,找到`OnDropFiles`事件处理程序(如果没有,则手动创建)。这个事件会在用户在窗体上释放文件时触发。在这里,我们将编写代码来获取拖放的文件列表。 ```delphi procedure TForm1.FormDropFiles(Sender: TObject; const Files: TStrings); begin // 清空现有文件列表 FileList.Clear; // 遍历Files字符串列表,每个元素都是一个拖放的文件路径 for I := 0 to Files.Count - 1 do begin // 添加文件路径到FileList(假设FileList是一个TStringList) FileList.Add(Files[I]); // 如果需要,这里可以进行其他处理,比如打开、读取或复制文件等 // ... end; end; ``` 4. **安全地处理文件**: 在`OnDropFiles`事件中,我们通常会有一个全局或局部的`TStringList`对象,用于存储拖放的文件路径。你可以根据需要对这些文件进行进一步的操作,如读取文件内容、移动或复制文件等。 5. **注册拖放操作**: 还需要在窗体的`OnCreate`事件中注册拖放操作。添加以下代码: ```delphi procedure TForm1.FormCreate(Sender: TObject); begin DragAcceptFiles(Handle, True); // 注册窗体为拖放目标 end; ``` 6. **解除注册**: 在窗体的`OnDestroy`事件中,别忘了解除注册拖放操作,以避免内存泄漏。 ```delphi procedure TForm1.FormDestroy(Sender: TObject); begin DragAcceptFiles(Handle, False); // 解除注册 end; ``` 以上就是Delphi7中实现拖拽文件并获取文件列表的基本步骤。实际开发中,你可能还需要考虑错误处理、多线程操作、文件类型的过滤等高级特性。通过深入理解Windows的消息机制和Delphi的组件使用,你可以构建出更复杂、功能更强大的拖放文件处理系统。
2025-06-12 16:02:25 187KB 拖拽文件
1
Element UI 提供了大部分UI控件,但对于拖拽,确实是个短板,于是就需要额外的控件来补充了,即本文档的主角vuedraggable。 从实战角度,以低代码配置功能为例,说明vuedraggable的属性、方法、用法,以及使用过程中遇到的一些坑点及解决方案。 要点如下: group属性的要点 update和sort事件的差别 add事件如何获取数据 如何处理属性重复添加问题 不同列表间拖动group属性无效 实例: 某个业务实体,如用户管理,常见的菜单对应一个列表页面,顶部为页面级功能按钮,如新增、删除、导出等,中间为查询区域,可以放几个常用的查询条件,最下面则是查询结果,以表格形式展现行列数据。查询结果表格的行记录,最后一列放一些针对于该行数据的快捷按钮,如删除、编辑等。 这个配置功能,一方面涉及到元素的排序,如按钮的次序、查询条件的次序、查询结果中列的次序;另一方面涉及到列表间元素的移动,如将实体属性添加到查询列表或查询结果中。如采用传统模式,需要选中某个元素,点击左移、右移等按钮,既不直观,操作也繁琐。而采用拖拽式操作,所见即所得,用户体验大幅提升。 在Vue.js应用中,我们经常需要实现拖拽功能来增强用户体验,特别是在构建低代码平台或者配置界面时。Element UI虽然提供了丰富的UI组件,但对拖拽功能的支持相对较弱。这时,我们可以借助第三方库vuedraggable来实现。vuedraggable是基于Sortable.js的Vue组件,它提供了一套完整的拖拽解决方案,包括触摸设备支持、文本选择、智能滚动、不同列表间的拖放等特性,并且与Vue 2.x的过渡动画兼容。 我们需要安装vuedraggable库。在项目中运行以下命令: ```bash npm install vuedraggable -S ``` 然后,在Vue组件中引入并使用Draggable组件: ```javascript import Draggable from 'vuedraggable'; ``` vuedraggable的核心属性和方法包括: 1. **v-model**: 用于绑定数据,通常是一个数组,表示拖动的元素列表。 2. **group**: 用于设置拖动元素的分组,可以防止不同组间的元素相互干扰。 3. **@sort**: 当元素在组内排序时触发,提供新的元素顺序。 4. **@update**: 在拖放操作结束后触发,无论是否改变了元素顺序,都会触发此事件。 5. **@add**: 当元素添加到列表时触发,可以通过此事件获取新添加的数据。 在实际应用中,例如页面按钮配置场景,我们可以这样设置: ```html {{ item.name }} ``` 在这个例子中,`buttonList`是存储按钮信息的数组,`group`属性定义了拖动分组,`updateSort`和`update`是处理排序和更新的回调函数。`@close`和`@click`事件分别用于删除和修改按钮。 在实际使用中,可能会遇到一些问题,比如元素重复添加和不同列表间拖动group属性无效。为了解决这些问题,我们需要在处理`@add`事件时进行数据校验,确保不添加重复元素。对于group属性无效的问题,通常是因为不同列表间的group值没有正确设置或没有设置。 vuedraggable提供了强大的拖拽功能,可以轻松实现列表排序和元素移动。通过合理利用其属性和事件,我们可以构建出直观易用的界面,提升用户体验。在开发过程中,遇到问题时,可以查阅官方文档或社区资源找到解决方案,确保功能的稳定实现。
2025-06-04 11:11:37 1.41MB vuedraggable
1
在IT行业中,动态标绘和拖拽绘制是地图应用中常见的功能,特别是在GIS(地理信息系统)领域。"SuperMap"是一款知名的GIS软件,它提供了强大的地图处理和数据分析能力。在这个场景下,"动态标绘拖拽绘制标号"指的是利用SuperMap或其他类似工具,用户可以在地图上动态创建、修改和移动标记,以实现对地理信息的直观表示。下面将详细探讨这一技术及其相关知识点。 1. **动态标绘**:动态标绘是指在地图上实时地添加、修改和删除地理元素的过程。这通常涉及到图形用户界面(GUI)的设计,使用户能够通过鼠标或其他输入设备与地图交互。在GIS软件中,动态标绘允许用户在地图上即时绘制点、线、面等几何对象,用于表示特定位置、边界或路线。 2. **拖拽绘制**:拖拽绘制是动态标绘的一个关键特性,允许用户通过鼠标拖动来创建和移动标记。这种操作简单直观,适合在移动设备或桌面应用中进行。在GIS应用中,拖拽绘制标号通常用于定位兴趣点、标注事件或调整地理数据的位置。 3. **SuperMap功能**:SuperMap软件提供了丰富的地图操作和分析功能,包括动态标绘拖拽绘制。用户可以通过其内置的绘图工具创建自定义图层,然后使用拖拽功能调整图层中的对象。此外,SuperMap还支持数据导入导出、空间分析、地图投影转换等功能,为地图制图和地理分析提供全面支持。 4. **地图标号**:地图标号是地图上的文字或符号,用来标识地物的名称、属性等信息。在动态标绘拖拽绘制中,用户可以添加、修改这些标号,以反映地图上地物的最新状态。标号的大小、颜色、字体等样式也可以根据需要进行定制。 5. **交互式地图开发**:在开发交互式地图应用时,开发者需要熟悉Web GIS技术和JavaScript库,如SuperMap iClient或Leaflet等。这些库提供了API,使得开发者能够实现地图的拖拽、缩放、旋转等交互功能,以及动态标绘的逻辑。 6. **地理坐标系统和投影**:动态标绘涉及地理坐标系统的理解,因为地图上的位置需要与地球表面的真实位置对应。开发者需要知道如何在不同的投影系统之间转换,以确保标绘的准确性。 7. **数据存储与管理**:在实现动态标绘拖拽绘制标号时,需要考虑如何存储和管理这些数据。这可能涉及到数据库设计,如使用GIS专用的数据库如PostGIS,或者使用GeoJSON等空间数据格式。 8. **安全性与权限控制**:在共享和编辑地图时,安全性与权限控制是重要的考虑因素。用户访问和修改地图的能力应根据他们的角色和权限设定。 9. **响应式设计**:现代GIS应用往往需要适应不同设备的屏幕尺寸,因此,动态标绘功能需要具备响应式设计,确保在手机、平板和桌面电脑上都能良好工作。 10. **性能优化**:对于大规模数据的动态标绘,性能优化至关重要。这可能包括数据分块加载、懒加载策略以及高效的渲染算法等。 通过上述知识点,我们可以理解动态标绘拖拽绘制标号在GIS领域的核心价值,它极大地提升了地图的交互性和实用性,使用户能更直观地理解和操作地理信息。
2025-05-21 20:20:30 8KB supermap
1
在Unity开发环境中,实现物体的拖拽与组装是增强用户交互体验的重要手段。为了实现这一功能,开发者需要编写相应的脚本来控制物体的移动、定位以及与其他物体的组装。拖拽功能的核心是实现鼠标事件的捕捉。当用户按下鼠标左键并拖动物体时,物体的坐标应当跟随鼠标移动。这需要通过检测鼠标事件,并在每一帧更新物体的世界坐标来实现。 为了确保物体可以被准确地放到指定位置,通常需要在物体下方设置一个接收点或组装点。当物体拖拽到这个区域时,需要进行碰撞检测,判断物体是否进入了一个有效的组装位置。在物体放置到正确位置之后,可以通过特定的逻辑代码将其“固定”在那里,或者与其他物体进行组装。组装功能涉及到更复杂的逻辑判断,比如物体之间的连接是否合理、是否存在冲突等。 Unity引擎为此提供了一系列的内置方法和工具,比如使用Transform组件来操作物体的位置、使用Physics组件处理碰撞检测等。除此之外,还可以利用Unity提供的UI系统,比如Canvas和UI元素,来创建一个用户友好的拖拽界面。在Unity编辑器中,物体的拖拽可以使用内置的EventTrigger组件或者编写自定义的Input事件来实现。 组装时,如果涉及到多个物体之间的关系,例如拼装成一个更大的物体,那么可能还需要编写脚本来管理这些物体之间的父子关系。这种关系可以使用Transform的parent属性来建立,使得一个物体成为另一个物体的子对象。这不仅影响了物体在场景中的显示顺序,还可能对物体的其他属性如运动和碰撞产生影响。 此外,对于物体的拖拽与组装,用户体验设计也是非常重要的一环。开发者需要确保拖拽过程流畅,组装时有明确的提示和反馈,比如视觉高亮显示可组装区域,或者声音提示组装成功等。这些都有助于提高用户的使用满意度。 实现这些功能还需要进行细致的测试,确保在不同的情况下拖拽和组装操作都能正常工作。这包括在不同的分辨率和设备上进行测试,以及针对不同用户的操作习惯进行优化。 Unity小工具——物体的拖拽与组装涉及到的技术点包括鼠标事件处理、碰撞检测、物体定位和组装逻辑、父子关系管理、用户体验设计以及全面测试等。这些技术点的综合应用,可以使得开发者创建出既实用又用户友好的交互式3D应用。
2025-05-15 10:23:35 30KB unity小工具
1
在Windows Forms应用开发中,创建一个仿Visual Studio (VS)工具箱的界面,以及实现标签设计和拖拽布局的功能,可以极大地提升用户交互体验和开发效率。以下将详细阐述这些知识点。 1. **WinForm应用**:WinForm是.NET Framework提供的一种用于构建桌面应用程序的技术,它基于Windows API,允许开发者创建具有丰富用户界面的应用程序。在本项目中,我们使用WinForm来创建类似VS工具箱的界面,展示可复用的控件或组件。 2. **仿VS工具箱**:Visual Studio的工具箱包含了一系列可以拖放到设计表面的控件,如按钮、文本框、标签等。在WinForm中,我们可以自定义一个窗体或者用户控件来模拟这个功能。这通常涉及到控件的动态加载、分类显示以及拖放支持。 3. **标签设计**:标签(Label)在用户界面上用于显示不可编辑的文本信息,如提示、标题等。在本项目中,标签设计可能涉及自定义标签的外观、字体、颜色,以及添加额外的功能,如点击事件处理,以便于用户交互。 4. **拖拽布局**:拖拽布局是一种用户友好的设计方式,用户可以通过鼠标直接拖动控件来改变其位置和大小。在WinForm中,可以实现此功能通过处理控件的`MouseDown`、`MouseMove`和`MouseUp`事件,配合计算鼠标的相对位置,从而实现控件的动态移动和尺寸调整。 5. **控件容器**:为了实现拖拽布局,我们需要一个容器控件(如Panel或FlowLayoutPanel)来容纳其他控件。容器控件可以自动管理其子控件的布局,允许在运行时动态添加和删除控件,同时支持自定义布局策略。 6. **事件处理**:在WinForm中,每个控件都有自己的事件,如Click、DragDrop等。为了实现拖拽功能,我们需要订阅并处理这些事件,编写相应的事件处理器代码。 7. **数据绑定**:在仿VS工具箱中,控件的实例可能来源于数据库或其他数据源,因此数据绑定是必不可少的。使用`BindingSource`和`DataSource`属性可以将控件与数据源关联,实现数据的实时更新。 8. **自定义控件**:如果需要更复杂的控件,可以创建自定义控件继承自现有的.NET Framework控件,添加自定义属性、方法和事件,以满足特定需求。 9. **代码分离和设计模式**:为了提高代码的可维护性和扩展性,可以采用MVP(Model-View-Presenter)或MVVM(Model-View-ViewModel)设计模式,将界面逻辑和业务逻辑分离。 10. **调试与测试**:在开发过程中,调试工具和单元测试是必不可少的,它们可以帮助开发者定位和修复问题,确保应用的稳定性和正确性。 通过以上技术,我们可以构建出一个功能完备、易用的WinForm标签设计工具,它不仅能模仿VS工具箱的界面,还能提供灵活的标签布局和拖拽功能,为开发者提供便利。
2025-05-02 23:25:51 65KB 标签设计 拖拽布局
1
根据OpenGL提供的直线,多边形绘制算法(橡皮筋效果),实现基于鼠标交互的卡通人物设计与绘制。使用颜色填充与反走样技术对卡通人物外貌以及衣着进行绘制。实现对卡通人物轮廓的交互控制,点击鼠标左键可以对人物五官位置进行拖拽移动调整。按“↑”按键能够实现卡通人物绕坐标原点(或指定点)进行旋转
2025-04-09 17:04:56 27.45MB 山东大学 计算机图形学 OpenGL
1