Chuyện là gần đây mình thấy hơi nhàm với mấy bài tập về giải thuật, lên YouTube dạo một vòng, thì thấy mấy anh làm mấy game console hay hay. Mình cũng muốn làm thử cho vui. Thấy họ sử dụng thư viện Windows.h, nên đã nghiên cứu và tổng hợp được một số thứ hay ho. Trong bài viết này, mình sẽ giới thiệu với các bạn về windows.h và các hàm thông dụng trong thư viện này nhé.

Đang xem: Màn hình console là gì

1. Windows.h là gì?

Windows.h là một header của Windows dành riêng cho ngôn ngữ lập trình C và C++. Trong đó chứa các khai báo cho tất cả các hàm (function) trong Windows API, tất cả các macro thường dùng bởi các lập trình viên Windows, và tất cả các kiểu dữ liệu (data type) sử dụng cho nhiều hàm và hệ thống con (subsystem).

2. Một số hàm hay ho trong Windows.h để vọc vạch với Console

Trong phần 1 này, mình sẽ nói về các hàm định hình màn hình Console:

> Thay đổi Console Window Size

Cú pháp:

BOOL WINAPI SetConsoleWindowInfo( _In_ HANDLE hConsoleOutput, _In_ BOOL bAbsolute, _In_ const SMALL_RECT *lpConsoleWindow);Tham số:

hConsoleOutput là một HANDLE tới đối tượng, ở đây chính là STD_OUTPUT_HANDLE thông qua hàm GetStdHandle(STD_OUTPUT_HANDLE);bAbssolute nếu TRUE thì sẽ chỉ định góc trên bên trái làm góc tọa độ; nếu FALSE thì tọa độ sẽ liên quan đến góc tọa độ của cửa sổ hiện tại.lpConsoleWindow là một con trỏ cấu trúc SMALL_RECT chỉ định các góc trên bên trái và góc dưới bên phải cho cửa số mới. Cấu trúc SMALL_RECT:

typedef struct _SMALL_RECT { SHORT Left; SHORT Top; SHORT Right; SHORT Bottom;} SMALL_RECT;Cố định Top = 0, Left = 0, các bạn chỉ cần thay đổi Right và Bottom bằng 2 giá trị lần lượt là width và height cụ thể để thay đổi kích thước của màn hình console.

Hoặc để cho nhanh gọn, các bạn có thể xây dựng một hàm như bên dưới:

void SetWindowSize(SHORT width, SHORT height){ HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); SMALL_RECT WindowSize; WindowSize.Top = 0; WindowSize.Left = 0; WindowSize.Right = width; WindowSize.Bottom = height; SetConsoleWindowInfo(hStdout, 1, &WindowSize);}Kết quả:

*

> Thay đổi Screen Buffer Size

Trước tiên, Screen Bufer Size và Window Size là khác nhau. Nếu các bạn đã từng chơi các tựa game như Liên Quân Mobile, FreeFire, PUBG, … thì bạn có thể hiểu nôm na rằng: Screen Buffer Size là toàn bộ map, còn Windows Size là khung hình mà các bạn có thể nhìn được trên màn hình. Screen Buffer Size >= Window Size.

Cú pháp:

BOOL WINAPI SetConsoleScreenBufferSize( _In_ HANDLE hConsoleOutput, _In_ COORD dwSize);Tham số:

hConsoleOutputxem ở trên.dwSize là cấu trúc COORD chỉ định kích thước mới của Screen Buffer. Cấu trúc COORD:

typedef struct _COORD { SHORT X; SHORT Y;} COORD, *PCOORD;Chỉ cần thay đổi giá trị X, Y trong COORD dwSize, là các bạn đã thay đổi đượcScreen Buffer Size của Console rồi đấy.

Xây dựng hàm:

void SetScreenBufferSize(SHORT width, SHORT height){ HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); COORD NewSize; NewSize.X = width; NewSize.Y = height; SetConsoleScreenBufferSize(hStdout, NewSize);}Kết quả:

