#ifndef CURSOR_H #define CURSOR_H #include "BaseComponent.h" #include "../utils/Color.h" #include #include class Cursor : public BaseComponent { private: bool visibility_; const int cursorAttributes_ = BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY; int lastAttributes_; bool posHasChanged_ = true; int maxLeft_, maxTop_; COORD lastPos_ = {0, 0}; public: Cursor() : BaseComponent(1, 1, 1, 1) { visibility_ = true; } Cursor(int x, int y) : BaseComponent(x, y, 1, 1) { visibility_ = true; }; Cursor(int x, int y, bool visibility) : BaseComponent(x, y, 1, 1) { visibility_ = visibility; } ~Cursor() override = default; void draw() override { if (!visibility_) return; // ReadConsoleOutput HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); COORD bufferSize = {static_cast(1), static_cast(1)}; COORD bufferPos = {0, 0}; if(posHasChanged_) { SMALL_RECT oldReat = {static_cast(lastPos_.X - 1), static_cast(lastPos_.Y - 1), static_cast(lastPos_.X), static_cast(lastPos_.Y)}; CHAR_INFO buffer[1]; if(ReadConsoleOutput(hConsole, buffer, bufferSize, bufferPos, &oldReat) == 0) { // std::cout << GetLastError() << std::endl; } buffer[0].Attributes = lastAttributes_; if(WriteConsoleOutput(hConsole, buffer, bufferSize, bufferPos, &oldReat) == 0) { // std::cout << GetLastError() << std::endl; } } SMALL_RECT rect = {static_cast(left - 1), static_cast(top - 1), static_cast(left), static_cast(top)}; CHAR_INFO buffer[1]; if(ReadConsoleOutput(hConsole, buffer, bufferSize, bufferPos, &rect) == 0) { // std::cout << GetLastError() << std::endl; } if(posHasChanged_) { lastAttributes_ = buffer[0].Attributes; } buffer[0].Attributes = cursorAttributes_; if(WriteConsoleOutput(hConsole, buffer, bufferSize, bufferPos, &rect) == 0) { // std::cout << GetLastError() << std::endl; } posHasChanged_ = false; } void setPosition(int x, int y) { posHasChanged_ = true; lastPos_ = {static_cast(left), static_cast(top)}; BaseComponent::setPosition(x, y); } void setBounds(int maxLeft, int maxTop) { maxLeft_ = maxLeft; maxTop_ = maxTop; } void moveUp() { if(top > 1) { setPosition(left, top - 1); } } void moveDown() { if(top < maxTop_) { setPosition(left, top + 1); } } void moveLeft() { if(left > 1) { setPosition(left - 1, top); } } void moveRight() { if(left < maxLeft_) { setPosition(left + 1, top); } } void onKeyPress(int key) override { return; } void setVisibility(bool visibility) { if(visibility == visibility_) return; visibility_ = visibility; } bool isVisible() { return visibility_; } }; #endif