Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.56/50: Рейтинг темы: голосов - 50, средняя оценка - 4.56
23 / 15 / 0
Регистрация: 16.11.2009
Сообщений: 332
1

Нужен совет знающих людей...

16.11.2009, 18:17. Просмотров 9365. Ответов 70
Метки нет (Все метки)


Всем привет!

Пишу программу в C++ Builder, и вот возникло 2 вопроса:

1) Можно-ли как-нибудь добавить шрифты в программу, чтобы не требовалась их установка нв ПК?
2) Как сделать плавное появление изображения в программе?

Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2009, 18:17
Ответы с готовыми решениями:

Нужен совет:
я учусь в 2-ом курсе на программиста у меня есть базовые знание c++,STL до сих пор работал...

Нужен совет!
Доброго времени суток! Возможно таких тем как эта было уже миллион.. но всё же, хотелось бы...

Нужен совет с Canvas
Доброго времени суток, Нужен совет, через чего сделать следующее Дано: картинка с нарисованными...

Нужен совет по созданию функции
Приветствую всех. Занимаюсь разработкой класса для работы с прибором на основе его протокола...

70
говнокодер
1262 / 286 / 35
Регистрация: 31.10.2009
Сообщений: 1,431
16.11.2009, 19:02 2
разве что скопировать сразу в Windows\\Fonts... (ну при запуске программы или при установке...)

скопировать можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
TMemoryStream * T = new TMemoryStream;
AnsiString S, S1;
char A[MAX_PATH];
GetWindowsDirectory(A,MAX_PATH); //виндовс
S=ExtractFilePath(Application->ExeName)+"\\EccentricStd.otf"; //путь к шрифту
S1=A;
S1=S1+ "\\Fonts\\EccentricStd.otf"; //куда копировать + имя шрифта
T->LoadFromFile(S);
T->SaveToFile(S1);
Edit1->Text=S1;
delete T;
другого способа не знаю, единственное, надо учитывать, если этот код просто оставить без изменений, то шрифт будет копироваться всякий раз.. надо или проверять наличие шрифта или проверять в первый ли раз запущена прога (например через ини файлы (писал в темах ранее))... ну и фонт нейм прописать надо))))

второй вопрос не совсем понятен.
0
23 / 15 / 0
Регистрация: 16.11.2009
Сообщений: 332
16.11.2009, 19:08  [ТС] 3
Ну со шрифтом всё ясно. Поясняю второй вопрос: в программе показывается изображение компонентом Image, вот и надо сделать медленное появление изображения.
0
говнокодер
1262 / 286 / 35
Регистрация: 31.10.2009
Сообщений: 1,431
16.11.2009, 19:43 4
может попробовать прорисовывать на канве линиями?
ну т.е.: отрисовываем изображение, устанавливаем прозрачный цвет далее через таймер:
закрашиваем сперва все кроме скажем, первой линии изображения...
(что-то вроде того):
C++
1
2
i++;
Image1->Picture->Bitmap->Canvas->Rectangle(0,Image1->Height+i,Image1->Width,Image1->Height);
потом снова загрузка изображения...
что нибудь вроде этого.. тут правда надо подумать еще... но я бы как нибудь так сделать.
Вот тут человек делал подобное:

Как мне сделать, чтоб изображение в ТImage было "привязано" к нижней границе объекта?

ну еще тема "создание игры" ... там наверняка есть че-нибудь интересное по этому поводу..
0
23 / 15 / 0
Регистрация: 16.11.2009
Сообщений: 332
16.11.2009, 19:48  [ТС] 5
Спасибо, попробую.
0
4948 / 2412 / 531
Регистрация: 05.06.2008
Сообщений: 7,515
Записей в блоге: 3
16.11.2009, 20:01 6
Цитата Сообщение от sh4d°_°ff Посмотреть сообщение
разве что скопировать сразу в Windows\\Fonts... (ну при запуске программы или при установке...)

скопировать можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
TMemoryStream * T = new TMemoryStream;
AnsiString S, S1;
char A[MAX_PATH];
GetWindowsDirectory(A,MAX_PATH); //виндовс
S=ExtractFilePath(Application->ExeName)+"\\EccentricStd.otf"; //путь к шрифту
S1=A;
S1=S1+ "\\Fonts\\EccentricStd.otf"; //куда копировать + имя шрифта
T->LoadFromFile(S);
T->SaveToFile(S1);
Edit1->Text=S1;
delete T;
другого способа не знаю, единственное, надо учитывать, если этот код просто оставить без изменений, то шрифт будет копироваться всякий раз.. надо или проверять наличие шрифта или проверять в первый ли раз запущена прога (например через ини файлы (писал в темах ранее))... ну и фонт нейм прописать надо))))

