Есть строка текста и 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]