Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

Cursor Hiding

Posted on 2000-03-24
5
Medium Priority
?
808 Views
Last Modified: 2008-03-17
I am looking for a solution to hide (and possibly change) the cursor in DOS console application.  I am using WinNT 4 and Vis C++ 6 to compile.  I read an answer by neitod stating:

In DOS use int 10H Sub-function 1
Set AH to 1
CH to the cursor start line 0-15
CL to cursor end line 0-15.  
and execute interupt 10H.
To make cursor dissapear set the start and end lines 0.  To make the a big block cursor set start to 0 and end to 15.

I am ABSOLUTELY confused by all this, but this seems to be the way to go.  If someone could explain how to get this working, and if possible, supply me a simple source code to get this working, I would be very thankful.  Thnx!
0
Comment
Question by:junkyboy
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
5 Comments
 
LVL 22

Accepted Solution

by:
nietod earned 100 total points
ID: 2653841
You could use that in a DOS program.  But you aren't writting a DOS program.  VC 6 doesn't produce DOS programs.  What you are producing is a win32 console program.  These usuallu look (to the user) like a DOS program, but thy are VERY different kind of programs--as far as the programmer is concerned.  that method will not work in a win32 console program.  Fortunatly, there are many wonderful windows API functions that will let you do this and more.

continues.
0
 
LVL 22

Expert Comment

by:nietod
ID: 2653852
In win32, you can show/hide/resize the cursor using the SetConsoleCursorInfo() function.  Look this up in the help.  I have some examples of this, but currenlty can't seem to find it.  I'll keep looking.  I do have some other examples of related things that will also be of interest to you.
0
 
LVL 22

Expert Comment

by:nietod
ID: 2653896
Here are functions for getting/setting the cursor's size.  The size is specified as the percent of the cursor's height compared to the character cell height.   0, means the cursor is invisible, 100 means it fills the cell. 50 means it take up the lower half of the cell etc.

//------------------------------------------------------------------------------------------------//
// TITLE:  Get Cursor Size.                                                                       //
//      This procedure returns the current cursor size.  The size is returned as a value between  //
// 0 and 100 (inclusive) indicating the percent of the character cell height that is filled with  //
// the cursor.  0 will be returned if the cursor is invisible.                                    //
int                                              // Cursor size.                                  //
GetCrsSiz(void)
{
   CONSOLE_CURSOR_INFO CrsInf;
   static HANDLE StdOutHnd = GetStdHandle(STD_OUTPUT_HANDLE); // >> standard output.                 //

   GetConsoleCursorInfo(StdOutHnd,&CrsInf);
   if (CrsInf.bVisible)                          // If the cursor is visible, then                //
      return CrsInf.dwSize;                      // Return the cursor size.                       //
   return 0;                                     // Indicate the cursor is invisible.             //
}
//------------------------------------------------------------------------------------------------//
// TITLE:  Set Cursor Size.                                                                       //
//      This procedure sets the current cursor size.  The size is specified as a value between    //
// 0 and 100 (inclusive) indicating the percent of the character cell height that is filled with  //
// the cursor.  Specify 0 to make the cursor invisible.                                           //
void
QConSetCrsSiz(int Siz)                           // New cursor size.  This value should be from 0 //
                                                 // to 100.                                       //
{
   CONSOLE_CURSOR_INFO CrsInf;
   static HANDLE StdOutHnd = GetStdHandle(STD_OUTPUT_HANDLE); // >> standard output.                 //

   if (Siz <= 0)                                 // If cursor should be made invisible, then      //
   {
      CrsInf.bVisible = FALSE;                   // Indicate cursor is invisible.                 //
      CrsInf.dwSize   = 1;                       // Set cursor size to its minimum.               //
   }
   else                                          // Otherwise, if cursor should be made visible,  //
   {
      CrsInf.bVisible = TRUE;                    // Indicate cursor is visible.                   //
      CrsInf.dwSize   = min(Siz,100);            // Set cursor size to specified size.            //
   }
   SetConsoleCursorInfo(StdOutHnd,&CrsInf);      // Set the cursor size.                          //
}
0
 
