none
CDC:DrawTextで複数行表示したときの正確な行間(px)を取得したい RRS feed

  • 質問

  • VisualStudio2010のC++MFC で開発しています。

    簡易エディタを作っておりまして、DrawTextで複数行表示した文字の右にDrawTextの単一行で行数を表示しようとしています。

     TEXTMETRIC textMetric;
     pDC->GetTextMetrics( &textMetric );

    で得たtextMetric.tmHeightを文字高さと考えて DrawTextの右にDrawTextで行数を表示していますが、行が進む毎に行数が数dotづつ下にずれます。 (ちなみに行高をtmpHeight-3 と考えて表示するとぴったり合いますが、 フォントやDPIなどによって変わりそうなんで固定offsetで帳尻をあわす事は避けたいです)

    DrawTextで複数行表示したときの正確な行間を得る方法がありましたらご教授ください。

    よろしくお願いします。


    • 編集済み AppKey 2016年6月29日 10:52 説明追加
    2016年6月29日 10:01

回答

  • 私の環境(Windows 10 x64 & Visual Studio 2010)で試したところ、DrawTextの複数行テキスト描画がずれることはありませんでした。

    下記のようなコードでテストしました。何か環境の違いがあるかもしれませんね。

    void CTestWindow::OnPaint()
    {
    	CPaintDC dc(this);
    
    	TEXTMETRIC tm = { 0 };
    	dc.GetTextMetrics(&tm);
    
    	RECT rect;
    	GetClientRect(&rect);
    
    	dc.DrawText(
    		TEXT("aaabbbccc\r\ndddeeefff\r\nあいうえお\r\nかきくけこ\r\n")
    		TEXT("aaabbbccc\r\ndddeeefff\r\nあいうえお\r\nかきくけこ\r\n")
    		TEXT("aaabbbccc\r\ndddeeefff\r\nあいうえお\r\nかきくけこ\r\n")
    		TEXT("aaabbbccc\r\ndddeeefff\r\nあいうえお\r\nかきくけこ\r\n")
    		, -1, &rect, 0);
    
    	for (int i = 0; i < 20; i++)
    	{
    		dc.MoveTo(0, i*tm.tmHeight);
    		dc.LineTo(100, i*tm.tmHeight);
    	}
    }
    • 編集済み kenjinoteMVP 2016年6月29日 11:26
    • 回答としてマーク AppKey 2016年6月29日 12:04
    2016年6月29日 11:24

すべての返信

  • 私の環境(Windows 10 x64 & Visual Studio 2010)で試したところ、DrawTextの複数行テキスト描画がずれることはありませんでした。

    下記のようなコードでテストしました。何か環境の違いがあるかもしれませんね。

    void CTestWindow::OnPaint()
    {
    	CPaintDC dc(this);
    
    	TEXTMETRIC tm = { 0 };
    	dc.GetTextMetrics(&tm);
    
    	RECT rect;
    	GetClientRect(&rect);
    
    	dc.DrawText(
    		TEXT("aaabbbccc\r\ndddeeefff\r\nあいうえお\r\nかきくけこ\r\n")
    		TEXT("aaabbbccc\r\ndddeeefff\r\nあいうえお\r\nかきくけこ\r\n")
    		TEXT("aaabbbccc\r\ndddeeefff\r\nあいうえお\r\nかきくけこ\r\n")
    		TEXT("aaabbbccc\r\ndddeeefff\r\nあいうえお\r\nかきくけこ\r\n")
    		, -1, &rect, 0);
    
    	for (int i = 0; i < 20; i++)
    	{
    		dc.MoveTo(0, i*tm.tmHeight);
    		dc.LineTo(100, i*tm.tmHeight);
    	}
    }
    • 編集済み kenjinoteMVP 2016年6月29日 11:26
    • 回答としてマーク AppKey 2016年6月29日 12:04
    2016年6月29日 11:24
  • 私の環境(Windows 10 x64 & Visual Studio 2010)で試したところ、DrawTextの複数行テキスト描画がずれることはありませんでした。

    下記のようなコードでテストしました。何か環境の違いがあるかもしれませんね。

    void CTestWindow::OnPaint()
    {
    	CPaintDC dc(this);
    
    	TEXTMETRIC tm = { 0 };
    	dc.GetTextMetrics(&tm);
    
    	RECT rect;
    	GetClientRect(&rect);
    
    	dc.DrawText(
    		TEXT("aaabbbccc\r\ndddeeefff\r\nあいうえお\r\nかきくけこ\r\n")
    		TEXT("aaabbbccc\r\ndddeeefff\r\nあいうえお\r\nかきくけこ\r\n")
    		TEXT("aaabbbccc\r\ndddeeefff\r\nあいうえお\r\nかきくけこ\r\n")
    		TEXT("aaabbbccc\r\ndddeeefff\r\nあいうえお\r\nかきくけこ\r\n")
    		, -1, &rect, 0);
    
    	for (int i = 0; i < 20; i++)
    	{
    		dc.MoveTo(0, i*tm.tmHeight);
    		dc.LineTo(100, i*tm.tmHeight);
    	}
    }

    サンプルまでご提示いただき大変ありがとうございました。

    プログラム的に問題があったようで正しく設定するとずれがなくなりました。

    また気がついた事がありましたらよろしくお願いします。


    2016年6月29日 12:04