Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: DataTimePicker не работает в Windows 10  (Прочитано 679 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« : 18-10-2017 07:19 » 

Опять обращаюсь к вам за помощью.

Вот такая ситуация:

1. программа написана c помощью Visual Studio с++ 2010  и использует компонент DataTimePicker(формат Time)
2. используется многобайтовая кодировка
3. работает без проблем в Windows XP, Windows 7

Столкнулась с такой проблемой  - в Windows 10 время показывается в таком виде 0:0:0, те только по одной цифре в часах, минутах и секундах.
( что такое же нашла в инете - этот элемент DataTimePicker VS 2017 не работает в 10 виндозе).

Посоветуйте, что делать.
И объясните, почему при использовании Юникода этот компонент работает ( попробовала изменить программу, но заткнулась на OemToChar-не знаю,как получить правильный результат. Но, это уже третий вопрос.).

Буду рада помощи.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 18-10-2017 07:32 » 

ann_nef, компонент не испоьзовал, студию 2010 не использовал, однако я думаю, если есть возможность перейти на юникод - надо перейти )

OemToCharBuff - что именно не получилось ?
Записан

darkelf
Молодой специалист

ua
Offline Offline

« Ответ #2 : 18-10-2017 09:17 » 

ann_nef, к сожалению не пользовался ни этим компонентом, ни  Visual Studio с++ 2010, ни даже Windows 10, но беглый просмотр документации, говорит, что там есть свойство CustomFormat, в котором можно указать необходимый формат отображения даты/времени, например, в Вашем случае, можно попробовать сказать "HH:mm:ss";
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 18-10-2017 15:52 » 

А можно чуть по-подробней
 - что за зверь такой DataTimePicker?
 - почему "используется многобайтовая кодировка"?
 - и, если работает с UNICODE и есть такая возможность, то почему так не оставить?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #4 : 24-10-2017 09:49 » 

Джон, отвечаю по порядку заданных вопросов.

1.
Зверь DataTimePicker выглядит так(см.вложенный файл)  и используется, в зависимости от формата, для ввода даты и времени.
В моём случае - времени.

2.
многобайтовая кодировка позволила без изменений перевести программу в VS2010 из гораздо более ранней студии,
чтобы русский текст отображался читабельно.

3.
чтобы использовать UNICODE надо всю программу пересмотреть, где есть тексты. Половину я уже сделала, но...

* DateTimePicker.JPG (1.67 Кб - загружено 90 раз.)
« Последнее редактирование: 24-10-2017 22:14 от Джон » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 24-10-2017 23:17 » 

Понятно, те "нормальный" MFC-шный CDateTimeCtrl, просто хотел уточнить, чтобы избежать.

Итак, поскольку, как уже неоднократно говорено, MFC есть обёртка для элементов управления Win API, то в этом и кроется проблема. В данном случае речь идёт о SysDateTimePick32.
Дело в том, что компилируемые в программу контролы зависят от подключаемой (используемой) версии comctl*.dll (comctl32.dll).
Которая в свою очередь зависит от системы. Поэтому и получается, что на одной системе всё работает, а на другой нет.

Что можно сделать, а что нельзя.

Сразу оговорюсь, что 2010-ой у меня уже давно нет, и дать точные указания что и где я не смогу.

 * необходимо проверить целевую версию винды, заданную для компиляции, в новых версиях за это отвечает файл включаемый в stdafx.h -> #include "targetver.h"
его содержимое очень простое
Код: (C++)
#pragma once

// Including SDKDDKVer.h defines the highest available Windows platform.

// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.

#include <SDKDDKVer.h>

самое главное - инфа о макросе _WIN32_WINNT, именно его значение необходимо проверить и установить в соответствие с целевой платформой.
Очень может быть что в старом проекте его значение установлено скажем на NT 4.

 * Вобще-то его максимальное значение определяется версией SDK-платформы используемой для компиляции. Её тоже необходимо проверить в настройках проекта. В 2015-ой это выглядит так

те в данном случае это SDK 7.1

Теперь о печальном.

мультибайтная компиляция перестаёт нормально поддерживатся в будущих версиях студии. начиная с 2013-ой она начинала предупреждать типа "MBCS is deprecated". потом совсем перевела MBCS в разряд ошибок. После кучи скандалов MS вернул MBCS, но как видно, сделал это очень неохотно.

Ладно, как говаривал герой Пуговкина: "Много текста" (с)

Если на 10-ой винде установлен  Windows 10 Creators Update, то скорей всего проблема тривиально не решается.
Отсюда следует (всё переводить не буду), что в этом случае существуют две версии comctl32.dll
 - 5.х для неюникодных приложений (плохая)
 - 6.х новая, рекомендованная для юникодных (хорошая)

Цитата оригинального ответа MS (из линка выше)
Цитата
This only occurs in applications that use the Date Time Picker implemented on COMCTL32 V5.
Any application using the COMCTL32 V5 Date Time Picker on RS2 will encounter this problem, including MFC and Windows Forms applications.
Unfortunately, there is currently no workaround for the issue when using the COMCTL32 V5 Date Time Picker other than removing the RS2 update, if possible.
Affected applications could be updated to use COMCTL32 V6, but this is not a trivial change due to the differences in the control implementations between V5 and V6.

Ну и далее один чел приводит возможное "решение", работоспособность которого проверить не могу.
Он нашёл по линку (который у меня не открывается) способ использовать v.6. в MBCS компилятах.

для этого необходимо добавить в stdafx.h след
Код: (C++)
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")

правда чел переживает о побочных эффектах и является ли это решение осмысленным workaround, но ответа на этот вопрос он так и не получил.

Так что самое надёжное и правильное, перевести проект таки на юникод.

1. жёстко закодированные тексты в принципе недопустимы, для этого есть ресурсы
2. если всё-таки такое и приходится делать (под дулом автомата), то брать их надо как минимум в _T("")
3. я не помню, если в 2010-ой регулярные выражения для поиска, если нет, то можно воспользоваться каким-нить другим редактором с такой ф-ей.

зы сорри за ошибки и очепятки




* ss1_projprop.png (8.95 Кб - загружено 99 раз.)
« Последнее редактирование: 24-10-2017 23:24 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #6 : 25-10-2017 10:19 » new

Джон, спасибо за подробный ответ.
Буду думать.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines