Есть строка текста и 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;
};
Здравствуйте, Sheridan, Вы писали:
S>DrawText(hdc,TextStrings[i].c_str(),TextStrings[i].length(),&LineRect,DT_CENTER);
попробуй так DT_WORDBREAK
(ширину окна можно задать жестко а потом через
GetTextExtentPoint32() вычислить количество строк в окне —
и соответственно его высоту)
Здравствуйте, vovas, Вы писали:
V>Здравствуйте, Sheridan, Вы писали:
S>>DrawText(hdc,TextStrings[i].c_str(),TextStrings[i].length(),&LineRect,DT_CENTER);
V>попробуй так DT_WORDBREAK V>(ширину окна можно задать жестко а потом через V>GetTextExtentPoint32() вычислить количество строк в окне — V>и соответственно его высоту)
Гм... А поподробнее немного можно? А то я винапи мало знаю, все больше в билдере пишу...
Здравствуйте, Sheridan, Вы писали:
S>Гм... А поподробнее немного можно? А то я винапи мало знаю, все больше в билдере пишу...
подробнее — очень много кода
ты же юзаешь DrawText() — а это чисттый winapi
вот там вместо DT_CENTER нужно указать DT_WORDBREAK (перенос строки в указаном
прямоугольнике).
ну а про GetTextExtentPoint32() придется почитать
> нужен HDC... Если я его сразу после создания окна возьму — ничего > страшного? >
Ну если он достаточно интенсивно используется, то это даже хороший вариант!!!
> И не надо ли потом ReleaseDC делать? >
При завершении процесса система сама всё прибьёт!!!
Posted via RSDN NNTP Server 1.9 gamma
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Здравствуйте, Sheridan, Вы писали:
S>Есть строка текста и RECT куда этот текст надо вывести в несколько строк... Даже не так... Надо перед созданием окна вычислить необходимый RECT и создать это окно нужного размера. Текст — просто строка неизвестного размера...
Попробуйте вызвать DrawText с параметром DT_CALCRECT
Здравствуйте, Stanky, Вы писали:
>> И не надо ли потом ReleaseDC делать? >> S>При завершении процесса система сама всё прибьёт!!!
ИМХО лучьше прибить... Особенно в моем случае