简单的Axure界面制作例子,实现一些页面切换以及登录注册,界面样式等。
2025/6/16 12:54:21 1.88MB Axure制作
1

在IT领域,文本编辑器是开发人员日常工作中不可或缺的工具,尤其对于编程语言如C#的开发者来说。
本文将深入探讨一个由C#构建的文本编辑器,它具备多文档支持、拖放功能、查找替换等多种特性,为用户提供高效且舒适的编辑体验。
这个文本编辑器具有“多文档”支持,意味着用户可以同时打开并编辑多个文本文件,无需在不同的窗口间频繁切换。
这一特性极大地提高了工作效率,尤其是在处理多个项目或者需要对比不同文件内容时。
“可直接拉文件”功能是该编辑器的一大亮点。
用户可以直接通过鼠标将文件从文件管理器拖放到编辑器界面上,快速打开文件进行编辑,这比传统的通过菜单或文件打开对话框选择文件的方式更为便捷。
此外,编辑器提供了“查找替换”功能,这是文本编辑器的核心功能之一。
用户可以通过输入关键词进行快速查找,同时也可以进行替换操作,对大量文本进行快速修改,这对于代码调试、文档整理等场景非常实用。
查找替换功能通常会支持正则表达式,使得搜索和替换操作更加灵活和强大。
至于“记事本”标签,暗示了这个编辑器的设计可能受到了Windows系统内置的记事本程序的启发,但显然它的功能更为丰富,界面设计更友好,用户体验更好。
记事本虽然简单,但在某些场合下可能无法满足专业开发的需求,而这款C#文本编辑器则弥补了这些不足。
在C#编程语言的支持下,这个文本编辑器可以利用.NET框架提供的丰富的类库和API,实现高效稳定的操作。
C#的面向对象特性使得代码结构清晰,易于维护和扩展,同时也为编辑器的定制化提供了可能,用户可以根据需要添加自定义插件或功能。
这款C#多文档文本编辑器是一个高效、易用的开发工具,其拖放功能、多文档支持以及强大的查找替换功能,为开发者带来了极大的便利。
配合C#的编程优势,这款编辑器无论是对于初学者还是经验丰富的开发者,都是一个值得尝试的选择。
在实际使用中,用户可以进一步探索其特性,提升工作效率,享受更加优质的文本编辑体验。
2025/6/15 22:15:24 1.56MB
1
简介:
### 开发51单片机操作系统时应注意的问题#### 一、引言随着嵌入式系统的广泛应用,针对特定硬件平台的操作系统开发变得尤为重要。
51单片机作为一款经典的微控制器,在工业控制、家用电器等领域有着广泛的应用。
然而,由于其硬件资源的限制,在51单片机上开发操作系统面临诸多挑战。
本文将详细介绍开发51单片机操作系统时需要注意的关键问题。
#### 二、关键问题详解##### 1. 操作系统软件的代码长度控制51系列单片机由于硬件资源的限制(如ROM空间较小),因此对于操作系统代码的大小有严格的要求。
通常情况下,一个基于51单片机的应用程序大约需要7至8KB的ROM空间。
相比之下,如果操作系统本身就需要几十KB的空间,那么留给用户应用程序的空间将非常有限,这显然不利于实际应用。
例如,流行的嵌入式操作系统往往体积较大,无法适用于51单片机。
为了克服这一限制,开发者需要采取以下措施:- **精简设计**:简化操作系统的功能模块,确保核心功能的同时尽可能减小代码量。
- **模块化**:采用模块化设计,允许用户根据具体需求选择加载必要的模块,从而降低整体代码量。
- **代码优化**:通过高效的编码技巧来减少代码长度,比如使用更简洁的数据结构和算法。
##### 2. 控制操作系统对片内RAM的占用51系列单片机仅有128或256字节的片内RAM空间,这对于运行操作系统而言是非常有限的。
如果操作系统占用过多的RAM空间,将严重影响用户应用程序的正常运行。
因此,开发者需要特别注意以下几点:- **最小化RAM使用**:减少操作系统的RAM占用,确保有足够的空间供用户应用程序使用。
- **合理分配资源**:优化RAM的使用方式,避免不必要的资源浪费。
- **外部RAM利用**:在不影响性能的前提下,考虑将部分数据存储在外置RAM中,以减轻内部RAM的压力。
##### 3. 解决函数的重入问题对于实时占先式操作系统而言,函数的重入性至关重要。
重入函数能够在不破坏数据的情况下被多个任务调用。
要实现函数的重入性,必须满足以下条件之一:- **不使用共享资源**:确保函数内部没有依赖任何共享资源。
- **使用中断禁用**:在使用共享资源时暂时禁用中断,以保证数据的一致性。
- **信号量机制**:通过申请和释放信号量来管理对共享资源的访问。
在标准C中实现这些条件相对简单,但在Keil C51编译器环境下,由于局部变量的静态分配特性,实现起来较为复杂。
开发者可以通过以下策略应对这一挑战:- **手动管理资源**:显式地控制共享资源的访问,避免自动管理带来的不确定性。
- **代码审查**:仔细检查函数中的资源使用情况,确保符合重入性的要求。
- **测试验证**:通过严格的测试来验证函数的重入性,确保其在多任务环境下的正确运行。
##### 4. 堆栈的分配与管理在占先式操作系统中,任务之间的切换频繁发生,因此需要合理分配和管理堆栈空间。
每个任务都需要有自己的堆栈,用于保存任务状态信息。
由于51单片机的RAM空间有限,堆栈的分配策略成为了一项重要的考量因素。
- **按需分配**:根据任务的实际需求动态分配堆栈空间,避免过度预分配造成的资源浪费。
- **优化堆栈使用**:通过调整任务的设计和编码方式来减少堆栈的需求。
- **复用机制**:探索堆栈空间的复用机制,如在任务间共享堆栈空间等方法。
#### 三、结论开发51单片机操作系统是一项充满挑战的任务,需要开发者在有限的硬件资源下,精心设计并优化操作系统的各个方面。
通过本文所述的关键问题及解决方案的探讨,希望能够帮助开发者更好地理解和应对这些挑战,成功开发出高效、可靠的51单片机操作系统。
2025/6/15 19:58:32 63KB
1
简介:
在Android开发中,`DialogFragment`是Android SDK提供的一种用于创建弹出式对话框的组件。
它是`Fragment`的一个子类,与传统的`Dialog`相比,`DialogFragment`具有更多的优势,尤其是在处理屏幕旋转和生命周期管理方面。
本篇文章将深入探讨`DialogFragment`的核心概念、优点、使用方法以及常见应用场景。
`DialogFragment`简介:`DialogFragment`继承自`Fragment`,它不仅拥有`Fragment`的所有功能,还能展示一个模态对话框。
它将对话框和碎片的特性结合在一起,使得对话框可以在不同的屏幕配置下保持一致的行为,同时能够更好地适应Android应用的动态布局需求。
`DialogFragment`的优点:1. 生命周期管理:由于`DialogFragment`继承自`Fragment`,它拥有完整的生命周期回调,可以方便地处理如暂停、恢复、销毁等状态变化,使得对话框在不同场景下的行为更加可控。
2. 自动处理配置变更:当设备发生横竖屏切换时,`DialogFragment`会自动处理对话框的关闭和重新显示,而普通的`Dialog`则需要开发者手动处理。
3. 易于集成:`DialogFragment`可以像普通`Fragment`一样添加到Activity的布局中,也可以单独显示为对话框,增加了代码的复用性。
4. 更好的主题定制:`DialogFragment`支持自定义对话框样式,可以方便地调整对话框的外观和行为。
使用`DialogFragment`的步骤:1. 创建`DialogFragment`子类:你需要创建一个新的类,继承自`DialogFragment`,并重写必要的方法,如`onCreateDialog()`,在这个方法中构建你的对话框实例。
2. 实现`onCreateDialog()`:在这个方法中,你可以使用`AlertDialog.Builder`或自定义的`Dialog`来创建对话框,并设置其标题、消息、按钮等元素。
3. 显示`DialogFragment`:你可以通过`FragmentManager`和`FragmentTransaction`将`DialogFragment`添加到当前的Activity中,或者使用静态方法`show()`直接显示对话框。
示例代码:```javapublic class MyDialogFragment extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); builder.setMessage("这是一条对话框消息") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 确定按钮的点击事件 } }) .setNegativeButton("取消", null); return builder.create(); }}```在Activity中显示`DialogFragment`:```javaMyDialogFragment dialogFragment = new MyDialogFragment();dialogFragment.show(getSupportFragmentManager(), "my_dialog");````DialogFragment`的常见应用场景:- 提示用户确认操作,如删除、保存等。
- 展示设置选项或偏好设置。
- 获取用户输入,如登录、注册表单。
- 显示帮助信息或关于应用的详情。
总结来说,`DialogFragment`是Android开发中处理对话框的理想选择,它的灵活性、易用性和强大的功能使其在各种应用场合都能发挥出色的效果。
通过理解其工作原理和实践操作,开发者可以更高效地利用这一组件,提升应用的用户体验。
2025/6/15 19:58:08 1.42MB
1
VerilogVGA显示图片切换程序,采用字符形式显示多幅哆啦a梦图片。
并进行自动切换图片。
图片大小为100*100的图片。
采用数组形式存储。
2025/6/13 9:05:27 4.2MB vga 多幅图片 切换显示 Verilog
1
实现了视频在线播放,同时后台断点缓存,缓存完毕后自动切换到本地视频播放,这样可以保证流畅性
2025/6/11 19:08:32 969KB Android
1
基于STM32f103z按键控制舵机实验,内含超音波测距控制舵机转角,二者实验可以切换测试(keil4),实验结果可行.1要使用按键控制舵机,请停蔽超音波部分代码,2若用超音波控制度舵机,请停蔽按键
2025/6/11 6:01:23 1.99MB 基于STM32
1
应用Socket编程实现一个简单的网络聊天程序。
聊天框架由客户端和服务器端组成,服务器连接、消息接收以及关闭等功能。
是通过建立基于对话框的MFC工程文件来实现编程,并支持windowsocket。
重点在于整体的设计是基于对话框和类的。
先进行对话框的布局以及各个控件属性的设置,再为控件添加响应函数和成员变量。
客户端和服务器端整合到一个对话框,利用设置radiobutton可以对两者进行切换,并写入相应的程序代码。
客户端对应“连接”按钮,服务器端对应“监听”按钮。
为其添加socket类和相应的代码。
添加类相应的各代码后,进行客户端和服务器端的连接。
编译启动时,启动两份,分别选择客户端和服务器端就可以进行对话了。
1
欢迎使用Live-DL保存直播,本工具通过FFmpeg保存直播流,CPU占用极低。
支持录制所有RTMP方式推流的直播网站,如哔哩哔哩等Step1.复制直播流地址到窗口(直播流地址可以通过Chrome浏览器F12“检查”功能获得,切换到Network选项卡,刷新页面,最长的一条就是)Step2.输入保存的文件名(文件会保存为“当天日期+你输入的名字.mp4”)Step3.选择保存路径a.保存在当前文件夹b.保存在E:\ReliveSavec.自定义路径(例如C:\users\yourname\desktop\)按Q可停止
2025/6/10 15:34:55 15.54MB 直播 直播保存 直播录像
1
视点变换,旋转,加速减速,星空背景太阳,光晕各行星纹理#include#include#include#include#include#include#include#pragmacomment(lib,"winmm.lib")#pragmacomment(lib,"wininet")//纹理图像结构typedefstruct{intimgWidth;//纹理宽度intimgHeight;//纹理高度unsignedcharbyteCount;//每个象素对应的字节数,3:24位图,4:带alpha通道的24位图unsignedchar*data;//纹理数据}TEXTUREIMAGE;//BMP文件头#pragmapack(2)typedefstruct{unsignedshortbfType;//文件类型unsignedlongbfSize;//文件大小unsignedshortbfReserved1;//保留位unsignedshortbfReserved2;//保留位unsignedlongbfOffBits;//数据偏移位置}BMPFILEHEADER;#pragmapack()//BMP信息头typedefstruct{unsignedlongbiSize;//此结构大小longbiWidth;//图像宽度longbiHeight;//图像高度unsignedshortbiPlanes;//调色板数量unsignedshortbiBitCount;//每个象素对应的位数,24:24位图,32:带alpha通道的24位图unsignedlongbiCompression;//压缩unsignedlongbiSizeImage;//图像大小longbiXPelsPerMeter;//横向分辨率longbiYPelsPerMeter;//纵向分辨率unsignedlongbiClrUsed;//颜色使用数unsignedlongbiClrImportant;//重要颜色数}BMPINFOHEADER;//定义窗口的标题、宽度、高度、全屏布尔变量#defineWIN_TITLE"模拟太阳系各星球的转动"constintWIN_WIDTH=800;constintWIN_HEIGHT=600;BOOLisFullScreen=FALSE;//初始不为全屏#defineDEG_TO_RAD0.017453floatangle=0.0;staticGLdoubleviewer[]={0,0,0,0,0};//初始化视角GLUquadricObj*quadric;//建立二次曲面对象GLfloatangle_Z;//星空旋转角度boolg_bOrbitOn=true;//控制转动暂停floatg_fSpeedmodifier=1.0f;//时间控制floatg_fElpasedTime;doubleg_dCurrentTime;doubleg_dLastTime;GLfloatLightAmbient[]={1.0f,1.0f,1.0f,0.0f};//环境光参数GLfloatLightDiffuse[]={1.0f,1.0f,1.0f,0.0f};//漫射光参数GLfloatLightPosition[]={0.0f,0.0f,0.0f,1.0f};//光源的位置//纹理图象TEXTUREIMAGEskyImg;TEXTUREIMAGEsunImg;TEXTUREIMAGErayImg;TEXTUREIMAGEmercuImg;TEXTUREIMAGEvenusImg;TEXTUREIMAGEearthImg;TEXTUREIMAGEmarsImg;TEXTUREIMAGEjupiterImg;TEXTUREIMAGEsaturnImg;TEXTUREIMAGEuranusImg;TEXTUREIMAGEneptuneImg;TEXTUREIMAGEmoonImg;GLuinttexture[12];//纹理数组//星球速度定义staticfloatfSunSpin=0.0f;//太阳自转速度staticfloatfMercuSpin=0.0f;//水星自转速度staticfloatfMercuOrbit=0.0f;//水星公转速度staticfloatfVenusSpin=0.0f;//金星自转速度staticfloatfVenusOrbit=0.0f;//金星公转速度staticfloatfEarthSpin=0.0f;//地球自转速度staticfloatfEarthOrbit=0.0f;//地球公转速度staticfloatfMarsSpin=0.0f;//火星自转速度staticfloatfMarsOrbit=0.0f;//火星公转速度staticfloatfJupiterSpin=0.0f;//木星自转速度staticfloatfJupiterOrbit=0.0f;//木星公转速度staticfloatfSaturnSpin=0.0f;//土星自转速度staticfloatfSaturnOrbit=0.0f;//土星公转速度staticfloatfUranusSpin=0.0f;//天王星自转速度staticfloatfUranusOrbit=0.0f;//天王星公转速度staticfloatfNeptuneSpin=0.0f;//海王星自转速度staticfloatfNeptuneOrbit=0.0f;//海王星公转速度staticfloatfMoonSpin=0.0f;//月亮自转速度staticfloatfMoonOrbit=0.0f;//月亮公转速度voidMakeTexture(TEXTUREIMAGEtextureImg,GLuint*texName)//转换为纹理{glPixelStorei(GL_UNPACK_ALIGNMENT,1);//对齐像素字节函数glGenTextures(1,texName);//第一个参数指定表明获取多少个连续的纹理标识符glBindTexture(GL_TEXTURE_2D,*texName);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,textureImg.imgWidth,textureImg.imgHeight,0,GL_RGB,GL_UNSIGNED_BYTE,textureImg.data);}//初始化OpenGLvoidInitGL(void){glClearColor(0.0f,0.0f,0.0f,0.5f);//设置黑色背景glClearDepth(2.0f);//设置深度缓存glEnable(GL_DEPTH_TEST);//启动深度测试glDepthFunc(GL_LEQUAL);//深度小或相等的时候渲染glShadeModel(GL_SMOOTH);//启动阴影平滑glEnable(GL_CULL_FACE);//开启剔除操作效果glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//使用质量最好的模式指定颜色和纹理坐标的插值质量glLightfv(GL_LIGHT1,GL_AMBIENT,LightAmbient);//设置环境光glLightfv(GL_LIGHT1,GL_DIFFUSE,LightDiffuse);//设置漫反射光glEnable(GL_LIGHTING);//打开光照glEnable(GL_LIGHT1);//打开光源1//载入纹理glEnable(GL_TEXTURE_2D);//开启2D纹理映射MakeTexture(skyImg,&texture;[0]);MakeTexture(sunImg,&texture;[1]);MakeTexture(rayImg,&texture;[2]);MakeTexture(mercuImg,&texture;[3]);MakeTexture(venusImg,&texture;[4]);MakeTexture(earthImg,&texture;[5]);MakeTexture(marsImg,&texture;[6]);MakeTexture(jupiterImg,&texture;[7]);MakeTexture(saturnImg,&texture;[8]);MakeTexture(uranusImg,&texture;[9]);MakeTexture(neptuneImg,&texture;[10]);MakeTexture(moonImg,&texture;[11]);quadric=gluNewQuadric();//建立一个曲面对象指针gluQuadricTexture(quadric,GLU_TRUE);//建立纹理坐标gluQuadricDrawStyle(quadric,GLU_FILL);//面填充}voidDisplay(void){glLoadIdentity();//设置观察点的位置和观察的方向gluLookAt(viewer[0],viewer[1],viewer[2],viewer[3],viewer[4],-5,0,1,0);//摄像机x,摄像机y,摄像机z,目标点x,目标点y,目标点z,摄像机顶朝向x,摄像机顶朝向y,摄像机顶朝向z//获得系统时间使太阳系有动态效果g_dCurrentTime=timeGetTime();g_fElpasedTime=(float)((g_dCurrentTime-g_dLastTime)*0.0005);g_dLastTime=g_dCurrentTime;glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);//指定GL_MODELVIEW是下一个矩阵操作的目标glTranslatef(0.0f,0.0f,-5.0f);//将坐标系移入屏幕5.0fglRotatef(10,1.0f,0.0f,0.0f);//将坐标系绕x轴旋转10度glEnable(GL_LIGHT0);//打开光源0/**********************************绘制背景星空********************************************/glPushMatrix();//当前模型矩阵入栈glTranslatef(-10.0f,3.0f,0.0f);glRotatef(angle_Z,0.0f,0.0f,1.0f);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D,texture[0]);//星空纹理glBegin(GL_QUADS);glNormal3f(0.0f,0.0f,1.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(-50.0f,-50.0f,-50.0f);glTexCoord2f(6.0f,0.0f);glVertex3f(50.0f,-50.0f,-50.0f);glTexCoord2f(6.0f,6.0f);glVertex3f(50.0f,50.0f,-50.0f);glTexCoord2f(0.0f,6.0f);glVertex3f(-50.0f,50.0f,-50.0f);glEnd();glBegin(GL_QUADS);glNormal3f(0.0f,0.0f,-1.0f);glTexCoord2f(6.0f,6.0f);glVertex3f(-50.0f,-50.0f,50.0f);glTexCoord2f(0.0f,6.0f);glVertex3f(50.0f,-50.0f,50.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(50.0f,50.0f,50.0f);glTexCoord2f(6.0f,0.0f);glVertex3f(-50.0f,50.0f,50.0f);glEnd();glBegin(GL_QUADS);glNormal3f(0.0f,1.0f,0.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(-50.0f,-50.0f,-50.0f);glTexCoord2f(6.0f,6.0f);glVertex3f(50.0f,-50.0f,50.0f);glTexCoord2f(6.0f,0.0f);glVertex3f(50.0f,-50.0f,-50.0f);glTexCoord2f(0.0f,6.0f);glVertex3f(-50.0f,-50.0f,50.0f);glEnd();glBegin(GL_QUADS);glNormal3f(0.0f,-1.0f,0.0f);glTexCoord2f(6.0f,6.0f);glVertex3f(-50.0f,50.0f,-50.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(50.0f,50.0f,50.0f);glTexCoord2f(0.0f,6.0f);glVertex3f(50.0f,50.0f,-50.0f);glTexCoord2f(6.0f,0.0f);glVertex3f(-50.0f,50.0f,50.0f);glEnd();glBegin(GL_QUADS);glNormal3f(1.0f,0.0f,0.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(-50.0f,-50.0f,-50.0f);glTexCoord2f(6.0f,6.0f);glVertex3f(-50.0f,50.0f,50.0f);glTexCoord2f(0.0f,6.0f);glVertex3f(-50.0f,-50.0f,50.0f);glTexCoord2f(6.0f,0.0f);glVertex3f(-50.0f,50.0f,-50.0f);glEnd();glBegin(GL_QUADS);glNormal3f(-1.0f,0.0f,0.0f);glTexCoord2f(6.0f,6.0f);glVertex3f(50.0f,-50.0f,-50.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(50.0f,50.0f,50.0f);glTexCoord2f(6.0f,0.0f);glVertex3f(50.0f,-50.0f,50.0f);glTexCoord2f(0.0f,6.0f);glVertex3f(50.0f,50.0f,-50.0f);glEnd();glPopMatrix();//当前模型矩阵出栈/**********************************绘制太阳************************************************/glBindTexture(GL_TEXTURE_2D,texture[2]);//光晕纹理glEnable(GL_BLEND);//开启混合glDisable(GL_DEPTH_TEST);//关闭深度测试//绘制太阳光晕glDisable(GL_LIGHTING);//关闭光照glBlendFunc(GL_SRC_ALPHA,GL_ONE);//半透明混合函数glColor4f(1.0f,0.5f,0.0f,0.5f);//设置RGBA值glBegin(GL_QUADS);glNormal3f(0.0f,0.0f,1.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,-1.0f,0.0f);glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,-1.0f,0.0f);glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f,1.0f,0.0f);glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,0.0f);glEnd();glDisable(GL_BLEND);//关闭混合glEnable(GL_DEPTH_TEST);glEnable(GL_LIGHTING);//开启光照glLightfv(GL_LIGHT1,GL_POSITION,LightPosition);//设置光源1位置glBindTexture(GL_TEXTURE_2D,texture[1]);//太阳纹理//将坐标系绕Y轴旋转fSunSpin角度,控制太阳自转glRotatef(fSunSpin,0.0,1.0,0.0);gluSphere(quadric,0.3f,32,32);//绘制太阳球体/**********************************绘制水星************************************************/glDisable(GL_LIGHT0);glEnable(GL_TEXTURE_2D);//开启纹理glPushMatrix();//当前模型视图矩阵入栈//将坐标系绕Y轴旋转fMercuOrbit角度,控制水星公转glRotatef(fMercuOrbit,0.0f,1.0f,0.0f);glRotatef(-90.0f,1.0f,0.0f,0.0f);//将坐标系绕X轴旋转-90度glTranslatef(0.5f,0.0f,0.0f);//将坐标系右移0.5fglBindTexture(GL_TEXTURE_2D,texture[3]);//水星纹理//将坐标系绕Z轴旋转fMercuSpin角度控制水星自转glRotatef(fMercuSpin,0.0f,0.0f,1.0f);gluSphere(quadric,0.04f,32,32);//水星球体glPopMatrix();//当前模型视图矩阵出栈//绘制轨道glBegin(GL_LINE_LOOP);for(angle=0;angle=-6.0)viewer[0]-=0.5;break;case'u':case'U':if(viewer[1]=-6.0)viewer[1]-=0.1;break;case'+':case'='://加速,减速,暂停g_fSpeedmodifier+=1.0f;glutPostRedisplay();break;case'':g_bOrbitOn=!g_bOrbitOn;glutPostRedisplay();break;case'-'://按'-'减小运行速度g_fSpeedmodifier-=1.0f;glutPostRedisplay();break;caseVK_ESCAPE://按ESC键时退出exit(0);break;default:break;}}voidspecial_keys(ints_keys,intx,inty){switch(s_keys){caseGLUT_KEY_F1://按F1键时切换窗口/全屏模式if(isFullScreen){glutReshapeWindow(WIN_WIDTH,WIN_HEIGHT);glutPositionWindow(30,30);isFullScreen=FALSE;}else{glutFullScreen();isFullScreen=TRUE;}break;caseGLUT_KEY_RIGHT://视角上下左右旋转if(viewer[3]=-3.0)viewer[3]-=0.1;break;caseGLUT_KEY_UP:if(viewer[4]=-4.5)viewer[4]-=0.1;break;default:break;}}voidmouse(intbtn,intstate,intx,inty)//远近视角{if(btn==GLUT_RIGHT_BUTTON&&state==GLUT_DOWN)viewer[2]+=0.3;if(btn==GLUT_LEFT_BUTTON&&state==GLUT_DOWN&&viewer;[2]>=-3.9)viewer[2]-=0.3;}voidLoadBmp(char*filename,TEXTUREIMAGE*textureImg)//载入图片{inti,j;FILE*file;BMPFILEHEADERbmpFile;BMPINFOHEADERbmpInfo;intpixel_size;//初始化纹理数据textureImg->imgWidth=0;textureImg->imgHeight=0;if(textureImg->data!=NULL){delete[]textureImg->data;}//打开文件file=fopen(filename,"rb");if(file==NULL){return;}//获取文件头rewind(file);fread(&bmpFile;,sizeof(BMPFILEHEADER),1,file);fread(&bmpInfo;,sizeof(BMPINFOHEADER),1,file);//验证文件类型if(bmpFile.bfType!=0x4D42){return;}//获取图像色彩数pixel_size=bmpInfo.biBitCount>>3;//读取文件数据textureImg->data=newunsignedchar[bmpInfo.biWidth*bmpInfo.biHeight*pixel_size];for(i=0;idata+(i*bmpInfo.biWidth+j)*pixel_size+2,sizeof(unsignedchar),1,file);//绿色分量fread(textureImg->data+(i*bmpInfo.biWidth+j)*pixel_size+1,sizeof(unsignedchar),1,file);//蓝色分量fread(textureImg->data+(i*bmpInfo.biWidth+j)*pixel_size+0,sizeof(unsignedchar),1,file);//Alpha分量if(pixel_size==4){fread(textureImg->data+(i*bmpInfo.biWidth+j)*pixel_size+3,sizeof(unsignedchar),1,file);}}}//记录图像相关参数textureImg->imgWidth=bmpInfo.biWidth;textureImg->imgHeight=bmpInfo.biHeight;textureImg->byteCount=pixel_size;fclose(file);}//程序主函数voidmain(intargc,char**argv){//读图片LoadBmp("Picture//Sky.bmp",&skyImg;);LoadBmp("Picture//Sun.bmp",&sunImg;);LoadBmp("Picture//Ray.bmp",&rayImg;);LoadBmp("Picture//Mercu.bmp",&mercuImg;);LoadBmp("Picture//Venus.bmp",&venusImg;);//金星LoadBmp("Picture//Earth.bmp",&earthImg;);LoadBmp("Picture//Mars.bmp",&marsImg;);//火星LoadBmp("Picture//Jupiter.bmp",&jupiterImg;);//木星LoadBmp("Picture//Saturn.bmp",&saturnImg;);//土星LoadBmp("Picture//Uranus.bmp",&uranusImg;);//天王星LoadBmp("Picture//Neptune.bmp",&neptuneImg;);//海王星LoadBmp("Picture//Moon.bmp",&moonImg;);glutInit(&argc;,argv);//初始化GLUT库glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH);//初始化显示模式glutInitWindowSize(WIN_WIDTH,WIN_HEIGHT);//初始化窗口大小glutInitWindowPosition(20,20);//初始化窗口位置GLuintwindow=glutCreateWindow(WIN_TITLE);//建立窗口InitGL();//初始化OpenGLglutDisplayFunc(Display);glutReshapeFunc(Reshape);glutKeyboardFunc(keyboard);glutSpecialFunc(special_keys);glutMouseFunc(mouse);glutIdleFunc(Display);//设置窗口空闲时的处理函数glutMainLoop();//进入事件处理循环}
2025/6/8 20:47:10 3.53MB 三维动画 模拟太阳系
1
共 1000 条记录 首页 上一页 下一页 尾页
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