Здравствуйте. Есть такой скиновый движок SkinMagic. Он устанавливает на контрол свой шрифт (который задается в оболочке для редактирования скина). Так вот в этой оболочке по дефолту стоит кирилический набор символов (поле Script в диалоге выбора шрифта имеет значение Cyrillic). Текст для контрола берется из txt файла. Сама программа работает с ansi.
Так вот когда мы запускаем прорамму например на немецкой винде и выбираем файлик с соответсвующией локализацией, текст на котролах все равно отображается с кирилическим набором симолов, а надо что-бы было так как выставлено в настройках ОС для анси программ. Как такое сделать? SetFont а затем SetWindowText непомагают...
Здравствуйте, Аноним, Вы писали:
А>У контролов дефолтный шрифт который получается по GetFont равен NULL.
А>Набор символов задаётся при создании нового шрифта. Если SetFont с новым
А>шрифтом не устанавливает новый шрифт (то есть ни начертания, ни размер, ничего),
А>то скорее всего используется какой-то хитрый субклассинг. То есть переопределяется
А>процедура отрисовки контрола, или вообще стиль "оwnerdraw". А там может быть что угодно хоть по пикселям текст отрисовываться вообще без шрифта...
Вот удалось нарыть исходник движка. Там действительно используется субклассинг, а текст рисуется вроде слебующим кодом:
void DrawTextStyle( HDC hDC,
const RECT* lpRect ,
ESkinTextEffect Effect,
DWORD EffectFlags,
COLORREF EffectColor,
COLORREF TextColor,
LPCTSTR lpText ,
DWORD nCount ,
UINT uFlags )
{
int nSavedDC = SaveDC( hDC );
SetBkMode( hDC , 1 );
if( (EffectFlags&TSF_SHADOW) == TSF_SHADOW )
{
RECT rcShadow = *lpRect;
OffsetRect( &rcShadow , Effect.xoff , Effect.yoff );
SetTextColor( hDC , EffectColor );
DrawText( hDC , lpText , nCount , &rcShadow , uFlags );
}
SetTextColor( hDC , TextColor );
DrawText( hDC , lpText , nCount ,(RECT*)lpRect , uFlags );
RestoreDC( hDC , nSavedDC );
}
Так вот, как бы мне так сделать, чтоб все-таки рисовалось тем шрифтом что мне надо в данный момент.
Здравствуйте, DeeoniS, Вы писали:
DS>Здравствуйте, Аноним, Вы писали:
А>>У контролов дефолтный шрифт который получается по GetFont равен NULL.
А>>Набор символов задаётся при создании нового шрифта. Если SetFont с новым
А>>шрифтом не устанавливает новый шрифт (то есть ни начертания, ни размер, ничего),
А>>то скорее всего используется какой-то хитрый субклассинг. То есть переопределяется
А>>процедура отрисовки контрола, или вообще стиль "оwnerdraw". А там может быть что угодно хоть по пикселям текст отрисовываться вообще без шрифта...
Насколько я помню, все GDI функции рисуют тем шрифтом, который выбран в данный момент в текущем конткстк окна.
Контролы обчные обязы принимать сообщение WM_SETFONT и в ответ на него устанавливать этот шрифт.
LOGFONT lf;
.....
.....
HFONT hFont;
hFont = CreateFontIndirect(&lf);
SendMessage(hwndControl, WM_SETFONT,(WPARAM) hFont,(LPARAM) LOWORD(TRUE));
Если контрол на это не реагирует, то перед вызовом всех тектовых функций можно напрямую самому попытаться
выбрать шрифт к том контекстк, где рисуется текст.
HFONT hFont;
hFont = CreateFontIndirect(&lf);
hOldFont = SelectObject(hdc,hFont);
Все поля в структуре LOGFONT можно посмотреть вызывав например для заведомо нормального контрола дилога с каким-то пользовательским шривтом,
сообщение (чем пытаться постичь их смысл читая МСДН проще передрать всё что не интересует)
HFONT hFont;
hFont = (HFONT) SendMessage(hwndControl,WM_GETFONT,0,0);
if (hFont==0)return FALSE;
GetObject(hFont,sizeof(LOGFONT),&lf);
или если выбрали новый шрифт,
GetObject(hOldFont,sizeof(LOGFONT),&lf);
Скорее всего нужно будет повторить все поля а модифицировать только поле lfCharSet
Если русский то приминять RUSSIAN_CHARSET
если немецкий то по моему ANSI_CHARSET
Здравствуйте, Аноним, Вы писали:
А>Насколько я помню, все GDI функции рисуют тем шрифтом, который выбран в данный момент в текущем конткстк окна.
А>Контролы обчные обязы принимать сообщение WM_SETFONT и в ответ на него устанавливать этот шрифт.
А>
А>LOGFONT lf;
А>.....
А>.....
А>HFONT hFont;
А>hFont = CreateFontIndirect(&lf);
А>SendMessage(hwndControl, WM_SETFONT,(WPARAM) hFont,(LPARAM) LOWORD(TRUE));
А>
А>Если контрол на это не реагирует, то перед вызовом всех тектовых функций можно напрямую самому попытаться
А>выбрать шрифт к том контекстк, где рисуется текст.
А>А>HFONT hFont;
А>hFont = CreateFontIndirect(&lf);
А>hOldFont = SelectObject(hdc,hFont);
А>
А>Все поля в структуре LOGFONT можно посмотреть вызывав например для заведомо нормального контрола дилога с каким-то пользовательским шривтом,
А>сообщение (чем пытаться постичь их смысл читая МСДН проще передрать всё что не интересует)
А>А>HFONT hFont;
А>hFont = (HFONT) SendMessage(hwndControl,WM_GETFONT,0,0);
А> if (hFont==0)return FALSE;
А>GetObject(hFont,sizeof(LOGFONT),&lf);
А>
А>или если выбрали новый шрифт,
А>А>GetObject(hOldFont,sizeof(LOGFONT),&lf);
А>
А>Скорее всего нужно будет повторить все поля а модифицировать только поле lfCharSet
А>Если русский то приминять RUSSIAN_CHARSET
А>если немецкий то по моему ANSI_CHARSET
Подобное я все пробовал... тут вопрос в каком месте вызывать этот код, ибо если делать это перед вызовом SetWindowText, то эффекта ноль...