|
|
|
| Здравствуйте!
Мне надо сделать так, чтобы некий текст прокрутился относительно некой точки компонента Image на 360 градусов. Я не могу понять как это реализовать по той причине, что функция TextOut не задает угла поворота или конечкой точки. Помогите реализовать это. Спасибо. | |
|
|
|
|
|
|
|
для: AVS
(28.11.2007 в 05:55)
| | Ну, насколько я знаю, ни одни стандартные средства не позволяют рисовать текст под любым углом (OpenGL, DirectX умеют, но как я понимаю это не тот случай). может надо рисовать текст (растеризовать) в отдельную область памяти а потом наложить его на нужное изображение. | |
|
|
|
|
|
|
|
для: alex19921992
(28.11.2007 в 06:02)
| | А как именно это реализовать? Моих текущих познаний не хватает для самостоятельного решения этой задачи. | |
|
|
|
|
|
|
|
для: AVS
(28.11.2007 в 08:51)
| | Это следует либо собственный компонент писать при помощи Windows API или использоать анимированный GIF-файл, который отображать при помощи компонента, который поддерживат GIF-формат. | |
|
|
|
|
|
|
|
для: AVS
(28.11.2007 в 05:55)
| | а что такое Image? где такая функция TextOut? в какой среде пишете? под какую платформу? | |
|
|
|
|
|
|
|
для: alex19921992
(28.11.2007 в 10:37)
| | Вероятно имеется в виду Builder - в VCL имеется специальный компонент TImage для вывода изображения. | |
|
|
|
|
|
|
|
для: cheops
(28.11.2007 в 12:00)
| | В C++ Builder 6. Компонент TImage. Image->Canvas->TextOutA(x,y,"Text"). Но это просто помещается текст.
Мне подкинули вот такой код:
RECT rc;
int angle;
HFONT hfnt, hfntPrev;
LPSTR lpszRotate = "String to be rotated.";
/* Allocate memory for a LOGFONT structure. */
PLOGFONT plf = (PLOGFONT) LocalAlloc(LPTR, sizeof(LOGFONT));
/* Specify a font typeface name and weight. */
lstrcpy(plf->lfFaceName, "Arial");
plf->lfWeight = FW_NORMAL;
/* Retrieve the client-rectangle dimensions. */
GetClientRect(hwnd, &rc);
/*
* Set the background mode to transparent for the
* text-output operation.
*/
SetBkMode(hdc, TRANSPARENT);
/*
* Draw the string 36 times, rotating 10 degrees
* counter-clockwise each time.
*/
for (angle = 0; angle < 3600; angle += 100) {
plf->lfEscapement = angle;
hfnt = CreateFontIndirect(plf);
hfntPrev = SelectObject(hdc, hfnt);
TextOut(hdc, rc.right / 2, rc.bottom / 2,
lpszRotate, lstrlen(lpszRotate));
SelectObject(hdc, hfntPrev);
DeleteObject(hfnt);
}
/* Reset the background mode to its default. */
SetBkMode(hdc, OPAQUE);
/* Free the memory allocated for the LOGFONT structure. */
LocalFree((LOCALHANDLE) plf);
|
Но он рисует на самой форме. Я пытался изменить его так, чтобы рисовалось на TImage (именно на нем мне надо), но не получилось, т.к. функции TextOut различны у формы и Image. | |
|
|
|
|
|
|
|
для: AVS
(28.11.2007 в 12:37)
| | Суть в том, что всё это Windows-окна, буть то форма или компонет изображения - вам нужно как-то перейти на язык Windows API. Строка
GetClientRect(hwnd, &rc); |
резервирует прямоугольник, где будет отрисовываться надпись - вам нужно этот прямоугольник (переменная rc) выбить из TImage, если не ошибаюсь получить его можно примерно так Image->Canvas->ClipRect | |
|
|
|
|
|
|
|
для: cheops
(28.11.2007 в 13:25)
| | Реализовал вот так, внутри таймера (чтобы было анимацией):
PLOGFONT font=(PLOGFONT) LocalAlloc(LPTR,sizeof(LOGFONT));
font->lfWeight=FW_NORMAL;
Main->Caption="X: "+IntToStr(x)+"; Y: "+IntToStr(y)+" | "+IntToStr(grad/10)+" градусов";
font->lfEscapement=grad;
SelectObject(Image->Canvas->Handle,CreateFontIndirect(font));
Image->Canvas->Brush->Color=clWhite;
Image->Canvas->Rectangle(0,0,Image->Width,Image->Height);
Image->Canvas->TextOut(x,y,Edit->Text.c_str());
if(i<36)
{
if(RB2->Checked)
{
grad+=100;
}
else
{
grad-=100;
}
i++;
}
else
{
Timer->Enabled=false;
Edit->Enabled=true;
return;
}
|
Вот только вопрос: что выполняют нижеприведенные операторы? Делал прогу по статье.
PLOGFONT font=(PLOGFONT) LocalAlloc(LPTR,sizeof(LOGFONT));
|
и
SelectObject(Image->Canvas->Handle,CreateFontIndirect(font));
|
Дайте пожалуйста подробное описание, чтобы не запороть защиту работы. :) | |
|
|
|
|
|
|
|
для: AVS
(30.11.2007 в 13:25)
| | PLOGFONT font=(PLOGFONT) LocalAlloc(LPTR,sizeof(LOGFONT)); |
Функция выделяет из кучи память для font в количестве sizeof(LOGFONT) байт. Её кстати в конце бы не плохо освободить
SelectObject() - позволяет выбрать объект, на котором будет осуществляться рисование средствами библиотеки GDI, функция CreateFontIndirect() - создаёт шрифт для рисования текста. | |
|
|
|
|
 371.9 Кб |
|
|
для: cheops
(01.12.2007 в 04:44)
| | Все, доделал прогу. Спасибо за помощь. Исходник прикрепил. Может кому пригодится. | |
|
|
|