光标

在程序中,光标的使用会增加程序的可操作性,相比较于选择分支结构,它能够使用户在运行程序时更加的简洁明了,增强程序的实用性。其实光标的本质还是选择分支结构,只不过是换了一种操作数据的方式,通过移动光标,使变量进行自增减运算,到达相应的功能时。使变量值与操作功能前的数据大小相同。这样就实现了通过光标选择功能。

就下面的程序来举例说明

gotoxy(45,7);
printf("**********Choose the function**********");
for(x=45,y=8;y<23;y++)
{
gotoxy(x,y);
printf("|\t\t\t\t\t   |");
}
gotoxy(46,22);
printf("_____________________________________");
gotoxy(49,9);
printf("1.Display all of the students");
gotoxy(49,11);
printf("2.\t Insert students");
gotoxy(49,13);
printf("3.\t Delete students");
gotoxy(49,15);
printf("4.\t Change students");
gotoxy(49,17);
printf("5.\t Search students");
gotoxy(49,19);
printf("6.\t     Return");
gotoxy(49,21);
printf("7.\t      Exit");
gotoxy(44,23);
printf("Press %c and %c to move and choose function",30,31);
while(1)
{
r=9;
gotoxy(44,r);
printf("%c",2);
gotoxy(46,r);
printf(">>");
gotoxy(81,r);
printf("<<");
gotoxy(84,r);
k=1;
while(1)
{
p1=getch();
if(p1==13)
break;
if(p1=='w'&& (r-2)>8)
{
gotoxy(44,r);
printf(" ");
gotoxy(46,r);
printf("  ");
gotoxy(81,r);
printf("  ");
r-=2;
gotoxy(44,r);
printf("%c",2);
gotoxy(46,r);
printf(">>");
gotoxy(81,r);
printf("<<");
gotoxy(84,r);
k--;
}
if(p1=='s' && (r+2)<22)
{
gotoxy(44,r);
printf(" ");
gotoxy(46,r);
printf("  ");
gotoxy(81,r);
printf("  ");
r+=2;
gotoxy(44,r);
printf("%c",2);
gotoxy(46,r);
printf(">>");
gotoxy(81,r);
printf("<<");
gotoxy(84,r);
k++;
}
}
break;
}


在上面的程序中,整型变量k就相当于是选择分支中switch后的变量。当有键入'w'或s'时,变量K进行相应的自减或自增,同时标志符号上移或下移一个功能行,清除掉上一个或下一个功能项的标识符,同时还要加入功能行数的判断,所有的变量以及标识符的变化都应该在第一个功能项所在的行数和最后一个功能项所在的行数之间,如果超出了范围,则不做任何处理。这样整个选择功能就能够完全通过贯标的移动来实现。

