Форум: Форум C++Разное
Новые темы: 00
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Прокрутка текста относительно точки
 
 автор: AVS   (28.11.2007 в 05:55)   письмо автору
 
 

Здравствуйте!

Мне надо сделать так, чтобы некий текст прокрутился относительно некой точки компонента Image на 360 градусов. Я не могу понять как это реализовать по той причине, что функция TextOut не задает угла поворота или конечкой точки. Помогите реализовать это. Спасибо.

  Ответить  
 
 автор: alex19921992   (28.11.2007 в 06:02)   письмо автору
 
   для: AVS   (28.11.2007 в 05:55)
 

Ну, насколько я знаю, ни одни стандартные средства не позволяют рисовать текст под любым углом (OpenGL, DirectX умеют, но как я понимаю это не тот случай). может надо рисовать текст (растеризовать) в отдельную область памяти а потом наложить его на нужное изображение.

  Ответить  
 
 автор: AVS   (28.11.2007 в 08:51)   письмо автору
 
   для: alex19921992   (28.11.2007 в 06:02)
 

А как именно это реализовать? Моих текущих познаний не хватает для самостоятельного решения этой задачи.

  Ответить  
 
 автор: cheops   (28.11.2007 в 08:59)   письмо автору
 
   для: AVS   (28.11.2007 в 08:51)
 

Это следует либо собственный компонент писать при помощи Windows API или использоать анимированный GIF-файл, который отображать при помощи компонента, который поддерживат GIF-формат.

  Ответить  
 
 автор: alex19921992   (28.11.2007 в 10:37)   письмо автору
 
   для: AVS   (28.11.2007 в 05:55)
 

а что такое Image? где такая функция TextOut? в какой среде пишете? под какую платформу?

  Ответить  
 
 автор: cheops   (28.11.2007 в 12:00)   письмо автору
 
   для: alex19921992   (28.11.2007 в 10:37)
 

Вероятно имеется в виду Builder - в VCL имеется специальный компонент TImage для вывода изображения.

  Ответить  
 
 автор: AVS   (28.11.2007 в 12:37)   письмо автору
 
   для: 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.

  Ответить  
 
 автор: cheops   (28.11.2007 в 13:25)   письмо автору
 
   для: AVS   (28.11.2007 в 12:37)
 

Суть в том, что всё это Windows-окна, буть то форма или компонет изображения - вам нужно как-то перейти на язык Windows API. Строка
GetClientRect(hwnd, &rc);

резервирует прямоугольник, где будет отрисовываться надпись - вам нужно этот прямоугольник (переменная rc) выбить из TImage, если не ошибаюсь получить его можно примерно так Image->Canvas->ClipRect

  Ответить  
 
 автор: AVS   (30.11.2007 в 13:25)   письмо автору
 
   для: 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));


Дайте пожалуйста подробное описание, чтобы не запороть защиту работы. :)

  Ответить  
 
 автор: cheops   (01.12.2007 в 04:44)   письмо автору
 
   для: AVS   (30.11.2007 в 13:25)
 

PLOGFONT font=(PLOGFONT) LocalAlloc(LPTR,sizeof(LOGFONT));

Функция выделяет из кучи память для font в количестве sizeof(LOGFONT) байт. Её кстати в конце бы не плохо освободить
LocalFree(font);

SelectObject() - позволяет выбрать объект, на котором будет осуществляться рисование средствами библиотеки GDI, функция CreateFontIndirect() - создаёт шрифт для рисования текста.

  Ответить  
 
 автор: AVS   (03.12.2007 в 09:12)   письмо автору
371.9 Кб
 
   для: cheops   (01.12.2007 в 04:44)
 

Все, доделал прогу. Спасибо за помощь. Исходник прикрепил. Может кому пригодится.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования