現象
最近、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で見つかったすべての問題を維持しています。必要な場合は、次の場所に移動してください。