文字サイズと回転表示の不具合ついて

[戻る]
2005/07/07(木) 21:18:01
以前メールアドレス取得の件でお世話になりました橘と言います。今回は文字につい
ての質問です。

下記のプログラムは手持ちの書籍からほとんどコピーしたもので、2バイト文字「者」
を文字背景白、文字色赤で90度回転で4個表示しています。lfHeightが138まで
は問題ないのですが、それより大きくすると以下のような症状が出てきました。なお、
文字の回転はどの角度でも問題なく回転しています。

1:139にすると180度の文字だけが、X位置650あたりに表示されます。
2:239にすると90度の文字だけが、X位置800あたりに表示されます。
3:339,439では問題なく、綺麗に4個表示します。

1と2の場合、文字背景は正常にその位置に描画されてるのですが、スッポリ文字だ
けが右方向へずれてしまうのです。ずれる位置が不正確で申し訳ありませんが、どう
してこのような現象が起きるのか、ご存知でしたらご教授ねがいます。後、lfHeight
ってどこまで許容されているのでしょうか。例えば10000、15000とかセッ
トできるのでしょうか?。

環境はVC++6.0、XP、画面の色グレー、画面サイズ1024×768でテス
トしました。


    CClientDC dc(this);
    // 文字列サンプルを作る
    CString str(_T("者"));
    //赤いテキストを描画する
         //dc.SetBkMode(TRANSPARENT);
    dc.SetTextColor(RGB(255,0,0));
    CFont   font;         // フォントオブジェクト
    LOGFONT stFont;       // フォント定義
    // 変更されないフォント属性を設定する
    memset(&stFont, 0, sizeof(LOGFONT));
    stFont.lfHeight = 139;
    stFont.lfWeight = FW_NORMAL;
    stFont.lfCharSet = SHIFTJIS_CHARSET;
    stFont.lfClipPrecision = CLIP_LH_ANGLES;
    strcpy(stFont.lfFaceName, "MS Pゴシック");
    //90度間隔でテキストを描画する
    for (int nAngle=0; nAngle < 3600; nAngle += 900)
    {
        // 新しい角度を指定する
        stFont.lfEscapement = nAngle;
        // フォントを作り、DCに指定する
        font.CreateFontIndirect(&stFont);
        CFont* pOldFont = dc.SelectObject(&font);
        // テキストを描画する
        dc.TextOut(500,350, str);
        // DCのフォントを選択解除し、オブジェクトを破棄する
        dc.SelectObject(pOldFont);
        font.DeleteObject();
    }

Kerry 2005/07/08(金) 10:39:40
原因は良くわかりませんが、グラフィック ドライバのバグを疑っても
良いかもしれません。
画面のプロパティでハードウェア アクセラレータをOFFってみるとか・・・

2005/07/09(土) 12:08:42
Kerryさん、アドバイスありがとうございます。&返事が遅くなって
ごめんなさい。で、画面関係のプロパティからおっしゃられる様な箇所を
探ってみたのですが、スッピンのマシンのせいか、私の探し方が悪いのか
HACをOFFるようなもが見つかりませんでした。

その後、文字を「あ」に代えて実行すると149で同じ症状が発現しました。
今度は文字を1バイトの「A」に代えてやってみました。この場合はどのサ
イズ、どの角度でも問題なく表示されました(どないなっとるじゃ)。

コレって私のマシンだけなのでしょうか。ハード的には購入時のままで何も
足さず、引いてもいません。また文字やフォントに対して黄表紙を齧る程度
の知識しか持ち合わせていないので、ナニカ錯誤の轍を踏んでいるかもしれ
ません。宜しくご教授ください。

Kerry 2005/07/11(月) 11:21:04
> 画面関係のプロパティからおっしゃられる様な箇所を探ってみたのですが、
> スッピンのマシンのせいか、私の探し方が悪いのかHACをOFFるような
> もが見つかりませんでした。

XPでしたら、画面のプロパティの[設定]ページの[詳細設定]ボタンでダイアログを
起動して、[トラブルシューティング]ページで設定できると思います。

もしくは、購入時のままであれば、最新のドライバに更新してみる、とか。

それから、ダメ元で

    // 新しい角度を指定する
    stFont.lfEscapement  = nAngle;
    stFont.lfOrientation = nAngle;

のようにしてみてください。
環境によっては、lfEscapementとlfOrientationを同じ値にしなければ
ならない場合があったようにも思われます。

2005/07/11(月) 22:16:42
Kerryさん、お忙しい中、貴重な&丁寧なアドバイス本当に有り難うございます。
早速試してみます。結果は明日お知らせできると思います。

2005/07/12(火) 19:03:43
[[解決]]
Kerryさん。昨日は有り難うございました。で、やってみました。全てOFFに
するとバッチリ表示されました!!!。本当に有り難うございました。

後者は以前やってみたのですがNGです。しかし、私はソフトを開発していてパソコ
ンの方を疑ったことはほとんどありませんでしたので、正直なところ驚きました。

私が狭隘な認識に捉われていなければ、Kerryさんの最初のアドバイスで解決
していたものを・・・アホな私に再度にわたってのご丁寧なアドバイスに対しまして、
深く頭を垂れる者です。有り難うございました。m(_ _)m

p.s.原因がわかりましたので最新のドライバをDLしようと思ってます。

古いスレッドには追加発言できません。