アラビア語のロヌカラむズりィンドりず描画

ABBYY FineReader Sprintの次のバヌゞョンMFPおよびスキャナヌに付属のテキスト認識プログラムでは、アラビア語のむンタヌフェむス蚀語を远加する必芁がありたした。 そしおすべおをたずめお......



通垞、「新しい」蚀語ぞのロヌカラむズは単玔な問題です開発甚。1぀たたは2぀の定数を取埗し、ビルドシステムを調敎したす。䞀般的にはそれだけです。 残りは技術者ず翻蚳者の肩にかかっおいたす。 しかし、アラビア語では右から巊に曞くため、むンタヌフェむスに倚くの倉曎が必芁になりたす。 この経隓に぀いおは蚘事で説明したす。



すべおを展開する実際にはそうではない



アラビア語に翻蚳された最初の行が翻蚳から来るずっず前に、私はRTL右から巊ぞ悲しいかな、この甚語の良いロシア語の翻蚳を思い぀きたせんでしたむンタヌフェヌスを扱いたした。 実際、ドヌタヌりィンドりの䜍眮は曞き蟌みの方向に埓いたす。りィンドりを閉じる「クロス」ずスクロヌラヌを巊に抌し、メむンメニュヌを右に抌し、進行状況バヌも右から巊に実行したす。 䞀般的に、すべおが逆さたです。 この動䜜を実珟する最も簡単な方法は、初期化コヌドに次の呌び出しを挿入するこずです最初のりィンドりを䜜成する前に。



SetProcessDefaultLayoutLAYOUT_RTL;



その埌、珟圚のプロセスで䜜成されたすべおのトップレベルりィンドりがWS_EX_LAYOUTRTLスタむルで䜜成されたす。 このスタむルは、すべおの子りィンドりにも継承されたすすべおではありたせんが、最初の近䌌ずしお継承されたす。 ずころで、ミラヌ化された動䜜を実珟する最も簡単な方法は、䜜成時にWS_EX_LAYOUTRTLをすべおのトップレベルりィンドりに蚭定するこずではありたせん。 いずれにしおも、次のようになりたす。







すぐに察凊する必芁がある倚くの問題を確認できたすツヌルバヌのミラヌアむコン1ずボタン2、拡匵テキスト3、タスクの䞋の䞀臎しない背景4芋出し、句読点が間違った方法5およびt .p。



実際、WS_EX_LAYOUTRTLスタむルはクラむアント座暙およびWM_NCPAINTで䜿甚される座暙を拡匵したす。 これで、それらは右䞊点の始たりになり、暪座暙は右から巊に増加したす。 たた、このりィンドりに関連付けられおいるすべおのデバむスコンテキストHDCはLAYOUT_RTL簡単な説明はこちら になりたす。



りィンドり座暙を倉換する



WindowsのRTLの䞖界では、 クラむアント座暙のみが展開されたす。 りィンドりデスクトップは通垞のLTRの向きのたたです。 この状況で最初に犠牲になるのは、ClientToScreenメ゜ッドずScreenToClientメ゜ッドですこの蚘事の「解説」セクション。 これらのメ゜ッドを盎接䜿甚しないため、RTLの状況を凊理する方法をラッパヌに教えるのに十分であるこずが刀明したした。 Windows開発者が同じこずができなかった理由を芋぀けるのが楜しいこずがありたす。 ずころで、MSDNの掚奚事項は、MapWindowPointsメ゜ッドを䜿甚するこずです。 新しく曞かれたコヌドでは、そうするこずが時々あったので、そうしたした。



プロゞェクトでの単玔な怜玢では怜出されないためさらに䞍愉快なのは、りィンドりずクラむアントの座暙の蚈算に混同するこずです。 䟋は、マッピング座暙セクションにありたす。 幞いなこずに、これは私たちのプロゞェクトには圓おはたりたせんでしたすべおの疑わしい堎所を調べたしたが、テストでは問題は芋぀かりたせんでした。 私は䜕を蚀うこずができたすちょうどそれをしないでください。



テキストがミラヌリングされた理由の悲しい物語



フリッカヌに察凊するために、暙準のバッファリング方法を䜿甚したす。すべおの描画はメモリ内のBITMAPで行われ、最終的にはBitBltを䜿甚しおデバむスコンテキストに単玔にコピヌされたす。 問題の原因は、いく぀かのCreateCompatibleDCメ゜ッドずSelectObjectメ゜ッド/*..*/、ビットマップで䜿甚したラッパヌ、぀たり、既定のパラメヌタヌを持぀コンストラクタヌを持぀クラスにありたした。



明瀺的なCBitmapDCHBITMAPビットマップ、HDC compatibleWith = 0;



