1

開発中のプログラムに問題があります。MFC を使用して記述されていますが、Unicode は使用しません。簡体字中国語への翻訳を行いました。これまでのところ、これが最初で唯一のローカリゼーションです。すべての文字列をリソースに移動して、翻訳可能にしました。私たちのコンピューター (Win7 と XP の両方) ではすべて正常に動作しているように見えますが、Windows XP を実行している一部のお客様のコンピューターでは問題が発生します。

これらのコンピューターでは、ツリー制御に入力するものを除いて、すべての翻訳された文字列が機能します (CTreeCtrl が直接使用されます)。問題の原因がツリー コントロールなのか、入力したテキストなのかはわかりませんが、これらのコントロールではフォントが置き換えられないようです。私の推測では、一部の文字列にはラテン文字も含まれているため、置換されない可能性があります。それでも、その種の置換はプログラムの他の場所でも機能するようで、ツリーに入力されたすべての文字列にそれらの文字が含まれているわけではありません。

だから私の最初の質問は: コントロール内で何が起こっているかを知る方法はありますか? 問題が発生しているコンピューターにリモート アクセスすることはできますが、そのコンピューターでデバッガーを実行するのは少し難しいかもしれません。この問題を診断するには、どのようなツールを使用できますか?

私の頭をよぎった解決策の 1 つは、ツリー コントロールをサブクラス化して、実際のテキスト描画をより詳細に制御することでした。 185261.aspxを使用して問題を回避してください。これは効果的でしょうか、それとも無駄に大変な作業になるのでしょうか?

どうもありがとう!

4

1 に答える 1

0

彼らのシステムでは、ツリー コントロールの実装にバグがあったか、何らかの方法で図面にフックされたシステム全体のアドインがあったようです。私が最終的にやったのは、ツリービューの通知を介してカスタム描画を行い、次にフォントリンクを使用してフォントを解決することでした. ただし、ほとんどの場合、とにかく事前に選択されたフォントで TextOutW() を実行することになったと思うので、フォントのリンクが必要になるとは思いません。

これは、私が最終的に得たもののやや単純化されたコードサンプルです。

void MyDlg::OnCustomDrawTreeItem( NMHDR* pNMHDR, LRESULT* pResult )
{

if (!mpFontLink)
{
    *pResult = CDRF_DODEFAULT;
    return;
}

LPNMTVCUSTOMDRAW pCustomdraw = (LPNMTVCUSTOMDRAW) pNMHDR;
switch(pCustomdraw->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
    {
        // Ask to do custom draw
        *pResult = CDRF_NOTIFYITEMDRAW;
        break;
    }
case CDDS_ITEMPREPAINT:
    {
        // Ask for post paint notification
        *pResult = CDRF_NOTIFYPOSTPAINT;
        break;
    }
case CDDS_ITEMPOSTPAINT:
    {
        // Get the rect of only the item, not the tree stuff
        RECT rcItem;
        m_pageTree.GetItemRect((HTREEITEM) pCustomdraw->nmcd.dwItemSpec, &rcItem, TRUE);

        // Erase the item background in case the previous string drawn was wider
        HDC hDC = pCustomdraw->nmcd.hdc;
        FillRect( hDC, &rcItem, (HBRUSH) GetClassLongPtr(m_pageTree.GetSafeHwnd(), GCLP_HBRBACKGROUND));

        pageStruct *pS = (pageStruct*) pCustomdraw->nmcd.lItemlParam;
        DWORD dwFontCodepages = 0, dwStrCodepages = 0;

        HFONT hOriginalFont = (HFONT)GetCurrentObject(hDC, OBJ_FONT);
        HRESULT hr = mpFontLink->GetFontCodePages( hDC, hOriginalFont, &dwFontCodepages);
        OML_CStringW tData = pS->csCaption.GetBuffer();

        // Set up position etc
        DWORD dwAlignOrig = GetTextAlign(hDC);
        if (!(dwAlignOrig & TA_UPDATECP)) {
            SetTextAlign(hDC, dwAlignOrig | TA_UPDATECP);
        }

        POINT ptOrig;
        MoveToEx(hDC, 2 + rcItem.left, 1 + rcItem.top, &ptOrig);
        SetTextColor( hDC, pCustomdraw->clrText );
        SetBkColor( hDC, pCustomdraw->clrTextBk );

        // Loop over the parts of the text
        TuInt32 nIndex = 1;
        while (nIndex <= tData.GetLength())
        {
            long nActualChars = 0;
            wchar_t *pStr = (wchar_t*)tData.BaseGetItemP( nIndex );
            TuInt32 nChars = 1 + tData.GetLength() - nIndex;
            hr = mpFontLink->GetStrCodePages(pStr, nChars,
                                             dwFontCodepages, &dwStrCodepages, &nActualChars);

            if (dwStrCodepages & dwFontCodepages)
            {
                // We end up here almost every time, that is why TextOutW would probably be enough.
                // This part is supported by the original font (or the GDI can help us switch automatically)
                TextOutW(hDC, 0, 0, pStr, nActualChars);
            }
            else
            {
                // We need to link
                HFONT hLinked;
                if (FAILED(hr = mpFontLink->MapFont(hDC, dwStrCodepages, 0, &hLinked)))
                {
                    // Fail: Output the rest without linking
                    TextOutW( hDC, 0, 0, pStr, nChars );
                    break;
                }

                // Output with linked font
                SelectObject(hDC, hLinked);
                TextOutW( hDC, 0, 0, pStr, nActualChars);
                SelectObject(hDC, hOriginalFont);
                mpFontLink->ReleaseFont( hOriginalFont );
            }
            nIndex += nActualChars;
        }
        OML_LOG_1( "_END:");

        // Reset alignment mode
        if (!(dwAlignOrig & TA_UPDATECP)) {
            SetTextAlign(hDC, dwAlignOrig);
            MoveToEx(hDC, ptOrig.x, ptOrig.y, NULL);
        }

        *pResult = CDRF_SKIPDEFAULT;
    }
default:
    {
        *pResult = CDRF_DODEFAULT;
        break;
    }
}
} /* OnCustomDrawTreeItem */
于 2012-08-09T10:21:44.747 に答える