bool console::SetSize(COORD Size) const { if (!sWindowMode) return SetConsoleScreenBufferSize(GetOutputHandle(), Size) != FALSE; CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo(GetOutputHandle(), &csbi); csbi.srWindow.Left = 0; csbi.srWindow.Right = Size.X - 1; csbi.srWindow.Bottom = csbi.dwSize.Y - 1; csbi.srWindow.Top = csbi.srWindow.Bottom - (Size.Y - 1); COORD WindowCoord = { static_cast<SHORT>(csbi.srWindow.Right - csbi.srWindow.Left + 1), static_cast<SHORT>(csbi.srWindow.Bottom - csbi.srWindow.Top + 1) }; if (WindowCoord.X > csbi.dwSize.X || WindowCoord.Y > csbi.dwSize.Y) { WindowCoord.X = std::max(WindowCoord.X, csbi.dwSize.X); WindowCoord.Y = std::max(WindowCoord.Y, csbi.dwSize.Y); SetConsoleScreenBufferSize(GetOutputHandle(), WindowCoord); if (WindowCoord.X > csbi.dwSize.X) { // windows sometimes uses existing colors to init right region of screen buffer FarColor Color; GetTextAttributes(Color); ClearExtraRegions(Color, CR_RIGHT); } } return SetWindowRect(csbi.srWindow); }
virtual bool GetSize(COORD& Size) const override { bool Result=false; CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo; #ifdef _DEBUG //Maximus: для отладки HANDLE hOut=GetOutputHandle(); UNREFERENCED_PARAMETER(hOut); DWORD dwErr=GetLastError(), dwErr2=0; UNREFERENCED_PARAMETER(dwErr); #endif if(GetConsoleScreenBufferInfo(GetOutputHandle(), &ConsoleScreenBufferInfo)) { if(Global->Opt->WindowMode) { Size.X=ConsoleScreenBufferInfo.srWindow.Right-ConsoleScreenBufferInfo.srWindow.Left+1; Size.Y=ConsoleScreenBufferInfo.srWindow.Bottom-ConsoleScreenBufferInfo.srWindow.Top+1; } else { Size=ConsoleScreenBufferInfo.dwSize; } Result=true; } #ifdef _DEBUG //Maximus: для отладки else { dwErr2=GetLastError(); _ASSERTE(Result && dwErr2==0); } #endif return Result; }
bool console::GetWindowRect(SMALL_RECT& ConsoleWindow) const { CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo; if (!GetConsoleScreenBufferInfo(GetOutputHandle(), &ConsoleScreenBufferInfo)) return false; ConsoleWindow = ConsoleScreenBufferInfo.srWindow; return true; }
virtual bool GetWindowRect(SMALL_RECT& ConsoleWindow) const override { bool Result=false; CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo; if(GetConsoleScreenBufferInfo(GetOutputHandle(), &ConsoleScreenBufferInfo)) { ConsoleWindow=ConsoleScreenBufferInfo.srWindow; Result=true; } return Result; }
virtual bool ReadOutput(matrix<FAR_CHAR_INFO>& Buffer, COORD BufferCoord, SMALL_RECT& ReadRegion) const override { bool Result=false; int Delta=Global->Opt->WindowMode?GetDelta():0; ReadRegion.Top+=Delta; ReadRegion.Bottom+=Delta; COORD BufferSize = { static_cast<SHORT>(Buffer.width()), static_cast<SHORT>(Buffer.height()) }; // skip unused region const size_t Offset = BufferCoord.Y * BufferSize.X; matrix<CHAR_INFO> ConsoleBuffer(BufferSize.Y - BufferCoord.Y, BufferSize.X); BufferSize.Y-=BufferCoord.Y; BufferCoord.Y=0; if(BufferSize.X*BufferSize.Y*sizeof(CHAR_INFO)>MAXSIZE) { auto SavedY = BufferSize.Y; BufferSize.Y = std::max(static_cast<int>(MAXSIZE/(BufferSize.X*sizeof(CHAR_INFO))),1); size_t Height = ReadRegion.Bottom - ReadRegion.Top + 1; int Start=ReadRegion.Top; SMALL_RECT SavedReadRegion=ReadRegion; for(size_t i = 0; i < Height; i += BufferSize.Y) { ReadRegion=SavedReadRegion; ReadRegion.Top = static_cast<SHORT>(Start+i); Result = ReadConsoleOutput(GetOutputHandle(), ConsoleBuffer[i].data(), BufferSize, BufferCoord, &ReadRegion) != FALSE; } BufferSize.Y = SavedY; } else { Result=ReadConsoleOutput(GetOutputHandle(), ConsoleBuffer.data(), BufferSize, BufferCoord, &ReadRegion)!=FALSE; } auto& ConsoleBufferVector = ConsoleBuffer.vector(); std::transform(ConsoleBufferVector.cbegin(), ConsoleBufferVector.cend(), Buffer.data() + Offset, [](CONST_REFERENCE(ConsoleBufferVector) i) { return FAR_CHAR_INFO::make(i.Char.UnicodeChar, colors::ConsoleColorToFarColor(i.Attributes)); });
bool console::GetWorkingRect(SMALL_RECT& WorkingRect) const { CONSOLE_SCREEN_BUFFER_INFO csbi; if (!GetConsoleScreenBufferInfo(GetOutputHandle(), &csbi)) return false; WorkingRect.Bottom = csbi.dwSize.Y - 1; WorkingRect.Left = 0; WorkingRect.Right = WorkingRect.Left + ScrX; WorkingRect.Top = WorkingRect.Bottom - ScrY; return true; }
virtual bool SetSize(COORD Size) const override { bool Result=false; if(Global->Opt->WindowMode) { CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo(GetOutputHandle(), &csbi); csbi.srWindow.Left=0; csbi.srWindow.Right=Size.X-1; csbi.srWindow.Bottom=csbi.dwSize.Y-1; csbi.srWindow.Top=csbi.srWindow.Bottom-(Size.Y-1); COORD WindowCoord={static_cast<SHORT>(csbi.srWindow.Right-csbi.srWindow.Left+1), static_cast<SHORT>(csbi.srWindow.Bottom-csbi.srWindow.Top+1)}; if(WindowCoord.X>csbi.dwSize.X || WindowCoord.Y>csbi.dwSize.Y) { WindowCoord.X=std::max(WindowCoord.X,csbi.dwSize.X); WindowCoord.Y=std::max(WindowCoord.Y,csbi.dwSize.Y); SetConsoleScreenBufferSize(GetOutputHandle(), WindowCoord); if(WindowCoord.X>csbi.dwSize.X) { // windows sometimes uses existing colors to init right region of screen buffer FarColor Color; Console().GetTextAttributes(Color); Console().ClearExtraRegions(Color, CR_RIGHT); } } if(SetWindowRect(csbi.srWindow)) { csbi.dwSize.X = Size.X; Result=SetConsoleScreenBufferSize(GetOutputHandle(), csbi.dwSize)!=FALSE; } } else { Result=SetConsoleScreenBufferSize(GetOutputHandle(), Size)!=FALSE; } return Result; }
virtual bool GetWorkingRect(SMALL_RECT& WorkingRect) const override { bool Result=false; CONSOLE_SCREEN_BUFFER_INFO csbi; if(GetConsoleScreenBufferInfo(GetOutputHandle(), &csbi)) { WorkingRect.Bottom=csbi.dwSize.Y-1; WorkingRect.Left=0; WorkingRect.Right=WorkingRect.Left+ScrX; WorkingRect.Top=WorkingRect.Bottom-ScrY; Result=true; } return Result; }
bool console::SetWindowRect(const SMALL_RECT& ConsoleWindow) const { return SetConsoleWindowInfo(GetOutputHandle(), true, &ConsoleWindow) != FALSE; }
MMRESULT MidiStream::ShortMessage(const MidiMessage & message) const { ASSERT(*this != NULL); return ::midiOutShortMsg(GetOutputHandle(), message); }
virtual bool SetWindowRect(const SMALL_RECT& ConsoleWindow) const override { return SetConsoleWindowInfo(GetOutputHandle(), true, &ConsoleWindow)!=FALSE; }