XP и MFC-класс CToolBar
Добавлено: 14 апр 2004, 14:27
Не работают нормально русские «подсказки» ToolTip для мфц-тулбара (CToolBar).
«Ненормальность» в том, что вместо русских букв в окошках тултипов появляются загадочные символы
), схожие то ли с греческими, то ли марсианскими. Чего надо сделать, чтобы по-русски говорил тултип?
Проект ранее был сделан в VC 7.0 (v.7.0.9466), Framework 1.0 (v.1.0.3705). Компилировалось и работало на W2k Prof (rus). Давно. Работало всё нормально.
Купил лаптоп с предустановленным XP English. Установил тот же компилер. Компильнул….В результате имеем ненормальности в поведении ToolTip, о которых сказано выше.
В части региональных настроек ОС – следующее. Сейчас установлены региональные настройки для даты, представления чисел и дат – English (United States). Не работает тултип…. Если установить региональные настройки – Russian, то всё начинает работать нормально. Здесь под региональными настройками имеется в виду значение строки в комбобоксе группы контролов “Standards and formats” на закладке “Regional Options” аплета “Regional and Language Options” в папке “Control Panel” XP. Есть причины, по которым хотелось бы оставить основные настройки ОС английскими. Кроме того, нет ВИДИМЫХ ПРИЧИН, по которым надо обязательно делать русские региональные настройки. А именно:
- Приложения, скомпилированные в BCB++ на этом же компе, работают нормально вне зависимости от региональных настроек (толтипы «говорят» по-русски, но там естественно свои vcl-толбары, а не отстой мфц M$). Поэтому нельзя сказать, что есть некие ошибки системного характера, и следует обязательно установить русские региональные настройки по умолчанию.
- Тестовые приложения, собранные в том же .NET, но в C#, и имеющие тулбар с тултипами, работают на ура. Нормально понимается рашен для толбара M$.
- Приложение M$С++, о котором речь, в котором этот несчастный толбар с неправильно работающим тултипом, в остальном прекрасно работает с русскими символами. Примечательно, что «синхронные подсказки» нормально работают в мфц – CStatusBar, который там же. Т.е. наводим мышу на кнопку тулбара – в тултипе кнопки видим абракадабру, а в статусбаре - вполне приличные русские слова. Это говорит о том, что строки из ресурсов нормально грузятся и отображаются в принципе. Поэтому и на ресурсы тоже не приходится грешить. В принципе, все контролы в этом проекте, что подгружают русские символы из ресурсов, работают нормально, вне зависимости от региональных настроек ОС.
- Сам, ToolTipCtrl API работает нормально (именно он по идее и оборачивается классами мфц). То, что с тултип-контролом shell всё в порядке говорит хотя бы тот факт, что для мфц-контролов (CEdit, CButton, …) в этом приложении, для которых подсобачен ToolTipCtrl WinAPI, мы имеем нормальные русские символы. Правда, последние грузятся из констант, а не из ресурсов (про редактирование ресурсов - позже).
- В принципе, сам ToolBarCtrl WinAPI с апишеым тулбаром работает нормально (именно его по идее должен оборачивать CToolBar MFC). Проверено. Т.е. если в приложении заменить CToolBar на свою реализацию обёртки ToolBarCtrl shell, то всё работает прекрасно (что, увы, и пришлось пока сделать). Русские символы нормально отображаются. И это не зависит от того, откуда и как мы грузим строки подсказок в окошке тултипа – или из констант, по ходу пьесы, или из ресурсов. При любой региональной настройке ОС тултипы тулбара WinAPI работают нормально. Т.е. как бы и для CToolBar MFC должно всё работать. Это потому, что где-то попадалось, что CToolBar MFC оборачивает ToolTipCtrl SHELL. Если работает контрол SHELL, то должна корректно работать и его обёртка (вряд ли кто будет сомневаться в корректности программистов M$). Ан нет. Не работает ;(.
Дополнительно, для пользы следствия могу сообщить следующее. Проект использует Multi-byte Character Set (_MBCS, что по умолчанию для проектов MFC ). Командная строка такова:
/Od /D "WIN32" /D "_WINDOWS" /D "_DEBUG" /D "" /D "_AFXDLL" /Gm /EHsc /RTC1 /MDd /Zc:wchar_t /Yu"stdafx.h" /Fp"Debug/Gkm.pch" /Fo"Debug/" /Fd"Debug/vc70.pdb" /W3 /nologo /c /Wp64 /ZI /TP
Строки в ресурсах расположены «в русской секции» (cp 1251).
Вот, что может наводить на грустные мысли…. Для нормального ввода в файл ресурсов русских строк невозможно использовать IDE. Там, в диалоговых окошках для ввода строк и в редакторе ресурсов после ввода появляются аброказябры вместо русского. Т.е. пока вводишь строку – печатаются русские символы, как только нажимаешь ENTER для завершения ввода - строка принимает невообразимый вид. Поэтому, приходится «руками» редактировать rc-файл ресурсов.
ПС.
Не думаю, что указанный гимор c тулбаром связан с контролами COMCTRL32.DLL XP. Если убить в проекте манифест, то имеем теже яйца только с видом W2k. Те же проблемы остаются. Надо бы найти способ, как использовать именно тулбар мфц, а не WinAPI. Апишный толбар, конечно, нормально работает. Но там может в перспективе добавится другой гимор, если он встраивается в проект с каркасом мфц, вместо CToolBar (не в проект с контролами MFC, а с каркасом MFC).
Как это делать?
Гурам спасибо в самом конце и пиво.
«Ненормальность» в том, что вместо русских букв в окошках тултипов появляются загадочные символы

Проект ранее был сделан в VC 7.0 (v.7.0.9466), Framework 1.0 (v.1.0.3705). Компилировалось и работало на W2k Prof (rus). Давно. Работало всё нормально.
Купил лаптоп с предустановленным XP English. Установил тот же компилер. Компильнул….В результате имеем ненормальности в поведении ToolTip, о которых сказано выше.
В части региональных настроек ОС – следующее. Сейчас установлены региональные настройки для даты, представления чисел и дат – English (United States). Не работает тултип…. Если установить региональные настройки – Russian, то всё начинает работать нормально. Здесь под региональными настройками имеется в виду значение строки в комбобоксе группы контролов “Standards and formats” на закладке “Regional Options” аплета “Regional and Language Options” в папке “Control Panel” XP. Есть причины, по которым хотелось бы оставить основные настройки ОС английскими. Кроме того, нет ВИДИМЫХ ПРИЧИН, по которым надо обязательно делать русские региональные настройки. А именно:
- Приложения, скомпилированные в BCB++ на этом же компе, работают нормально вне зависимости от региональных настроек (толтипы «говорят» по-русски, но там естественно свои vcl-толбары, а не отстой мфц M$). Поэтому нельзя сказать, что есть некие ошибки системного характера, и следует обязательно установить русские региональные настройки по умолчанию.
- Тестовые приложения, собранные в том же .NET, но в C#, и имеющие тулбар с тултипами, работают на ура. Нормально понимается рашен для толбара M$.
- Приложение M$С++, о котором речь, в котором этот несчастный толбар с неправильно работающим тултипом, в остальном прекрасно работает с русскими символами. Примечательно, что «синхронные подсказки» нормально работают в мфц – CStatusBar, который там же. Т.е. наводим мышу на кнопку тулбара – в тултипе кнопки видим абракадабру, а в статусбаре - вполне приличные русские слова. Это говорит о том, что строки из ресурсов нормально грузятся и отображаются в принципе. Поэтому и на ресурсы тоже не приходится грешить. В принципе, все контролы в этом проекте, что подгружают русские символы из ресурсов, работают нормально, вне зависимости от региональных настроек ОС.
- Сам, ToolTipCtrl API работает нормально (именно он по идее и оборачивается классами мфц). То, что с тултип-контролом shell всё в порядке говорит хотя бы тот факт, что для мфц-контролов (CEdit, CButton, …) в этом приложении, для которых подсобачен ToolTipCtrl WinAPI, мы имеем нормальные русские символы. Правда, последние грузятся из констант, а не из ресурсов (про редактирование ресурсов - позже).
- В принципе, сам ToolBarCtrl WinAPI с апишеым тулбаром работает нормально (именно его по идее должен оборачивать CToolBar MFC). Проверено. Т.е. если в приложении заменить CToolBar на свою реализацию обёртки ToolBarCtrl shell, то всё работает прекрасно (что, увы, и пришлось пока сделать). Русские символы нормально отображаются. И это не зависит от того, откуда и как мы грузим строки подсказок в окошке тултипа – или из констант, по ходу пьесы, или из ресурсов. При любой региональной настройке ОС тултипы тулбара WinAPI работают нормально. Т.е. как бы и для CToolBar MFC должно всё работать. Это потому, что где-то попадалось, что CToolBar MFC оборачивает ToolTipCtrl SHELL. Если работает контрол SHELL, то должна корректно работать и его обёртка (вряд ли кто будет сомневаться в корректности программистов M$). Ан нет. Не работает ;(.
Дополнительно, для пользы следствия могу сообщить следующее. Проект использует Multi-byte Character Set (_MBCS, что по умолчанию для проектов MFC ). Командная строка такова:
/Od /D "WIN32" /D "_WINDOWS" /D "_DEBUG" /D "" /D "_AFXDLL" /Gm /EHsc /RTC1 /MDd /Zc:wchar_t /Yu"stdafx.h" /Fp"Debug/Gkm.pch" /Fo"Debug/" /Fd"Debug/vc70.pdb" /W3 /nologo /c /Wp64 /ZI /TP
Строки в ресурсах расположены «в русской секции» (cp 1251).
Вот, что может наводить на грустные мысли…. Для нормального ввода в файл ресурсов русских строк невозможно использовать IDE. Там, в диалоговых окошках для ввода строк и в редакторе ресурсов после ввода появляются аброказябры вместо русского. Т.е. пока вводишь строку – печатаются русские символы, как только нажимаешь ENTER для завершения ввода - строка принимает невообразимый вид. Поэтому, приходится «руками» редактировать rc-файл ресурсов.
ПС.
Не думаю, что указанный гимор c тулбаром связан с контролами COMCTRL32.DLL XP. Если убить в проекте манифест, то имеем теже яйца только с видом W2k. Те же проблемы остаются. Надо бы найти способ, как использовать именно тулбар мфц, а не WinAPI. Апишный толбар, конечно, нормально работает. Но там может в перспективе добавится другой гимор, если он встраивается в проект с каркасом мфц, вместо CToolBar (не в проект с контролами MFC, а с каркасом MFC).
Как это делать?
Гурам спасибо в самом конце и пиво.