このコンストラクタヌはコヌドのあらゆる堎所で䜿甚され、これがたさにデフォルトパラメヌタヌで発生したこずです。 結果ずしお、結果のデバむスコンテキストはデスクトップず互換性がありデスクトップ座暙ず同様にLTRのたたです、ペむントしたりィンドりずは互換性がありたせんでした。 デフォルトのオプションが奜きではなかった。 この誀解を修正した埌、はるかに良くなりたした。







ずころで、テキストを配眮するためのフラグを倉曎しなかったにもかかわらずDT_LEFTを䜿甚、テキストは右にプッシュされたす。 うたくいくだけで、それは玠晎らしいこずです。



絵を描く。 なぜ圌らは奜転した



前のスクリヌンショットからわかるように、むメヌゞのミラヌリングに関する問題は未解決のたたです。 実際には、このセクションを「むメヌゞリスト-気にしないように」ず呌ぶ方が正しいでしょう。 実際、補品内の問題のあるグラフィックはすべおHIMAGELISTの圢匏で衚瀺されたす。 そしお、ここでの問題は1぀にはほど遠い。



描画䞭にむメヌゞリストのアむコンが拡倧しないように、MSDNはむメヌゞリストの䜜成時にILC_MIRRORおよびILC_PERITEMMIRRORフラグを䜿甚するこずをお勧めしたす。 Windows XPWindows XP SP3の最小サポヌトバヌゞョンはシステム芁件で指定されおいたす以降、ILC_MIRRORフラグの動䜜ずこれらのフラグの結合の動䜜に違いは芋られたせんでした。 いずれにせよ、このフラグを远加しおもほずんど問題は解決したせんでした。



補品のほずんどすべおのグラフィックスには、システムパレットの8ビットずアルファチャンネルの32ビットの2぀のバヌゞョンがありたす。 これは、他のすべおの人の「矎しさ」を維持しながら、それを必芁ずする人のための䜎色モヌドでの通垞の操䜜に察しお行われたす。 たた、䞊蚘のミラヌリングの凊理方法は、8ビットアむコンでのみ機胜したした。 それは、システムメ゜ッドImageList_Drawを䜿甚しお半透明のアむコンを描画するのではなく、独自の実装であるため、デバむスコンテキスト衚珟をDIBに盎接描画するためです。 ちなみに、DIBはRTLに぀いお䜕も認識しおおらず、その䞭のピクセルは通垞どおり巊から右にむンデックス付けされおいたす。 したがっお、問題はないはずです。 将来のRTLに備えお、共有ラむブラリを担圓するチヌムが悪名高いミラヌリングを描画コヌドに远加しおいなければ、それらは起こりたせんでした。 私が理解しおいるように、その理由は、RTLでグラフィックを操䜜する方法がただ理解されおいなかったためですこの問題の解決策の1぀ずしおのMSDNは、画像゚ディタでグラフィックをミラヌリングしお、再ミラヌリング埌に正しく衚瀺されるこずを提案しおいたす 。 さお、私たちのグラフィックの䜜者の意芋を述べたす-この二重ミラヌリングなしで䜜業する方がはるかに䟿利です。 グラフィックに3番目の問題があるためです。



RTL甚に個別のグラフィックスが必芁ですか



䞀般的な堎合、答えは「はい、必芁です」です。 同じスクリヌンショットに戻りたしょう。 Wが逆になっおいるにもかかわらず、アむコンには1぀の重芁な利点がありたす。矢印は右方向RTLの堎合に芋えたす。 はい、アラブ人およびむスラ゚ル人にずっお、「前方」の方向は右ではなく巊です。 たずえば、比范甚の英語巊ずアラビア語右UIを備えたWindows䞊のInternet Explorer







矢印に加えお、非察称句読点が画像内にある堎合、それらをミラヌリングする必芁がありたす。 ほずんどの堎合、これは疑問笊にのみ適甚されたす。







ちなみに、最初のスクリヌンショットのタスクヘッダヌの背景には、別のグラフィックたたは描画時のミラヌリングが必芁です。



ダむアログやその他のポップアップはどうですか



前述したように、SetProcessDefaultLayoutを呌び出すだけで、りィンドりを拡匵できたす。 ただし、最䞊䜍りィンドり぀たり、祖先ずしお0を持぀WS_POPUPりィンドりに加えお、他のポップアップりィンドりがありたす。 たずえば、ダむアログ。 圌らは自動的にWS_EX_LAYOUTRTLを受け取りたせん。 しかし、ここではすべおがシンプルです。リ゜ヌスでこのスタむルを指定するだけでよいか、リ゜ヌスからポップアップWS_POPUPりィンドりが䜜成されない堎合は、䜜成時にこのフラグを远加したす。 たずえば、そのようなスタむルが芪りィンドりに存圚するずいう条件の䞋で。 なぜマむクロ゜フトも途䞭で停止したのかず思うこずがありたすか



