The color of windows console displays correctly now
minor minor
This commit is contained in:
parent
e9127832d7
commit
084fc4aff7
|
|
@ -28,6 +28,7 @@
|
|||
#include "Transition.h"
|
||||
#include <windowsx.h>
|
||||
#include <imm.h>
|
||||
#include <iostream>
|
||||
|
||||
#pragma comment (lib ,"imm32.lib")
|
||||
|
||||
|
|
@ -53,6 +54,40 @@ namespace easy2d
|
|||
{
|
||||
debug_ = options.debug;
|
||||
|
||||
// show console if debug mode enabled
|
||||
HWND console = ::GetConsoleWindow();
|
||||
if (debug_ && !console)
|
||||
{
|
||||
if (::AllocConsole())
|
||||
{
|
||||
console = ::GetConsoleWindow();
|
||||
FILE * dummy;
|
||||
freopen_s(&dummy, "CONOUT$", "w+t", stdout);
|
||||
freopen_s(&dummy, "CONIN$", "r+t", stdin);
|
||||
freopen_s(&dummy, "CONOUT$", "w+t", stderr);
|
||||
(void)dummy;
|
||||
|
||||
std::cout.clear();
|
||||
std::wcout.clear();
|
||||
std::cin.clear();
|
||||
std::wcin.clear();
|
||||
std::cerr.clear();
|
||||
std::wcerr.clear();
|
||||
}
|
||||
}
|
||||
else if (!debug_ && console)
|
||||
{
|
||||
::ShowWindow(console, SW_HIDE);
|
||||
console = nullptr;
|
||||
}
|
||||
|
||||
// disable the close button of console
|
||||
if (console)
|
||||
{
|
||||
HMENU hmenu = ::GetSystemMenu(console, FALSE);
|
||||
::RemoveMenu(hmenu, SC_CLOSE, MF_BYCOMMAND);
|
||||
}
|
||||
|
||||
ThrowIfFailed(
|
||||
Factory::Instance()->Init(debug_)
|
||||
);
|
||||
|
|
@ -95,31 +130,6 @@ namespace easy2d
|
|||
// disable imm
|
||||
::ImmAssociateContext(hwnd, nullptr);
|
||||
|
||||
// show console if debug mode enabled
|
||||
HWND console = ::GetConsoleWindow();
|
||||
if (debug_ && !console)
|
||||
{
|
||||
if (::AllocConsole())
|
||||
{
|
||||
console = ::GetConsoleWindow();
|
||||
FILE * stdoutStream, *stdinStream, *stderrStream;
|
||||
freopen_s(&stdoutStream, "conout$", "w+t", stdout);
|
||||
freopen_s(&stdinStream, "conin$", "r+t", stdin);
|
||||
freopen_s(&stderrStream, "conout$", "w+t", stderr);
|
||||
}
|
||||
}
|
||||
else if (!debug_ && console)
|
||||
{
|
||||
::ShowWindow(console, SW_HIDE);
|
||||
}
|
||||
|
||||
// disable the close button of console
|
||||
if (console)
|
||||
{
|
||||
HMENU hmenu = ::GetSystemMenu(console, FALSE);
|
||||
::RemoveMenu(hmenu, SC_CLOSE, MF_BYCOMMAND);
|
||||
}
|
||||
|
||||
// use Application instance in message loop
|
||||
::SetWindowLongPtr(hwnd, GWLP_USERDATA, PtrToUlong(this));
|
||||
}
|
||||
|
|
@ -189,8 +199,6 @@ namespace easy2d
|
|||
const auto dt = (now - last) * time_scale_;
|
||||
last = now;
|
||||
|
||||
Input::Instance()->Update();
|
||||
|
||||
if (transition_)
|
||||
{
|
||||
transition_->Update(dt);
|
||||
|
|
@ -262,6 +270,8 @@ namespace easy2d
|
|||
{
|
||||
app->Update();
|
||||
app->Render(hwnd);
|
||||
|
||||
Input::Instance()->Update();
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
|
@ -269,6 +279,8 @@ namespace easy2d
|
|||
case WM_KEYDOWN:
|
||||
case WM_KEYUP:
|
||||
{
|
||||
Input::Instance()->UpdateKey((int)wparam, (msg == WM_KEYDOWN) ? true : false);
|
||||
|
||||
if (!app->transition_ && app->curr_scene_)
|
||||
{
|
||||
Event evt((msg == WM_KEYDOWN) ? KeyboardEvent::Down : KeyboardEvent::Up);
|
||||
|
|
@ -292,6 +304,10 @@ namespace easy2d
|
|||
case WM_MOUSEMOVE:
|
||||
case WM_MOUSEWHEEL:
|
||||
{
|
||||
if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONUP) { Input::Instance()->UpdateKey(VK_LBUTTON, (msg == WM_LBUTTONDOWN) ? true : false); }
|
||||
else if (msg == WM_RBUTTONDOWN || msg == WM_RBUTTONUP) { Input::Instance()->UpdateKey(VK_RBUTTON, (msg == WM_RBUTTONDOWN) ? true : false); }
|
||||
else if (msg == WM_MBUTTONDOWN || msg == WM_MBUTTONUP) { Input::Instance()->UpdateKey(VK_MBUTTON, (msg == WM_MBUTTONDOWN) ? true : false); }
|
||||
|
||||
if (!app->transition_ && app->curr_scene_)
|
||||
{
|
||||
Event evt;
|
||||
|
|
@ -301,24 +317,14 @@ namespace easy2d
|
|||
evt.mouse.left_btn_down = !!(wparam & MK_LBUTTON);
|
||||
evt.mouse.left_btn_down = !!(wparam & MK_RBUTTON);
|
||||
|
||||
if (msg == WM_MOUSEMOVE)
|
||||
evt.type = MouseEvent::Move;
|
||||
else if (msg == WM_LBUTTONDOWN || msg == WM_RBUTTONDOWN || msg == WM_MBUTTONDOWN)
|
||||
evt.type = MouseEvent::Down;
|
||||
else if (msg == WM_LBUTTONUP || msg == WM_RBUTTONUP || msg == WM_MBUTTONUP)
|
||||
evt.type = MouseEvent::Up;
|
||||
else
|
||||
{
|
||||
evt.type = MouseEvent::Wheel;
|
||||
evt.mouse.wheel_delta = GET_WHEEL_DELTA_WPARAM(wparam) / 120.f;
|
||||
}
|
||||
if (msg == WM_MOUSEMOVE) { evt.type = MouseEvent::Move; }
|
||||
else if (msg == WM_LBUTTONDOWN || msg == WM_RBUTTONDOWN || msg == WM_MBUTTONDOWN) { evt.type = MouseEvent::Down; }
|
||||
else if (msg == WM_LBUTTONUP || msg == WM_RBUTTONUP || msg == WM_MBUTTONUP) { evt.type = MouseEvent::Up; }
|
||||
else if (msg == WM_MOUSEWHEEL) { evt.type = MouseEvent::Wheel; evt.mouse.wheel = GET_WHEEL_DELTA_WPARAM(wparam) / (float)WHEEL_DELTA; }
|
||||
|
||||
if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONUP)
|
||||
evt.mouse.button = MouseButton::Left;
|
||||
else if (msg == WM_RBUTTONDOWN || msg == WM_RBUTTONUP)
|
||||
evt.mouse.button = MouseButton::Right;
|
||||
else if (msg == WM_MBUTTONDOWN || msg == WM_MBUTTONUP)
|
||||
evt.mouse.button = MouseButton::Middle;
|
||||
if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONUP) { evt.mouse.button = MouseButton::Left; }
|
||||
else if (msg == WM_RBUTTONDOWN || msg == WM_RBUTTONUP) { evt.mouse.button = MouseButton::Right; }
|
||||
else if (msg == WM_MBUTTONDOWN || msg == WM_MBUTTONUP) { evt.mouse.button = MouseButton::Middle; }
|
||||
|
||||
app->curr_scene_->Dispatch(evt);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ namespace easy2d
|
|||
|
||||
// 初始化
|
||||
void Init(
|
||||
Options const& options
|
||||
Options const& options = Options{}
|
||||
);
|
||||
|
||||
// 启动时
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ namespace easy2d
|
|||
|
||||
struct
|
||||
{
|
||||
float wheel_delta; // 仅当消息类型为 Wheel 时有效
|
||||
float wheel; // 仅当消息类型为 Wheel 时有效
|
||||
};
|
||||
|
||||
static inline bool Check(EventType type)
|
||||
|
|
|
|||
|
|
@ -26,9 +26,11 @@ namespace easy2d
|
|||
{
|
||||
Input::Input()
|
||||
: hwnd_(nullptr)
|
||||
, want_update_(false)
|
||||
{
|
||||
ZeroMemory(keys_, sizeof(keys_));
|
||||
ZeroMemory(keys_cache_, sizeof(keys_cache_));
|
||||
ZeroMemory(keys_pressed_, sizeof(keys_pressed_));
|
||||
ZeroMemory(keys_released_, sizeof(keys_released_));
|
||||
}
|
||||
|
||||
Input::~Input()
|
||||
|
|
@ -47,42 +49,55 @@ namespace easy2d
|
|||
|
||||
void Input::Update()
|
||||
{
|
||||
memcpy(keys_cache_, keys_, sizeof(keys_cache_));
|
||||
::GetKeyboardState(keys_);
|
||||
if (want_update_)
|
||||
{
|
||||
want_update_ = false;
|
||||
|
||||
ZeroMemory(keys_pressed_, sizeof(keys_pressed_));
|
||||
ZeroMemory(keys_released_, sizeof(keys_released_));
|
||||
}
|
||||
}
|
||||
|
||||
void Input::UpdateKey(int key, bool down)
|
||||
{
|
||||
if (down && !keys_[key])
|
||||
keys_pressed_[key] = true;
|
||||
if (!down && keys_[key])
|
||||
keys_released_[key] = true;
|
||||
|
||||
keys_[key] = down;
|
||||
|
||||
want_update_ = true;
|
||||
}
|
||||
|
||||
bool Input::IsDown(KeyCode code)
|
||||
{
|
||||
return !!(keys_[static_cast<int>(code)] & 0x80);
|
||||
return keys_[static_cast<int>(code)];
|
||||
}
|
||||
|
||||
bool Input::IsDown(MouseButton btn)
|
||||
{
|
||||
return !!(keys_[static_cast<int>(btn)] & 0x80);
|
||||
return keys_[static_cast<int>(btn)];
|
||||
}
|
||||
|
||||
bool Input::WasPressed(KeyCode code)
|
||||
{
|
||||
return !(keys_cache_[static_cast<int>(code)] & 0x80)
|
||||
&& (keys_[static_cast<int>(code)] & 0x80);
|
||||
return keys_pressed_[static_cast<int>(code)];
|
||||
}
|
||||
|
||||
bool Input::WasPressed(MouseButton btn)
|
||||
{
|
||||
return !(keys_cache_[static_cast<int>(btn)] & 0x80)
|
||||
&& (keys_[static_cast<int>(btn)] & 0x80);
|
||||
return keys_pressed_[static_cast<int>(btn)];
|
||||
}
|
||||
|
||||
bool Input::WasReleased(KeyCode code)
|
||||
{
|
||||
return (keys_cache_[static_cast<int>(code)] & 0x80)
|
||||
&& !(keys_[static_cast<int>(code)] & 0x80);
|
||||
return keys_released_[static_cast<int>(code)];
|
||||
}
|
||||
|
||||
bool Input::WasReleased(MouseButton btn)
|
||||
{
|
||||
return (keys_cache_[static_cast<int>(btn)] & 0x80)
|
||||
&& !(keys_[static_cast<int>(btn)] & 0x80);
|
||||
return keys_released_[static_cast<int>(btn)];
|
||||
}
|
||||
|
||||
float Input::GetMouseX()
|
||||
|
|
@ -96,10 +111,17 @@ namespace easy2d
|
|||
}
|
||||
|
||||
Point Input::GetMousePos()
|
||||
{
|
||||
Point mouse_pos = Point{};
|
||||
if (HWND active_window = ::GetForegroundWindow())
|
||||
{
|
||||
if (active_window == hwnd_ || ::IsChild(active_window, hwnd_))
|
||||
{
|
||||
POINT pos;
|
||||
::GetCursorPos(&pos);
|
||||
::ScreenToClient(hwnd_, &pos);
|
||||
return Point{ static_cast<float>(pos.x), static_cast<float>(pos.y) };
|
||||
if (::GetCursorPos(&pos) && ::ScreenToClient(hwnd_, &pos))
|
||||
mouse_pos = Point((float)pos.x, (float)pos.y);
|
||||
}
|
||||
}
|
||||
return mouse_pos;
|
||||
}
|
||||
}
|
||||
|
|
@ -31,8 +31,6 @@ namespace easy2d
|
|||
E2D_DECLARE_SINGLETON(Input);
|
||||
|
||||
public:
|
||||
HRESULT Init(HWND hwnd, bool debug);
|
||||
|
||||
// 检测键盘按键是否正被按下
|
||||
bool IsDown(
|
||||
KeyCode code
|
||||
|
|
@ -72,8 +70,12 @@ namespace easy2d
|
|||
// 获得鼠标坐标
|
||||
Point GetMousePos();
|
||||
|
||||
HRESULT Init(HWND hwnd, bool debug);
|
||||
|
||||
void Update();
|
||||
|
||||
void UpdateKey(int, bool);
|
||||
|
||||
protected:
|
||||
Input();
|
||||
|
||||
|
|
@ -81,7 +83,9 @@ namespace easy2d
|
|||
|
||||
protected:
|
||||
HWND hwnd_;
|
||||
BYTE keys_[256];
|
||||
BYTE keys_cache_[256];
|
||||
bool want_update_;
|
||||
bool keys_[256];
|
||||
bool keys_pressed_[256];
|
||||
bool keys_released_[256];
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -124,7 +124,7 @@ namespace easy2d
|
|||
// 삿혤긴뻣
|
||||
Transform const& GetTransform() const { return transform_; }
|
||||
|
||||
// 삿혤관鍋분
|
||||
// 获取边框
|
||||
Rect GetBounds() const;
|
||||
|
||||
// 삿혤棍학관鍋분
|
||||
|
|
|
|||
|
|
@ -33,35 +33,47 @@ namespace easy2d
|
|||
|
||||
namespace color
|
||||
{
|
||||
const wchar_t _reset[] = L"\x1b[0m";
|
||||
const WORD _blue = FOREGROUND_BLUE | FOREGROUND_INTENSITY;
|
||||
const WORD _green = FOREGROUND_GREEN | FOREGROUND_INTENSITY;
|
||||
const WORD _red = FOREGROUND_RED | FOREGROUND_INTENSITY;
|
||||
const WORD _yellow = FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY;
|
||||
const WORD _white = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY;
|
||||
|
||||
const wchar_t _black[] = L"\x1b[30m";
|
||||
const wchar_t _red[] = L"\x1b[31m";
|
||||
const wchar_t _green[] = L"\x1b[32m";
|
||||
const wchar_t _yellow[] = L"\x1b[33m";
|
||||
const wchar_t _blue[] = L"\x1b[34m";
|
||||
const wchar_t _white[] = L"\x1b[37m";
|
||||
const WORD _blue_bg = _white | BACKGROUND_BLUE | BACKGROUND_INTENSITY;
|
||||
const WORD _green_bg = _white | BACKGROUND_GREEN | BACKGROUND_INTENSITY;
|
||||
const WORD _red_bg = _white | BACKGROUND_RED | BACKGROUND_INTENSITY;
|
||||
const WORD _yellow_bg = BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY;
|
||||
const WORD _white_bg = BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY;
|
||||
|
||||
const WORD _reset = _white;
|
||||
|
||||
const wchar_t _black_bg[] = L"\x1b[40m";
|
||||
const wchar_t _red_bg[] = L"\x1b[41m";
|
||||
const wchar_t _green_bg[] = L"\x1b[42m";
|
||||
const wchar_t _yellow_bg[] = L"\x1b[43m";
|
||||
const wchar_t _blue_bg[] = L"\x1b[44m";
|
||||
const wchar_t _white_bg[] = L"\x1b[47m";
|
||||
|
||||
#define DECLARE_COLOR(COLOR) \
|
||||
inline std::wostream& (COLOR)(std::wostream& _out)\
|
||||
{ _out.write(_##COLOR, 5); return _out; }\
|
||||
inline std::wostream& (COLOR##_bg)(std::wostream& _out)\
|
||||
{ _out.write(_##COLOR##_bg, 5); return _out; }
|
||||
inline std::wostream& (stdout_##COLOR)(std::wostream& _out)\
|
||||
{ ::SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE), _##COLOR); return _out; }\
|
||||
\
|
||||
inline std::wostream& (stderr_##COLOR)(std::wostream& _out)\
|
||||
{ ::SetConsoleTextAttribute(::GetStdHandle(STD_ERROR_HANDLE), _##COLOR); return _out; }
|
||||
|
||||
inline std::wostream& (reset)(std::wostream& _out) { _out.write(_reset, 4); return _out; }
|
||||
#define DECLARE_BG_COLOR(COLOR) \
|
||||
inline std::wostream& (stdout_##COLOR##_bg)(std::wostream& _out)\
|
||||
{ ::SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE), _##COLOR##_bg); return _out; }\
|
||||
\
|
||||
inline std::wostream& (stderr_##COLOR##_bg)(std::wostream& _out)\
|
||||
{ ::SetConsoleTextAttribute(::GetStdHandle(STD_ERROR_HANDLE), _##COLOR##_bg); return _out; }
|
||||
|
||||
DECLARE_COLOR(red);
|
||||
DECLARE_COLOR(green);
|
||||
DECLARE_COLOR(yellow);
|
||||
DECLARE_COLOR(blue);
|
||||
DECLARE_COLOR(white);
|
||||
DECLARE_COLOR(reset);
|
||||
|
||||
DECLARE_BG_COLOR(red);
|
||||
DECLARE_BG_COLOR(green);
|
||||
DECLARE_BG_COLOR(yellow);
|
||||
DECLARE_BG_COLOR(blue);
|
||||
DECLARE_BG_COLOR(white);
|
||||
|
||||
#undef DECLARE_COLOR
|
||||
}
|
||||
|
|
@ -102,7 +114,7 @@ namespace easy2d
|
|||
ss << L"\r\n";
|
||||
|
||||
std::wstring output = ss.str();
|
||||
os << color << output << color::reset;
|
||||
os << color << output;
|
||||
::OutputDebugStringW(output.c_str());
|
||||
|
||||
delete[] buffer;
|
||||
|
|
@ -124,7 +136,7 @@ namespace easy2d
|
|||
va_list args = nullptr;
|
||||
va_start(args, format);
|
||||
|
||||
Output(std::wcout, color::white, false, nullptr, format, args);
|
||||
Output(std::wcout, color::stdout_white, false, nullptr, format, args);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
|
@ -134,7 +146,7 @@ namespace easy2d
|
|||
va_list args = nullptr;
|
||||
va_start(args, format);
|
||||
|
||||
Output(std::wcout, color::white, true, nullptr, format, args);
|
||||
Output(std::wcout, color::stdout_white, true, nullptr, format, args);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
|
@ -144,7 +156,7 @@ namespace easy2d
|
|||
va_list args = nullptr;
|
||||
va_start(args, format);
|
||||
|
||||
Output(std::wcout, color::blue, false, nullptr, format, args);
|
||||
Output(std::wcout, color::stdout_blue, false, nullptr, format, args);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
|
@ -154,7 +166,7 @@ namespace easy2d
|
|||
va_list args = nullptr;
|
||||
va_start(args, format);
|
||||
|
||||
Output(std::wcout, color::blue, true, nullptr, format, args);
|
||||
Output(std::wcout, color::stdout_blue, true, nullptr, format, args);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
|
@ -164,7 +176,7 @@ namespace easy2d
|
|||
va_list args = nullptr;
|
||||
va_start(args, format);
|
||||
|
||||
Output(std::wcerr, color::yellow_bg, false, L"Warning: ", format, args);
|
||||
Output(std::wcerr, color::stdout_yellow_bg, false, L"Warning: ", format, args);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
|
@ -174,7 +186,7 @@ namespace easy2d
|
|||
va_list args = nullptr;
|
||||
va_start(args, format);
|
||||
|
||||
Output(std::wcerr, color::yellow_bg, true, L"Warning: ", format, args);
|
||||
Output(std::wcerr, color::stdout_yellow_bg, true, L"Warning: ", format, args);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
|
@ -184,7 +196,7 @@ namespace easy2d
|
|||
va_list args = nullptr;
|
||||
va_start(args, format);
|
||||
|
||||
Output(std::wcerr, color::red_bg, false, L"Error: ", format, args);
|
||||
Output(std::wcerr, color::stderr_red_bg, false, L"Error: ", format, args);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
|
@ -194,7 +206,7 @@ namespace easy2d
|
|||
va_list args = nullptr;
|
||||
va_start(args, format);
|
||||
|
||||
Output(std::wcerr, color::red_bg, true, L"Error: ", format, args);
|
||||
Output(std::wcerr, color::stderr_red_bg, true, L"Error: ", format, args);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue