程序问答   发布时间:2022-05-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了设置控制台窗口大小以匹配 Windows 上的屏幕缓冲区大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决设置控制台窗口大小以匹配 Windows 上的屏幕缓冲区?

开发过程中遇到设置控制台窗口大小以匹配 Windows 上的屏幕缓冲区的问题如何解决?下面主要结合日常开发的经验,给出你关于设置控制台窗口大小以匹配 Windows 上的屏幕缓冲区的解决方法建议,希望对你解决设置控制台窗口大小以匹配 Windows 上的屏幕缓冲区有所启发或帮助;

使用 console functions 来控制控制台程序的布局,但我无法更改其大小。

目前,我能做的是禁用调整大小、删除按钮和更改缓冲区大小,但是如果我尝试调整窗口本身的大小,所有尝试都会失败;尽管如此,某些函数确实会调整窗口大小,但以像素为单位,因此缩放比例大大降低。

到目前为止我所做的(不是 C++ 人,只是摆弄,在语法上放轻松):

#include <iostream>
#include <windows.h>

using namespace std;

COORD conBufferSize = { 150,40 };
SMall_RECT conScreen = { 0,150,40 };

CONSolE_SCREEN_BUFFER_INFOEX csbIE;

int main()
{   
    // console opened for application
    HWND hwConsole = GetConsoleWindow();

    // hIDe it
    ShowWindow(hwConsole,SW_HIDE);
    
    // get the style for it
    DWORD style = getwindowlong(hwConsole,GWL_STYLE);

    // disable maximizing and minimizing and resizing
    style &= ~(WS_MAXIMIZEBox | WS_MINIMIZEBox | WS_SIZEBoX);
    SetwindowLong(hwConsole,GWL_STYLE,stylE);

    HANDLE hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE,NulL,CONSolE_TEXTMODE_BUFFER,null);

    SetConsoleScreenBufferSize(hConsole,conBufferSizE);

    // this does nothing to the window itself as best I can tell
    // if by "window" it means what portion of the display window you vIEw "into"
    // commented out here for functionality
    // SetConsoleWindowInfo(hConsole,TRUE,&conScreen);

    SetConsoleActiveScreenBuffer(hConsolE);
    
    // this sequence works,but seems by accIDent
    // surely there is another method?
    csbIE.cbSize = sizeof(csbIE);
    GetConsoleScreenBufferInfoEx(hConsole,&csbIE);
    csbIE.srWindow = conScreen;
    SetConsoleScreenBufferInfoEx(hConsole,&csbIE);

    // required to update styles
    // using the cx/cy parameters sets size in pixels
    // that is much smaller than buffer size which accounts for Font size
    // therefore this "doesn't" work
    SetwindowPos(hwConsole,HWND_top,SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE| SWP_SHOWWINDOW);
    
    // to look at the console until close
    while (1) {

    }

    return 0;
}

现在据我所知,如果我有一个 100 列 x 40 行的屏幕缓冲区,它不会直接转换为容纳缓冲区的窗口的大小。所以我的下一个想法是我需要确定当前控制台字体使用了多少像素,然后将缓冲区尺寸乘以它来确定像素大小并使用 SetwindowPosSetConsoleScreenBufferInfoEx 方法。>

我不确定的一件事是,为什么 srWindow 属性能够使用与 SetConsoleWindowInfo 的描述类似的描述修改显示窗口,但不会产生可辨别的变化。

解决方法

我不确定的一件事是为什么 srWindow 属性能够 用类似的描述修改显示窗口 SetConsoleWindowInfo 并没有产生明显的变化。

根据doc,

如果指定的窗口矩形超出范围,则函数失败 控制台屏幕缓冲区的边界。这意味着顶部 和 lpConsoleWindow 矩形的左成员(或计算的 顶部和左侧坐标(如果 bAbsolute 为 falSE)不能小于 零。同样,Bottom 和 Right 成员(或计算的 底部和右侧坐标)不能大于(屏幕缓冲区 高度 – 1) 和 (屏幕缓冲区宽度 – 1),分别。功能 如果 Right 成员(或计算出的右坐标)是 小于或等于Left成员(或计算出的左坐标) 或者如果底部成员(或计算出的底部坐标)小于 或等于顶部成员(或计算出的顶部坐标)。

使用 GetConsoleScreenBufferInfoEx 获取屏幕缓冲区的大小(例如:120,30)。只要SMall_RECT集合小于120、30,调用SetConsoleActiveScreenBuffer后就会看到屏幕缓冲区大小发生变化。

SMall_RECT conScreen = { 0,50,20 };
...
SetConsoleWindowInfo(hConsole,TRUE,&conScreen);
SetConsoleActiveScreenBuffer(hConsolE);

调试时请务必检查每个api的返回值。

大佬总结

以上是大佬教程为你收集整理的设置控制台窗口大小以匹配 Windows 上的屏幕缓冲区全部内容,希望文章能够帮你解决设置控制台窗口大小以匹配 Windows 上的屏幕缓冲区所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:Windows