delphi windows DrawTextEX Правильное использование отсечения - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь понять и правильно использовать windows API DrawTextEx, в DelphiXE8 в Windows 10 Pro. Моя цель - нарисовать многострочный текст на холсте внутри прямоугольника, обрезанного или не обрезанного по необходимости. Я предоставляю прямоугольник, и текст рисуется и обрезается, но кажется, что он неправильно реагирует на прямоугольник.

здесь есть функция

function MDrawPhraseEX(MyCanvas: TCanvas; MyString: String; MyRect: TRect; MyDrawText: Boolean): Integer;
var
    MyPhraseRect: TRect;
    MyClipRect: TRect;
    MyTextHeight: Integer;

const
    cLeftPhraseMargin = 0;
    cWidth = 700; // width of column.
    cRightPhrasemargin = 0;
    cTab = 50;
begin
    try
        MyCanvas.Rectangle(MyRect);
        //MyCanvas.TextRect(MyRect, MyString, [tfWordBreak, tfEndEllipsis] );
        //MyCanvas.FrameRect(MyRect);
        WinAPI.Windows.DrawText(MyCanvas.Handle, PChar(MyString), Length(MyString), MyRect, DT_WORDBREAK {OR DT_EXTERNALLEADING} {OR DT_NOCLIP});

        //DrawText(MyCanvas.Handle, PChar(MyString), Length(MyString), MyPhraseRect, DT_WORDBREAK);

        result := MyRect.Height;
    except
        //Log('****Exception: MDrawPhrase');

    end;
end;

Поэтому я рисую прямоугольник на холст, чтобы показать прямоугольник, переданный функции. когда я раскомментирую DT_NOCLIPPING, печатается вся фраза. Когда я удаляю DT_NOCLIPPING, фраза обрезается, но неправильно реагирует на прямоугольник.

Вот скриншот, вырезанный и не вырезанный.

Not Clipped

Clipped

Есть мысли?

...