Win32 API设置控制台相关属性

目录

1.1 system

 1.2 title

 1.3 COORD

 1.4GetStdHandle

 1.5GetConsoleCursorInFo

 1.6 SetConsoleCursorInfo

 1.7SetConsoleCursorPosition

 1.8GetAsyncKeyState

1.9setlocale

1.10宽字符的打印


1.1 system

 设置控制台属性其实我们可以采用"win+R" 输入"cmd" 进入控制台修改

 

 然后"mode con cols=100 lines=30"设置30行100列

 

 写程序的时候一般是用编译器,其实我们还可以用C语言中的库函数system

 首先我们得把默认终端应用程序改一下否者编译时达不到我们想要的结果

 

保存退出后默认是黑色的框,可以根据自己的喜好设置背景颜色

int system( const char* command );

   调用命令处理器以执行命令

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
	//设置控制台相关属性
	system("mode con cols=30 lines=30");

	return 0;
}

 效果是一样的

 1.2 title

title命令用于修改控制台cmd窗口

    system("title 贪吃蛇");

 

 1.3 COORD

 小黑框也是有坐标的概念,为了我们后续游戏的进行,COORD是windows API中定义的一个结构体,表示一个字符在控制台屏幕缓冲区上的坐标,坐标系(0,0)的原点位于缓冲区的顶部左侧单元格

 语法

typedef struct _COORD{
 SHORT X:
 SHORT Y:

}COORD,*PCOORD;

//定义一个坐标为(x,y)的结构体名字为COORD

int main()
{//定位光标
	COORD pos  = { 10,20 };

	return 0;
}
  •  X表示水平坐标
  • Y表示纵坐标

 1.4GetStdHandle

GetStdHandle是一个Windows API函数,他用于从一个特定的标准设备(标准输入,标准输出错误)中取得一个句柄(用来标识不同设备的数值),使用这个句柄可以操作设备。

 HANDLE WINAPI GetStdHandle(_In_ DWORD nStdHandle);

//获得键盘鼠标等的句柄 

  • nStdHandle标准设备 
  • HANDLE 是一种指针

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<Windows.h>
int main()
{
	//设置控制台相关属性
	HANDLE houtput =NULL;
	houtput = GetSpoolFileHandle(STD_OUTPUT_HANDLE);
	return 0;
}

 

 1.5GetConsoleCursorInFo

检索有关指定控制台屏幕缓冲区的游标大小和可见性的信息。

typedef struct _CONSOLE_CURSOR_INFO{

DWORD dwSize;

BOLL bVisible;

}CONSOLE_CURSOR_INFO,*PCONSOLE_CURSOR_INFO;

  • bVisible ,游标的可见性,如果可见则该成员为TURE
  • dwSize光标填充的字符单元百分比,此值结余1-100光标外观会变化,范围为单元底部的水平线到完全填充

#include<stdlib.h>
#include<Windows.h>
int main()
{
	//设置控制台相关属性
		HANDLE houtput =NULL;
	houtput = GetSpoolFileHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO cursor_info = { 0 };
	GetConsoleCursorInfo(houtput,&cursor_info);
	return 0;
};

 1.6 SetConsoleCursorInfo

设置控制台屏幕缓冲区的光标的大小和可见性

原型

BOOL WINAPI SetConsoleCursorInfo{
HANDLE hConsoleOutput,

const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo

};

 1.7SetConsoleCursorPosition

定位光标的位置

 BOOL WINAPI SetConsoleCursorPosition{

_In_HANDLE hConsoleOutput,//句柄

_In_ COORD dwCursorPosition //坐标

}

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<stdbool.h>
int main()
{
	//获得输出设备的句柄
	HANDLE houtput = NULL;
	houtput = GetStdHandle(STD_OUTPUT_HANDLE);	
//定位光标的位置
	COORD pos  = { 10,20 };
	SetConsoleCursorPosition(houtput, pos);
	return 0;
}

 可以让我在屏幕上的任何位置打印信息

 

 1.8GetAsyncKeyState

获取键盘按键情况返回值为short类型,1表示按过0表示没按过

 SHORT GetAsyncKeyState

{
int  Vkey;

};

综上,我们可以用以上函数来设置控制台基本属性

1.9setlocale

setlocale 函数用于修改当前地区,第LC_ALL 第二个参数为"C"正常模式和""本地化模式

 setlocale(LC_ALL,"C");

//c语言为默认模式,库函数按正常的方式执行

setlocale(LC_ALL,"")

//切换到本地化,支持宽字符等的输出

  •  setlocale也可以来查询当前地区,第二个参数置为空就可以了
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<stdbool.h>
#include <locale.h>
int main()
{
	char* ret = setlocale(LC_ALL, NULL);
	printf("%s\n", ret);

	ret = setlocale(LC_ALL, "");
	printf("%s\n", ret);
	return 0;
}

1.10宽字符的打印

wchar_t ch=L'我';

