Особенности работы с контролом SysMonthCal32
Различная ширина SysMonthCal32 в разных локалях
При разработке одной из своих программ я столкнулся с интересной ситуацией. Никаких ракетных технологий, просто в диалоговом окне выводится стандартный виджет календарика через контрол SysMonthCal32. Я работаю в русской версии Windows и наивно предположил, что размеры виджета календарика всегда должны как-то вписываться в те границы, которые я ему определил. Но, как вы можете видеть на этих скриншотах, ширина контрола с календариком заметно отличается в зависимости от установленной в системе локали, на что мне указал один из пользователей (Mufasa, спасибо!). Вариантов нет, пришлось изучить этот вопрос.
Как оказалось, перед тем, как вывести календарик в диалоговом окне, надо сперва выяснить, каких размеров он будет. Для этого надо создать контрол календарика и сразу послать ему сообщение MCM_GETMINREQRECT. На выходе мы получим размеры, которые виджет календарика будет занимать. В обработчике диалогового окна это лучше всего делать на этапе инициализации. Например, так:
Code (Assembler) : Убрать нумерацию
- section '.data' data readable writeable
- ; Структуры для получения требуемых координат виджета
- crect RECT
- ...
- section '.code' code readable executable
- ; Получить нужные размеры календарика и подогнать
- ; виджет под эти размеры
- invoke GetDlgItem,[hwnddlg],ID_CALENDAR
- mov ebx,eax
- invoke SendMessage,ebx,MCM_GETMINREQRECT,0,crect
- push TRUE
- mov eax,[crect.bottom]
- sub eax,[crect.top]
- ; Вертикальный отступ
- add eax,30
- push eax
- mov eax,[crect.right]
- sub eax,[crect.left]
- ; Горизонтальный отступ
- add eax,30
- push eax
- invoke MoveWindow,ebx,[crect.left],[crect.top]
Для большей надежности можно дополнительно узнать максимальную ширину надписи "Сегодня такое-то число" в текущей локали, для этого надо воспользоваться кодом:
Code (Assembler) : Убрать нумерацию
- invoke GetDlgItem,[hwnddlg],ID_CALENDAR
- invoke SendMessage,eax,MCM_GETMAXTODAYWIDTH,0,0
- ; EAX = максимальная ширина надписи
В приложении пример программы с исходным текстом, которая отрисовывает в окне виджет календарика и подгоняет размеры окна под размеры виджета в зависимости от установленной локали.
Просмотров: 1682 | Комментариев: 2
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(11.09.2018 в 10:39):
Всегда пожалуйста :)
avp1965
(07.09.2018 в 17:34):
Благодарствуем.
Добавить комментарий
Заполните форму для добавления комментария