*

Hình dưới, đã set Window Size và Screen Buffer Size bằng nhau, nên thanh cuộn (ScrollBar) biến mất.

Xem thêm: Bài 4 : Vệt Bánh Xe Là Gì – Tìm Hiểu Về Chiều Dài Cơ Sở Trên Xe

> Vô hiệu hóa thay đổi kích thước màn hình

Ngay khi đã Set Window Size và Screen Buffer Size, người dùng vẫn có thể kéo mép phải và mép dưới Console để mở rộng hoặc thu nhỏ màn hình Console. Nếu bạn không muốn họ làm vậy, bạn có thể “cấm” bằng hàm SetWindowLong():

Cú pháp:

LONG SetWindowLong( HWND hWnd, int nIndex, LONG dwNewLong); Tham số:

hWndlà mộtHandle tới window và gián tiếp đến các class trong window. Trong trường hợp này,hWnd = GetConsoleWindow();nIndex ở đây ta truyền vào là GWL_STYLE: đặt một kiểu cửa số mới.dwNewLongchỉ định giá trị thay thế ở đây ta lấy giá trị hiện tại AND với NOTWS_SIZEBOX.

Cụ thể:

void DisableResizeWindow(){ HWND hWnd = GetConsoleWindow(); SetWindowLong(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) & ~WS_SIZEBOX);}Kết quả:

>Vô hiệu hóa các nút Minimize, Maximize và Close

Để làm điều này, ta sử dụng hàm DeleteMenu().

Cú pháp:

BOOL DeleteMenu( HMENU hMenu, UINT uPosition, UINT uFlags);Tham số:

hMenu là một handle đến menu bị thay đổi.uPosition là nút menu bị xóaSC_CLOSE,SC_MINIMIZE hoặcSC_MAXIMIZE.Cho biết cách diễn giải tham số uPosition, ở đây làMF_BYCOMMAND.

Các bạn có thể tham khảo hàm sau:

void DisableCtrButton(bool Close, bool Min, bool Max){ HWND hWnd = GetConsoleWindow(); HMENU hMenu = GetSystemMenu(hWnd, false); if (Close == 1) { DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND); } if (Min == 1) { DeleteMenu(hMenu, SC_MINIMIZE, MF_BYCOMMAND); } if (Max == 1) { DeleteMenu(hMenu, SC_MAXIMIZE, MF_BYCOMMAND); }}Kết quả:

>Ẩn/Hiện thanh cuộn

KhiScreen Buffer Size > Window Size thanh cuộn sẽ hiện lên. Nó đôi khi sẽ gây cản trở, các bạn có thể ẩn nó đi.

Cú pháp:

BOOL ShowScrollBar( HWND hWnd, int wBar, BOOL bShow);Tham số:

hWnd xem ở trênwBar là là thanh cuộn muốn ẩn hoặc hiện gồm cóSB_BOTH (cả hai), SB_HORZ (thanh cuộn ngang), SB_VERT (thanh cuộn dọc).bShow nếu TRUE thì hiện, FALSE thì ẩn.

Hàm ẩn/hiện cả hai thanh cuộn:

void ShowScrollbar(BOOL Show){ HWND hWnd = GetConsoleWindow(); ShowScrollBar(hWnd, SB_BOTH, Show);}Kết quả:

*

Tạm kết

Trên đây mình đã giới thiệu với các bạn về thư viện Windows.h và một số hàm để định dạng màn hình Console. Các bạn có thể cho các hàm này vào một file header (.h) để khi cần có thể include và sử dụng ngay.

Xem thêm: Chế Độ Nghỉ Phép Của Cán Bộ Công Chức Được Quy Định Thế Nào?

Nếu thấy bài viết hữu ích hãy rate 5* và share để cho mọi người có thể tham khảo. Nếu có thắc mắc gì hay thấy bài viết còn sai sót hãy để lại một comment bên dưới nhé.

Leave a Reply

Your email address will not be published. Required fields are marked *