none
DrawTextで、文字の間隔が詰まって描画されてしまいます RRS feed

  • 質問

  • 拡張メタファイルに、DrawTextで文字を描画しています。
    このとき文字間隔の指定は行っていないため、デフォルト(0)が適用されるものと思っていました。
    しかし、ある特定の環境において、文字間が詰まって描画される現象が発生しています。
    DrawTextを呼び出す前に、SetTextCharacterExtra関数を使用して、拡張メタファイルのデバイスコンテキストに対して明示的に文字間隔をマイナスの値に指定したときに、同じような現象が出ることが分かりました。
    以下のような実装(抜粋)なのですが、CreateEnhMetaFileで生成したデバイスコンテキストに、初期値として0以外の文字間隔が設定されているということはあるのでしょうか。
    (例えば他のソフトウェアの干渉などによって、影響を受けることはあるのでしょうか)
    ----------
     hDskWnd = GetDesktopWindow();
     hRefDC = GetDC(hDskWnd);
     // 拡張メタファイルのデバイスコンテキストを作成
     hDC = CreateEnhMetaFile(hRefDC, NULL, &rect, _TEXT("FujiXerox\0PaperUI Access Formatter\0\0"));
     ReleaseDC(hDskWnd, hRefDC);
     // 文字を描画
     DrawText(hDC, stringvalue, -1, &textrect, uiDrawFormat);
    -----------
    現象が発生している環境が近くにないため、実際の値の確認はできておらず、あくまで推測で調査を進めております。
    お分かりの方がいらっしゃいましたら、ご教授宜しくお願い致します。


    2011年3月29日 2:14

すべての返信

  • メタファイルの初期値のいくつかは hRefDC で指定したものになります。デスクトップを元にしておられるようですので、問題の現象が出ているユーザのデスクトップが、そのような設定になっていたり、デスクトップに対して処理をしている常駐ソフト類があるのではないでしょうか?


    2011年3月29日 2:42
  • 早速のご回答ありがとうございます。

     

    試しに、拡張メタファイルを生成する前のデバイスコンテキストに対して、SetTextCharacterExtra関数にて文字間隔を指定してみましたが、生成された拡張メタファイルのデバイスコンテキストには適用されませんでした。

     

    ----------
     hDskWnd = GetDesktopWindow();
     hRefDC = GetDC(hDskWnd);
     SetTextCharacterExtra(hRefDC, -200);
     extraSpace = GetTextCharacterExtra(hRefDC);    <-ここではextraSpaceに-200がセットされます。
     
    // 拡張メタファイルのデバイスコンテキストを作成
     hDC = CreateEnhMetaFile(hRefDC, NULL, &rect, _TEXT("FujiXerox\0PaperUI Access Formatter\0\0"));
     ReleaseDC(hDskWnd, hRefDC);
     extraSpace = GetTextCharacterExtra(hDC);      <- ここではextraSpaceに0がセットされています。
     // 文字を描画
     DrawText(hDC, stringvalue, -1, &textrect, uiDrawFormat);
    -----------
    ご回答いただきましたように、デスクトップの設定によるものだとしたら、その値を設定する方法など、もしご存知でしたらご教示いただけないでしょうか。
    宜しくお願い致します。

    2011年3月29日 8:50
  • いえ、そういう可能性はないですか?って程度です。

    ちなみに、「文字がつまって描画される」とは、具体的にどのような状態になるのでしょうか?

    再現性のある環境で作成されたメタファイルを、別のPCで再生しても文字間隔が詰まるのであれば、メタファイルにレコードされた文字位置が狭いということですし、再現性のない環境で作成されたメタファイルを、再現性のあるPCで再生しても文字間隔が詰まるのであれば、メタファイルではなく再生先のデバイスコンテキストの問題ではないかと思えます。

    そういった切り分けをしてみてはいかがでしょうか?(メタファイルをファイルに出力して中身をみるのも早いかもしれません)

    2011年3月31日 14:39
  • アドバイスありがとうございます。
    返信が遅くなり申し訳ありません
    こちらから当該のマシンにアクセスできないため、ご提示頂いた方法を試す術がなく、またそうこうしているうちに、現象が再現しなくなったとの報告を受けました。
    再現していた時とそうでない時で、システムに変更を加えたようなことはないそうで、やはり同時に起動している他のソフトウェアから何らかの影響を受けているのでは、という疑いが捨てきれないのですが、ひとまず調査は終了ということになりました。
    この現象に関して何かご存知の方がいらっしゃれば、引き続きコメントお待ちしております。
    「文字が詰まって描画される」現象ですが、隣り合う文字がくっついたり、一部重なったりして描画されてしまう状態です。
    2011年4月5日 8:23