wprintf(L"%lc\n",ch); 

  •  宽字符的字面量必须加上前缀L,否则C语言会把字面量当窄字面量处理,前缀L在单引号前面表示宽字符
  • 宽字符使用wprintf,对应wprintf()的占位符为%lc
  • 在双引号前面,表示宽字符,对应的wprintf()的占位符为%ls

  • 32
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在VS2010中使用Win32控制台应用程序来实现定时器功能有以下步骤: 1. 打开VS2010,选择创建新项目,选择Win32控制台应用程序模板。 2. 在下一步中,选择空项目并勾选“空项目”选项。 3. 创建项目后,进入“解决方案资源管理器”,右击项目名称,选择“属性”。 4. 在属性窗口中,选择“配置属性” > “链接器” > “系统”,将“子系统”选择为“控制台(/SUBSYSTEM:CONSOLE)”,然后点击“应用”按钮保存更改。 5. 打开“main.cpp”文件,进行编码。 6. 在代码中,首先包含头文件`#include<Windows.h>`,用于使用Windows API。 7. 在代码中定义回调函数`VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)`作为定时器事件处理函数。 8. 在`main()`函数中,使用`SetTimer(NULL, 0, 1000, TimerProc)`来设置定时器,第一个参数为窗口句柄,若为NULL表示当前控制台窗口,第二个参数为定时器 ID,若为0表示不需要 ID,第三个参数为定时器间隔时间(毫秒),第四个参数为定时器事件处理函数。 9. 程序运行后,每隔1秒会调用一次定时器事件处理函数。 10. 在定时器事件处理函数中,可以进行需要定时执行的操作,例如输出一段文字,并且保存到文件中,或者执行其他需要定时执行的任务。 以上就是在VS2010中使用Win32控制台应用程序实现定时器功能的大致步骤。具体的实现细节可以根据实际需求进行调整和修改。 ### 回答2: 在VS2010中,我们可以使用Win32控制台应用程序来实现定时器的功能。下面是一个简单的示例: 首先,我们需要包含Windows头文件和一些必要的函数库: ```c #include <Windows.h> #include <iostream> #pragma comment(lib, "winmm.lib") ``` 在控制台应用程序的入口点main函数中,我们可以定义一个定时器函数来处理定时器事件,通过SetTimer函数来设置定时器: ```c VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { std::cout << "定时器触发!" << std::endl; } int main() { UINT_PTR timerId = SetTimer(NULL, 0, 1000, TimerProc); // 设置定时器,每隔1秒钟触发一次TimerProc函数 if (timerId == 0) { std::cout << "定时器设置失败!" << std::endl; return 1; } // 主循环 MSG msg; BOOL bRet; while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if (bRet == -1) { // 错误处理 return 1; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } KillTimer(NULL, timerId); // 停止定时器 return 0; } ``` 上述代码中,我们定义了一个名为TimerProc的回调函数,该函数会在定时器到达指定时间间隔时被调用。在main函数中,我们使用SetTimer函数设置一个1秒钟的定时器,并传入回调函数TimerProc。然后进入主循环,等待消息的到来。最后,在程序结束前,我们使用KillTimer函数停止定时器。 以上就是在VS2010中使用Win32控制台应用程序实现定时器的简单示例。当定时器触发时,会在控制台输出"定时器触发!"。需要注意的是,由于控制台应用程序是基于消息循环的,所以需要在主循环中处理消息,以便正常接收和处理定时器事件。 ### 回答3: 在VS2010中使用Win32控制台应用程序来使用定时器实例主要有以下步骤: 1. 创建一个新的Win32控制台应用程序项目。 2. 在主函数中,使用SetTimer函数来创建定时器。SetTimer函数的原型如下: UINT_PTR SetTimer( HWND hWnd, // 窗口句柄,控制台应用程序没有窗口句柄,可以传入NULL UINT_PTR nIDEvent, // 定时器标识符,可以自定义一个ID UINT uElapse, // 定时器间隔时间,以毫秒计算 TIMERPROC lpTimerFunc // 定时器回调函数,即定时器事件处理函数 ); 3. 在定时器回调函数中处理定时器事件。定时器回调函数的原型如下: VOID CALLBACK TimerProc( HWND hwnd, // 窗口句柄,控制台应用程序没有窗口句柄,可以传入NULL UINT uMsg, // 消息标识符 UINT_PTR idEvent, // 定时器标识符,与SetTimer函数传入的值相同 DWORD dwTime // 当前时间 ); 4. 在定时器回调函数中可以添加需要定时执行的逻辑,例如打印一些信息。 5. 调用GetMessage函数或使用无限循环语句来保持控制台程序的运行。 6. 在程序结束前,使用KillTimer函数取消定时器。KillTimer函数的原型如下: BOOL KillTimer( HWND hWnd, // 窗口句柄,控制台应用程序没有窗口句柄,可以传入NULL UINT_PTR uIDEvent // 定时器标识符,与SetTimer函数传入的值相同 ); 以上是在VS2010中使用Win32控制台应用程序来使用定时器实例的基本步骤。定时器可以用于定时执行某些任务或事件,例如更新数据、刷新界面等。控制台应用程序没有窗口句柄,但定时器函数仍然可以使用,只需要将窗口句柄参数传入NULL即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熬夜苦读学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值