在上一篇文章中,詳細的介紹了通過格式字符串對文字進行各種設置(原文鏈接:輕松玩轉windows控制臺( 三):魔改文字和玩轉光標),比如給文字加上下劃線、高亮顯示文字等等,又著重介紹了如何靈活控制當前光標的位置,可以定位在控制臺屏幕的任意位置,可以前進、后退、上下左右四個方向任意移動等的功能。
為后期的控制臺游戲開發提供了一些準備知識,突破了我們對控制臺一成不變黑窗口的印象,原來隨著我們技能的提升,控制臺是可以被我們隨心所欲玩轉的。
控制臺就像一個盲盒,每次調試控制臺程序時,它的大小和位置都是未知的,今天,我們就來學習一下,如何設置控制臺窗口的大小。
我們通常所說的控制臺窗口的大小,其實指的是控制臺程序的顯示面積占據整個屏幕的區域,我們把這個大小,稱為控制臺的“顯示區域”,或可見區域、可視區域都可以。如圖:
我的桌面是黑色的,和控制臺的背景很相似,但是仔細看,還是能看到邊框痕跡的。紅框內的控制臺窗口的大小,稱為控制臺的“顯示區域”(可見區域)。
控制臺窗口內輸入輸出數據,以及鼠標、鍵盤等設備的響應事件、以及操作的歷史記錄等等,都被存儲在控制臺的“屏幕緩沖區”(Screen Buffer),屏幕緩存區也是有大小的,這個大小指的是能存儲的數據的多少。這樣說實際上是不準確的,但是為了降低學習的復雜度,這樣處理是最合適的,否則按下面的講法:
每個控制臺都有一個包含輸入事件記錄隊列的輸入緩沖區。當控制臺的窗口獲得鍵盤焦點時,控制臺會將每個輸入事件(例如單次擊鍵、鼠標移動或鼠標按鈕單擊)設置為它放置在控制臺輸入緩沖區中的輸入記錄。
這種描述雖然嚴謹,但是牽涉到了鼠標時間、鍵盤事件、緩沖區的數據結構等等,會讓我們的學習曲線在開始的時候就會變得陡峭,基本上就變成了從入門到放棄。在前期是不需要深入學習的,后期會在我的實戰課中逐漸學習到的。
窗口的顯示區域指的是當前控制臺窗口的外觀大小,屏幕緩沖區指的是當前控制臺窗口的數據存儲的容量的大小,我們先來講解下窗口顯示區域如何設置大小。
控制臺窗口尺寸的設置,有很多種方法,本文先介紹兩種最簡單移動的方法。一個是通過DOS命令mode來進行設置,另一個是通過windows的控制臺函數來進行設置。
我們先介紹第一種。DOS命令中有一個mode命令,mode是“模式”的意思,可以設置控制臺的模式,也可以設置打印機的模式,等等。
控制臺在DOS命令一般稱為“con”,是console的簡寫。設置控制臺的窗口大小,實際上就是設置它在屏幕上的顯示區域,有多少行多少列可見。
比如說我們設置了展示出20行,但是如果我們輸入和輸出的內容超過了20行,那么除非移動滾動條,否則是看不到的。舉個例子:
我們打開了一個控制臺窗口,如果屏幕輸入和顯示的內容超過了屏幕的顯示區域,就會自動出現滾動條,如下圖所示:
我們輸入了一個dir命令,顯示的內容的行數已經超過了窗口顯示區域的行數,所以可見區域以外的部分,就需要通過滾動條上下滾動來顯示被遮蔽的內容,無論如何滾動,控制臺窗口的可見區域大小都不會被改變的。
可見區域的行數和列數就是窗口的尺寸。通過剛才介紹的mode命令,就可以進行設置。命令如下:
mode con lines = 40 cols = 20
mode con 是設置console(控制臺)的mode(模式)的意思。lines 是行,col是colum的簡寫,后面加s是因為復數。
下面是一段演示如何通過程序來利用mode命令設置控制臺窗口尺寸的代碼:
#include <stdio.h>
#include <stdlib.h>
int main() {
int lines = 20,cols = 30;
char console_size[50];
sprintf(console_size,"mode con lines=%d cols=%d",lines,cols);
system(console_size);
printf("input lines: ");
scanf("%d",&lines);
printf("input cols: ");
scanf("%d",&cols);
sprintf(console_size,"mode con lines=%d cols=%d",lines,cols);
system(console_size);
printf("new lines = %d\nnew cols = %d\n",lines,cols);
system("pause");
return 0;
}
程序啟動時的默認控制臺窗口尺寸為20行30列,可以隨時改變窗口尺寸。注意,lines=30,和cols=20,中間不能有空格,否則命令不起作用。之所以用sprintf函數,是為了能靈活接收變量的值。程序剛開始運行窗口尺寸如下:
輸入行數15,列數30保持不變,窗口尺寸效果如下:
除了通過system函數執行DOS命令的方式以外,我們一般更常用的辦法,是通過windows提供的控制臺函數來設置控制臺窗口尺寸。函數原型如下:
BOOL SetConsoleWindowInfo(
HANDLE hConsoleOutput,
BOOL bAbsolute,
const SMALL_RECT *lpConsoleWindow);
typedef struct _SMALL_RECT {
SHORT Left;
SHORT Top;
SHORT Right;
SHORT Bottom;
} SMALL_RECT;
第一個是要用到的控制臺函數的原型定義,第二個是函數最后一個參數要用到的結構體類型的定義。我們來詳細解釋下這兩者。
SetConsoleWindowInfo,見名知義,設置控制臺窗口信息,這個函數的作用局勢用來設置控制臺的顯示區域的尺寸大小的(和之前的DOS命令一樣,不是設置屏幕緩沖區大小,都只是設置控制臺窗口顯示區域的大小,屏幕緩沖區大小后文會介紹)。
函數執行成功,會返回TRUE,失敗返回FALSE。第一個參數需要傳入某個控制臺的句柄值 ,句柄的用法我們在之前的系列文章里已經介紹過了,這里不再贅述,一般都是通過GetStdHandle函數獲取到當前控制臺窗口的句柄值,然后傳入即可。
第二個參數是狀態開關,如果FALSE,則我們傳入的窗口尺寸是相對值,如果是TRUE,則傳入的窗口尺寸是絕對值。相對值是指相對于當前控制臺窗口尺寸的偏移量。絕對值,是指重新指定一組新的窗口尺寸,下面的演示代碼就是使用的是絕對值用法。
最后一個參數,是一個SMALL_RECT結構體。如果狀態開關是TRUE的話,這個結構體存放的是新的窗口的尺寸大小。因為后面控制臺系列文章中,要經常用到。下面就詳細介紹下。
RECT是rectangle的簡稱,矩形的含義。每一個窗體都是一個矩形的結構。船體一般有4個頂點共同構成一塊矩形區域,但是如果指定了左上頂點和右下頂點的位置,那么這個矩形實際上也就被唯一確定了。
左上頂點一般由x坐標和y坐標組成。之前文章已經說過,整個屏幕的坐標軸,包括GUI圖形的坐標軸,都是把左上頂點作為原點,往下是y軸,往右是x軸。
因此我們控制臺窗口也是這樣。左上角是坐標軸原點,y軸一般稱為Top(top),x軸一般稱為Left(left)。因為是原點,所以Top和Left一般默認為:Top = 0,left= 0。以此類推,右下角坐標的x軸我們一般稱為Right(right),y軸稱為Bottom(bottom)。
實際上bottom就是行數,right就是列數(每一行的可見字符個數)。
small是指這個矩形的4個成員變量的數據類型都是short類型。small表示小,shaort表示短整型。
我們假設控制臺的顯示區域(可見區域)是15行40列(每行可見40個字符),給出演示代碼如下:
#include <windows.h>
int main() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SMALL_RECT newWindowSize = {0, 0, 39, 14}; // 設置新的窗口尺寸,寬度為40字符,高度為15行
SetConsoleWindowInfo(hConsole, TRUE, &newWindowSize);
system("pause");
return 0;
}
首先通過GetStdHandle獲取標準設備的句柄,參數指定了要獲取句柄的標準設備的類型是什么,本例是控制臺,STD_OUTPUT_HANDLE,指的就是控制臺對象的句柄。
然后定義一個區域的大小,作為新的控制臺窗口的尺寸。從0開始,直到39,一共右40個字符,從0到14,一共15行。狀態標志一定要是TRUE,表示是通過絕對值來設置新的窗口尺寸。
程序運行效果如圖所示:
本文主要講解了控制臺窗口的大小不僅僅是屏幕上看見的“顯示區域”(可見區域),還包括窗口輸入輸出的數據的存儲大小。
并且通過代碼詳細演示了如何設置控制臺窗口的顯示區域(可見區域)的尺寸,并且給出了2個實現的方法,特別提醒的是,這2個方法只是講解了控制臺顯示區域的大小設置,他們的屏幕緩沖區的大小都是操作系統設置的默認值。
下一篇將詳細講解控制臺屏幕緩沖區的設置(ScreenBufferSize),包括獲取當前控制臺窗口的默認緩沖區的大小,以及如何設置成新的大小等實際操作。
段譽,24年2月12日(年初三),寫于合肥。
在Windows 10中,我們可以通過一條命令來設置電腦的IP地址,不用再用鼠標點來點去。
通過netsh命令來實現直接修改IP地址,如DHCP自動獲取或靜態IP設置。
實戰開始......
在這里面輸入“cmd”,然后點擊確定,打開命令提示符窗口。
我們就可以在這里輸入命令了。
輸入完成按鍵盤上的回車,就會顯示當前的網絡配置情況。
紅色方框中的名字就是我們的網卡名稱,在這里我們可以看到DHCP是否啟用,ipv4地址,子網掩碼,網關還有DNS服務器。我們現在重點關注網卡名稱“以太網”,這個名字和我們在網絡適配器中看到的是一致的。
netsh interface ipv4 set address name="以太網" static 192.168.1.100 255.255.255.0 192.168.1.1
設置完成后我們可以通過ipconfig/all命令來查看一下是否生效。
我們看到IP地址已經修改成我們想要的IP了。
netsh interface ip set dns name="以太網" static 8.8.8.8
我們先來看一下現在的DNS服務器地址,還是通過ipconfig/all命令。
現在的DNS服務器IP是223.5.5.5。下面我們執行一下上面的命令在看一下,DNS地址已經修改成8.8.8.8了。
netsh interface ip set address name="以太網" source=dhcp
總結:一條簡單的命令就可以修改IP地址,是不是很方便,快來學習起來吧。