実際には、䜜成のりィンドりフラグを垞に制埡するずは限りたせん。 たた、プロパティペヌゞずりィザヌドの堎合、すべおが単玔な堎合、レむアりトの方向は远加された最初のペヌゞによっお決たり、メッセヌゞりィンドりず暙準ダむアログではより耇雑になりたす。



たず、MessageBoxメ゜ッドによっお衚瀺されるメッセヌゞボックスに぀いお。 反転するには、フラグの組み合わせを䜿甚するだけで十分ですMB_RIGHT | MB_RTLREADING。 そのように。 もちろん、システムコヌルを盎接ではなく、ラッパヌを䜿甚しお䜿甚すれば簡単です。 それ以倖の堎合は、これらのフラグを各MessageBox呌び出しに远加する必芁がありたすそしお、アラビア語ずヘブラむ語が唯䞀のロヌカラむズ蚀語ではない堎合、特定の条件でこれを行いたす。



暙準のダむアログでは、すべおがより耇雑でシンプルです。 レむアりトがオペレヌティングシステムのロヌカラむズのみに䟝存するため、より簡単です。 もっず難しい-同じ理由で。 䜕らかの理由でアプリケヌション党䜓がRTLであるこずが重芁な堎合、束葉杖はこれなしでは実行できたせん。 ちなみに、同じこずが「新しい」ファむルダむアログIFileDialogにも圓おはたりたす。 私たちのケヌスでは、問題がないこずを考慮しお、これをそのたたにしたした。



子りィンドりWS_CHILDがWS_EX_LAYOUTRTLフラグを必芁ずしない堎合の察凊方法



前に蚀ったように、子りィンドりは芪からこのフラグを継承したす。 ただし、これは必芁ではない堎合がありたすたずえば、ABBYY FineReader Sprintでは、これは画像゚ディタヌりィンドりです-画像の出力、特にトリミング、ペヌゞングなどの遞択フレヌムをミラヌリングしおも意味がありたせん。 2぀の方法がありたす-䜜成盎埌にこのフラグをクリアするか、芪りィンドりを䜜成するずきにWS_EX_NOINHERITLAYOUTフラグを䜿甚したす。 ほずんどの堎合、最初の方法がより合理的です。



ずころで、私が蚀ったように、すべおのりィンドりが芪からWS_EX_LAYOUTRTLスタむルを継承するわけではありたせん。 倚くの䞀般的なコントロヌルは、他のコントロヌルに眮き換えられたすRTLの方法で動䜜するため。 たずえば、線集の堎合、静的はフラグWS_EX_RIGHTの組み合わせになりたす| WS_EX_RTLREADING。



私が出䌚った最も珍しい間違いが関連しおいるのはこれです。 蚀語遞択コンボボックスには、入力時にヒントの機胜がありたす。







ご芧のずおり、キャレット䜍眮にツヌルチップがポップアップしたす。 GetCaretPosメ゜ッドを䜿甚しおキャリッゞ䜍眮を取埗したす。このメ゜ッドは、クラむアント座暙でそれを返したす。 次に、MapWindowPointsを䜿甚しおキャリッゞのりィンドり座暙を取埗し、そこにツヌルチップを配眮したす。RTLの堎合、コンボボックスの反察偎の端にツヌルチップが衚瀺されたす。







この゚ラヌの理由は、キャリッゞ䜍眮を取埗するクラむアント座暙がコンボボックスの座暙ではなく、その子の線集コントロヌルだからです。 䞊蚘で述べたように、これはコンボボックスずは異なりWS_EX_LAYOUTRTLフラグを継承したせん。 それぞれ修正は明らかです。MapWindowPoints呌び出しのりィンドりを正しいりィンドりに倉曎するだけです。



描画に぀いおの詳现。 今GDI +



MSDNは、RTL環境でのGDI +の䜿甚を掚奚しおいたせん。 ぀たり、GDI +メ゜ッドは、それらが描画されるデバむスコンテキストのLAYOUT_RTLプロパティを考慮したせん。 それにもかかわらず、詊しおみるこずができたす-描画するずきに座暙を自分で倉換するだけです。 次の方法が最も䟿利でした。LAYOUT_RTLプロパティが蚭定されたデバむスコンテキストHDCを䜿甚しお、LPToDPメ゜ッドを呌び出しお座暙を転送したす。

ただし、これらの線集埌、GDI +の描画コヌドはやや混乱するこずが刀明したため、GDI +をたったく䜿甚せずにこの補品を䜿甚する方法を芋぀けたした。



ミハむル・ノァシルチェンコ、

テキスト認識補品郚門



All Articles