操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

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

    首先,在wps軟件中打開文檔文件,并進(jìn)入到編輯頁(yè)面,點(diǎn)擊紅色方框中的開始。

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

    寫在前面

    這兩天在網(wǎng)上看到有視頻回顧國(guó)內(nèi)計(jì)算機(jī)發(fā)展的歷史,其中UCDOS6.0、wps1.0等經(jīng)典軟件界面,一下子讓我回到了學(xué)生時(shí)代。

    UCDOS6.0

    WPS1.0

    我是從96年接觸電腦,97年學(xué)習(xí)計(jì)算機(jī),98年進(jìn)入計(jì)算機(jī)專業(yè),那時(shí)候?qū)W的數(shù)據(jù)庫(kù)還是foxbase,后來我嚴(yán)重懷疑之所以學(xué)Foxbase,是因?yàn)榻滩氖俏覀兝蠋熅帉懙木壒?.....那時(shí)候?qū)W的最好的就是匯編語(yǔ)言和c語(yǔ)言了。最后悔沒認(rèn)真學(xué)的就是數(shù)據(jù)結(jié)構(gòu)和freeBSD,當(dāng)時(shí)教FreeBSD的老師,現(xiàn)在想來當(dāng)時(shí)真的算是個(gè)大神了,只可惜年輕不懂事,沒有認(rèn)真聽課......

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

    先貼上來一張程序運(yùn)行的效果圖:

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

    這個(gè)效果圖的原理分成幾部分實(shí)現(xiàn),首先畫一個(gè)灰色的矩形,然后再錯(cuò)位畫一個(gè)紅色的矩形,然后再輸出一段文字,其中這段文字進(jìn)行字體大小的調(diào)整。

    我們先對(duì)這個(gè)程序的代碼功能分段講解,最后再發(fā)布完整的程序源碼。

    準(zhǔn)備工作

    準(zhǔn)備工作不是必須要做的,只是為了讓顯示效果更好。比如,我們可以將屏幕緩沖區(qū)的行數(shù)和列數(shù)設(shè)置好,以獲得一個(gè)合適的控制臺(tái)窗體的顯示尺寸。

    當(dāng)然,之前文章中我們已經(jīng)說過,屏幕緩沖區(qū)尺寸不等同于窗口顯示尺寸,所以我們需要再將窗口尺寸設(shè)置為和屏幕緩沖區(qū)相同,這樣就不會(huì)出現(xiàn)滾動(dòng)條。

    首先,我們需要先獲取當(dāng)前控制臺(tái)程序的句柄,代碼如下:

    HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);

    設(shè)置屏幕緩沖區(qū)的代碼如下:

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

    設(shè)置控制臺(tái)窗口尺寸的代碼如下:

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

    注意,屏幕緩沖區(qū)的COORD結(jié)構(gòu)中的坐標(biāo)x和y分別表示行數(shù)和列數(shù)。窗口尺寸中的SMALL_RECT結(jié)構(gòu)表示窗口相對(duì)于屏幕緩沖區(qū)的位置坐標(biāo),含義不同。

    矩形背景

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

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

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

    我們搞清楚了FillConsoleOutputAttribute函數(shù)的用法,現(xiàn)在看看在程序中如何使用的。

    繼續(xù)下一段代碼:

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

    這段代碼定義了兩個(gè)背景區(qū)域的顏色。bgColor_shadow 定義的是灰色背景。bgColor 定義的紅色背景,準(zhǔn)備顯示的文字用黃色,并且增強(qiáng)了明亮度。

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

    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hConsole, &csbi);

    這兩行代碼的主要作用就是獲取屏幕緩沖區(qū)中當(dāng)前字符的屬性,即csbi.wAttributes成員的值。后面字符屬性被更改后,當(dāng)想恢復(fù)到現(xiàn)在的字符屬性時(shí),可以隨時(shí)通過csbi.wAttributes來恢復(fù)默認(rèn)屬性。

    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 表示文字的背景區(qū)域面積,shadow_rect 表示陰影的區(qū)域面積,所謂陰影,就是被display_rect遮擋的區(qū)域面積。

    為了實(shí)現(xiàn)背遮擋,只要將第二個(gè)區(qū)域和第一個(gè)區(qū)域錯(cuò)位就可以了,效果逼真度要看美術(shù)的,錯(cuò)多少位置,陰影部分的顏色如何調(diào)色等。然后再用代碼實(shí)現(xiàn)。

    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 表示區(qū)域面積每行填充的字符單元(列數(shù)),line_num 表示要填充多少行。注意,雖然我們定義了SMALL_RECT結(jié)構(gòu),表示矩形面積,但實(shí)際上,控制臺(tái)不支持一次性填充屏幕緩沖區(qū)中的某個(gè)局部矩形面積,只能逐行的填充。所以要用for循環(huán)實(shí)現(xiàn)。

    另外,F(xiàn)illConsoleOutputAttribute的最后一個(gè)參數(shù),時(shí)輸出型參數(shù),用來記錄由多少個(gè)字符單元受到函數(shù)操作的影響,在本程序中我們并未用到,理論上可以設(shè)為NULL,但根據(jù)實(shí)際經(jīng)驗(yàn),不要設(shè)為NULL。

    這段代碼實(shí)現(xiàn)的效果如下:

    字體大小

    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);

    這段代碼的作用時(shí)對(duì)后面要輸出的文字進(jìn)行字體大小的設(shè)置。使用了一個(gè)CONSOLE_FONT_INFOEX結(jié)構(gòu)體,注意,不要和CONSOLE_FONT_INFO結(jié)構(gòu)體混淆了。

    CONSOLE_FONT_INFO結(jié)構(gòu)體的定義如下:

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

    CONSOLE_FONT_INFOEX結(jié)構(gòu)體的定義如下:

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

    這2個(gè)結(jié)構(gòu)體其實(shí)能能通過dwFontSize成員來獲得當(dāng)前字體的大小,但要設(shè)置字體大小,需要調(diào)用SetCurrentConsoleFontEx函數(shù)來實(shí)現(xiàn),而這個(gè)函數(shù)使用的結(jié)構(gòu)體就是 CONSOLE_FONT_INFOEX類型,而不是CONSOLE_FONT_INFO類型。我們來看下這個(gè)函數(shù)的原型:

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

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

    如何使用CONSOLE_FONT_INFOEX類型變量?

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

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

    文本輸出

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

    WriteConsoleOutputCharacter函數(shù)原型如下:

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

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

    COORD 結(jié)構(gòu),表示的是坐標(biāo),指定第一個(gè)字符在屏幕緩沖區(qū)的起始坐標(biāo)。

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

    本例中程序代碼如下:

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

    輸出要顯示的文字,所在的字符單元自動(dòng)使用剛才設(shè)置好的字符屬性。直到調(diào)用下面這行代碼,才恢復(fù)之前默認(rèn)的字符屬性:

    SetConsoleTextAttribute(hConsole, csbi.wAttributes);

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

    fflush(stdout);

    這是c語(yǔ)言的用法,C++可以這樣用:std::cout << std::flush;在剛才的代碼中,const char*是c語(yǔ)言的編程風(fēng)格,可以替換成LPCTSTR類型,這是windows編程風(fēng)格。關(guān)于windows編程風(fēng)格的自定義數(shù)據(jù)類型,在我的這篇文章里由詳細(xì)講解輕松玩轉(zhuǎn)windows控制臺(tái)(一):窗口標(biāo)題

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

網(wǎng)站首頁(yè)   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

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

備案號(hào):冀ICP備2024067069號(hào)-3 北京科技有限公司版權(quán)所有