LVL 22

Expert Comment

by:nietod
ID: 2653903
Here is some more code showing how to move the cursor around and to change the color of the output.

#include <stdio.h>
      #include <string.h>
      #include <stdlib.h>
      #include <windows.h>
      FILE*fp;

enum Color
{
   Red,
   Green,
   Blue,
   Yellow,
   Purple,
   Cyan,  
   White,
   Black
};

void GotoXY(int X,int Y)
{
      HANDLE StdOut = GetStdHandle(STD_OUTPUT_HANDLE);
      COORD Coord = {X,Y};
      SetConsoleCursorPosition(StdOut,Coord);
}
void OutputStr(const char *S)
{
      HANDLE StdOut = GetStdHandle(STD_OUTPUT_HANDLE);
      int StrLen = strlen(S);
      DWORD LenWrt;
      WriteConsole(StdOut,S,StrLen,&LenWrt,NULL);
}
void OutputStr(int X,int Y,const char *S)
{
      GotoXY(X,Y);
      OutputStr(S);
}

void ClearScreen()
{
   HANDLE StdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   CONSOLE_SCREEN_BUFFER_INFO BufInf;
   COORD Origin = {0,0};
   DWORD LenWrt;

   GetConsoleScreenBufferInfo(StdOut,&BufInf); // Get screen rows and columns.
 
   int ChrCnt = BufInf.dwSize.X * BufInf.dwSize.Y; // Number of chars on screen.
   
   FillConsoleOutputAttribute(StdOut,0,ChrCnt,Origin,&LenWrt);
   FillConsoleOutputCharacter(StdOut,' ',ChrCnt,Origin,&LenWrt);
}
void SetColor(Color TxtCol,Color BckCol)
{
   HANDLE StdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   WORD   Col    = 0;

   switch (TxtCol)
   {
   case Red:    Col |= FOREGROUND_RED;   break;
   case Green:  Col |= FOREGROUND_GREEN; break;
   case Blue:   Col |= FOREGROUND_BLUE;  break;
   case Yellow: Col |= FOREGROUND_RED | FOREGROUND_GREEN;   break;
   case Purple: Col |= FOREGROUND_RED | FOREGROUND_BLUE;    break;
   case Cyan:   Col |= FOREGROUND_GREEN | FOREGROUND_BLUE;  break;
   case White:  Col |= FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
   }
   switch (BckCol)
   {
   case Red:    Col |= BACKGROUND_RED;   break;
   case Green:  Col |= BACKGROUND_GREEN; break;
   case Blue:   Col |= BACKGROUND_BLUE;  break;
   case Yellow: Col |= BACKGROUND_RED | BACKGROUND_GREEN;   break;
   case Purple: Col |= BACKGROUND_RED | BACKGROUND_BLUE;    break;
   case Cyan:   Col |= BACKGROUND_GREEN | BACKGROUND_BLUE;  break;
   case White:  Col |= BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE; break;
   }
   SetConsoleTextAttribute(StdOut,Col);
}

      main()
      {

      char buf[1000], garbage[10], filename[15], inChar[1000], text;
      int m, length, choice, count=1, longs=0, x=0, cnt=0, y=0;
      static int n=0;


   while(1)
   {
      ClearScreen();
      longs=0, n=0, x=0, y=0; cnt=0;
      HANDLE StdOut = GetStdHandle(STD_OUTPUT_HANDLE);
           
      SetColor(Red,Black);
      OutputStr(0,1,"********************************************************");
      SetColor(Black,Cyan);
      OutputStr(20,2,"P A R A G R A P H");
      SetColor(Purple,Black);
      OutputStr(0,3,"********************************************************");
      SetColor(Black,Cyan);
      OutputStr(20,4,"C O N V E R T E R");
      SetColor(Blue,Black);
      OutputStr(0,5,"********************************************************");

      SetColor(Yellow,Black);
      OutputStr(0, 7,"Paragraph Converter Menu");
      OutputStr(0, 8,"1.  Enter a paragragh");
      OutputStr(0, 9,"2.  Read from file");
      OutputStr(0,10,"3.  Exit");
      OutputStr(0,11,"#########################");
      SetColor(White,Black);
      OutputStr(0,13,"Enter you choice : ");
      GotoXY(20,13);

      fflush(stdin);
      scanf(" %d", &choice);
      gets(garbage);

      ClearScreen();
      GotoXY(0,0);

      switch(choice)
      {
      case 1:

      printf("\nEnter a sentence : ");
      gets(buf);

      length=strlen(buf);

      printf (" \n\n\nProsessing...\n\n\n");

      for ( m=0; m<length; m++)
      {
      if( buf[m] == ' ')
      count++;
      else if (buf[m] == '.' || buf[m] == '?' || buf[m] == '!')
      {

      if(count>20)
      {
      for(n; n<=m; n++)
      {
      inChar[x] = buf[n];
      x++;
      }

      longs++;
      count=1;
      }
      else{
      count=1;
      n=m+1;}
      }
      }

      if(longs>0)
      {
      printf("\nThe following %d sentence(s) is(are) too long, please reduce the number of words to make it more readable.\n\n",
      longs);
      for(cnt; cnt<=x; cnt++)
      {
      printf("%c",inChar[cnt]);
      if(inChar[cnt]=='.')
      printf("\n\n");
      }

      }
      else
      printf("\nThere are no long sentences.\n\n" );


      break;

      case 2:
      printf("\n\nEnter the filename: ");
      scanf(" %s", &filename);
      fp=fopen(filename, "r");
      printf("\nProcessing...");
      if(fp==NULL)
      {
      printf("\n\nFile %s does not exist\n\n", filename);
      }
      else
      {
      printf("\n\nAssume data in file: %s\n\n", filename);
      printf("---------------------------------------------------------------------------\n");
      rewind(fp);
      while((text = getc(fp)) != EOF)
      {
      printf("%c",text);
      buf[y]=text;
      y++;
      }
      fclose(fp);
      printf("\n----------------------------------------------------------------------\n");


      length=strlen(buf);

      for ( m=0; m<length; m++)
      {
      if( buf[m] == ' ')
      count++;
      else if (buf[m] == '.' || buf[m] == '?' || buf[m] == '!')
      {

      if(count>20)
      {
      for(n; n<=m; n++)
      {
      inChar[x] = buf[n];
      x++;
      }
      longs++;
      count=1;
      }
      else{
      count=1;
      n=m+1;
      }
      }

      }

      if(longs>0)
      {
      printf("\nThe following %d sentence(s) is(are) too long, please reduce the number of words to make it more readable.\n\n",
      longs);
      for(cnt; cnt<=x; cnt++)
      {
      printf("%c",inChar[cnt]);
      if(inChar[cnt]=='.')
      printf("\n\n");
      }
      }
      else
      printf("\nThere are no long sentences.\n\n" );


      }




      break;

      case 3:
      printf("\n\nBYE !!!\n\n");
      exit(0);
      break;
      default :
      printf(" \nInvalid selection made.\n");
      break;
      }

      }
      return 0;
      }
0
 

Author Comment

by:junkyboy
ID: 2656176
Thanks!  Every time I get perfect answers like this, I really feel Experts Exchange IS THE BEST PLACE on the net!  :)
0

Featured Post

Enroll in September's Course of the Month

This month’s featured course covers 16 hours of training in installation, management, and deployment of VMware vSphere virtualization environments. It's free for Premium Members, Team Accounts, and Qualified Experts!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Unlike C#, C++ doesn't have native support for sealing classes (so they cannot be sub-classed). At the cost of a virtual base class pointer it is possible to implement a pseudo sealing mechanism The trick is to virtually inherit from a base class…
Often, when implementing a feature, you won't know how certain events should be handled at the point where they occur and you'd rather defer to the user of your function or class. For example, a XML parser will extract a tag from the source code, wh…
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.

705 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question