второй вопрос не совсем понятен.
Можно при помощи функции AddFontResourceEx копировать шрифт не надо ни куда только шрифт держать вместе с екзешником

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  int i = AddFontResourceEx("Digiface.ttf", FR_PRIVATE, NULL);
 
        if (i!=0)
{
        SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); // сообщить о шрифте
        AnsiString i = "Digiface";
        Edit1->Font->Name=i;
        Edit2->Font->Name=i;
        Edit3->Font->Name=i;
        Edit4->Font->Name=i;
        Edit5->Font->Name=i;
        Edit6->Font->Name=i;
        Edit7->Font->Name=i;
        Edit8->Font->Name=i;
        Memo1->Font->Name=i;
 
 
        Edit1->Text=FormatDateTime ("dd/mm/yy hh:mm:ss", df.CurrentDateTime());
        Edit2->Text=FormatDateTime ("dd", df.CurrentDate());
        Edit3->Text=FormatDateTime ("mm", df.CurrentDate());
        Edit4->Text=FormatDateTime ("yy", df.CurrentDate());
        Edit5->Text=FormatDateTime ("hh", df.CurrentTime());
        Edit6->Text=FormatDateTime ("nn", df.CurrentTime());
        Edit7->Text=FormatDateTime ("ss", df.CurrentTime());
        Edit8->Text=FormatDateTime ("hh" + S + "mm", df.CurrentTime());
}
 
 
void __fastcall TForm1::FormDeactivate(TObject *Sender)
{
    if (RemoveFontResourceEx("Digiface.ttf", FR_PRIVATE, NULL)!=0)
 
     {
       SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
     }
 
    else
     {
      ShowMessage("Не могу удалить ссылку на шрифт");
     }
}
А вверху не забудь подключить вот это

C++
1
2
#include <windows.h>
#include <Sysutils.hpp>
4
23 / 15 / 0
Регистрация: 16.11.2009
Сообщений: 332
16.11.2009, 20:02  [ТС] 7
Странно, шрифты не копируются.
0
говнокодер
1262 / 286 / 35
Регистрация: 31.10.2009
Сообщений: 1,431
16.11.2009, 20:04 8
У меня да?
попробуй этот шрифт с моим кодом, положи в папку с экзэшником и проверь... у меня работало.
0
Вложения
Тип файла: rar EccentricStd.rar (19.3 Кб, 51 просмотров)
23 / 15 / 0
Регистрация: 16.11.2009
Сообщений: 332
16.11.2009, 20:11  [ТС] 9
Пробова и так: CopyFile(" "," ", true); Не идёт.
0
говнокодер
1262 / 286 / 35
Регистрация: 31.10.2009
Сообщений: 1,431
16.11.2009, 20:17 10
а "руками" скопировать получается?
ошибки какие пишет или тупо не копирует?
0
23 / 15 / 0
Регистрация: 16.11.2009
Сообщений: 332
16.11.2009, 20:26  [ТС] 11
Руками не подходит, ошибок не пишет, просто не копирует. Причём не копирует именно в папку Fonts.

