2009-12-19 3 views
0

Я использую управление выбора времени в usoft в диалоговом окне. Я начал с установки формата «HH»: «mm» «ddddMMMdd», «yyyy» и текущей локальной даты & времени с использованием DTM-SETSYSTEMTIME. Если пользователь изменяет любое поле в элементе управления, программа не может сбросить дату и время в элементе управления с помощью DTM-SETSYSTEMTIME, хотя SendMessage возвращает значение 1. Насколько я могу судить, диалоговое окно возвращает false (ноль) для любых уведомлений он получает относительно контроля.проблема с датой и временем, не может сбросить дату или время

Проблема, описанная выше, заключается в том, как я впервые узнал об этом, но на самом деле это намного проще. Я сделал два вызова DTM-SETSYSTEMTIME подряд, и только первый из них повлиял. Второй в следующем примере не получает введен в действие, даже если состояние возвращается в 1.

 hwnd = GetDlgItem (hDlg, IDC_SUN_STAT_DATE_TIME); 
     Status = SendMessage (hwnd, DTM_SETFORMAT,0,(LPARAM)"HH':'mm' 'ddddMMMdd','yyyy"); 
     Status = SendMessage (hwnd, DTM_SETSYSTEMTIME,GDT_VALID, (LPARAM)&systimeTime); 
     systimeTime.wHour += 2; 
     Status = SendMessage (hwnd, DTM_SETSYSTEMTIME,GDT_VALID, (LPARAM)&systimeTime); 

Оказывается, что только первый DTM-SETSYSTEMTIME вводится в действие, следующие из них игнорируются.

Что мне нужно сделать, чтобы изменить/сбросить дату/время в элементе управления? Или (более вероятно), что я делаю неправильно?

+0

Привет, какой язык и каркас? – Skurmedel

+0

@Skurmedel: visual C++ 6.0, я могу получить измененную дату/время, но я не могу установить новую, элемент управления остается замороженным независимо от того, что сделал пользователь. –

+0

Я пробовал обращаться с DTN-DATETIMECHANGE и возвращать ноль с помощью SetWindowLong (hwnd, DWL_MSGRESULT, 0), что заставляет время даты в элементе управления быть установленным в пробелы. Должен ли я копировать SYSTEMTIME, найденный в NMDATETIMECHANGE .s где-нибудь? –

ответ

1

Я вырезал и вставил ваш код в свою собственную программу на Visual C++ 6.0, и он отлично работает для меня. Если я прокомментирую второй DTM_SETSYSTEMTIME, я получаю время, которое на два часа раньше. В коде вы что-то не показываете.

Редактировать: Поскольку вы выбрали этот ответ, я мог бы также сделать его точным. Я проверял ваши комментарии в своей собственной программе.

у вас возникли проблемы с взаимодействием неожиданных поведений даты/время подборщика:

  1. Структура SYSTEMTIME требует полного 4-значного года.
  2. Сборщик даты/времени не указывает на ошибку, если вы используете DTM_SETSYSTEMTIME с недопустимым SYSTEMTIME.
  3. После того, как вы установили неверную SYSTEMTIME, выбор даты/времени перестает отвечать на дополнительные сообщения DTM_SETSYSTEMTIME. Кроме того, он все равно возвращается, как если бы он правильно обработал сообщение.
+0

Спасибо! Знание того, что оно работает для вас в одной и той же среде, позволило мне понять, что я сделал неправильно. Проблема оказалась незаконным годом в моей SYSTEMTIME, которую я построил с того времени (я пренебрег учетом смещения 1900 года). Очевидно, DTM-SETSYSTEMTIME принимает незаконный год (и заменяет текущий год), если у него нет даты/времени, но игнорирует последующие вызовы с незаконными годами. Если DTM-SETSYSTEMTIME дал мне ошибку или не удалось полностью, я бы давно это понял. Счастливых праздников! –

+0

Ну, чтобы быть полным, DTM_SETSYSTEMTIME принимает первую незаконную SYSTEMTIME и игнорирует последующие незаконные, но позже ответит на соответствующие SYSTEMTIME. –

 Смежные вопросы

  • Нет связанных вопросов^_^