关于无法使用GetCurrentConsoleFont
  • 板块灌水区
  • 楼主zhangyaiwei
  • 当前回复9
  • 已保存回复9
  • 发布时间2022/10/21 21:20
  • 上次更新2023/10/27 06:37:07
查看原帖
关于无法使用GetCurrentConsoleFont
684245
zhangyaiwei楼主2022/10/21 21:20

我写了一段程序(如下)

#include<bits/stdc++.h>
#include<Windows.h>
#include<conio.h>
using namespace std;
int getch__(){
    if(_kbhit()){
        return getch();
    }
    return -1;
}
bool keys(int x){
    return (GetAsyncKeyState(x)&0x8000);
}
int Get_key(){
    char ch=getch__();
    if(ch==-32||ch==0){
        return getch__();
    }
    return ch;
}
int Wait_Get_key(){
    char ch=getch();
    if(ch==-32||ch==0){
        return getch();
    }
    return ch;
}
bool KeyDown(int x){
    return(Get_key()==x);
}
bool Wait_KeyDown(int x){
    return(Wait_Get_key()==x);
}
bool MouseDown(short x){
    switch(x){
        case 1:
            return keys(0x01);
            break;
        case 2:
            return keys(0x04);
            break;
        case 3:
            return keys(0x02);
            break;  
    }
}
int color(short r,short g,short b,char c){
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    if(hOut==INVALID_HANDLE_VALUE){
        return GetLastError();
    }
    DWORD dwMode=0;
    if(!GetConsoleMode(hOut,&dwMode)){
        return GetLastError();
    }
    dwMode|=0x0004;
    if(!SetConsoleMode(hOut,dwMode)){
        return GetLastError();
    }
    wprintf(L"\x1b[38;2;%d;%d;%dm%c",r,g,b,c);
}
int change_color(short r,short g,short b){
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    if(hOut==INVALID_HANDLE_VALUE){
        return GetLastError();
    }
    DWORD dwMode=0;
    if(!GetConsoleMode(hOut,&dwMode)){
        return GetLastError();
    }
    dwMode|=0x0004;
    if(!SetConsoleMode(hOut,dwMode)){
        return GetLastError();
    }
    wprintf(L"\x1b[38;2;%d;%d;%dm",r,g,b);
}
void colors(short r,short g,short b,string c,int Sleeps){
    for(int i=0;i<c.size();i++){
        color(r,g,b,c[i]);
        Sleep(Sleeps);
    }
}
struct position{
    int x,y;
};
position to_get_Mouse(){
    POINT p;
    CONSOLE_FONT_INFO a;
    GetCursorPos(&p);
    ScreenToClient(GetForegroundWindow(),&p);
    GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE),FALSE,&a);
    return {p.x/a.dwFontSize.X,p.y/a.dwFontSize.Y};
} 
void move_to(position pos){
    HANDLE hout;
    COORD coord;
    coord.X=pos.x;
    coord.Y=pos.y;
    hout=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hout,coord);
}
position to_get() { 
    HANDLE hStdout;
    CONSOLE_SCREEN_BUFFER_INFO pBuffer; 
    hStdout=GetStdHandle(STD_OUTPUT_HANDLE); 
    GetConsoleScreenBufferInfo(hStdout, &pBuffer); 
    return {pBuffer.dwCursorPosition.X,pBuffer.dwCursorPosition.Y};
}
void HideCursor(){
    HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO CursorInfo;
    GetConsoleCursorInfo(handle,&CursorInfo);
    CursorInfo.bVisible=false;
    SetConsoleCursorInfo(handle,&CursorInfo);
}
void ShowCursor(){
    HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO CursorInfo;
    GetConsoleCursorInfo(handle,&CursorInfo);
    CursorInfo.bVisible=true;
    SetConsoleCursorInfo(handle,&CursorInfo);
}
void cool_char(int change_range,char x,int change_char_time,short r,short g,short b){
    x-=change_range;
    for(int i=0;i<change_range;i++){
        color(r,g,b,x+i);
        Sleep(change_char_time);
        int m_x=to_get().x,m_y=to_get().y;
        move_to({m_x-1,m_y});
    }
    color(r,g,b,x+change_range);
}
void prints(string str,int Sleeps,short r=256,short g=256,short b=256,bool colorclear=true,bool change_char=true,string cursor="_",int change_char_time=5,bool clear_cursor=true,int change_range=5){
    HideCursor();
    for(int i=0;i<str.size();i++){
        if(str[i]=='\n'){
            for(int i=0;i<cursor.size();i++){
                cout<<" ";
            }
            cout<<'\n';
        }
        else{
            if(change_char){
                cool_char(change_range,str[i],change_char_time,r,g,b);
            }
            else{
                color(r,g,b,str[i]);
            }
            colors(r,g,b,cursor,0);
        }
        Sleep(Sleeps);
        int m_x=to_get().x,m_y=to_get().y;
        move_to({m_x-cursor.size(),m_y});
    }
    if(clear_cursor){
        position last=to_get();
        for(int i=0;i<cursor.size();i++){
            cout<<" ";
        }
        move_to(last); 
    }
    if(colorclear){
        change_color(256,256,256);
    }
}
void change_console_char(position positions,char change_char,bool go_back=true){
    position last=to_get();
    move_to(positions);
    cout<<change_char;
    if(go_back){
        move_to(last);
    }
}
int randint(int start,int end){
    return rand()%(start+end)+start; 
}
void Close_stop(){
    auto hStdin=GetStdHandle(STD_INPUT_HANDLE);
    DWORD mode;
    GetConsoleMode(hStdin,&mode);
    mode&=~ENABLE_QUICK_EDIT_MODE;
    SetConsoleMode(hStdin,mode);
}
void Start_stop(){
    auto hStdin=GetStdHandle(STD_INPUT_HANDLE);
    DWORD mode;
    GetConsoleMode(hStdin,&mode);
    mode=ENABLE_QUICK_EDIT_MODE;
    SetConsoleMode(hStdin,mode);
}
string int_to_string(long long x){
    stringstream K;
    K<<x;
    string a=K.str();
    return a;
}
int main(){
    Close_stop();
    HideCursor();//45,11
    prints("+==========================================+\n|                                          |\n|                                          |\n|                                          |\n|                                          |\n|                                          |\n|                                          |\n|                                          |\n|                                          |\n|                                          |\n+==========================================+",0,-1,-1,-1,false,false);
    int r=256,g=256,b=256;
    while(1){
        int xx=to_get_Mouse().x,yy=to_get_Mouse().y;
        if(MouseDown(1)){
            if(xx>0&&yy>0&&xx<43&&yy<10){
                move_to({xx,yy});
                color(r,g,b,'#');
            }
            if(xx==45){
                if(yy==1){
                    r++;
                    if(KeyDown(72)){
                        r+=9;
                    }
                }
                if(yy==2){
                    g++;
                    if(KeyDown(72)){
                        g+=9;
                    }
                }
                if(yy==3){
                    b++;
                    if(KeyDown(72)){
                        b+=9;
                    }
                }
                if(yy==4){
                    move_to({0,0});
                    prints("+==========================================+\n|                                          |\n|                                          |\n|                                          |\n|                                          |\n|                                          |\n|                                          |\n|                                          |\n|                                          |\n|                                          |\n+==========================================+",0,-1,-1,-1,false,false," ");
                }
                if(yy==5){
                    move_to({0,0});
                    prints("+==========================================+\n|##########################################|\n|##########################################|\n|##########################################|\n|##########################################|\n|##########################################|\n|##########################################|\n|##########################################|\n|##########################################|\n|##########################################|\n+==========================================+",0,-1,-1,-1,false,false," ");
                }
            }
        }
        if(MouseDown(3)){
            if(xx>0&&yy>0&&xx<43&&yy<10){
                move_to({xx,yy});
                color(r,g,b,' ');
            }
            if(xx==45){
                if(yy==1){
                    r--;
                    if(KeyDown(72)){
                        r-=9;
                    }
                }
                if(yy==2){
                    g--;
                    if(KeyDown(72)){
                        g-=9;
                    }
                }
                if(yy==3){
                    b--;
                    if(KeyDown(72)){
                        b-=9;
                    }
                }
            }
        }
        if(KeyDown(27)){
            move_to({0,10});
            break;
        }
        if(r<0){
            r=0;
        }
        if(g<0){
            g=0;
        }
        if(b<0){
            b=0;
        }
        if(r>256){
            r=256;
        }
        if(g>256){
            g=256;
        }
        if(b>256){
            b=256;
        }
        move_to({44,0});
        colors(r,g,b," #",0);
        move_to({44,1});
        colors(256,0,0," #",0);
        colors(256,256,256," r:"+int_to_string(r),0);
        move_to({44,2});
        colors(0,256,0," #",0);
        colors(256,256,256," g:"+int_to_string(g),0);
        move_to({44,3});
        colors(0,0,256," #",0);
        colors(256,256,256," b:"+int_to_string(b),0);
        move_to({44,4});
        colors(256,256,256," # black_clear",0);
        move_to({44,5});
        colors(256,256,256," # white_clear",0);
    }
}

