2009-12-19 243 views
0

我在对话框中使用了一个usoft日期时间选择器控件。我通过使用DTM-SETSYSTEMTIME将格式设置为“HH”:“mm”,“ddddMMMdd”,“yyyy”和当前本地日期&时间开始。如果用户更改控件中的任何字段,程序将无法使用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 2009-12-19 23:36:32

+0

@Skurmedel:visual c + + 6.0,我可以检索修改的日期/时间,但我不能设置一个新的,该控件保持冻结在任何用户做。 – 2009-12-20 13:04:11

+0

我试着处理DTN-DATETIMECHANGE并用SetWindowLong(hwnd,DWL_MSGRESULT,0)返回零,导致控件中的日期时间设置为空白。我应该复制在NMDATETIMECHANGE .st找到的SYSTEMTIME吗? – 2009-12-20 17:46:31

回答

1

我已将您的代码剪切并粘贴到我自己的Visual C++ 6.0程序中,它对我来说非常合适。如果我注释掉第二个DTM_SETSYSTEMTIME,我会得到一个提前两个小时的时间。您没有向我们展示代码中的某些内容。

编辑︰既然你选择了这个答案,我不妨做它准确。我已经用我自己的程序验证了你的意见。

您所遇到的问题与日期/时间选择器的意外行为的相互作用:

  1. 的SYSTEMTIME结构需要一个完整的4位数的年份。
  2. 如果您使用带有无效SYSTEMTIME的DTM_SETSYSTEMTIME,则日期/时间选择器不会指示错误。
  3. 设置了无效的SYSTEMTIME后,日期/时间选择器停止响应更多的DTM_SETSYSTEM TIME消息。此外,它仍然返回,就好像它已经正确处理了消息。
+0

谢谢!知道它在同一个环境中适合你,这让我能够弄清楚我做错了什么。这个问题在我的SYSTEMTIME中是非法的一年,我从tm时间开始构建(我忽略了1900年的偏移量)。很明显,如果DTM-SETSYSTEMTIME没有日期/时间,它将接受非法年份(并替代当前年份),但会忽略具有非法年份的后续调用。如果DTM-SETSYSTEMTIME给我一个错误或者完全失败,我很早以前就会想到这一点。节日快乐! – 2009-12-22 13:15:03

+0

那么,要完成DTM_SETSYSTEMTIME接受第一个非法的SYSTEMTIME,并忽略随后的非法SYSTEMOUT,稍后将响应正确的SYSTEMTIME。 – 2009-12-24 14:11:39