欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    今天從網頁上復制了一段文字下來,放在WPS中,文字背景居然有陰影,這樣太不好看了,怎么把陰影去掉呢?自己在找了半天,還是沒有成功,祭出度娘大法,找了幾個方法,都不行,最后自己摸索著用下面的方法解決問題,方法分享給大家,點贊收藏,以備不時之需。

    首先,在wps軟件中打開文檔文件,并進入到編輯頁面,點擊紅色方框中的開始。

    用鼠標選中要去除陰影的文字,點擊紅色方框中的字符底紋,再看,文字背景陰影就去除了。是不是很簡單呀。

    寫在前面

    這兩天在網上看到有視頻回顧國內計算機發展的歷史,其中UCDOS6.0、wps1.0等經典軟件界面,一下子讓我回到了學生時代。

    UCDOS6.0

    WPS1.0

    我是從96年接觸電腦,97年學習計算機,98年進入計算機專業,那時候學的數據庫還是foxbase,后來我嚴重懷疑之所以學Foxbase,是因為教材是我們老師編寫的緣故......那時候學的最好的就是匯編語言和c語言了。最后悔沒認真學的就是數據結構和freeBSD,當時教FreeBSD的老師,現在想來當時真的算是個大神了,只可惜年輕不懂事,沒有認真聽課......

    正好這段時間在寫《輕松玩轉windows控制臺》系列教程,今天就來找一找DOS界面下的“圖形界面”的感覺吧。

    先貼上來一張程序運行的效果圖:

    在命令行時代,為了使界面有立體感,就是通過圖形的重疊,以及顏色搭配,制造出立體感的。我的美術功底非常的差,差到中學時代參加美術考試,蘋果畫成了“方形”,不是夸張。所以,這個效果就將就看吧,本來還想再模擬一些效果,想想還是作罷。

    這個效果圖的原理分成幾部分實現,首先畫一個灰色的矩形,然后再錯位畫一個紅色的矩形,然后再輸出一段文字,其中這段文字進行字體大小的調整。

    我們先對這個程序的代碼功能分段講解,最后再發布完整的程序源碼。

    準備工作

    準備工作不是必須要做的,只是為了讓顯示效果更好。比如,我們可以將屏幕緩沖區的行數和列數設置好,以獲得一個合適的控制臺窗體的顯示尺寸。

    當然,之前文章中我們已經說過,屏幕緩沖區尺寸不等同于窗口顯示尺寸,所以我們需要再將窗口尺寸設置為和屏幕緩沖區相同,這樣就不會出現滾動條。

    首先,我們需要先獲取當前控制臺程序的句柄,代碼如下:

    HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);

    設置屏幕緩沖區的代碼如下:

    COORD scr_size={80,30};
    SetConsoleScreenBufferSize(hConsole,scr_size);

    設置控制臺窗口尺寸的代碼如下:

    SMALL_RECT wnd_size={0,0,79,29};
    SetConsoleWindowInfo(hConsole,TRUE,&wnd_size);

    注意,屏幕緩沖區的COORD結構中的坐標x和y分別表示行數和列數。窗口尺寸中的SMALL_RECT結構表示窗口相對于屏幕緩沖區的位置坐標,含義不同。

    矩形背景

    矩形背景實際上是由FillConsoleOutputAttribute函數繪制的。函數原型如下:

    BOOL FillConsoleOutputAttribute(
    HANDLE hConsoleOutput,
    WORD wAttribute,
    DWORD nLength,
    COORD dwWriteCoord,
    LPDWORD lpNumberOfAttrsWritten
    );

    第一個參數傳入窗口句柄,第二個參數是字符的前景色和背景色,第三個參數要設置字符單元的個數,也就是設置連續的字符個數(重要!超過一行,自動換行到下一行),第四個參數是COORD 結構,傳入了一個坐標,作為指定的起始位置,最后一個參數是輸出型參數,如果打算向外傳輸數據,理論上可以設置為NULL(空指針),但是實際開發中不建議這樣做,賦值一個DWORD類型的指針即可,不需要賦初值。

    我們搞清楚了FillConsoleOutputAttribute函數的用法,現在看看在程序中如何使用的。

    繼續下一段代碼:

    //區域的背景色和文字顏色
    WORD bgColor_shadow,bgColor;
    //1.陰影區域用灰色填充
    bgColor_shadow=BACKGROUND_INTENSITY;
    //2.文字的背景色用紅色填充,文字用黃色填充
    bgColor=BACKGROUND_RED |FOREGROUND_RED | FOREGROUND_GREEN| FOREGROUND_INTENSITY;

    這段代碼定義了兩個背景區域的顏色。bgColor_shadow 定義的是灰色背景。bgColor 定義的紅色背景,準備顯示的文字用黃色,并且增強了明亮度。

    FOREGROUND_INTENSITY和BACKGROUND_INTENSITY,一個是前景色的INTENSITY,一個是背景色的INTENSITY,單獨使用時,表示灰色,如何和同類型的顏色混用時,表示增加顏色,使這個顏色更明亮。

    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hConsole, &csbi);

    這兩行代碼的主要作用就是獲取屏幕緩沖區中當前字符的屬性,即csbi.wAttributes成員的值。后面字符屬性被更改后,當想恢復到現在的字符屬性時,可以隨時通過csbi.wAttributes來恢復默認屬性。

    SMALL_RECT display_rect,shadow_rect;
    display_rect.Left=25;
    display_rect.Top=7;
    display_rect.Right=55;
    display_rect.Bottom=22;
    shadow_rect.Left=display_rect.Left + 1;
    shadow_rect.Top=display_rect.Top + 1;
    shadow_rect.Right=display_rect.Right + 1;
    shadow_rect.Bottom=display_rect.Bottom + 1;

    這段代碼中,display_rect 表示文字的背景區域面積,shadow_rect 表示陰影的區域面積,所謂陰影,就是被display_rect遮擋的區域面積。

    為了實現背遮擋,只要將第二個區域和第一個區域錯位就可以了,效果逼真度要看美術的,錯多少位置,陰影部分的顏色如何調色等。然后再用代碼實現。

    DWORD col_num=display_rect.Right - display_rect.Left + 1;
    SHORT line_num=display_rect.Bottom - display_rect.Top + 1;
    DWORD dword1;
    for(SHORT i=shadow_rect.Top; i <=line_num;i++){
    			FillConsoleOutputAttribute(hConsole, bgColor_shadow, col_num, {shadow_rect.Left, i}, &dword1);
    }
    DWORD dword2;
    for(SHORT i=display_rect.Top; i < line_num;i++){
    		FillConsoleOutputAttribute(hConsole, bgColor, col_num, {display_rect.Left, i}, &dword2);
    }

    col_num 表示區域面積每行填充的字符單元(列數),line_num 表示要填充多少行。注意,雖然我們定義了SMALL_RECT結構,表示矩形面積,但實際上,控制臺不支持一次性填充屏幕緩沖區中的某個局部矩形面積,只能逐行的填充。所以要用for循環實現。

    另外,FillConsoleOutputAttribute的最后一個參數,時輸出型參數,用來記錄由多少個字符單元受到函數操作的影響,在本程序中我們并未用到,理論上可以設為NULL,但根據實際經驗,不要設為NULL。

    這段代碼實現的效果如下:

    字體大小

    CONSOLE_FONT_INFOEX cfi;
    cfi.cbSize=sizeof(cfi);
    cfi.nFont=0;
    cfi.dwFontSize.X=10;
    cfi.dwFontSize.Y=20;
    cfi.FontFamily=FF_DONTCARE;
    cfi.FontWeight=FW_BOLD;
    SetCurrentConsoleFontEx(hConsole, FALSE, &cfi);

    這段代碼的作用時對后面要輸出的文字進行字體大小的設置。使用了一個CONSOLE_FONT_INFOEX結構體,注意,不要和CONSOLE_FONT_INFO結構體混淆了。

    CONSOLE_FONT_INFO結構體的定義如下:

    typedef struct _CONSOLE_FONT_INFO {
    DWORD nFont;
      COORD dwFontSize;
    } CONSOLE_FONT_INFO;

    CONSOLE_FONT_INFOEX結構體的定義如下:

    typedef struct _CONSOLE_FONT_INFOEX {
    ULONG cbSize;
    DWORD nFont;
    COORD dwFontSize;
    UINT FontFamily;
    UINT FontWeight;
    WCHAR FaceName[LF_FACESIZE];
    } CONSOLE_FONT_INFOEX;

    這2個結構體其實能能通過dwFontSize成員來獲得當前字體的大小,但要設置字體大小,需要調用SetCurrentConsoleFontEx函數來實現,而這個函數使用的結構體就是 CONSOLE_FONT_INFOEX類型,而不是CONSOLE_FONT_INFO類型。我們來看下這個函數的原型:

    BOOL SetCurrentConsoleFontEx(
    HANDLE hConsoleOutput,
    BOOL bMaximumWindow,
    PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx
    );

    第一個參數沒什么可講的,就是控制臺窗體句柄,第二個參數如果為 TRUE,則設置當前窗口最大化后的最大窗口情況下對應的字體信息。 如果為 FALSE,則設置當前窗口時的字體信息。最后一個參數就是CONSOLE_FONT_INFOEX的指針,這是一個典型的輸入型參數。(輸入型參數和輸出型參數可以看我的。。。文章鏈接)

    如何使用CONSOLE_FONT_INFOEX類型變量?

    第一個參數必須要這樣使用: cfi.cbSize=sizeof(cfi);第二個參數nFont一般默認為0,第三個參數dwFontSize是一個COORD結構體,注意,這個結構體不是表示坐標的,而是表示后面輸出的文字的字符寬度和高度。 X 成員包含寬度,而 Y 成員包含高度。

    第四個參數FontFamily表示字體間距和系列。 有關此成員可能值的信息,可以看 TEXTMETRIC 結構的 tmPitchAndFamily 成員的說明。參數FontWeight表示字體粗細。 粗細范圍為 100 到 1000,按 100 的倍數表示。 例如,正常粗細為 400,而 700 為粗體。FaceName表示要使用的字體名稱(如 Courier 或 Arial)。為了降低學習的復雜度,此處暫時不展開,后期的文章中會詳細的講解這幾個參數的用法,不影響的本程序的功能實現。

    文本輸出

    輸出文本內容,可以有很多鐘方法,比如FillConsoleOutputCharacter 函數和WriteConsoleOutputCharacter函數,前者是允許批量輸出字符到屏幕緩沖區,后者是單個字符串的輸出。本例程序鐘用的就是后者。

    WriteConsoleOutputCharacter函數原型如下:

    BOOL WriteConsoleOutputCharacter(
    HANDLE hConsoleOutput,
    LPCTSTR lpCharacter,
    DWORD nLength,
    COORD dwWriteCoord,
    LPDWORD lpNumberOfCharsWritten
    );

    第一個參數不用多言,一定是窗口句柄,第二個參數是要寫入屏幕緩沖區的字符或字符串。第三個參數是要寫入的字符個數(不是字節個數,是字符個數)。第四個參數是

    COORD 結構,表示的是坐標,指定第一個字符在屏幕緩沖區的起始坐標。

    最后一個參數和剛才的FillConsoleOutputAttribute函數的最后一個參數的用法類似,第二個參數的字符串當函數執行完畢后,實際輸出到屏幕緩沖區的字符個數將被存放到這個參數所指向的區域。這個實際上就是指向DWORD的指針。按照經驗,即使在程序中沒起作用,也不建議設為NULL。

    本例中程序代碼如下:

    const char* str="致 敬 經 典";
    //const char *可以替換成LPCTSTR
    //LPCTSTR str="...";
    //LPCTSTR是windows編程風格
    //const char *是c語言風格
    DWORD written;
    if (!WriteConsoleOutputCharacter(hConsole, str, strlen(str),{35,11 },&written))
    {
    printf("%d\n", GetLastError());
    return 1;
    }

    輸出要顯示的文字,所在的字符單元自動使用剛才設置好的字符屬性。直到調用下面這行代碼,才恢復之前默認的字符屬性:

    SetConsoleTextAttribute(hConsole, csbi.wAttributes);

    下面這行代碼,是為了讓對屏幕緩沖區所做的修改能夠立即生效:

    fflush(stdout);

    這是c語言的用法,C++可以這樣用:std::cout << std::flush;在剛才的代碼中,const char*是c語言的編程風格,可以替換成LPCTSTR類型,這是windows編程風格。關于windows編程風格的自定義數據類型,在我的這篇文章里由詳細講解輕松玩轉windows控制臺(一):窗口標題

    下面是完整的程序源碼,可以直接編譯運行。所用的環境為CLion2023,默認的clang編譯器,64位win10最新版本。實際上,在devC++和vs2022里也可以編譯通過。如果有任何問題,歡迎隨時交流。

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有