• <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

            真正的快樂,來自于內心的平靜!

            統計

            留言簿(1)

            常用鏈接

            閱讀排行榜

            評論排行榜

            自己動手制作控制臺定位函數

            轉載:http://topic.csdn.net/t/20061102/23/5129585.html
            自己動手制作控制臺定位函數  
               
              大家一定都用過TC供給大家的光標定位,創建方框等函數,在我們眼里很神秘,現在我們就自己動手來制作。  
               
              一.   光標定位  
               
              首先我們通過MCDN可以找到這樣一個函數SetConsoleCursorPosition(),這個就是VC++提供的光標的定位函數,它的原形為  
               
              BOOL     SetConsoleCursorPosition(  
               
                  HANDLE     hConsoleOutput,      
               
              COORD     dwCursorPosition  
               
              );  
               
              BOOL   :是一種類型(Boolean   variable布爾變量),返回‘   真   ’or‘   假   ’;  
               
              HANDLE     hConsoleOutput,     為輸出設備的句柄,和int、char一樣是一種類型  
               
              COORD     dwCursorPosition,為光標的位置  
               
              接下來我們所要做的就是獲得輸出設備的句柄和設置光標的位置。  
               
              1.   獲得輸出設備的句柄  
               
              要獲得輸出設備的句柄就要用到函數GetStdHandle(),它的原形為:  
               
              HANDLE   GetStdHandle(  
               
                  DWORD   nStdHandle       //   input,   output,   or   error   device  
               
              );  
               
              nStdHandle一共有3個值為STD_INPUT_HANDLE     輸入設備句柄,   STD_OUTPUT_HANDLE     輸出設備句柄,STD_ERROR_HANDLE   錯誤句柄  
               
              所以我們要獲得輸出設備的句柄就要先定義個句柄然后將獲得的輸出設備的句柄賦值給所定義的句柄。如:HANDLE       hCon       =       GetStdHandle(STD_OUTPUT_HANDLE);    
               
              2.   設置光標的位置  
               
              COORD的原形為:  
               
              typedef   struct   _COORD    
               
              {   //   coord.    
               
                      SHORT   X;             //   horizontal   coordinate    
               
                      SHORT   Y;             //   vertical   coordinate    
               
              }   COORD;  
               
              Typedef的含義就是把一種類型定義成另一種名字  
               
              e.g  
               
              typedef   int   zhengxing;  
               
              zhengxing   nA;   //等同于int   nA;  
               
              從這里大家可以發現COORD為一個結構體類型,他含有X,Y兩個元素,所以我們就應該先定義一個COORD的結構體變量,然后對其元素進行賦值就可以完成對光標的設置。  
               
              這樣一個完整的光標定位函數我們就可以寫出來了。如下:  
               
              void   goxy(int   nX,   int   nY)  
               
              {  
               
                      HANDLE       hCon;//定義一個句柄  
               
                      hCon   =   GetStdHandle(STD_OUTPUT_HANDLE);       //獲得輸出設備的句柄  
               
                      COORD       setps;   //定義結構體變量  
               
                      setps.X   =   nX;        
               
                      setps.Y   =   nY;    
               
                      SetConsoleCursorPosition(hCon,setps);     //定位  
               
              }  
               
              再調用時,我們只需輸入他的坐標就可以進行光標的定位了。  
               
              二.制作方框  
               
              大家現在都可以打印一個任意邊長的方框,只是無法將所打印的方框在屏幕的其他地方打印出來,我們現在有了光標的定位函數,只需在打印每個點的時候將光標定位到你想要的地方,就可以實現制作方框了。下面是我寫的一個制作方框的函數,大家可以參考下:  
               
              void   frame(int   x,   int   y,   int   width,   int   height)  
               
              {  
               
                      for(int   nI   =   0;   nI   <   height;   nI++)     //行數  
               
                      {  
               
                              for(int   nJ   =   0;   nJ   <   width*2;   nJ   +=   2)   //列數,width*2中文符號占兩位  
               
                              {  
               
                                      goxy(x   +   nJ,   y   +   nI);   //調用我們前面的函數進行光標的定位  
               
                                      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");  
               
                      }  
               
              }  
               
              如果大家還想在方框上打印出標題,只需要在方框打印結束后,調用光標定位,定位到適當的位置進行打印,將兩個函數封裝成一個函數就可以實現了。我們還可以通過函數的重載實現輸入不同的參數打印不同的方框,如方框的顏色,文本的顏色等等;  
               
                 
               
              三.其他的設置  
               
              1.文本顏色  
               
              函數的原形  
               
              BOOL   SetConsoleTextAttribute(  
               
                  HANDLE   hConsoleOutput,     //   控制臺的句柄  
               
                  WORD   wAttributes                 //文本和背景的顏色(0--15)  
               
              );  
               
                 
               
              e.g  
               
              HANDLE       hCon       =       GetStdHandle(STD_OUTPUT_HANDLE);  
               
              SetConsoleTextAttribute(hCon,       10);設置成綠色,一共有0--15種顏色  
               
                 
               
              2.   執行清屏命令  
               
              這個函數比起書上的用空格來清除方框內容的方法要簡單多了  
               
              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);   //獲得輸出設備的句柄  
               
              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為清除的范圍  
               
              四.總結  
               
              對于控制臺的設置還有很多,比如控制臺的標題設置等等,在MSDN上都有很詳細的說明。通過以上的介紹大家都可以做出自己的光標定位函數,在自己的設計中應用。別人能寫出來的,我們一樣能做出來,就向我們經常聽到的那樣“沒有做不出來的,只有想不到的”   
               

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

            精品久久久久久亚洲精品 | 久久99国产精品久久99小说 | 欧美性猛交xxxx免费看久久久| 久久久综合香蕉尹人综合网| 精品伊人久久大线蕉色首页| 国产精品久久久久久久| 婷婷久久综合九色综合绿巨人| 无码专区久久综合久中文字幕| 精品国产一区二区三区久久| 欧美一区二区久久精品| 国产精品久久午夜夜伦鲁鲁| 亚洲精品久久久www| 日本精品久久久中文字幕| 精品综合久久久久久97| 久久久久免费精品国产| 亚洲午夜无码AV毛片久久| 久久亚洲国产中v天仙www| 亚洲欧洲日产国码无码久久99| 久久久久人妻精品一区三寸蜜桃| 新狼窝色AV性久久久久久| 久久亚洲精品国产亚洲老地址| 亚洲精品高清久久| 久久精品蜜芽亚洲国产AV| 伊人久久大香线蕉综合Av| 亚洲AⅤ优女AV综合久久久| 国产三级观看久久| 国产91色综合久久免费| 欧美黑人又粗又大久久久| 久久久午夜精品| 伊人情人综合成人久久网小说 | 91性高湖久久久久| 久久福利青草精品资源站免费| 日日躁夜夜躁狠狠久久AV| 99精品国产综合久久久久五月天| 久久中文字幕人妻丝袜| 久久久久久精品免费看SSS| 伊人色综合久久天天人守人婷| 少妇熟女久久综合网色欲| 久久精品国产亚洲av麻豆图片| 国产成人久久精品一区二区三区| 久久人人爽人人爽人人爽|