2013-05-09 80 views
0

我想在用戶仍鍵入時在屏幕上顯示一個字符串。通常情況下,wxDC的DrawText函數用於字符串內容已知的字符串。wxDC在打字時在屏幕上打印文字

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

正如我們所知,該功能只在屏幕上wxString和打印。但是,如何讓用戶在屏幕上鍵入某些內容(在wxWindow,wxFrame上)。總而言之,我現在正在一個繪圖程序上工作,用戶可以繪製某些形狀。某些形狀很容易繪製,移動等...但有一個文本框,並讓用戶輸入內容是迄今爲止竊聽我的心靈。當然,這應該是可編輯的,例如當用戶再次點擊相同的「文本框」時,我應該可以編輯它。

最後一點,我試圖避免使用控件,如wxTextCtrl,並在某種意義上試圖使我自己的textctrl。什麼是最好的起點?

任何想法,將不勝感激。

回答

0

我不認爲你需要在這裏做任何特別的事情。只要用戶處於某種「編輯」模式 - 即您期望他們輸入文本 - 那麼您只需在用戶輸入更多文本時重新繪製所有內容。

事情是這樣的:

  1. 用戶點擊一個矩形內編輯文本。
  2. 程序啓動編輯模式(某些內部狀態初始化一個空字符串)。
  3. 雖然用戶沒有點擊的矩形以外
    • 的矩形內輸入的字符添加到字符串
    • 明確繪圖區域背景
    • 呼叫DrawText或更可能DrawLabel繪製字符串在RECT

這時,文本被重畫爲它的變化,你有必要時內容持久性的字符串。

或者,您可以彈出wxDialogwxTextCtrl要求用戶輸入整個文本字符串,然後在對話框關閉後繪製。

有意義嗎?

+0

在這種情況下,用戶輸入文本時會調用OnPaint。調用OnPaint會有效嗎,特別是當有其他對象時? 另外,我該如何實現刪除或讓用戶將光標置於字符串中間並開始刪除它。我可能是完全錯誤的,但也許wxTextValidator將在這種情況下幫助,但我不知道如何使用它。 – macroland 2013-05-10 04:52:01

+0

@macroland重繪不應該是無效的,反正經常發生,但我不太確定就地編輯 - 也許你需要先做一些基本的工作。我描述的方式將處理初始輸入,並且您可以應對退格等。雖然在中間字符串中提供點擊和編輯將很困難。 – 2013-05-10 05:11:14

+0

我檢查了wxTextCtrl的代碼,它看起來相當複雜,使一個textCtrl(可編輯等...)或類似的一個wxGrid控件。也許我應該放棄這個想法,只是顯示一個臨時的wTextCtrl並獲取文本,然後在焦點消失時將其刪除。 – macroland 2013-05-11 01:42:39

0

編寫你自己的wxTextCtrl很困難,我強烈建議不要這樣做。但是,如果你真的想(爲什麼?),那麼它當然是可能的,畢竟wxRichTextCtrl具有比純粹的wxTextCtrl僅使用wxWidgets API編寫的功能更多的功能。

而且這裏沒有特別的魔法,你只需要更新窗口(理想情況下,使用wxWindow::RefreshRect()而不是刷新整個窗口)每當它顯示的文本改變了,你的wxEVT_PAINT處理程序必須能夠正確地繪製文本。

+0

我認爲wxTextEntry可以幫助解決很多問題。 HOwever,現在我有一個基本問題。我無法將char事件路由到窗口 SetWindowStyle(wxDEFAULT_FRAME_STYLE | wxTAB_TRAVERSAL | wxWANTS_CHARS); 連接(wxEVT_KEY_DOWN,wxKeyEventHandler(DeviceContextFrame :: OnKeyDown)); 連接(wxEVT_CHAR,wxKeyEventHandler(DeviceContextFrame :: OnChar)); 似乎不會引發事件。 – macroland 2013-05-11 00:14:18

+0

您不能將事件路由到本機窗口。你應該把它放在焦點上,以便它自己接收鍵盤事件。它也更簡單。 – 2013-05-11 01:06:16

+0

嗯。非常感謝! – macroland 2013-05-11 01:39:57