使用 tab 和 shift-tab 导航出 wxPanel 中的 wxStyledTextCtrl

Use tab and shift-tab to navigate out of a wxStyledTextCtrl within a wxPanel

我正在尝试制作一个 wxWidgets 应用程序,特别是 poEdit,使用键盘更容易访问。有一个包含三个控件的 wxPanel;一个组合框、一个按钮和一个只读的 wxStyledTextCtrl。问题是一旦焦点进入 wxStyledTextCtrl 就不可能使用键盘移回其他控件。我希望能够从 wxStyledTextCtrl 切换回组合框。到目前为止,我已经尝试调用 SetTabIndents(false) 但这没有帮助。

有什么想法吗?

我找到了我自己问题的答案。我确实最终 classing wxStyledTextCtrl class 并覆盖 MSWWindowProc 函数以自定义 WM_GETDLGCODE 消息的处理以清除 DLGC_WANTALLKEYS 和 DLGC_WANTTAB 位.我使用的代码如下

我用来做这个的代码如下。

<myStc.h>
#include <wx/stc/stc.h>

class myWxStyledTextCtrl : public wxStyledTextCtrl
{
public:
    DECLARE_DYNAMIC_CLASS(myWxStyledTextCtrl);
    myWxStyledTextCtrl(
        wxWindow* parent, wxWindowID id = wxID_ANY,
        const wxPoint& pos = wxDefaultPosition,
        const wxSize& size = wxDefaultSize, long style = 0,
        const wxString& name = wxSTCNameStr);
    myWxStyledTextCtrl();
    void SetUseTabToNavigate(bool useTabToNavigate);

#ifdef __WXMSW__
    // special Windows message handling
    virtual WXLRESULT MSWWindowProc(
        WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
#endif

    DECLARE_EVENT_TABLE();
private:
    bool m_useTabToNavigate;
};
</myStc.h>

<myStc.cpp>
#include "myStc.h"

IMPLEMENT_DYNAMIC_CLASS(myWxStyledTextCtrl, wxStyledTextCtrl);
BEGIN_EVENT_TABLE(myWxStyledTextCtrl, wxStyledTextCtrl)
END_EVENT_TABLE()

myWxStyledTextCtrl::myWxStyledTextCtrl(
    wxWindow* parent, wxWindowID id /*= wxID_ANY*/,
    const wxPoint& pos /*= wxDefaultPosition*/,
    const wxSize& size /*= wxDefaultSize*/, long style /*= 0*/,
    const wxString& name /*= wxSTCNameStr*/) :
    wxStyledTextCtrl(parent, id, pos, size, style, name)
{
    m_useTabToNavigate = false;
}

myWxStyledTextCtrl::myWxStyledTextCtrl() :
    wxStyledTextCtrl()
{
    m_useTabToNavigate = false;
}

void myWxStyledTextCtrl::SetUseTabToNavigate(bool useTabToNavigate)
{
    m_useTabToNavigate = useTabToNavigate;
}

#ifdef __WXMSW__
WXLRESULT myWxStyledTextCtrl::MSWWindowProc(
    WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
{
    WXLRESULT ret = wxStyledTextCtrl::MSWWindowProc(nMsg, wParam, lParam);
    if (!m_useTabToNavigate)
    {
        return ret;
    }
    if (nMsg == WM_GETDLGCODE)
    {
        ret &= ~(DLGC_WANTALLKEYS | DLGC_WANTTAB);
    }
    return ret;
}
#endif
</myStc.cpp>

我可能会在未来的某个时候找出适用于其他操作系统的解决方案。