Добавлено через 3 минуты
Кстати, шрифты .ttf
0
говнокодер
1262 / 286 / 35
Регистрация: 31.10.2009
Сообщений: 1,431
16.11.2009, 20:29 12
Цитата Сообщение от BARS1991 Посмотреть сообщение
Руками не подходит
просто проверить можешь ли ты сам скопировать, но ладно это пофиг...
кинь листинг... даже "пользователи с привилегией Юзера" могут копировать в Фонтс (если я не ошибаюсь.... наверное ошибка
0
23 / 15 / 0
Регистрация: 16.11.2009
Сообщений: 332
16.11.2009, 20:32  [ТС] 13
При копировании руками всё в порядке, не идёт именно из проги.
0
говнокодер
1262 / 286 / 35
Регистрация: 31.10.2009
Сообщений: 1,431
16.11.2009, 20:34 14
Цитата Сообщение от sh4d°_°ff Посмотреть сообщение
листинг
скопируй сюда код... как у тебя в проге копируется
0
23 / 15 / 0
Регистрация: 16.11.2009
Сообщений: 332
16.11.2009, 20:43  [ТС] 15
Пробовал так: CopyFile("Classica One.ttf","C:\\Windows\\Fonts\\ClassicaOne.ttf", true);
И как в первом ответе.
0
говнокодер
1262 / 286 / 35
Регистрация: 31.10.2009
Сообщений: 1,431
16.11.2009, 20:54 16
ОМГ...
1 - какая привелегия у пользователя Виндоус (под которым ты сейчас зашел) Админ, Юзер?
2 - CopyFile("Classica One.ttf","C:\\Windows\\Fonts\\ClassicaOne.ttf", true); этой функцией не пользуюсь, но тут явно должно быть так:
C++
1
2
AnsiString S=Application->ExeName)+"\\ClassicaOne.ttf";
CopyFile(ExtractFilePath(S,"C:\\Windows\\Fonts\\ClassicaOne.ttf", true);
3 - и в моем примере и в вашем шрифт в папке с экзешником
4 -третий пункт учитываем.
C++
1
2
3
4
5
6
7
8
9
10
TMemoryStream * T = new TMemoryStream;
AnsiString S, S1;
char A[MAX_PATH];
GetWindowsDirectory(A,MAX_PATH);
S=ExtractFilePath(Application->ExeName)+"\\ClassicaOne.ttf";
S1=A;
S1=S1+ "\\Fonts\\ClassicaOne.ttf";
T->LoadFromFile(S);
T->SaveToFile(S1);
delete T;
??????????????????????????
0
23 / 15 / 0
Регистрация: 16.11.2009
Сообщений: 332
16.11.2009, 21:11  [ТС] 17
Пользователь АДМИН, в другие папки мой CopyFile копирует, не работает только с папкой Fonts.

Добавлено через 2 минуты
Шрифт в папке с экзешником.

Добавлено через 3 минуты
Ваш пример тоже не работает.

Добавлено через 3 минуты
Ладно продолжим обсуждение завтра вечером, часов в 6.
0
говнокодер
1262 / 286 / 35
Регистрация: 31.10.2009
Сообщений: 1,431
16.11.2009, 21:14 18
сорри я там код вообще тупой привел)))))))
C++
1
2
AnsiString S=Application->ExeName+"\\CURLZ___.TTF";
CopyFile(S.c_str(),"D:\\WINDOWS\\Fonts\\CURLZ___.TTF", true);
тоже в фонтс не копирует, в другие места правда не пробовал.

а вот так копирует: точно

C++
1
2
3
4
5
6
7
8
9
10
TMemoryStream * T = new TMemoryStream;
AnsiString S, S1;
char A[MAX_PATH];
GetWindowsDirectory(A,MAX_PATH);
S=ExtractFilePath(Application->ExeName)+"\\CURLZ___.TTF";
S1=A;
S1=S1+ "\\Fonts\\CURLZ___.TTF";
T->LoadFromFile(S);
T->SaveToFile(S1);
delete T;
0
говнокодер
1262 / 286 / 35
Регистрация: 31.10.2009
Сообщений: 1,431
16.11.2009, 21:23 19
вот абсолютно рабочий вариант:
в эдит вводим имя шрифта, жмем на кнопку, и он копируется:
0
Вложения
Тип файла: rar font.rar (11.3 Кб, 31 просмотров)
23 / 15 / 0
Регистрация: 16.11.2009
Сообщений: 332
17.11.2009, 13:46  [ТС] 20
На копирует. "Абсолютно рабочий пример" тоже не работает.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.11.2009, 13:46

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Нужен совет новичку в программировании
Всем привет. Я уже примерно 7 месяцев собираюсь прочитать книгу по C++, но всё время находятся дела...

Структура приложения(нужен совет)
Пишу код программы и возник вопрос: нужно ли использовать полиморфизм в приложении? Дело в том,...

Нужен совет в оптимизации кода
Нужно оптимизировать метод Deallocate, который переводит нужный указатель из allotted в exempted,...

Выбор с книги, нужен совет.
Прошу дать рекомендации по литературе. Работаю в Builder C++ 6.0 Какую книгу мне лучше выбрать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.