• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Vitacy.Tan'Blog

            真正的快樂,來自于內(nèi)心的平靜!

            統(tǒng)計

            留言簿(1)

            常用鏈接

            閱讀排行榜

            評論排行榜

            自己動手制作控制臺定位函數(shù)

            轉(zhuǎn)載:http://topic.csdn.net/t/20061102/23/5129585.html
            自己動手制作控制臺定位函數(shù)  
               
              大家一定都用過TC供給大家的光標定位,創(chuàng)建方框等函數(shù),在我們眼里很神秘,現(xiàn)在我們就自己動手來制作。  
               
              一.   光標定位  
               
              首先我們通過MCDN可以找到這樣一個函數(shù)SetConsoleCursorPosition(),這個就是VC++提供的光標的定位函數(shù),它的原形為  
               
              BOOL     SetConsoleCursorPosition(  
               
                  HANDLE     hConsoleOutput,      
               
              COORD     dwCursorPosition  
               
              );  
               
              BOOL   :是一種類型(Boolean   variable布爾變量),返回‘   真   ’or‘   假   ’;  
               
              HANDLE     hConsoleOutput,     為輸出設(shè)備的句柄,和int、char一樣是一種類型  
               
              COORD     dwCursorPosition,為光標的位置  
               
              接下來我們所要做的就是獲得輸出設(shè)備的句柄和設(shè)置光標的位置。  
               
              1.   獲得輸出設(shè)備的句柄  
               
              要獲得輸出設(shè)備的句柄就要用到函數(shù)GetStdHandle(),它的原形為:  
               
              HANDLE   GetStdHandle(  
               
                  DWORD   nStdHandle       //   input,   output,   or   error   device  
               
              );  
               
              nStdHandle一共有3個值為STD_INPUT_HANDLE     輸入設(shè)備句柄,   STD_OUTPUT_HANDLE     輸出設(shè)備句柄,STD_ERROR_HANDLE   錯誤句柄  
               
              所以我們要獲得輸出設(shè)備的句柄就要先定義個句柄然后將獲得的輸出設(shè)備的句柄賦值給所定義的句柄。如:HANDLE       hCon       =       GetStdHandle(STD_OUTPUT_HANDLE);    
               
              2.   設(shè)置光標的位置  
               
              COORD的原形為:  
               
              typedef   struct   _COORD    
               
              {   //   coord.    
               
                      SHORT   X;             //   horizontal   coordinate    
               
                      SHORT   Y;             //   vertical   coordinate    
               
              }   COORD;  
               
              Typedef的含義就是把一種類型定義成另一種名字  
               
              e.g  
               
              typedef   int   zhengxing;  
               
              zhengxing   nA;   //等同于int   nA;  
               
              從這里大家可以發(fā)現(xiàn)COORD為一個結(jié)構(gòu)體類型,他含有X,Y兩個元素,所以我們就應(yīng)該先定義一個COORD的結(jié)構(gòu)體變量,然后對其元素進行賦值就可以完成對光標的設(shè)置。  
               
              這樣一個完整的光標定位函數(shù)我們就可以寫出來了。如下:  
               
              void   goxy(int   nX,   int   nY)  
               
              {  
               
                      HANDLE       hCon;//定義一個句柄  
               
                      hCon   =   GetStdHandle(STD_OUTPUT_HANDLE);       //獲得輸出設(shè)備的句柄  
               
                      COORD       setps;   //定義結(jié)構(gòu)體變量  
               
                      setps.X   =   nX;        
               
                      setps.Y   =   nY;    
               
                      SetConsoleCursorPosition(hCon,setps);     //定位  
               
              }  
               
              再調(diào)用時,我們只需輸入他的坐標就可以進行光標的定位了。  
               
              二.制作方框  
               
              大家現(xiàn)在都可以打印一個任意邊長的方框,只是無法將所打印的方框在屏幕的其他地方打印出來,我們現(xiàn)在有了光標的定位函數(shù),只需在打印每個點的時候?qū)⒐鈽硕ㄎ坏侥阆胍牡胤剑涂梢詫崿F(xiàn)制作方框了。下面是我寫的一個制作方框的函數(shù),大家可以參考下:  
               
              void   frame(int   x,   int   y,   int   width,   int   height)  
               
              {  
               
                      for(int   nI   =   0;   nI   <   height;   nI++)     //行數(shù)  
               
                      {  
               
                              for(int   nJ   =   0;   nJ   <   width*2;   nJ   +=   2)   //列數(shù),width*2中文符號占兩位  
               
                              {  
               
                                      goxy(x   +   nJ,   y   +   nI);   //調(diào)用我們前面的函數(shù)進行光標的定位  
               
                                      if(nI   ==   0   ||   nJ   ==   width*2   -   2   ||   nJ   ==   0   ||   nI   ==   height   -   1)   //只打印四個邊  
               
                                      {  
               
                                              if(nI   ==   0   &&   nJ   ==   0   )   //左上的拐角  
               
                                              {  
               
                                                      printf("┏");  
               
                                              }  
               
                                              else   if(nI   ==   0   &&   nJ   ==   width   *   2   -   2)  
               
                                              {  
               
                                                              printf("┓");//右上的拐角  
               
                                              }  
               
                                              else   if(nI   ==   height   -   1   &&   nJ   ==   0)  
               
                                              {  
               
                                                      printf("┗");//左下的拐角  
               
                                              }  
               
                                              else   if(nI   ==   height   -   1   &&   nJ   ==   width*2   -   2)  
               
                                              {  
               
                                                      printf("┛");//右下的拐角  
               
                                              }  
               
                                              else   if(nI   ==   0   ||   nI   ==   height   -   1)  
               
                                              {  
               
                                                      printf("━");        
               
                                              }  
               
                                              else  
               
                                              {  
               
                                                      printf("┃");  
               
                                              }  
               
                                      }  
               
                              }  
               
                              printf("\n");  
               
                      }  
               
              }  
               
              如果大家還想在方框上打印出標題,只需要在方框打印結(jié)束后,調(diào)用光標定位,定位到適當?shù)奈恢眠M行打印,將兩個函數(shù)封裝成一個函數(shù)就可以實現(xiàn)了。我們還可以通過函數(shù)的重載實現(xiàn)輸入不同的參數(shù)打印不同的方框,如方框的顏色,文本的顏色等等;  
               
                 
               
              三.其他的設(shè)置  
               
              1.文本顏色  
               
              函數(shù)的原形  
               
              BOOL   SetConsoleTextAttribute(  
               
                  HANDLE   hConsoleOutput,     //   控制臺的句柄  
               
                  WORD   wAttributes                 //文本和背景的顏色(0--15)  
               
              );  
               
                 
               
              e.g  
               
              HANDLE       hCon       =       GetStdHandle(STD_OUTPUT_HANDLE);  
               
              SetConsoleTextAttribute(hCon,       10);設(shè)置成綠色,一共有0--15種顏色  
               
                 
               
              2.   執(zhí)行清屏命令  
               
              這個函數(shù)比起書上的用空格來清除方框內(nèi)容的方法要簡單多了  
               
              BOOL   FillConsoleOutputCharacter(  
               
                  HANDLE   hConsoleOutput,     //   handle   to   screen   buffer  
               
                  TCHAR   cCharacter,               //   character   to   write   要寫入的字符  
               
                  DWORD   nLength,                     //   number   of   character   cells   to   write   to寫入多少個單元  
               
                  COORD   dwWriteCoord,           //   x-   and   y-coordinates   of   first   cell   起始的單元  
               
                  LPDWORD   lpNumberOfCharsWritten    
               
                                                                  //   pointer   to   number   of   cells   written   to  
               
              );  
               
                 
               
              e.g  
               
              DWORD       nBytesWrite;    
               
              CONSOLE_SCREEN_BUFFER_INFO       ConInfo;       //定義一個控制臺的信息變量  
               
              HANDLE       hCon       =       GetStdHandle(STD_OUTPUT_HANDLE);   //獲得輸出設(shè)備的句柄  
               
              GetConsoleScreenBufferInfo(hCon,       &       ConInfo);//獲得控制臺的信息  
               
              CurPos.X       =       ConInfo.srWindow.Left;     //屏幕最左邊的X坐標  
               
              CurPos.Y       =       ConInfo.srWindow.Top;     //屏幕最上邊的Y坐標  
               
              FillConsoleOutputCharacter(hCon,   0x20,   ConInfo.dwSize.X*ConInfo.dwSize.Y,   CurPos,   &   nBytesWrite);    
               
              0x20為空格,為16進制的ASC碼值,ConInfo.dwSize.X*ConInfo.dwSize.Y為清除的范圍  
               
              四.總結(jié)  
               
              對于控制臺的設(shè)置還有很多,比如控制臺的標題設(shè)置等等,在MSDN上都有很詳細的說明。通過以上的介紹大家都可以做出自己的光標定位函數(shù),在自己的設(shè)計中應(yīng)用。別人能寫出來的,我們一樣能做出來,就向我們經(jīng)常聽到的那樣“沒有做不出來的,只有想不到的”   
               

            posted on 2007-07-04 21:35 Vitacy.Tan 閱讀(359) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            午夜精品久久久久久久| 99久久99久久精品国产片| 久久婷婷是五月综合色狠狠| 中文字幕亚洲综合久久菠萝蜜| 色婷婷狠狠久久综合五月| 国内精品久久久久影院薰衣草| 91精品国产色综合久久| 亚洲国产高清精品线久久| 亚洲乱码精品久久久久..| 大美女久久久久久j久久| 色综合久久久久综合体桃花网| 精品久久久久久国产91| 色妞色综合久久夜夜| 久久国产免费观看精品| 久久精品国产精品亚洲精品 | 久久99国产精品久久久| 亚洲精品乱码久久久久久不卡| 国产精品99久久久久久人| 久久WWW免费人成一看片| 久久综合伊人77777麻豆| avtt天堂网久久精品| 亚洲va国产va天堂va久久| 日韩欧美亚洲国产精品字幕久久久| 久久99国产乱子伦精品免费| 久久精品国产亚洲AV蜜臀色欲| 欧美性大战久久久久久| 久久国产精品国语对白| 久久亚洲国产中v天仙www| 国产精品久久久久影院嫩草| 色婷婷综合久久久久中文一区二区| 婷婷久久综合九色综合绿巨人| 久久艹国产| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 国产精品久久久久天天影视| 久久综合给合久久国产免费| 伊人久久精品无码二区麻豆| 国产精品久久新婚兰兰| 久久亚洲精品无码aⅴ大香| 中文字幕日本人妻久久久免费 | 色综合久久88色综合天天| 国产精品久久成人影院|