Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2012, 01:04   #1
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
Вопрос Работа с шрифтами

Заносим в массив кнопки с диалогового окна:
Код:
	for(int index = 0; index < CONTROL_BUTTON_COUNT; index++)
		DDX_Control(pDX, index + 1000, ControlButtons[index]);
....

Устанавливаем текст кнопки и ее шрифт:
Код:
        CHAR Lang[20];
	CHAR String[50];
	GetPrivateProfileString("Main", "Lang", NULL, Lang, 20, languages_ini_path);

	CFont font;
	LOGFONT lf;
	lf.lfHeight = 12; 
	lf.lfWidth = 0; 
	lf.lfEscapement = 0;
	lf.lfOrientation = 0; 
	lf.lfWeight = FW_NORMAL; 
	lf.lfItalic = 0;
	lf.lfUnderline = 0; 
	lf.lfStrikeOut = 0; 
	lf.lfCharSet = RUSSIAN_CHARSET;
	lf.lfOutPrecision = OUT_DEFAULT_PRECIS; 
	lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
	lf.lfQuality = PROOF_QUALITY; 
	lf.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN;  
	strcpy(lf.lfFaceName,"Times New Roman");

	for(int index = 0; index < CONTROL_BUTTON_COUNT; index++)
	{
		CString key;
		font.CreateFontIndirect(&lf);
		ControlButtons[index].SetFont(&font);
		key.Format("STR_ID_%i", index + 1);
		GetPrivateProfileString(Lang, key, NULL, String, 50, languages_ini_path);
		ControlButtons[index].SetWindowTextA(String);
	}
В результате получается что для последней кнопки в массиве, шрифт не устанавливается. В чем косяк?
crymchanin вне форума Ответить с цитированием
Старый 27.11.2012, 20:18   #2
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию

for(int index = 0; index <= CONTROL_BUTTON_COUNT; index++)
не?

/// посмотрел внимательней.... не знаю ))
Проверяй чему равен CONTROL_BUTTON_COUNT, выполняется ли код в последней итерации или нет. А если в одной?....
Пишу на чистом С, плюсы спилил.

Последний раз редактировалось LynXzp; 27.11.2012 в 20:21.
LynXzp вне форума Ответить с цитированием
Старый 27.11.2012, 22:21   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

По мне так вообще странно, что это работает.
Стандартный метод SetFont просто берет манипулятор из CFont объекта и передает его окну а потом это манипулятор удаляется, когда мы создаем следущий CFont или когда выходим из функции, где делается установка.

Вынесите font.CreateFont() из цикла. CFont должен существовать пока фонт установлен в кнопке, но никто не запрещает использовать один и тот фонт для всех кнопок. Лучше всего сделать font переменной класса.

Когда тестируете, возмите ваше окно за заголовочную строку и вынесите его целиком за пределы екрана - это гарантирует, что все елементы перерисуются. Вполне возможно, что они рисуются при смене (и выглядят правильно) но в дальнейшем рисоваться правильно уже не будут.
waleri вне форума Ответить с цитированием
Старый 29.11.2012, 23:47   #4
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию

Цитата:
Сообщение от LynXzp Посмотреть сообщение
for(int index = 0; index <= CONTROL_BUTTON_COUNT; index++)
не?

/// посмотрел внимательней.... не знаю ))
Проверяй чему равен CONTROL_BUTTON_COUNT, выполняется ли код в последней итерации или нет. А если в одной?....
Нет, дело не в этом)

Цитата:
Сообщение от waleri Посмотреть сообщение
По мне так вообще странно, что это работает.
Стандартный метод SetFont просто берет манипулятор из CFont объекта и передает его окну а потом это манипулятор удаляется, когда мы создаем следущий CFont или когда выходим из функции, где делается установка.
Мой код выполняется в функции OnInitDialog(), возможно дело в этом?

Цитата:
Сообщение от waleri Посмотреть сообщение
Вынесите font.CreateFont() из цикла. CFont должен существовать пока фонт установлен в кнопке, но никто не запрещает использовать один и тот фонт для всех кнопок. Лучше всего сделать font переменной класса.
Пробовал... в итоге не работает вообще...

Так было изначально:


Так после 1 шрифта для всех:


Цитата:
Сообщение от waleri Посмотреть сообщение
Когда тестируете, возмите ваше окно за заголовочную строку и вынесите его целиком за пределы екрана - это гарантирует, что все елементы перерисуются. Вполне возможно, что они рисуются при смене (и выглядят правильно) но в дальнейшем рисоваться правильно уже не будут.
Перерисовка не помогает

Последний раз редактировалось crymchanin; 30.11.2012 в 00:01.
crymchanin вне форума Ответить с цитированием
Старый 30.11.2012, 00:23   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Я так и думал...
Сделайте CFont font переменной класса.
В OnInitDialog вызовите CreateFont только один раз, потом присвойте всем кнопкам.

CFont не позволяет вызывать CreateFont несколько раз подряд, у вас должна вылезать Assert табличка, если только вы не делаете Release сборку.
waleri вне форума Ответить с цитированием
Старый 30.11.2012, 00:34   #6
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию

Заработало) Большое спасибо)
crymchanin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
GDI+ работа со шрифтами D][mon Помощь студентам 0 14.03.2012 20:03
Проблема со шрифтами analyst Microsoft Office Excel 2 16.06.2011 17:31
Проблема со шрифтами Caнёk Операционные системы общие вопросы 11 22.08.2010 18:48
проблема со шрифтами Gambler Microsoft Office Word 0 29.10.2006 21:35