NetEaseオープンソースduilibにはRichEditが付属しており、一部のシステムではキーボードを入力できないという問題を解決します

現象

最近、NetEaseのオープンソースメンテナンスに基づくduilibがクライアントを作成しました。オンラインになった後、ユーザーから一連の問題が報告されました。最も奇妙な問題は、RichEditが入力できない場合があることです。
ここに画像の説明を挿入

調査

公式の例でテストした後、問題もあることがわかりました。

これら2つのRichEditのXMLは次のとおりです。

<!-- 单行文本 -->
<RichEdit class="simple input" height="30" margin="0,3" padding="6,6,6" promptmode="true" prompttext="Single line text control" promptcolor="lightcolor"/>

<!-- 多行文本 -->
<RichEdit class="prompt" name="edit" bkcolor="bk_wnd_lightcolor" width="stretch" height="stretch" 
            multiline="true" vscrollbar="true" hscrollbar="true" autovscroll="true" 
            normaltextcolor="darkcolor" wantreturnmsg="true" rich="true"/>

解決

スタイルテストを絶えず変更した後、2つの方法があります。

  • 1行のテキストのclass = "simpleinput"をclass = "input"に変更します
  • シンプルスタイルはglobal.xmlで定義されており、このファイルでシンプルの定義を見つけて、wanttab = "false"を削除します。
<Class name="simple" multiline="false" autohscroll="true" wantreturnmsg="true" rich="false" normaltextcolor="darkcolor" disabledtextcolor="textdefaultdisablecolor"/>
<!-- <Class name="simple" multiline="false" autohscroll="true" wantreturnmsg="true" wanttab="false" rich="false" normaltextcolor="darkcolor" disabledtextcolor="textdefaultdisablecolor"/> -->

したがって、wanttab = "false"との関係があると最終的に判断されます。

フォローアップの質問

wanttab = "false"を削除した後、ユーザー名とパスワードの入力ボックスで、ユーザー名のときにTabキーを押すと、改行の代わりに\ tタブが追加されることがわかったので、引き続き解決する必要があります。

NetEaseの変更後、duilibの関連コードを注意深く読んだ後、RichEdit \ tで手動で処理してラップします。

void RichEdit::OnChar(EventArgs& event)
{
    
    
	//TAB
	if (::GetKeyState(VK_TAB) < 0) {
    
    
		if (!m_bWantTab) {
    
    
			if (m_pWindow != NULL)
				m_pWindow->SendNotify((Control*)this, kEventTab);
			return;
		}

		// added_by [email protected] 2021-01-28 tab ignore
		// m_bWantTabEx是新增的属性,需要外部主动赋值。
		if (!m_bWantTabEx) {
    
    
			if (m_pWindow != NULL)
				m_pWindow->SetNextTabControl(::GetKeyState(VK_SHIFT) >= 0);
			return;
		}
	}
	//Number
	if (m_bNumberOnly) {
    
    
		if (event.wParam < '0' || event.wParam > '9')
			return;
	}

	TxSendMessage(WM_CHAR, event.wParam, event.lParam, NULL);
}

ログインインターフェイスがLoginFormと呼ばれていると仮定すると、InitWindowで、SetWantTabEx(一部のコンピューターが入力できない問題を解決するために追加された追加関数)を呼び出して設定します。

void LoginForm::InitWindow() {
    
    
	// ...
    passwd_ = static_cast<ui::RichEdit*>(FindControl(L"passwd"));
    ed_phone_ = static_cast<ui::RichEdit*>(FindControl(L"ed_phone"));
    ed_sms_ = static_cast<ui::RichEdit*>(FindControl(L"ed_sms"));

    // SetWantTabEx是新增的函数,自己可以在RichEdit.h中新增即可。
	ed_phone_->SetWantTabEx(false);
	passwd_->SetWantTabEx(false);
	ed_sms_->SetWantTabEx(false);
	
	// ...
}

追記

公式ウェブサイトは1年以上更新されておらず、このブランチのREADME.mdで見つかったすべての問題を維持しています。必要な場合は、次の場所に移動してください。

おすすめ

転載: blog.csdn.net/xmcy001122/article/details/113343899
おすすめ