Нарисовать текст в несколько строк...
От: Sheridan Россия  
Дата: 22.11.04 05:45
Оценка:
Есть строка текста и RECT куда этот текст надо вывести в несколько строк... Даже не так... Надо перед созданием окна вычислить необходимый RECT и создать это окно нужного размера. Текст — просто строка неизвестного размера...
Вот что я делаю:
CToolTip::CToolTip(std::string Text, std::string Caption,int DeltaTop, int DeltaLeft, EIcon Icon)
{
    _caption = Caption;
    _text = Text;
    Options = GetToolTipManager()->ToolTipOptions;
    /*Вычисление размеров окошка*/
    int Width = Options->MinToolTipWidth;
    int Height = Options->MinToolTipHeight;
    int CaptionHeight = _caption.length() * Options->CaptionFontStruct.lfWidth;
    if (Height < CaptionHeight) Height += CaptionHeight - Height;

    int LineWidth = 0;
    int Lines = Height/Options->TextFontStruct.lfHeight;
    if (Height%Options->TextFontStruct.lfHeight) Lines++;
    if (Lines > 1)
    {
        int CharsPerLine = _text.length() / Lines;
        while(CharsPerLine>Options->MaxLineLength || CharsPerLine<Options->MinLineLength)
        {
            if (CharsPerLine>Options->MaxLineLength) Lines++;
            if (CharsPerLine<Options->MinLineLength) Lines--;
            CharsPerLine = _text.length() / Lines;
        }
        LineWidth = CharsPerLine*Options->TextFontStruct.lfWidth;
        int LinesHeight = Options->TextFontStruct.lfHeight * Lines;
        if(LinesHeight > Height) Height += Height - LinesHeight;
        for (int i=0;i<Lines;i++) TextStrings.push_back(_text.substr(i*CharsPerLine,CharsPerLine));
    }
    else    
    {
        LineWidth = _text.length()*Options->TextFontStruct.lfWidth;
        TextStrings.push_back(_text);
    }
    if(Width<LineWidth+Options->CaptionWidth) Width += Width - LineWidth+Options->CaptionWidth;
    WindowPos.x = DeltaLeft;
    WindowPos.y = DeltaTop - Height;
    TTWindowHandle = CreateWindowEx(WS_EX_TOPMOST | WS_EX_TOOLWINDOW,
                                    "Sheridan_ToolTip_Wnd_Class",
                                    "",
                                    WS_POPUP | WS_BORDER,
                                    WindowPos.x,
                                    WindowPos.y,
                                    Width,
                                    Height,
                                    NULL,
                                    NULL,
                                    NULL,
                                    (LPVOID) NULL);
    if (!TTWindowHandle) ShowError("CreateWindow");
    GetClientRect(TTWindowHandle,&TTWindowRect);
    _TTCaptionRect = TTWindowRect;
    _TTCaptionRect.right = Options->CaptionWidth;
    _TTTextRect = TTWindowRect; // - Собственно RECT под вывод текста
    _TTTextRect.top -= Options->TextBorderWidth;
    _TTTextRect.left += Options->CaptionWidth;
    _TTTextRect.right -= Options->TextBorderWidth;
    _TTTextRect.bottom += Options->TextBorderWidth; 
    SetWindowLong(TTWindowHandle,GWL_USERDATA,(LONG)this);
    Show();
}

Options это вот что
class CToolTipOptions
{
public:
    CToolTipOptions(void);
    ~CToolTipOptions(void);
    int MaxLineLength;
    int MinLineLength;
    int MinToolTipHeight;
    int MinToolTipWidth;
    int CaptionWidth;
    COLORREF StartGradientColor;
    COLORREF EndGradientColor;
    int GradientCount;
    COLORREF CaptionColor;
    COLORREF TextColor;
    unsigned int ShowTime;
    LOGFONT CaptionFontStruct;
    HFONT CaptionFont;
    LOGFONT TextFontStruct; // шрфт для текста
    HFONT TextFont;
    int TextBorderWidth;
    EGradientDirection GradientDirection;
};

Шрифт моздаю вот так:
    CaptionFontStruct.lfCharSet = DEFAULT_CHARSET;
    CaptionFontStruct.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    CaptionFontStruct.lfEscapement = 900;
    strcpy(CaptionFontStruct.lfFaceName,"Microsoft Sans Serif");
    CaptionFontStruct.lfHeight = 12;
    CaptionFontStruct.lfItalic = FALSE;
    CaptionFontStruct.lfOrientation = 0;
    CaptionFontStruct.lfOutPrecision = OUT_DEVICE_PRECIS;
    CaptionFontStruct.lfPitchAndFamily = FF_ROMAN;
    CaptionFontStruct.lfQuality = ANTIALIASED_QUALITY;
    CaptionFontStruct.lfStrikeOut = FALSE;
    CaptionFontStruct.lfUnderline = FALSE;
    CaptionFontStruct.lfWeight = FW_SEMIBOLD;
    CaptionFontStruct.lfWidth = 5;
    CaptionFont = CreateFontIndirect(&CaptionFontStruct);
    TextFontStruct = CaptionFontStruct;
    TextFontStruct.lfHeight = 12;
    TextFontStruct.lfEscapement = 0;
    TextFont = CreateFontIndirect(&TextFontStruct);

А рисую просто
    RECT LineRect = _TTTextRect;
    
    SetTextColor(hdc,Options->TextColor);
    SelectFont(hdc,Options->TextFont);
    for (int i=0;i<TextStrings.size();i++)
    {
        LineRect.bottom = LineRect.top+Options->TextFontStruct.lfHeight+1;
        DrawText(hdc,TextStrings[i].c_str(),TextStrings[i].length(),&LineRect,DT_CENTER);
        LineRect.top = LineRect.bottom;
    }

И в итоге получается вот что [Текст — "Текст тестового хинта [If you add a minimize button to your dialog, you will need the code below]"]

Что я не так делаю?
-=RSDN@Home 1.1.4 beta 3 rev. 233=- [silent]
Matrix has you...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.