Набор символов для шрифта
От: DeeoniS  
Дата: 23.10.07 12:34
Оценка:
Здравствуйте. Есть такой скиновый движок SkinMagic. Он устанавливает на контрол свой шрифт (который задается в оболочке для редактирования скина). Так вот в этой оболочке по дефолту стоит кирилический набор символов (поле Script в диалоге выбора шрифта имеет значение Cyrillic). Текст для контрола берется из txt файла. Сама программа работает с ansi.

Так вот когда мы запускаем прорамму например на немецкой винде и выбираем файлик с соответсвующией локализацией, текст на котролах все равно отображается с кирилическим набором симолов, а надо что-бы было так как выставлено в настройках ОС для анси программ. Как такое сделать? SetFont а затем SetWindowText непомагают...
Re: Набор символов для шрифта
От: Аноним  
Дата: 24.10.07 09:58
Оценка:
Здравствуйте, DeeoniS, Вы писали:


DS>Так вот когда мы запускаем прорамму например на немецкой винде и выбираем файлик с соответсвующией локализацией, текст на котролах все равно отображается с кирилическим набором симолов, а надо что-бы было так как выставлено в настройках ОС для анси программ. Как такое сделать? SetFont а затем SetWindowText непомагают...



У контролов дефолтный шрифт который получается по GetFont равен NULL.

Набор символов задаётся при создании нового шрифта. Если SetFont с новым
шрифтом не устанавливает новый шрифт (то есть ни начертания, ни размер, ничего),
то скорее всего используется какой-то хитрый субклассинг. То есть переопределяется
процедура отрисовки контрола, или вообще стиль "оwnerdraw". А там может быть что угодно хоть по пикселям текст отрисовываться вообще без шрифта...
Re[2]: Набор символов для шрифта
От: DeeoniS  
Дата: 24.10.07 11:26
Оценка:
Здравствуйте, Аноним, Вы писали:


А>У контролов дефолтный шрифт который получается по 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 );
}


Так вот, как бы мне так сделать, чтоб все-таки рисовалось тем шрифтом что мне надо в данный момент.
Re[3]: Набор символов для шрифта
От: Аноним  
Дата: 24.10.07 14:56
Оценка:
Здравствуйте, 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
Re[4]: Набор символов для шрифта
От: DeeoniS  
Дата: 24.10.07 16:46
Оценка:
Здравствуйте, Аноним, Вы писали:



А>Насколько я помню, все 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, то эффекта ноль...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.