⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 win32commandline.cpp

📁 计算机代数系统
💻 CPP
字号:
#include <time.h>#include <stdio.h>#include <stdlib.h>#include <windows.h>#include "win32commandline.h"#define BufSz 1024bool is_NT_or_later = false;/*    This displays a message box.*/static void win_assert(BOOL condition){    if(condition) return;    LPVOID lpMsgBuf;    FormatMessage(         FORMAT_MESSAGE_ALLOCATE_BUFFER |         FORMAT_MESSAGE_FROM_SYSTEM |         FORMAT_MESSAGE_IGNORE_INSERTS,        NULL,        GetLastError(),        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language        (LPTSTR) &lpMsgBuf,        0,        NULL);    MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );    // Free the buffer.    LocalFree(lpMsgBuf);    exit(1);}void CWin32CommandLine::color_print(const LispCharPtr str, WORD text_attrib){    BOOL status;    unsigned len = strlen(str);    CONSOLE_SCREEN_BUFFER_INFO old_info;    out_console = GetStdHandle(STD_OUTPUT_HANDLE);    win_assert(INVALID_HANDLE_VALUE != out_console);    status = GetConsoleScreenBufferInfo(out_console, &old_info);    win_assert(status);    WORD old_attrib = old_info.wAttributes;    status = SetConsoleTextAttribute(out_console, text_attrib);    win_assert(status);    DWORD written;    status = WriteConsole(out_console, str, len, &written, NULL);    win_assert(status);    // restore the attributes    status = SetConsoleTextAttribute(out_console, old_attrib);    win_assert(status);}void CWin32CommandLine::color_read(LispCharPtr str, WORD text_attrib){    BOOL status;    CONSOLE_SCREEN_BUFFER_INFO old_info;    out_console = GetStdHandle(STD_OUTPUT_HANDLE);    win_assert(INVALID_HANDLE_VALUE != out_console);    status = GetConsoleScreenBufferInfo(out_console, &old_info);    win_assert(status);    WORD old_attrib = old_info.wAttributes;    status = SetConsoleTextAttribute(out_console, text_attrib);    DWORD read;    status = ReadConsole(in_console, str, 80, &read, NULL);    str[read - 2] = '\0';    win_assert(status);    // restore the attributes    status = SetConsoleTextAttribute(out_console, old_attrib);    win_assert(status);}void CWin32CommandLine::NewLine(){  ShowLine();
  color_print("\n", 0);}void CWin32CommandLine::Pause(){    int i = clock()+CLOCKS_PER_SEC/4;    while (clock()<i);}void CWin32CommandLine::ReadLineSub(LispCharPtr prompt){//    if(_is_NT_or_later){//        char buff[BufSz];//        color_print(prompt, FOREGROUND_RED | FOREGROUND_INTENSITY );//        color_read(buff, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);//        iSubLine = buff;//    }else{        CCommandLine::ReadLineSub(prompt);//    }}
void CWin32CommandLine::ShowLine(){
  ShowLine(iLastPrompt, strlen(iLastPrompt), strlen(iLastPrompt)+iSubLine.NrItems());
}
void CWin32CommandLine::ShowLine(LispCharPtr prompt, LispInt promptlen, LispInt cursor){  iLastPrompt = prompt;
  putchar('\r');							// clear line  int i;	for (i=0;i<79;i++) putchar(' ');    assert(iSubLine.NrItems() != 0);    char str[BufSz];    sprintf(str, "\r%s%s", prompt, &iSubLine[0]);    color_print(str, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY );	i = strlen(&iSubLine[0]) + promptlen;		// position cursor	for (;i > cursor+promptlen; i--)		putchar('\b');    fflush(stdout);}CWin32CommandLine::CWin32CommandLine() :    out_console(GetStdHandle(STD_OUTPUT_HANDLE)),    in_console(GetStdHandle(STD_INPUT_HANDLE)),    _is_NT_or_later(false){    win_assert(INVALID_HANDLE_VALUE != out_console);    win_assert(INVALID_HANDLE_VALUE != in_console);        // figure out the version of windows    OSVERSIONINFO osvi;     osvi.dwOSVersionInfoSize  = sizeof(OSVERSIONINFO);    GetVersionEx(&osvi);    _is_NT_or_later = (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT);        /* &&        ( (osvi.dwMajorVersion > 4) ||        ( (osvi.dwMajorVersion == 4) && (osvi.dwMinorVersion > 0) ) );*/ //    if(!_is_NT_or_later)
    {        FILE*f=fopen("history.log", "r");        if(f){            if(f){                char buff[BufSz];                while(fgets(buff,BufSz-2,f))                {                    int i;                    for(i=0;buff[i] && buff[i] != '\n';++i)                        ;                    buff[i++] = '\0';                    LispStringPtr ptr = new LispString(buff);                    iHistoryList.Append(ptr);                                }                fclose(f);            }        }    }}CWin32CommandLine::~CWin32CommandLine(){//    if(!_is_NT_or_later)
    {        FILE*f=fopen("history.log","w");        if (f){            int i;            for (i=0;i<iHistoryList.NrLines();i++)            {                fprintf(f,"%s\n",iHistoryList.GetLine(i)->String());            }            fclose(f);        }    }}LispInt CWin32CommandLine::GetKey(){    LispInt c;    c = _getch();//    if(!_is_NT_or_later){//        return c;//    }	switch (c) {		case 8:			c = eBackSpace;		// Backspace            break;		case 9:					//  Tab            c = eTab;			break;        case 13:				// Enter            c = eEnter;            break;        case 0xE0:            c = _getch();		// Get extended scan code			switch (c) {                case 75:		// left arrow key                    c = eLeft;                    break;                case 77:		// right arrow key                    c = eRight;                    break;                case 72:		// up arrow key                    c = eUp;                    break;                case 80:		// down arrow key                    c = eDown;                    break;                case 71:		// home                    c = eHome;                    break;                case 79:		// end                    c = eEnd;                    break;				case 83:		// delete					c = eDelete;					break;			}        break;	}    return c;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -