C++ 缩小控制台尺寸
我在更改控制台大小时遇到问题。这是我的代码:C++ 缩小控制台尺寸,c++,winapi,console-application,C++,Winapi,Console Application,我在更改控制台大小时遇到问题。这是我的代码: BOOL setConsole(int x, int y) { hStdin = GetStdHandle(STD_INPUT_HANDLE); hStdout = GetStdHandle(STD_OUTPUT_HANDLE); if (hStdin == INVALID_HANDLE_VALUE || hStdout == INVALID_HANDLE_VALUE) { MessageBox(NULL, TEXT("Get
BOOL setConsole(int x, int y)
{
hStdin = GetStdHandle(STD_INPUT_HANDLE);
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if (hStdin == INVALID_HANDLE_VALUE ||
hStdout == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, TEXT("GetStdHandle"),
TEXT("Console Error"), MB_OK);
return false;
}
SMALL_RECT windowSize = {0, 0, x-1, y-1};
// Change the console window size:
SetConsoleWindowInfo(hStdout, TRUE, &windowSize);
COORD c = { x, y};
//Change the internal buffer size:
SetConsoleScreenBufferSize(hStdout, c);
SetConsoleDisplayMode(hStdout,CONSOLE_FULLSCREEN_MODE, &c);
return true;
}
当我试着放大控制台时,它工作得非常好。当一个参数小于前一个参数时,不会发生任何情况。怎么了
@编辑:在一些测试之后,我注意到,如果我一次更改一个参数,则可以调整大小(减少)。示例(假设控制台为100x100)
为什么
SetConsoleScreenBufferSize
更改控制台内部缓冲区的大小。
更改它对控制台窗口范围没有影响。
如果需要对控制台的可见部分(缓冲区)产生影响,请调用SetConsoleWindowInfo
窗口缓冲区不能小于内部缓冲区,减小它也会减小内部缓冲区,
但不是相反
如果在COORDS中使用非法值调用SetConsoleScreenBufferSize
(例如,高度/宽度太小),则会得到一个
错误,通常是87'无效参数。
请尝试以下代码:
#include <iostream>
#include <windows.h>
using namespace std;
void SetWindow(int Width, int Height)
{
_COORD coord;
coord.X = Width;
coord.Y = Height;
_SMALL_RECT Rect;
Rect.Top = 0;
Rect.Left = 0;
Rect.Bottom = Height - 1;
Rect.Right = Width - 1;
HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE); // Get Handle
SetConsoleScreenBufferSize(Handle, coord); // Set Buffer Size
SetConsoleWindowInfo(Handle, TRUE, &Rect); // Set Window Size
}
int main(void)
{
SetWindow(80,40);
int dx=1,i=5,l=0;
while(l<5)
{
i=i+dx;
if( (i<1) || (i>10)){ dx=-dx; l++;}
SetWindow(10*i,5*i);
Sleep(100);
}
cout<<" \nPress any key to continue\n";
cin.ignore();
cin.get();
return 0;
}
system("mode 650");
#包括
#包括
使用名称空间std;
void SetWindow(整数宽度、整数高度)
{
_合作社;
坐标X=宽度;
坐标Y=高度;
_小直;
矩形顶部=0;
矩形左=0;
垂直底部=高度-1;
右直=宽度-1;
HANDLE HANDLE=GetStdHandle(STD_OUTPUT_HANDLE);//获取句柄
SetConsoleScreenBufferSize(句柄、坐标);//设置缓冲区大小
SetConsoleWindowInfo(句柄、TRUE和Rect);//设置窗口大小
}
内部主(空)
{
设置窗口(80,40);
int dx=1,i=5,l=0;
而(l请尝试以下代码:
#include <iostream>
#include <windows.h>
using namespace std;
void SetWindow(int Width, int Height)
{
_COORD coord;
coord.X = Width;
coord.Y = Height;
_SMALL_RECT Rect;
Rect.Top = 0;
Rect.Left = 0;
Rect.Bottom = Height - 1;
Rect.Right = Width - 1;
HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE); // Get Handle
SetConsoleScreenBufferSize(Handle, coord); // Set Buffer Size
SetConsoleWindowInfo(Handle, TRUE, &Rect); // Set Window Size
}
int main(void)
{
SetWindow(80,40);
int dx=1,i=5,l=0;
while(l<5)
{
i=i+dx;
if( (i<1) || (i>10)){ dx=-dx; l++;}
SetWindow(10*i,5*i);
Sleep(100);
}
cout<<" \nPress any key to continue\n";
cin.ignore();
cin.get();
return 0;
}
system("mode 650");
我在2012年10月15日修改了“Software_Designer”提供的代码,并创建了一个命令行实用程序来设置控制台大小和滚动缓冲区
< >我使用DEV C++().< /P>编译它。
中包含一个可执行文件。我希望这对您有所帮助
/*
* consolesize.cpp - set console size and buffer dimensions
*
* [00] 02.07.2016 CWa Initial Version
*
* inspired by: http://stackoverflow.com/questions/12900713/reducing-console-size
*
*/
#include <iostream>
#include <windows.h>
using namespace std;
// SetWindow(Width,Height,WidthBuffer,HeightBuffer) -- set console size and buffer dimensions
//
void SetWindow(int Width, int Height, int WidthBuffer, int HeightBuffer) {
_COORD coord;
coord.X = WidthBuffer;
coord.Y = HeightBuffer;
_SMALL_RECT Rect;
Rect.Top = 0;
Rect.Left = 0;
Rect.Bottom = Height - 1;
Rect.Right = Width - 1;
HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE); // Get Handle
SetConsoleScreenBufferSize(Handle, coord); // Set Buffer Size
SetConsoleWindowInfo(Handle, TRUE, &Rect); // Set Window Size
} // SetWindow
// main(Width,Height,WidthBuffer,HeightBuffer) -- main
//
int main(int argc, char *argv[]) {
int width = 80;
int height = 25;
int wbuffer = width + 200;
int hbuffer = height + 1000;
if ( argc == 5 ){
width = atoi(argv[1]);
height = atoi(argv[2]);
wbuffer = atoi(argv[3]);
hbuffer = atoi(argv[4]);
} else if ( argc > 1 ) {
cout << "Usage: " << argv[0] << " [ width height bufferwidth bufferheight ]" << endl << endl;
cout << " Where" << endl;
cout << " width console width" << endl;
cout << " height console height" << endl;
cout << " bufferwidth scroll buffer width" << endl;
cout << " bufferheight scroll buffer height" << endl;
return 4;
}
SetWindow(width,height,wbuffer,hbuffer);
return 0;
}
/*
*consolesize.cpp-设置控制台大小和缓冲区尺寸
*
*[00]2016年7月2日CWa初始版本
*
*灵感来自:http://stackoverflow.com/questions/12900713/reducing-console-size
*
*/
#包括
#包括
使用名称空间std;
//SetWindow(宽度、高度、宽度缓冲区、高度缓冲区)--设置控制台大小和缓冲区尺寸
//
void SetWindow(int-Width、int-Height、int-WidthBuffer、int-HeightBuffer){
_合作社;
坐标X=宽度缓冲区;
坐标Y=高度缓冲区;
_小直;
矩形顶部=0;
矩形左=0;
垂直底部=高度-1;
右直=宽度-1;
HANDLE HANDLE=GetStdHandle(STD_OUTPUT_HANDLE);//获取句柄
SetConsoleScreenBufferSize(句柄、坐标);//设置缓冲区大小
SetConsoleWindowInfo(句柄、TRUE和Rect);//设置窗口大小
}//设置窗口
//主(宽度、高度、宽度缓冲区、高度缓冲区)--主
//
intmain(intargc,char*argv[]){
整数宽度=80;
整数高度=25;
int wbuffer=宽度+200;
int hbuffer=高度+1000;
如果(argc==5){
宽度=atoi(argv[1]);
高度=atoi(argv[2]);
wbuffer=atoi(argv[3]);
hbuffer=atoi(argv[4]);
}否则如果(argc>1){
参加聚会不能迟到
根据MSDN和一些测试,屏幕缓冲区不能设置为小于窗口范围,或者窗口范围不能设置为大于屏幕缓冲区
一种方法是在更改缓冲区大小之前将窗口缩小到最小:
static void
set_console_size(HANDLE screen_buffer, SHORT width, SHORT height)
{
assert(screen_buffer != NULL);
assert(width > 0);
assert(height > 0);
COORD const size = { width, height };
BOOL success;
SMALL_RECT const minimal_window = { 0, 0, 1, 1 };
success = SetConsoleWindowInfo(screen_buffer, TRUE, &minimal_window);
CHECK(success);
success = SetConsoleScreenBufferSize(screen_buffer, size);
CHECK(success);
SMALL_RECT const window = { 0, 0, size.X - 1, size.Y - 1 };
success = SetConsoleWindowInfo(screen_buffer, TRUE, &window);
CHECK(success);
}
提示:检查这些操作是否失败,如果失败,请检查GetLastError()对于错误代码。一切正常,没有出现错误。嗯,这是错误的方法。你不能使它变大。窗口不能大于缓冲区,它将失败,出现错误87。你是否使用GetLargestConsoleWindowSize检查了你的坐标?或者你可以在SetConsoleScreenBuff之前调用SetConsoleWindowInfo
erSize
。在使用SetWindow()
函数时,我得到一个错误,即STD\u输出\u句柄
未定义。