整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          輕松玩轉windows控制臺(七)窗口的移動、居中和

          輕松玩轉windows控制臺(七)窗口的移動、居中和隱藏

          在前面

          上一篇寫的是關于控制臺屏幕緩沖區滾動機制的剖析,費了我老鼻子勁。平時覺得非常簡單的知識點,等落筆成文時,才發現非常不容易。找遍全文,都是掛一漏萬,沒有系統講解的。微軟的MSDN。。。呵呵,大家懂的都懂。新手看不懂,老手不需要看,就是個工具書。

          最后雖然寫成了,但是非常不滿意,本來這個windows控制臺的主題,本意是想寫的好玩、輕松、有趣。因為主要是面向c和c++的初學者,能讓平時枯燥無比的控制臺,也能玩出很多花樣,沒想到寫到第六期,竟然越來越復雜,越來越面目可憎。

          今天一定要重新開始,寫點簡單又有意思的小技巧,這樣學起來也不累。

          移動窗口

          前面也陸陸續續的介紹了窗口操作的一些技巧,但是最重要的卻遺漏了。就是每次控制臺程序啟動時,窗口在屏幕上的位置好像都出現過,但是就是沒有居中過。特別是對一些強迫癥,或者完美主義者來說,是無法接收的。。。

          讓窗口居中有很多辦法。我們先來看看如何移動窗口的。下面是一段把控制臺從屏幕上一個位置移動到另一個位置的代碼:

          #include <windows.h>
          #include <stdio.h>
          #include <stdlib.h>
          int main(){
              HWND hwnd=GetConsoleWindow();
              RECT rect;
              GetWindowRect(hwnd,&rect);
              int newX,newY,width,height;
              width=rect.right - rect.left + 1;
              height=rect.bottom - rect.top + 1;
              newX=300,newY=300;
              getchar();
              MoveWindow(hwnd,newX,newY,width,height,FALSE);
              getchar();
              return  0;
          }

          下面是程序運行后效果截圖:

          圖1

          然后再點擊回車鍵,窗口被改變位置:

          圖2

          程序比較簡單,用到了這樣幾個函數:

          HWND GetConsoleWindow(void);

          見名知意,得到當前控制臺程序的窗口句柄,返回值是控制臺所使用的窗口句柄。

          HWND,是Handle Window的縮寫,H是handle,句柄的縮寫,句柄的概念我們已經介紹多次,初學者就理解為類似指針,用以唯一表示一個對象的標識符即可。WND是window的縮寫,表示“窗口對象”,windows程序,就是由一個個“窗口”組成的程序。

          實際上HWND就是HANDLE,用HWND表示,就是強調這是一個窗口對象句柄。看看定義便可以知道:

          typedef HANDLE HWND;
          BOOL GetWindowRect(HWND hWnd,LPRECT lpRect);

          見名知意,得到窗口對象的矩形值,返回值為TRUE,表示獲取成功。HWND是一個輸入參數,綁定一個窗口對象。

          第二個參數是一個輸出型參數,LPRECT類型中的LP,表示指針,RECT表示一個結構體類型,組合起來LPRECT就是一個指向RECT結構體類型的指針。

          RECT結構體和之前文章中講解的SMALL_RECT類型類似,區別在于成員變量是LONG類型。RECT結構體定義如下:

          typedef struct tagRECT {
          LONG left;
          LONG top;
          LONG right;
          LONG bottom;
          } RECT;

          通過這個函數可以獲取當前控制臺窗口的左上角和右下角坐標,這個坐標不是之前文章中說的坐標是相對于屏幕緩沖區的相對位置的坐標,此處是相對于顯示器屏幕左上角(0,0)的相對位置的坐標(假定不是子窗口),這樣就可以計算出當前窗口的矩形面積的寬width和高height,移動窗體時需要用到。

          移動窗體windows提供了一個MoveWindow函數,函數原型如下:

          BOOL MoveWindow(HWND hWnd, int X,int Y, int nWidth, int nHeight, BOOL bRepaint);

          返回值為TRUE則執行成功,傳入一個窗體句柄(HWND類型,盡量不要傳入HANDEL類型),X和Y表示要移動到的新位置的左上角的坐標。(之前已經說過X是橫坐標,Y是縱坐標,計算機系統以左上角為坐標原點)。

          如果在移動窗體的過程中,保持窗體大小不變,那么就要用GetWindowRect函數獲取窗體的頂點坐標,并計算出寬和高,然后傳入到對應的參數。如果需要改變窗體的大小,可以直接填入新的寬和高。

          最后一個參數一般都默認為FALSE,因為還沒學到窗體重繪,暫時不展開講解。

          總結一下,首先通過GetConsoleWindow()函數獲得當前控制臺窗口的HWND窗體句柄值, 通過GetWindowRect函數,獲得控制臺窗口在屏幕上所占據的矩形面積的寬和高,然后通過MoveWindow函數移動窗體到新的位置。

          下面的例子演示了窗體在移動過程中同事調整尺寸的效果:

          #include <windows.h>
          #include <stdio.h>
          #include <stdlib.h>
          int main(){
              HWND hwnd=GetConsoleWindow();
              RECT rect;
              int newX,newY,width,height;
              newX=300,newY=300;
              width=500;
              height=350;
              MoveWindow(hwnd,newX,newY,width,height,FALSE);
              getchar();
              return  0;
          }

          程序運行的效果如圖:

          圖3

          控制臺程序運行時,自動調整好窗口的尺寸和位置。

          窗口居中

          有了前面移動窗口的基礎知識,再讓窗口居中就非常簡單了。

          基本思路:窗口的寬度和高度的中心點,一定也是屏幕的寬度和高度的中心點。所以只需要知道屏幕的寬度和高度,然后求出他們的1/2的值,其實就是窗口的寬高的中心點。

          實現代碼如下:

          #include <windows.h>
          #include <stdio.h>
          #include <stdlib.h>
          int main(){
              HWND hwnd=GetConsoleWindow();
              RECT rect;
              GetWindowRect(hwnd,&rect);
              int newX,newY,width,height;
              width=rect.right - rect.left + 1;
              height=rect.bottom - rect.top + 1;
              int screen_width=GetSystemMetrics(SM_CXSCREEN);
              int screen_height=GetSystemMetrics(SM_CYSCREEN);
              newX=(screen_width - width)/2;
              newY=(screen_height - height) /2;
              MoveWindow(hwnd,newX,newY,width,height,FALSE);
              getchar();
              return 0;
          }

          程序運行的效果如下:

          圖4

          這個程序中,用到了一個很重要的GetSystemMetrics函數。Metrics,指標、配置,System Metrics,即系統相關的指標,配置等參數。函數原型如下:

          int GetSystemMetrics( [in] int nIndex);

          傳入的參數代表不同功能的枚舉常量,大部分枚舉常量都是與某個圖形對象的寬度、高度、粗細有關。下面列舉了部分枚舉常量,全部的詳細信息從MSDN都可以查閱到。

          SM_CMONITORS 80  
          桌面上的顯示器數量。
          
          SM_CMOUSEBUTTONS43  
          鼠標上的按鈕數,如果未安裝鼠標,則為零。
          
          SM_CXFULLSCREEN 16
          主顯示器上全屏窗口的工作區寬度(以像素為單位)。
          
          SM_CXSCREEN 0
          主顯示器的屏幕寬度(以像素為單位)。
          
          SM_CYFULLSCREEN 17
          主顯示器上全屏窗口的工作區高度(以像素為單位)。
          
          SM_CYSCREEN 1
          主顯示器的屏幕高度(以像素為單位)。
          
          SM_SWAPBUTTON 23
          如果鼠標左鍵和右鍵的含義互換,則為非零;否則為 0。

          下面這個程序是對這個函數的部分枚舉常量編寫的演示代碼:

          #include <windows.h>
          #include <stdio.h>
          #include <stdlib.h>
          int main(){
              int  cnt_monitor=GetSystemMetrics(SM_CMONITORS);
              printf("顯示器有 %d 臺。\n",cnt_monitor);
              int cnt_mouse=GetSystemMetrics(SM_CMOUSEBUTTONS);
              printf("鼠標有 %d 個按鈕。\n",cnt_mouse);
              int height_screen_contain_taskbar=GetSystemMetrics(SM_CYSCREEN);
              printf("包含任務欄的屏幕高度:%d\n",height_screen_contain_taskbar);
              int height_screen_above_taskbar=GetSystemMetrics(SM_CYFULLSCREEN);
              printf("任務欄上面屏幕高度:%d\n",height_screen_above_taskbar);
              int width_full_screen=GetSystemMetrics(SM_CXFULLSCREEN);
              printf("屏幕寬度full mode:%d\n",width_full_screen);
              int width_screen=GetSystemMetrics(SM_CXSCREEN);
              printf("屏幕寬度:%d\n",width_screen);
              int swap_mouse_btn=GetSystemMetrics(SM_SWAPBUTTON);
              if(swap_mouse_btn)
                  printf("鼠標按鈕功能被互換。\n");
              else{
                  printf("鼠標按鈕功能正常。\n");
              }
              getchar();
              return 0;
          }

          程序運行截圖如下:

          圖5

          注意,運行結果中說有2臺顯示期,不是指打開的2臺顯示器,而是必須如下圖所示,設置為“擴展”模式的顯示器。如果選擇“復制“模式,則多臺顯示器也計為1臺。

          圖6

          之所以有8個鼠標按鈕,是因為無線鼠標、觸控板、ThinkPad上的紅點加起來一共有8個按鈕。

          SM_CYSCREEN,表示顯示器整個屏幕的垂直高度,CYFULLSCREEN,表示屏幕中未遮擋區域的垂直高度,如果底部有任務欄,那么任務欄就屬于遮擋屏幕的區域,它的高度要被扣除,在我的屏幕上,底部任務欄高度=960 - 897 (像素)。

          SM_CXFULLSCREEN 和 SM_CXSCREEN ,都是獲取屏幕的寬度,區別在于,當任務欄在左側或右側顯示時,SM_CXFULLSCREEN的屏幕寬度,是不包含任務欄區域的屏幕寬度,而SM_CXSCREEN是整個顯示器屏幕區域的大小。如果任務欄在屏幕底部,那么這兩個的值是相同的,在我的顯示器上都是1707像素。

          通過GetSystemMetrics函數獲取到了屏幕的高度和寬度后,需要計算出當前矩形窗口居中時,左上角的坐標值,然后通過MoveWindow函數,移動到對應的區域,即可實現“窗體居中”的效果。

          窗口隱藏和顯示

          有時候,我們需要控制臺程序保持運行,但又不顯示在屏幕上,就需要用到“窗口隱藏”。通過ShowWindow函數,就可以靈活的控制窗口的隱藏和各種顯示方式。函數原型如下:

          BOOL ShowWindow(HWND hWnd,int nCmdShow);

          第二個參數通過各種枚舉常量來設置窗口的顯示狀態。部分功能的枚舉常量如下:

          1.使窗口處于激活狀態的顯示方式:

          SW_HIDE  0
          隱藏窗口。
          
          SW_NORMAL 1 
          激活并顯示窗口。如果窗口被最小化、最大化或排列,系統會將其恢復到其原始大小和位置。
          
          SW_SHOWMINIMIZED  2
           激活窗口并將其顯示為最小化窗口。
          
          SW_SHOWMAXIMIZED
           SW_MAXIMIZE  3 
          激活窗口并將其顯示為最大化窗口。
          
          SW_SHOW 5 
          激活窗口并按其當前大小和位置顯示窗口。
          
          SW_RESTORE 9 
          激活并顯示窗口。如果窗口被最小化、最大化或排列,系統會將其恢復到其原始大小和位置。

          2.顯示但不激活窗口的方式:

          SW_SHOWNOACTIVATE  4 
          以最近的大小和位置顯示窗口。此值與 SW_SHOWNORMAL 值類似,只是窗口未激活。
          
          SW_MINIMIZE  6 
          最小化指定的窗口,并按 Z 順序激活下一個頂級窗口。
          
          SW_SHOWMINNOACTIVE  7 
          將窗口顯示為最小化窗口。此值與 SW_SHOWMINIMIZED 類似,只是窗口未激活。
          
          SW_SHOWNA 8
          以窗口的當前大小和位置顯示窗口。此值與 SW_SHOW 值類似,只是窗口未激活。
          

          下面是部分顯示方式的示例代碼:

          #include <windows.h>
          #include <stdio.h>
          #include <stdlib.h>
          int main(){
              HWND hwnd=GetConsoleWindow();
              RECT rect;
              GetWindowRect(hwnd,&rect);
              int newX,newY,width,height;
              width=rect.right - rect.left + 1;
              height=rect.bottom - rect.top + 1;
              int screen_width=GetSystemMetrics(SM_CXSCREEN);
              int screen_height=GetSystemMetrics(SM_CYSCREEN);
              newX=(screen_width - width)/2;
              newY=(screen_height - height) /2;
              MoveWindow(hwnd,newX,newY,width,height,FALSE);
              Sleep(500);
              ShowWindow(hwnd,SW_HIDE);
              Sleep(500);
              ShowWindow(hwnd,SW_NORMAL);
              Sleep(500);
              ShowWindow(hwnd,SW_SHOWMINIMIZED);
              Sleep(500);
              ShowWindow(hwnd,SW_MAXIMIZE);
              Sleep(500);
              ShowWindow(hwnd,SW_MINIMIZE);
              Sleep(500);
              ShowWindow(hwnd,SW_SHOWNOACTIVATE);
              Sleep(500);
              return 0;
          }

          因程序界面動態變化,就不截圖了。

          下面這段代碼,演示了控制臺程序窗口閃爍的特效:

          #include <windows.h>
          #include <stdio.h>
          #include <stdlib.h>
          int main(){
              HWND hwnd=GetConsoleWindow();
              RECT rect;
              GetWindowRect(hwnd,&rect);
              int newX,newY,width,height;
              width=rect.right - rect.left + 1;
              height=rect.bottom - rect.top + 1;
              int screen_width=GetSystemMetrics(SM_CXSCREEN);
              int screen_height=GetSystemMetrics(SM_CYSCREEN);
              newX=(screen_width - width)/2;
              newY=(screen_height - height) /2;
              MoveWindow(hwnd,newX,newY,width,height,FALSE);
              int flag=1;
              while(1){
                  if(flag){
                    ShowWindow(hwnd,SW_HIDE);
                    flag=0;
                  }else{
                    ShowWindow(hwnd,SW_SHOW);
                    flag=1;
                  }
                  Sleep(200);
              }
              return 0;
          }

          窗口閃爍效果如下:


          <script src="https://lf3-cdn-tos.bytescm.com/obj/cdn-static-resource/tt_player/tt.player.js?v=20160723"></script>

          Sleep函數,是讓當前程序執行到此處,暫停規定的毫秒數之后再繼續執行下一條指令。參數就是一個具體的數值,代表暫停的毫秒數。建議編譯前,一定要把Sleep的毫秒數調大,不然閃爍太快,不容易關閉程序[憨笑][呲牙]

          總 結

          沒有什么可總結的,今天的幾個用法,非常簡單,實驗一下即可,如果感興趣,也可以在MSDN上看更擴展的關聯函數功能。

          段譽,2024年2月17日,寫于合肥。

          要讓你的Excel表格看起來既專業又整潔?

          只需一分鐘,就能學會如何讓數據在單元格中完美居中。快來掌握這個小技巧,讓你的報告和數據展示煥然一新!

          在Excel中,居中擺列通常指的是將單元格內容在水平和垂直方向上都居中顯示。以下是快速學會如何設置Excel單元格內容居中的步驟:

          水平居中:

          • 選擇你想要居中的單元格或單元格區域
          • 在Excel的“開始”菜單欄中找到“對齊”組
          • 在“對齊”組中,點擊“水平居中”按鈕(通常是一個帶有水平居中圖標的按鈕)


          水平居中

          垂直居中:

          • 對于同一單元格或單元格區域,點擊“對齊”組中的“垂直居中”按鈕(通常是一個帶有垂直居中圖標的按鈕)。

          垂直居中

          同時水平和垂直居中:

          - 如果你想要同時實現水平和垂直居中,可以同時點擊“水平居中”和“垂直居中”按鈕,或者在“對齊”組中找到一個帶有十字標志的按鈕,這個按鈕代表了同時水平和垂直居中。


          水平居中+垂直居中

          跨列居中:

          • 如果你想要將多列數據居中顯示,首先選中這些列。
          • 右鍵點擊選中區域,選擇“設置單元格格式”。
          • 在彈出的“設置單元格格式”對話框中,切換到“對齊”標簽頁。
          • 在“水平”對齊下拉菜單中選擇“跨列居中”,然后點擊“確定”。

          頁面居中:

          • 如果你想要整個工作表在打印時居中顯示,可以設置頁面居中。
          • 點擊“頁面布局”菜單,選擇“頁面設置”。
          • 在“頁面設置”對話框中,找到“頁邊距”選項卡。
          • 在“頁邊距”選項卡中,勾選“水平居中”和“垂直居中”選項,然后點擊“確定”。

          通過以上步驟,你可以在一分鐘內學會如何在Excel中設置單元格內容的居中擺列。

          這些操作適用于大多數Excel版本哦

          Word文檔編輯中,居中對齊是一種常用的排版方式,它可以使文本內容在頁面上更加整齊、美觀。本文將詳細介紹Word居中對齊的快捷鍵、操作方法以及相關技巧,幫助大家輕松實現高效排版。

          一、Word居中對齊快捷鍵

          在Word中,居中對齊的快捷鍵是“Ctrl + E”。選中需要居中對齊的文本內容,然后按下“Ctrl + E”組合鍵,即可將文本內容居中對齊。這個快捷鍵可以大大提高我們的排版效率,特別是在處理大量文本內容時。具體word教程,可以在下圖點擊打開看。

          word辦公視頻教程送加密狗
          ¥10
          購買
          <script src="http://mp.toutiao.com/mp/agw/mass_profit/pc_product_promotions_js?item_id=7339004866368455168"></script>

          二、Word中如何快速居中對齊

          除了使用快捷鍵外,我們還可以通過以下步驟快速實現Word中的居中對齊:

          1. 選中需要居中對齊的文本內容;
          2. 在Word的菜單欄中找到“段落”選項;
          3. 點擊“段落”選項中的“居中對齊”按鈕,即可將文本內容居中對齊。

          這種方法雖然比快捷鍵稍慢一些,但它更加直觀,適合初學者使用。

          三、Word文檔居中對齊的快捷方式

          除了上述兩種方法外,我們還可以通過設置段落格式來實現Word文檔的居中對齊。具體操作步驟如下:

          1. 選中需要居中對齊的文本內容;
          2. 右鍵點擊選中的文本,選擇“段落”選項;
          3. 在彈出的“段落”對話框中,找到“對齊方式”選項;
          4. 選擇“居中”對齊方式,然后點擊“確定”按鈕。

          這種方法雖然相對繁瑣一些,但它可以對整個段落進行更加精細的格式設置,滿足不同的排版需求。

          四、Word居中對齊的鍵盤快捷鍵是什么

          前面已經提到,Word居中對齊的鍵盤快捷鍵是“Ctrl + E”。這個快捷鍵可以幫助我們快速實現文本內容的居中對齊,提高排版效率。需要注意的是,在使用快捷鍵之前,我們需要先選中需要居中對齊的文本內容。

          五、Word如何實現文本一鍵居中對齊

          除了使用快捷鍵和菜單選項外,我們還可以通過自定義工具欄來實現Word中文本的一鍵居中對齊。具體操作步驟如下:

          1. 在Word的菜單欄中找到“視圖”選項;
          2. 點擊“視圖”選項中的“工具欄”按鈕;
          3. 在彈出的菜單中選擇“自定義”選項;
          4. 在“自定義”對話框中,找到“命令”選項卡;
          5. 在“命令”選項卡中選擇“格式”類別;
          6. 找到“居中對齊”命令,并將其拖動到工具欄中適當的位置;
          7. 點擊“關閉”按鈕完成設置。

          完成上述設置后,我們就可以在工具欄中直接點擊“居中對齊”按鈕來實現文本內容的一鍵居中對齊了。這種方法可以根據個人習慣進行自定義設置,提高操作效率。

          六、Word居中對齊操作技巧

          在使用Word進行居中對齊時,我們可以掌握一些操作技巧來提高排版效率:

          1. 使用快捷鍵:熟練掌握并使用“Ctrl + E”快捷鍵可以快速實現文本內容的居中對齊;
          2. 批量選中:通過鼠標拖動或使用“Shift”鍵配合方向鍵可以快速選中需要居中對齊的多個文本內容;
          3. 預設樣式:在Word中預設一些常用的居中對齊樣式,可以在需要時直接應用,避免重復設置;
          4. 調整間距:在居中對齊的基礎上,我們還可以通過調整行間距和字間距來進一步優化排版效果。

          七、Word文本居中對齊的快捷鍵教程總結

          本文詳細介紹了Word居中對齊的快捷鍵、操作方法以及相關技巧。通過掌握這些知識和技巧,我們可以輕松實現Word文檔的高效排版。無論是初學者還是有一定經驗的用戶,都可以從本文中獲得實用的幫助和指導。希望大家在閱讀本文后能夠更加熟練地運用Word進行文檔編輯和排版工作。

          按ctrl+e鍵

          通過上面的方法都可以對齊


          主站蜘蛛池模板: 国产日韩精品一区二区三区在线 | 亚欧成人中文字幕一区| 天堂资源中文最新版在线一区| 亚洲av无码一区二区三区观看| 色妞AV永久一区二区国产AV| 日本精品一区二区三区四区| 丰满爆乳无码一区二区三区| 中文字幕一区二区三区精彩视频| 99精品国产高清一区二区三区 | 亚洲Aⅴ无码一区二区二三区软件 亚洲AⅤ视频一区二区三区 | 国产一区二区精品在线观看| 亚洲精品精华液一区二区| 国产成人精品日本亚洲专一区 | 国产一区二区三区不卡观| 一级毛片完整版免费播放一区 | 国产免费播放一区二区| 亚洲国产精品一区二区第一页免| 日本一区二区高清不卡| 精品成人一区二区三区免费视频 | 波多野结衣一区视频在线| 人妻无码视频一区二区三区| 香蕉久久一区二区不卡无毒影院 | 国产成人综合一区精品| 无码国产精品一区二区免费式直播| 精品三级AV无码一区| 国产香蕉一区二区在线网站| 99无码人妻一区二区三区免费| 亚洲视频一区二区三区四区| 亚洲日韩中文字幕一区| eeuss鲁片一区二区三区| 国产成人精品一区二三区| 无码欧精品亚洲日韩一区夜夜嗨| 一区二区在线视频免费观看| 变态拳头交视频一区二区| 久久国产精品一区免费下载| 日韩精品一区二区三区老鸭窝 | 亚洲人AV永久一区二区三区久久| 视频在线一区二区三区| 熟女少妇精品一区二区| 日韩一区二区三区无码影院| 蜜桃AV抽搐高潮一区二区|