首页 > 编程语言 >c++控制台

c++控制台

时间:2024-11-06 19:31:33浏览次数:2  
标签:STD FOREGROUND HANDLE GetStdHandle system c++ OUTPUT 控制台

文章简介

由于许多初学者可能都会想编一个自己的游戏,却由于表现形式不够而困扰,因此有了这篇文章。

警告:system需谨慎,死机两行泪。

一、光标

1、隐藏光标

    void HideCursor()
    {
    	CONSOLE_CURSOR_INFO cursor_info = {1, 0};
    	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
    }//隐藏光标

2、获取光标位置

作者觉得这个指令不是很常用,备用吧。

    函数返回 COORD 类型的指针位置,用 .x .y 获取 x y 坐标
void GetMouseCurPoint()
{
    POINT mypoint;
 
    for (int i = 0; i < 100; i++)
    {
        GetCursorPos(&mypoint);//获取鼠标当前所在位置
        printf("% ld, % ld \n", mypoint.x, mypoint.y);
        Sleep(1000);
    }
}

3、移动光标

参数分别是目标位置的 x y 坐标
void MouseMove(int x, int y)//鼠标移动到指定位置 
{
    double fScreenWidth = ::GetSystemMetrics(SM_CXSCREEN) - 1;//获取屏幕分辨率宽度 
    double fScreenHeight = ::GetSystemMetrics(SM_CYSCREEN) - 1;//获取屏幕分辨率高度 
    double fx = x * (65535.0f / fScreenWidth);
    double fy = y * (65535.0f / fScreenHeight);
 
    printf("fScreenWidth %lf , fScreenHeight %lf, fx %lf, fy %lf \n", fScreenWidth, fScreenHeight, fx, fy);
 
    INPUT  Input = { 0 };
    Input.type = INPUT_MOUSE;
    Input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
    Input.mi.dx = fx;
    Input.mi.dy = fy;
    SendInput(1, &Input, sizeof(INPUT));
}

    } //移动光标

4、检测鼠标

#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
if(KEY_DOWN(VK_LBUTTON))//检测左键是否按下
if(KEY_DOWN(VK_RBUTTON))//检测右键是否按下
if(KEY_DOWN(VK_MBUTTON))//检测滚轮是否按下

5、操作鼠标

mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//模拟鼠标键按下
Sleep(10);//要留给某些应用的反应时间 
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//模拟鼠标键抬起

二、窗口大小

1、调整大小

作为一个像样的游戏窗口总有一个合适的大小,不可能用控制台默认的奇怪的大小。

参数分别为窗口行列的数量
    void setsize(int col, int row)
    {
    	char cmd[64];
    	sprintf(cmd, "mode con cols=%d lines=%d", col, row);
    	system(cmd);
    }//调整窗口大小

2、固定大小

调完大小,会发现一个问题:有些不听话的玩家会自行调整窗口大小,于是我们就要固定窗口大小,禁止玩家调整。

SetWindowLongPtrA(GetConsoleWindow(), GWL_STYLE, GetWindowLongPtrA(GetConsoleWindow(),GWL_STYLE)& ~WS_SIZEBOX & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX);//固定窗口大小

键盘宏输出

#define down(a) keybd_event(a,0,0,0)//按下
#define up(a) keybd_event(a,0,2,0)//弹起
#define press(a) down(a),up(a)//a+b
A-Z 65-90
主键盘0-9 48-57
小键盘0-9 96-105
F1-F12 112 123
Backspace 8
Tab 9
Clear 12
Enter 13
Shift 16
Ctrl 17
Alt 18
Caps Lock 20
Esc 27
Spacebar 32
Page Up 33
Page Down 34
End 35
Home 36
Left 37
Up 38
Right 39
Down 40
Delete 46
Num Lock 144
\* 106
\+ 107
Enter 108
\- 109
. 110
/ 111

键盘宏输入

#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)

/*中途若需输入还是用 getch() 好
  头文件是 #include<conio.h>*/

system 系列

介绍

system函数是C语言标准库中的一个函数,用于执行系统命令,如打开网址、文件夹、创建文件夹、复制文件、运行程序等。

使用system函数可能带来安全风险,应谨慎处理用户输入的命令。

system具体函数

system("pause");

暂停文件处理 显示按任意键继续. . .


system("cls");

清除页面上的文本内容


system("start ");

打开网址,<url>是要打开的网址。

system("start https://www.luogu.com.cn/user/704697");