在Dev C++上,只要开启c++11即可正常使用(如下图) 但是转到sublime_text上却编译错误(如下图) (无法使用GetCurrentConsoleFont??????

编译命令:

{
   "shell_cmd": "g++ -finput-charset=UTF-8 -fexec-charset=GBK -Wall \"${file_name}\" -o \"${file_base_name}\" && start cmd /c \"\"${file_base_name}\" & pause\"",
   "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
   "working_dir": "${file_path}",
   "selector": "source.c++",
   "encoding": "gbk",
   "variants":
   [
       {
           "name": "Single File Build",
           "shell_cmd": "g++ -finput-charset=UTF-8 -fexec-charset=GBK -Wall \"${file_name}\" -o \"${file_base_name}\""
       },
       {
           "name": "Single File Run",
           "shell_cmd": "start cmd /c \"\"${file_base_name}\" & pause\""
       },
       {
           "name": "Single File Build & Run",
           "shell_cmd": "g++ -finput-charset=UTF-8 -fexec-charset=GBK -Wall \"${file_name}\" -o \"${file_base_name}\" && start cmd /c \"\"${file_base_name}\" & pause\""
       },
       {
           "name": "Multiple Files Build",
           "shell_cmd": "g++ -finput-charset=UTF-8 -fexec-charset=GBK -Wall *.cpp -o \"${file_base_name}\""
       },
       {
           "name": "Multiple Files Run",
           "shell_cmd": "start cmd /c \"\"${file_base_name}\" & pause\""
       },
       {
           "name": "Multiple Files Build & Run",
           "shell_cmd": "g++ -finput-charset=UTF-8 -fexec-charset=GBK -Wall *.cpp -o \"${file_base_name}\" && start cmd /c \"\"${file_base_name}\" & pause\""
       }
   ]
}
//————————————————
//版权声明:本文为CSDN博主「SY-Liu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
//原文链接:https://blog.csdn.net/qq_45890382/article/details/117885025

求万能的谷民帮助!!

2022/10/21 21:20
加载中...