You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在只读wxTextCtrl中隐藏光标(支持文本选择)

嘿,我之前在wxWidgets开发计算器的时候也遇到过这个一模一样的问题——只读的wxTextCtrl还是会显示光标,虽然不影响功能,但看着确实别扭。结合你的需求(可选择、不可编辑、无光标),给你几个实用的解决方案:

方案一:设置透明光标(最简单快捷)

这是我当时用的方法,不需要子类化控件,几步就能搞定:

  1. 先确保你的wxTextCtrl已经设置了wxTE_READONLY样式,彻底禁止编辑:
    wxTextCtrl* display = new wxTextCtrl(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxTE_READONLY | wxTE_RIGHT);
    
  2. 创建一个1x1的透明位图,用它生成空光标:
    wxBitmap emptyBmp(1, 1);
    wxMemoryDC dc(emptyBmp);
    dc.SetBackground(*wxTRANSPARENT_BRUSH);
    dc.Clear();
    wxCursor emptyCursor(emptyBmp);
    
  3. 把这个空光标设置给你的文本控件:
    display->SetCursor(emptyCursor);
    

这样一来,光标就变成完全透明的,视觉上就像消失了,但文本依然可以正常选中复制,也不会被编辑。

方案二:子类化wxTextCtrl,控制光标显示

如果觉得方案一有点取巧,你可以自定义一个wxTextCtrl子类,通过重写事件来彻底隐藏光标:

class ReadOnlyTextCtrl : public wxTextCtrl {
public:
    ReadOnlyTextCtrl(wxWindow* parent, wxWindowID id, const wxString& value = "",
                     const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
                     long style = wxTE_READONLY)
        : wxTextCtrl(parent, id, value, pos, size, style) {}

protected:
    void OnSetFocus(wxFocusEvent& event) override {
        // 先调用父类的焦点处理逻辑
        wxTextCtrl::OnSetFocus(event);
        // 给控件设置空光标,跨平台通用
        wxBitmap emptyBmp(1, 1);
        wxMemoryDC dc(emptyBmp);
        dc.SetBackground(*wxTRANSPARENT_BRUSH);
        dc.Clear();
        SetCursor(wxCursor(emptyBmp));
    }

    DECLARE_EVENT_TABLE()
};

BEGIN_EVENT_TABLE(ReadOnlyTextCtrl, wxTextCtrl)
    EVT_SET_FOCUS(ReadOnlyTextCtrl::OnSetFocus)
END_EVENT_TABLE()

这种方式把光标控制逻辑封装在子类里,代码更规整,也能保证跨平台兼容性。

额外提示

不管用哪种方案,都不要去掉wxTE_READONLY样式——它不仅能禁止编辑,还能保证文本选择功能正常工作。另外,如果你的计算器需要实时更新显示内容,直接用SetValue或者AppendText就可以,完全不会受这些设置影响。

内容的提问来源于stack exchange,提问作者iKebab897

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 19:07:38