便是打开本人主页(点点关注呗


system("title 名称");

修改窗口名称。


system("start <folder_path>")

跟上面的<url>相似,这个指令是打开文件夹的,即替换<folder path>

  • 文件路径记得加双\\,如C:\\Users\\Administrator\\Desktop\\播放器.exe

system("mkdir <folder_path>");

在当前目录新建一个文件夹,<folder path>同样指目录。


system("copy <source_file_path> <destination_file_path>");

复制文件,其中两个板块分别为源文件路径目标文件路径

eg.


system("<program_path>");

运行程序,<program path>是应用路径,右键.exe可以获取。


system("shutdown /s /t 0");

让你的电脑关机,不要轻易使用,但可以让别人用


system("dir");

列出当前目录下的文件和文件夹。


system("date <date_string>");

设置系统时间 data_string 是时间字符串。


火车头

#include<bits/stdc++.h>
#include<windows.h>
#include<stdio.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
using namespace std; 
void HideCursor()
{
    CONSOLE_CURSOR_INFO cursor_info = {1, 0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}//隐藏光标
COORD GetCursorPos()
{
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO bInfo;
    GetConsoleScreenBufferInfo(hOut, &bInfo);
    return bInfo.dwCursorPosition;
}//获取光标位置
void gotoxy(int x, int y)
{
    HANDLE hout;
    COORD pos;
    pos.X = x;
    pos.Y = y;
    hout = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hout, pos);
} //移动光标
void setsize(int col, int row)
{
    char cmd[64];
    sprintf(cmd, "mode con cols=%d lines=%d", col, row);
    system(cmd);
}//调整窗口大小
void gu_ch()
{
	SetWindowLongPtrA(GetConsoleWindow(), GWL_STYLE, GetWindowLongPtrA(GetConsoleWindow(),GWL_STYLE)& ~WS_SIZEBOX & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX);
	//固定窗口大小
}
void Color(int a)
{
    if(a==0) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
    if(a==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
    if(a==2) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
    if(a==3) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
    if(a==4) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
    if(a==5) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
    if(a==6) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
    if(a==7) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN);
    if(a==8) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
    if(a==9) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|BACKGROUND_INTENSITY|BACKGROUND_RED);
    if(a==10) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE|BACKGROUND_INTENSITY|BACKGROUND_BLUE);
}
int main()
{
	
}

有想要补充的请 私信 / 留言

标签:STD,FOREGROUND,HANDLE,GetStdHandle,system,c++,OUTPUT,控制台
From: https://www.cnblogs.com/wonder-fu/p/18530900

相关文章

  • 对C++程序使用输入输出重定向
    一般来说,在VisualStudio使用文件重定向有三种方法:方法一:通过命令行参数实现项目→属性→配置属性→调试→命令参数然后就在这里加上你的命令行参数比如我有这样一段程序:#include<iostream>#include<fstream>#include"Sales_item.h"intmain(){ Sales_itemtrans1,......
  • c++ 嵌入 python问题
     在嵌入式Python环境中,确保你的C++应用程序能够加载静态编译的Python解释器,需要设置Python解释器的搜索路径。以下是实现这一目标的步骤:1.设置环境变量你可以通过设置环境变量 PYTHONHOME 来指定Python解释器的根目录。这个环境变量告诉Python解释器去哪里查找......
  • C++:多态中的虚/纯虚函数,抽象类以及虚函数表
    我们在平时,旅游或者是坐高铁或火车的时候。对学生票,军人票,普通票这些概念多少都有些许耳闻。而我们上篇文章也介绍过了继承与多继承。如果这些票我们都分别的去写一个类,当然很冗余,这里我们便可以去使用继承,我们假设我们的票价是由一个票价函数控制的,如果子类与父类中有着同名的......
  • QT creator 中c和c++混编问题
    今天在编译包含.c和.cpp的QT项目,在整合各种代码的时候,碰到一些问题,为了方便后查,初步总结如下:1.新版QT中一般使用g++编译cpp文件和c文件,可以在项目中同时使用c文件和cpp文件。后缀cpp文件g++自动识别为c++代码自动进行c++编译,后缀c文件自动识别为c代码进行c编译。这个时候必须注意......
  • 南沙C++信奥赛陈老师解一本通题 1225:金银岛
    ​ 【题目描述】某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋至多只能装重量为w的物品。岛上金属有ss个种类,每种金属重量不同,分别为n1,n2,...,nsn1,n2,...,ns,同时每个种类......
  • 鸿蒙开发进阶(HarmonyOS )FileUri开发指南(C/C++)
     鸿蒙NEXT开发实战往期必看文章:一分钟了解”纯血版!鸿蒙HarmonyOSNext应用开发!“非常详细的”鸿蒙HarmonyOSNext应用开发学习路线!(从零基础入门到精通)HarmonyOSNEXT应用开发案例实践总结合(持续更新......)HarmonyOSNEXT应用开发性能优化实践总结(持续更新......)场景介......
  • C++工厂模式全解析:从简单工厂到抽象工厂的进阶之路
    在软件设计中,工厂模式(FactoryPattern)是一类创建型设计模式,用于将对象的创建过程和使用过程解耦。这种设计模式在面向对象编程中非常常见,特别是在构建复杂系统时,工厂模式可以使代码更加灵活、模块化、易于扩展。工厂模式的主要类型包括:简单工厂模式(SimpleFactory)工厂方法模......
  • C++中的各种锁p8
    在多线程开发中,经常会遇到数据同步,很多情况下用锁都是一个很好的选择。C++中常用的锁主要有下面几种:互斥锁(std::mutex)这是最基本的一种锁。它用于保护共享资源,在任意时刻,最多只有一个线程可以获取该锁,从而访问被保护的资源。当一个线程获取了互斥锁后,其他试图获取该锁的线程会......
  • 【C++】踏上C++学习之旅(五):auto、范围for以及nullptr的精彩时刻(C++11)
    文章目录前言1.auto关键字(C++11)1.1为什么要有auto关键字1.2auto关键字的使用方式1.3auto的使用细则1.4auto不能推导的场景2.基于范围的for循环(C++11)2.1范围for的语法2.2范围for的使用条件3.指针空值nullptr(C++11)3.1为什么会有nullptr这个关键字?前言本......
  • 【C/C++】野指针概念以及避免方式
    C语言中的野指针详解野指针(WildPointer)是指向未定义或非法内存位置的指针。本博客讲解野指针的概念、产生原因、危害以及如何避免野指针的问题。1.什么是野指针野指针指的是未初始化或已经失效的指针变量。这些指针指向的内存位置不再有效,可能被系统回收或被其他变量使......