2016-08-17 6 views
3

言語に応じてRTLを作成できる動的なダイアログを作成しようとしています。しかし、私は次の問題を抱えています。コンボボックスのRTLスタイルを変更するたびに、テキストが反転して表示されます。私はInvalidateRect,RedrawWindowなどの関数を使ってみましたが、正しく動作させることができませんでした。コンボボックスのRTLスタイルを変更するときにミラーリングされるテキスト

関連するコード(WTLとWinAPIの):

CComboBox combo = hWndCtl; 
if(combo.GetCurSel() == 0) 
    combo.ModifyStyleEx(WS_EX_LAYOUTRTL, 0); 
else 
    combo.ModifyStyleEx(0, WS_EX_LAYOUTRTL); 

デモプロジェクト:here

問題のデモ:

enter image description here

+0

**これは答えではありません。それは診断です。答えが「正しく再描画された」場合、ここでの提案は「答え」とみなすべきではありませんが、以前の経験に基づいて何が起こっているのかを証明しています**:InvalidateRect親ウィンドウのウィンドウプロシージャの 'WM_USER + 5'ハンドラのハンドラで()を呼び出し、拡張スタイルを変更した後に' PostMessage(親ウィンドウ、WM_USER + 5、0、0) 'などを呼び出しますか?それは正しく再描画されますか、または反転したままになりますか? – andlabs

答えて

2

あなたがCBN_SELCHANGE通知に対応しているようです。これは、コンボボックスがその編集ボックスにテキストを設定した後に通知されます。

代わりにCBN_SELENDOKにお答えください。 CBN_SELENDOKCBN_SELCHANGEの前に送信されると、コンボボックスがテキストを設定する前にスタイルを変更する時間が与えられます。

switch (HIWORD(wParam)) 
{ 
case CBN_SELENDOK:// CBN_SELCHANGE: 
    if (SendMessage(hComboBox, CB_GETCURSEL, 0, 0) == 0) 
     ModifyStyleEx(hComboBox, WS_EX_LAYOUTRTL, 0); 
    else 
     ModifyStyleEx(hComboBox, 0, WS_EX_LAYOUTRTL); 
    break; 
default:break; 
} 



編集:Windowsの10 /効果をフェードインしました。コンボの選択をキーボードで変更した場合、色がフェードアウトしている間も、テキストは引き続き後方に移動します。

ComboBoxには、この問題を引き起こしている可能性のある編集コントロールがあります。 WS_EX_LAYOUTRTLの代わりにWS_EX_RIGHT | WS_EX_RTLREADINGを使用する方が良いでしょう。これはCBN_SELCHANGEでも動作します。

case CBN_SELENDOK: //(or CBN_SELCHANGE) 
    if (SendMessage(hComboBox, CB_GETCURSEL, 0, 0) == 0) 
     ModifyStyleEx(hComboBox, WS_EX_RIGHT | WS_EX_RTLREADING, 0); 
    else 
     ModifyStyleEx(hComboBox, 0, WS_EX_RIGHT | WS_EX_RTLREADING); 
    break; 
+0

ありがとうございました。少なくともマウスでアイテムを選択する一般的なケースでは、実際に問題が修正されました。 ifがまだ存在する。マウスホイールやキーボードを使用するときに、私はそれで生きることができます。もちろん、これに対する解決策がある場合は、私に教えてください。 http://i.imgur.com/Pnz8raX.gif – Paul

+0

マウスホイールでエラーを再現できませんでしたが、キーコントロールはあなたの言ったように迷惑な表示エラーを引き起こします。私は、このソリューションが 'WS_EX_RIGHT | WS_EX_RTLREADING' –

関連する問題