C语言调整控制台颜色、大小、标题、文字位置、窗口位置、按钮

控制台是编程中最实用的窗口,下面几招可以随心控制控制台。

1.改变颜色

(1)全局

用color指令可以迅速调节全控制台的文字颜色及背景颜色:

#include <stdio.h>
#include <stdlib.h>
int main()
{
  printf("PureColorText\n");
  system("pause");
  system("color 0A");
  printf("\nTurn to green\n");
  system("pause");
  return 0;
}

可以发现最后修改了全部文字的颜色。
color本身就是系统带的,在cmd打color /?可以看到用法:
【注】下表的颜色就是十六色。
color用法
这个很好理解。
.

#include <windows.h>
(2)局部

那么怎么改一小部分的颜色呢?就稍微有些麻烦:

VOID SetColor(UINT uFore,UINT uBack) {
 HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
 SetConsoleTextAttribute(handle,uFore+uBack*0x10);
}

用了俩Windows API,这样就比较方便了:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
VOID SetColor(UINT uFore,UINT uBack) {
 HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
 SetConsoleTextAttribute(handle,uFore+uBack*0x10);
}
int main()
{
  SetColor(14,0);
  printf("Colorful ");
  SetColor(11,0);
  printf("Text\n");
  system("Pause");
  return 0;
}

这样就有两种颜色了。
请注意这里的参数与前面的color是相反的.

2.改变控制台大小

为了让输出内容更有条理,需要改变控制台大小。
这里用了另一个命令.

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
void SetSize(unsigned uCol,unsigned uLine)
{
 char cmd[64];
 sprintf(cmd,"mode con cols=%d lines=%d",uCol,uLine);
 system(cmd);
}
int main()
{
  SetSize(80,3);
  printf("Very very long....................................\n");
  system("Pause");
  return 0;
}

这样就弄出一个非常长的控制台,但有点缺陷就是有点延时。

3.换标题

默认的标题是文件路径,超长一串不美观。用这个可以更换标题。

VOID SetTitle(LPCSTR lpTitle) {
 SetConsoleTitle(lpTitle);
}

往里投个常量字符串参数就能改变标题了.

4.指定文字输出坐标

这个功能就比较厉害了,在做游戏里就很实用。

VOID SetPosC(COORD a) { // set cursor
 HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);
 SetConsoleCursorPosition(out, a);
}
VOID SetPos(int x, int y) { // set cursor2
 COORD pos= {x, y};
 SetPosC(pos);
}

两种改变方式,一个传坐标,一个直接传xy(单位:字符长宽).
可以直接跳到所指区域,很方便!

5.改变窗口位置

这个功能也不是非常重要:

//2021/07/18 补添此函数:因为C语言不支持函数重载
RECT GetWindowRect2(HWND hwnd){ //换个名称即可   
 RECT rt;   
 GetWindowRect(hwnd,&rt);  //这是Windows原版函数  
 return rt; 
}

LONG GetWindowWidth(HWND hwnd){
 RECT rect=GetWindowRect2(hwnd);
 return (rect.right - rect.left);
}
LONG GetWindowHeight(HWND hwnd){
 RECT rect=GetWindowRect2(hwnd);
 return (rect.bottom - rect.top);
}
WINBOOL MoveWindow2(HWND hwnd,
                   int X,int Y,
                   BOOL bRepaint) //2021/07/23 修改此处:删除C语言不支持的bool和默认参数
 {
 LONG w,h;
 w=GetWindowWidth(hwnd);
 h=GetWindowHeight(hwnd);
 MoveWindow(hwnd,X,Y,w,h,bRepaint);	//原版函数
}

请用第三个函数就能移动控制台了,说一下参数:

WINBOOL MoveWindow2(HWND hwnd, //窗口句柄
                   int X,int Y, //指定屏幕内坐标(单位:像素)
                   BOOL bRepaint);	 //是否重绘窗口

用的时候很简单:

//2021/07/23: 参数填完整
//2021/07/25: 又忘了C不能函数重载,再次改名
MoveWindow2(GetConsoleWindow(),100,100,TRUE);	//把控制台拖到(100,100) 重绘窗口

6.隐藏光标

控制台输出、输入时都有一个下划线光标在那里闪,用这个函数可以隐藏它:

VOID HideConsoleCursor(VOID) {
 CONSOLE_CURSOR_INFO cursor_info = {1, 0};
 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), 
                      &cursor_info);
}

直接调用即可。

7.让关闭按钮无效化

这个用于很作死或者有特殊目的的程序:

VOID KillConsoleCloseButton(VOID) {
 DeleteMenu(GetSystemMenu(GetConsoleWindow(), FALSE), 
                          SC_CLOSE, MF_DISABLED);
 DrawMenuBar(GetConsoleWindow());
}

8.关闭控制台的一些默认模式

#define DISABLE_QUICK_EDIT_MODE 0x01
#define DISABLE_INSERT_MODE 0x02
#define DISABLE_MOUSE_INPUT 0x03 
#define DISABLE_ALL (DISABLE_QUICK_EDIT_MODE | DISABLE_INSERT_MODE | DISABLE_MOUSE_INPUT)

VOID CloseConsoleMode(UINT uTag)
{	//通用函数
	HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);  
        DWORD mode;  
        GetConsoleMode(hStdin, &mode);  
        if(uTag & DISABLE_QUICK_EDIT_MODE)
        	mode &= ~ENABLE_QUICK_EDIT_MODE;  //移除快速编辑模式
    	if(uTag & DISABLE_INSERT_MODE)
        	mode &= ~ENABLE_INSERT_MODE;      //移除插入模式
        if(uTag & DISABLE_MOUSE_INPUT)
        	mode &= ~ENABLE_MOUSE_INPUT;
        SetConsoleMode(hStdin, mode);  
    return;
}
VOID CloseConsoleQuickEditMode(VOID)
{	//关闭快速编辑模式,这个很好用
	CloseConsoleMode(DISABLE_QUICK_EDIT_MODE);
}
VOID CloseConsoleInsertMode(VOID)
{	//关闭插入模式?我也不是很懂
	CloseConsoleMode(DISABLE_INSERT_MODE);
}
VOID CloseConsoleMouseInput(VOID)
{	//关闭鼠标输入?我也不是很懂
	CloseConsoleMode(DISABLE_MOUSE_INPUT);
}

当你需要在控制台程序上进行鼠标操作时,你会发现选中了文字,就很烦,于是这段代码就很有用

int main()
{
    CloseConsoleQuickEditMode();	//关闭快速编辑模式
    printf("关闭之后选中文字必须要右键菜单里选择了");
    getchar();
    return 0;
}

9.隐藏控制台

WINBOOL HideConsole() {
	HWND hwndc=GetConsoleWindow();
	//         FindWindow("ConsoleWindowClass",NULL); //也可以
	return ShowWindow(hwndc,SW_HIDE);
}

隐藏控制台的方法很多好吧

10.控制台置顶

这函数都是任何窗口通用的,把句柄换掉就行了

VOID FloatConsole() //(保持)置顶 
{
	SetWindowPos(GetConsoleWindow(),HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_DRAWFRAME);
	//                             HWND_TOP:顶端   HWND_TOPMOST: 保持顶端   HWND_BOTTOM:底端
	//SetForegroundWindow(GetConsoleWindow());
}
VOID UnfloatConsole()
{	//取消置顶
	SetWindowPos(GetConsoleWindow(),HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_DRAWFRAME);
}

11.丢弃控制台

控制台直接脱离程序。程序依然能运行,但是控制台却退出了

FreeConsole();	//in wincon.h which is in windows.h

12.字体设置

(20221224)不好意思,这么重要的内容现在才发现
直接看别的同志总结的优秀的代码吧:
如何用c改变控制台字体以及字体大小?
.
.
.
//注意:使用以上所有开头大写的名称比较正式的函数(Pascal命名法)都是WINAPI, 必须包含windows.h.

  • 195
    点赞
  • 814
    收藏
    觉得还不错? 一键收藏
  • 30
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值