Thay đổi kích thước console trong c++

#include <iostream>
#include <Windows.h>
using namespace std;

void SetWindowSize(SHORT width, SHORT height)
{
    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    SMALL_RECT WindowSize;
    WindowSize.Top = 0;
    WindowSize.Left = 0;
    WindowSize.Bottom = height;
    WindowSize.Right = width;

    SetConsoleWindowInfo(hStdout, 1, &WindowSize);
}

void SetScreenBufferSize(SHORT width, SHORT height)
{
    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);

    COORD NewSize;
    NewSize.X = width;
    NewSize.Y = height;

    SetConsoleScreenBufferSize(hStdout, NewSize);
}
int main()
{
    SetWindowSize(90, 20);
    SetScreenBufferSize(90, 20);
    cout << "Hello word \n";
    system("pause");

    return 0;
}

Cho mình hỏi mình đã set window size và buffer size bằng nhau nhưng màn hình console vẫn có thanh cuốn. Vì sao ạ và có cách sửa ko ạ.

Cho kích thước nhỏ hơn thử xem, chứ độ rộng là 90 (kí tự) thì lớn đấy.

4 Likes

Mình chỉnh còn 30 và 10 rồi nhưng vẫn còn thanh cuốn ấy bạn.

Bạn kéo thanh cuộn thì chữ nó có cuộn chữ theo không?

Có thể có vài ràng buộc khiến kích thước thay đổi không theo ý bạn.
Hoặc là do thanh cuộn chưa cập nhật các giá trị. :hugs:

4 Likes

Cảm ơn bạn nha. Mình đang tìm hiểu phần định dạng console nhưng làm theo bài dạy lại không giống nên chuối quá. Bạn tiện xem thử phần này giúp mình ha không được thì cũng không sao.


Chổ SetConsoleOutputCP(65001) mình muốn in ra chữ Việt theo bảng mã unikey nên đổi code page thành 65001 nhưng vẫn xuất chữ ra bị lỗi.

Phần bạn muốn hiển thị kí tự Unicode thì bạn phải chuyển cả phông chữ (font) sang phông không raster. Bạn có thể chọn thủ công để chuyển sang Consolas.
Chuột phải vào thanh tiêu đề và chọn Properties > Thẻ Font > Chọn Consolas > OK.
Còn lập trình thì có thể là:

4 Likes

sửa lại thành

    WindowSize.Bottom = height - 1;
    WindowSize.Right = width - 1;

là hết thanh cuộn nha :V :V


còn để in tiếng Việt thì phải xài wchar_t :V Viết chuỗi phải có thêm L đằng trước, ví dụ L"Nguyễn", ko xài cin, cout nữa mà xài wcin, wcout :V :V

#include <iostream>
#include <fcntl.h> //_O_WTEXT
#include <io.h>    //_setmode()
#include <string>

int main()
{
    _setmode(_fileno(stdout), _O_WTEXT); // needed for output
    _setmode(_fileno(stdin), _O_WTEXT);  // needed for input

    std::wcout << L"Nhập tên của bạn: ";
    std::wstring name;
    std::getline(std::wcin, name);
    std::wcout << L"Xin chào, " << name << L"\n";
}

nếu ko thích L"..." cho chuỗi tiếng Việt thì xài Boost.Nowide :V :V xài nowide::cout << "Chuỗi tiếng Việt" được mà cũng phải xài nowide::cin nowide::cout của nó :V

7 Likes

Thank bạn nhiều nha. Solve được hết problem luôn r =))). Mà hỏi chút sao bạn biết cái height với width phải trừ 1 thế bạn.

đọc source người ta ở đây nè =]] https://github.com/wmcbrine/PDCurses/blob/d727feea46ff3efa0c82f8a3eb1b73dee6042c61/wincon/pdcscrn.c#L514
dòng 533: rect.Right = ncols - 1;

Bottom với Right khác width và height. Ví dụ width = 10 thì Left=0, Right=9 thôi chứ :V

5 Likes

Bạn pro vl :V thank bạn lần nữa =))

kích cỡ cái console này rộng dài bao nhiêu vậy bác hì

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?