[C++/Dev C++] Jak wyłączyć Scrollbar w aplikacji konsolowej


(Kamil Wojtasik) #1

Jak wyłączyć Scrollbar w aplikacji konsolowej w C++/Dev C++?


(Sawyer47) #2

Scrollbar nie jest częścią aplikacji działającej w trybie tekstowym. Można co najwyżej wyłączyć w go w opcjach emulatora terminala, a to jest zależne od tego jakiego się używa.


(Kamil Wojtasik) #3

A jak zrobić coś takiego ? tu nie ma scrola ...


(Ryan) #4

Nie prawda, nr47, można wyłączyć scroll bar kawałkiem kodu. Wystarczy wywołać kilka funkcji API, m.in.:

http://msdn2.microsoft.com/en-us/library/ms686044.aspx

Jeśli dobrze pamiętam manipulacja ScreenBufferSize i WindowInfo jest wystarczająca. Nie mogę niestety znaleźć kodu, który to robi, ale wykonałem to kiedyś i wiem, że działa (w C# za pomocą P/Invoke, ale jednak).

//edit

To powyżej to nie musi wcale być okno konsoli.


(Kamil Wojtasik) #5

Dzięki Ryan.

Znalazłem.

Jakby ktoś kiedyś szukał to zamieszczam tu :

#include 


static HANDLE hStdIn;

static HANDLE hStdOut;

static DWORD SavedMode;

static CONSOLE_CURSOR_INFO SavedCursor;


static void resizeConBufAndWindow(HANDLE hConsole, SHORT xSize, SHORT ySize)

{

   CONSOLE_SCREEN_BUFFER_INFO csbi;

   BOOL bSuccess;

   SMALL_RECT srWindowRect;

   COORD coordScreen;


   bSuccess = GetConsoleScreenBufferInfo(hConsole, &csbi);


   coordScreen = GetLargestConsoleWindowSize(hConsole);


   srWindowRect.Right = (SHORT) (min(xSize, coordScreen.X) - 1);

   srWindowRect.Bottom = (SHORT) (min(ySize, coordScreen.Y) - 1);

   srWindowRect.Left = srWindowRect.Top = (SHORT) 0;


   coordScreen.X = xSize;

   coordScreen.Y = ySize;


   if ((DWORD) csbi.dwSize.X * csbi.dwSize.Y > (DWORD) xSize * ySize)

      {

         bSuccess = SetConsoleWindowInfo(hConsole, TRUE, &srWindowRect);

         bSuccess = SetConsoleScreenBufferSize(hConsole, coordScreen);

      }


   if ((DWORD) csbi.dwSize.X * csbi.dwSize.Y < (DWORD) xSize * ySize)

      {

          bSuccess = SetConsoleScreenBufferSize(hConsole, coordScreen);

          bSuccess = SetConsoleWindowInfo(hConsole, TRUE, &srWindowRect);

      }

}


static BOOL CreateConsole( int Columns, int Rows )

{

   BOOL bSuccess;

   CONSOLE_SCREEN_BUFFER_INFO csbi;

   CONSOLE_CURSOR_INFO cci;


   bSuccess = GetConsoleScreenBufferInfo( GetStdHandle(STD_OUTPUT_HANDLE),&csbi);

   if ( bSuccess )

      {

         if (csbi.dwCursorPosition.X | csbi.dwCursorPosition.Y)

            {

               bSuccess = FreeConsole();

               bSuccess = AllocConsole();

            }

         bSuccess = SetConsoleTitle("Game Client");

         hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

         hStdIn = GetStdHandle(STD_INPUT_HANDLE);

         bSuccess = SetConsoleMode(hStdIn, (unsigned long) (~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT)) | ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT);

         cci.dwSize = 25;

         cci.bVisible = TRUE;

         bSuccess = SetConsoleCursorInfo(hStdOut, &cci);

         bSuccess = SetConsoleTextAttribute(hStdOut, 0 | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE );

         resizeConBufAndWindow( hStdOut, (short) Columns, (short) Rows );

      }

   return bSuccess;

}


static BOOL Puts(HANDLE hConsole, PCHAR s)

{

   DWORD cCharsWritten;

   return WriteConsole(hConsole, s, strlen(s), &cCharsWritten, NULL);

}


int main()

{

  int c, v;


  CreateConsole(80,30);

  Puts( hStdOut, "Hello!!" );

  system("pause");

}