【问题标题】:wxDC printing a text on screen while typingwxDC 打字时在屏幕上打印文本
【发布时间】:2013-05-09 23:39:32
【问题描述】:

我试图在用户仍在键入时在屏幕上显示一个字符串。通常wxDC的DrawText函数用于字符串内容已知的字符串。

void DrawText(const wxString& text, wxCoord x, wxCoord y) 

我们知道,这个函数接受一个 wxString 并在屏幕上打印。但是,我怎样才能让用户在屏幕上(在 wxWindow、wxFrame 上)键入内容。总而言之,我现在正在开发一个绘图程序,用户可以在其中绘制某些形状。某些形状很容易绘制、移动等……但是到目前为止,拥有一个文本框并让用户在其中输入一些东西让我很烦恼。当然,这应该是可编辑的,例如当用户再次单击同一个“文本框”时,我应该能够对其进行编辑。

最后一点,我试图避免使用诸如 wxTextCtrl 之类的控件,并且在某种意义上试图制作我自己的 textctrl。最好的起点是什么?

任何想法都将不胜感激。

【问题讨论】:

    标签: c++ mfc wxwidgets


    【解决方案1】:

    编写自己的wxTextCtrl 很困难,我强烈建议不要这样做。但是如果你真的想要(为什么?),那当然是可能的,毕竟wxRichTextCtrl 比普通的wxTextCtrl 具有更多的功能,它是仅使用 wxWidgets API 编写的。

    这里并没有什么特别的神奇之处,您只需要更新窗口(理想情况下,使用wxWindow::RefreshRect() 而不是刷新整个窗口)只要其中显示的文本发生更改并且您的wxEVT_PAINT 处理程序必须能够绘制文字正确。

    【讨论】:

    • 我认为 wxTextEntry 可以帮助解决很多问题。但是,现在我有一个基本问题。我无法将 char 事件路由到窗口 SetWindowStyle(wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL|wxWANTS_CHARS);连接(wxEVT_KEY_DOWN,wxKeyEventHandler(DeviceContextFrame::OnKeyDown));连接(wxEVT_CHAR,wxKeyEventHandler(DeviceContextFrame::OnChar));似乎没有触发事件。
    • 您无法将事件路由到本机窗口。您应该给它焦点,以便它自己接收键盘事件。它也简单得多。
    • 我没有编写自己的 wxTextCtrl,而是暂时显示 wxTextCtrl 并在用户按下其他位置时将其删除。我认为这是一种更简单的方法
    【解决方案2】:

    我认为你不需要在这里做任何特别的事情。只要用户处于某种“编辑”模式——即你希望他们输入文本——那么你需要做的就是在用户输入更多文本时重新绘制所有内容。

    类似这样的:

    1. 用户在矩形内单击以编辑文本。
    2. 程序启动编辑模式(某些内部状态初始化一个空字符串)。
    3. 虽然用户没有在矩形外点击
      • 将输入的字符添加到文本字符串中
      • 将矩形内的绘图区域清除为背景
      • 调用DrawText 或更可能是DrawLabel 在矩形中绘制字符串

    然后文本会随着它的变化而重绘,如果需要的话,你有一个包含内容的字符串以供持久化。

    或者,您可以只弹出一个带有wxTextCtrlwxDialog 来向用户询问整个文本字符串,然后在对话框关闭后进行绘制。

    有道理吗?

    【讨论】:

    • 在这种情况下,当用户输入文本时会调用 OnPaint。调用 OnPaint 是否有效,尤其是在有其他对象时?另外我应该如何实现删除或让用户将光标放在字符串中间并开始删除它。我可能完全错了,但也许 wxTextValidator 在这种情况下会有所帮助,但我不确定如何使用它。
    • @macroland 重新绘制不应该是低效的,无论如何这种情况经常发生,但我不太确定就地编辑 - 也许你需要先得到一些基本的工作。我描述的方式可以处理初始输入,您可以处理退格等。但是,在中间字符串中提供单击和编辑会很困难。
    • 我检查了 wxTextCtrl 的代码,制作 textCtrl(可编辑等)或类似的 wxGrid 控件似乎相当复杂。也许我应该放弃这个想法,只显示一个临时的 wTextCtrl 并获取文本,然后在焦点消失时将其删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2020-01-20
    • 1970-01-01
    相关资源
    最近更新 更多