如何修改wxLogMessage的颜色、字体样式及日志窗口文本格式?
修改wxLogMessage与wxLogWindow的字体和颜色
一、修改wxLogWindow的等宽字体(Courier New)
默认wxLogWindow使用wxTextCtrl控件,可直接获取该控件并设置字体:
wxLogWindow* w = new wxLogWindow(NULL, wxT("log winnnn"), TRUE, FALSE); // 获取日志窗口内的文本控件 wxTextCtrl* logCtrl = wxDynamicCast(w->GetFrame()->FindWindow(wxID_LOG), wxTextCtrl); if (logCtrl) { // 设置Courier New等宽字体,参数依次为字号、字体族、样式、粗细、是否下划线、字体名 wxFont courierFont(10, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("Courier New")); logCtrl->SetFont(courierFont); } wxLog::SetActiveTarget(w); wxLogMessage("Logging wxScroll..."); w->GetFrame()->Move(20, 20);
- 注:
wxFONTFAMILY_MODERN是跨平台等宽字体族,若需严格指定Courier New,直接传入字体名即可(Windows平台优先匹配,其他平台会 fallback 到系统等宽字体)。
二、实现彩色日志输出(含部分文本变色)
默认wxLogWindow的wxTextCtrl仅支持单一颜色,需替换为wxRichTextCtrl并自定义日志类来实现多色输出:
1. 自定义彩色日志窗口(带wxRichTextCtrl)
class ColoredLogWindow : public wxFrame { public: ColoredLogWindow(wxWindow* parent, const wxString& title) : wxFrame(parent, wxID_ANY, title) { // 创建只读的富文本控件 m_richText = new wxRichTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxRE_MULTILINE | wxRE_READONLY); // 设置Courier New等宽字体 wxFont courierFont(10, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("Courier New")); m_richText->SetFont(courierFont); // 布局设置 wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL); sizer->Add(m_richText, 1, wxEXPAND | wxALL, 5); SetSizer(sizer); SetSize(400, 300); Show(); } // 添加带颜色的日志文本 void AddLog(const wxString& msg, const wxColour& color = *wxBLACK) { m_richText->BeginTextColour(color); m_richText->AppendText(msg + wxT("\n")); m_richText->EndTextColour(); // 自动滚动到最新日志 m_richText->ShowPosition(m_richText->GetLastPosition()); } private: wxRichTextCtrl* m_richText; };
2. 自定义日志类(处理颜色逻辑)
class ColoredLog : public wxLog { public: ColoredLog(ColoredLogWindow* logWin) : m_logWin(logWin) {} protected: // 重写日志记录方法,自定义颜色规则 virtual void DoLogRecord(wxLogLevel level, const wxString& msg, const wxLogRecordInfo& info) override { wxColour color = *wxBLACK; // 根据日志级别设置颜色 switch (level) { case wxLOG_Error: color = *wxRED; break; case wxLOG_Warning: color = *wxORANGE; break; case wxLOG_Info: color = *wxBLUE; break; default: color = *wxBLACK; } // 针对特定文本(如包含"Scroll")单独设置颜色 if (msg.Contains(wxT("Scroll"))) { color = *wxGREEN; } m_logWin->AddLog(msg, color); } private: ColoredLogWindow* m_logWin; };
3. 使用自定义彩色日志
// 创建彩色日志窗口 ColoredLogWindow* logWin = new ColoredLogWindow(NULL, wxT("Colored Log Window")); // 设置为全局日志目标 wxLog::SetActiveTarget(new ColoredLog(logWin)); // 测试不同颜色的日志 wxLogMessage("Logging wxScroll..."); // 包含"Scroll",显示绿色 wxLogError("This is an error message"); // 红色 wxLogWarning("This is a warning"); // 橙色 wxLogInfo("This is info text"); // 蓝色 wxLogDebug("Debug message"); // 默认黑色
关键说明
- 若仅需全局修改字体,直接修改
wxLogWindow的wxTextCtrl字体即可; - 多色输出必须依赖
wxRichTextCtrl,因为wxTextCtrl不支持多格式文本; - 可根据业务需求扩展颜色规则(如按日志级别、关键词、模块区分颜色)。
内容的提问来源于stack exchange,提问作者Rose
相关产品推荐
相关产品推荐

