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 /?可以看到用法:
【注】下表的颜色就是十六色。
这个很好理解。
.
#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.
更多推荐
已为社区贡献1条内容
所有评论(0)