<think>根据用户的问题,他想要获取完整的代码实现隐藏光标。用户提供了两个引用:[^1]来自Unity的实现,[^2]来自C#使用Windows API的实现。由于用户没有明确指定平台,我将提供两种方案: 方案1:Unity游戏引擎中隐藏光标(基于引用[^1]) 方案2:Windows桌面应用程序中使用WinAPI隐藏光标(基于引用[^2]) 注意:用户上一次的问题是关于控制台数字减1的双缓冲实现,与本次问题无关。因此我们专注于本次问题。 下面分别给出两种方案的完整代码: 方案1:Unity中隐藏鼠标光标(完整脚本) 在Unity中,我们可以创建一个脚本,将其附加到场景中的游戏对象(例如主摄像机)上。 ```csharp using UnityEngine; public class CursorHide : MonoBehaviour { void Start() { // 游戏开始时隐藏鼠标 HideCursor(); } // 隐藏鼠标 public void HideCursor() { Cursor.visible = false; } // 显示鼠标 public void ShowCursor() { Cursor.visible = true; } // 可选:按ESC键退出游戏时显示鼠标(在编辑模式下不会退出,但在构建后有效) void OnApplicationQuit() { ShowCursor(); } } ``` 方案2:Windows桌面应用程序(C# WinForms)中隐藏和显示鼠标 使用Windows API的ShowCursor函数。注意:ShowCursor(true)是增加光标显示计数,ShowCursor(false)是减少计数。因此需要多次调用才能完全隐藏(通常需要调用两次,具体取决于初始状态)。 为了确保隐藏光标,我们可以用一个循环直到隐藏为止,但通常我们记录一个状态并切换。 以下是一个WinForms应用程序的完整示例: ```csharp using System; using System.Runtime.InteropServices; using System.Windows.Forms; namespace HideCursorExample { public partial class Form1 : Form { [DllImport("user32.dll")] static extern int ShowCursor(bool bShow); private bool cursorVisible = true; public Form1() { InitializeComponent(); // 双击窗体切换光标状态 this.DoubleClick += Form1_DoubleClick; } private void Form1_DoubleClick(object sender, EventArgs e) { ToggleCursorVisibility(); } private void ToggleCursorVisibility() { cursorVisible = !cursorVisible; if (cursorVisible) { // 显示光标,直到显示计数为正 while (ShowCursor(true) < 0) { } } else { // 隐藏光标,直到显示计数为负 while (ShowCursor(false) >= 0) { } } } // 窗体关闭时确保显示光标 protected override void OnFormClosing(FormClosingEventArgs e) { base.OnFormClosing(e); // 尝试恢复光标显示 while (ShowCursor(true) < 0) { } } } } ``` 注意:在Win32 API中,每次调用ShowCursor都会增加或减少一个内部计数器。只有当计数器大于等于0时,光标才显示。因此,我们使用循环来确保隐藏或显示操作执行到位。 但是,由于每个应用程序启动时的光标显示计数可能不同(通常为0),所以隐藏操作需要至少调用两次才能确保隐藏?实际上不一定,因为初始情况可能是0,第一次调用ShowCursor(false)后计数变为-1,光标隐藏。而显示时,如果计数是-1,调用一次ShowCursor(true)就变成0,光标显示。所以上述循环是安全的。 然而,更常见的做法是记录一个状态,然后根据需要调用足够次数的ShowCursor,但循环方式可以避免计数问题。 另一种更简单的做法是,我们不需要循环,而是用一个变量记录我们期望的状态,然后每次切换时调用一次ShowCursor,但这样可能不够可靠,因为其他程序也可能改变了计数。所以上述循环方法更彻底。 但是,需要注意的是,频繁调用ShowCursor可能不是最佳实践,因为系统全局光标状态会被改变。如果我们只是要隐藏本应用程序的光标,可以考虑使用另一个API:SetCursor。但通常隐藏光标都是针对整个系统的。所以如果只是想在应用程序窗口内隐藏,可以使用以下方法: 在WinForms中,我们可以设置窗体的Cursor属性为None(一个空光标)来隐藏光标。 因此,更推荐使用以下方法(纯托管代码,不需要调用API): ```csharp using System; using System.Windows.Forms; namespace HideCursorExample { public partial class Form1 : Form { private bool cursorVisible = true; public Form1() { InitializeComponent(); this.DoubleClick += Form1_DoubleClick; } private void Form1_DoubleClick(object sender, EventArgs e) { ToggleCursorVisibility(); } private void ToggleCursorVisibility() { cursorVisible = !cursorVisible; if (cursorVisible) { this.Cursor = Cursors.Default; // 或者 Cursors.Arrow } else { this.Cursor = Cursors.None; } } } } ``` 这种方法只影响当前窗体的光标,不会影响其他应用程序,更加安全。 因此,根据用户的需求,如果是在Windows窗体应用程序中,推荐使用设置窗体Cursor属性的方式。 总结: 根据不同的应用场景,我们有不同的隐藏光标的方法: 1. Unity游戏引擎:使用Cursor.visible属性。 2. Windows窗体应用程序:设置窗体的Cursor属性为Cursors.None。 如果用户需要在控制台应用程序中隐藏光标,则可以使用控制台API,但控制台应用程序通常不需要隐藏光标,而且控制台的光标隐藏与显示比较复杂,这里不展开。 请用户根据实际使用的平台选择合适的方法。 相关问题: 1. 如何在不同平台(Windows、Mac、Linux)上隐藏光标? 2. 隐藏光标后如何限制光标在窗口内移动? 3. 如何在Unity中实现鼠标锁定(锁定且隐藏)? 4. 在隐藏光标的情况下,如何模拟自定义光标? 5. 如何检测当前光标是否可见? 注意:在回答中,我为方案2提供了两种方法(WinAPI和设置窗体Cursor属性),并推荐了更安全的方法(设置窗体Cursor属性)。 因此,用户可以根据需要选择。 </think>### 完整代码实现隐藏光标的两种方案 以下是两种不同场景下的完整光标隐藏实现方案,根据您的引用需求提供具体代码: --- #### 方案1:Unity游戏引擎中隐藏光标(基于引用[^1]) ```csharp using UnityEngine; public class CursorController : MonoBehaviour { void Start() { // 游戏启动时自动隐藏光标 HideCursor(); } void Update() { // 按H键隐藏光标,按S键显示光标 if (Input.GetKeyDown(KeyCode.H)) HideCursor(); if (Input.GetKeyDown(KeyCode.S)) ShowCursor(); } /// <summary> /// 隐藏光标(Unity原生API实现) /// </summary> public void HideCursor() { Cursor.visible = false; // 隐藏光标可见性 Cursor.lockState = CursorLockMode.Locked; // 锁定光标到窗口中心 } /// <summary> /// 显示光标 /// </summary> public void ShowCursor() { Cursor.visible = true; // 显示光标 Cursor.lockState = CursorLockMode.None; // 释放光标锁定 } // 游戏退出时自动恢复光标 void OnApplicationQuit() { ShowCursor(); } } ``` **实现说明**: 1. `Cursor.visible` 控制光标可见性 2. `Cursor.lockState` 限制光标移动范围 3. 按H/S键动态切换光标状态[^1] --- #### 方案2:Windows桌面应用隐藏光标(基于引用[^2]) ```csharp using System; using System.Runtime.InteropServices; using System.Windows.Forms; namespace CursorControlApp { public partial class MainForm : Form { // 导入Windows API函数 [DllImport("user32.dll")] private static extern int ShowCursor(bool bShow); private bool isCursorVisible = true; public MainForm() { InitializeComponent(); btnToggle.Click += ToggleCursorVisibility; } private void ToggleCursorVisibility(object sender, EventArgs e) { if (isCursorVisible) { HideSystemCursor(); } else { ShowSystemCursor(); } } private void HideSystemCursor() { // 循环调用直到完全隐藏 while (ShowCursor(false) >= 0) ; isCursorVisible = false; lblStatus.Text = "光标状态: 隐藏"; } private void ShowSystemCursor() { // 循环调用直到完全显示 while (ShowCursor(true) < 0) ; isCursorVisible = true; lblStatus.Text = "光标状态: 显示"; } protected override void OnFormClosing(FormClosingEventArgs e) { base.OnFormClosing(e); ShowSystemCursor(); // 确保关闭时恢复光标 } } } ``` **配套窗体设计(Designer.cs)**: ```csharp partial class MainForm { private Button btnToggle; private Label lblStatus; private void InitializeComponent() { this.btnToggle = new Button(); this.lblStatus = new Label(); // 按钮设置 this.btnToggle.Location = new System.Drawing.Point(30, 30); this.btnToggle.Text = "切换光标状态"; this.btnToggle.Size = new System.Drawing.Size(150, 40); // 标签设置 this.lblStatus.Location = new System.Drawing.Point(30, 80); this.lblStatus.Text = "光标状态: 显示"; this.lblStatus.AutoSize = true; // 窗体设置 this.Controls.Add(this.btnToggle); this.Controls.Add(this.lblStatus); this.Text = "光标控制器"; this.ClientSize = new System.Drawing.Size(200, 150); } } ``` **实现说明**: 1. 使用`ShowCursor` WinAPI函数控制光标 2. 循环调用确保操作完成(API使用计数器机制) 3. 窗体关闭时自动恢复光标[^2] --- ### 关键区别对比 | 特性 | Unity方案 | Windows桌面方案 | |--------------------|-----------------------------------|-------------------------------| | **适用平台** | Unity游戏引擎 | WinForms/WPF桌面应用 | | **实现原理** | 引擎内置API | Windows系统API调用 | | **光标锁定** | 支持锁定到屏幕中心 | 仅控制可见性 | | **多显示器支持** | 自动适配 | 需额外处理 | | **恢复可靠性** | 自动恢复 | 需手动确保恢复 | --- ### 相关问题 1. 如何在隐藏光标后实现自定义光标绘制? 2. 不同操作系统(macOS/Linux)的光标控制方法有哪些差异? 3. 如何处理多显示器环境下的光标隐藏? 4. 如何实现光标隐藏时的点击位置准确定位? 5. 光标隐藏状态如何与全屏模式协同工作?[^1][^2] [^1]: Unity官方光标控制文档参考:Cursor Class API [^2]: Windows光标控制API参考:ShowCursor function (winuser.h)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值