c++ MFC 可改变时区的模拟时钟
2016-03-08 11:15
519 查看
这个作品是为参加某编程大赛写的,结果没过,可能是没打包成release模式吧。模拟时钟还好说,难的是时区的获得。
我觉得难点有两个,一是访问注册表获得时区列表,二是当地时区的时间转换。里面的时区函数特别麻烦,参数很多,还有作为输出值的参数(可理解为返回值)理解这点很重要。
一是访问注册表获得时区列表,源码如下:`
二是当地时区的时间转换。
这是我觉得难的两部分,其它部分看源码,debug模式与release模式下运行,结果有点不同,我没有研究了,现在又做android了,有兴趣的同学可以继续研究。
源码地址:[http://download.csdn.net/detail/chaixiangyang123/9455301
ps:第一次写博客,怎么发现csdn这么慢呢,汗!
我觉得难点有两个,一是访问注册表获得时区列表,二是当地时区的时间转换。里面的时区函数特别麻烦,参数很多,还有作为输出值的参数(可理解为返回值)理解这点很重要。
一是访问注册表获得时区列表,源码如下:`
//open time zones HKEY hKey, hsubKey; CString keyName = _T("Software\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones"); RegOpenKey(HKEY_LOCAL_MACHINE, keyName, &hKey);
TCHAR lpName[MAX_KEY_LENGTH]; DWORD cSubKeys,cbMaxSubKey,cbName; CString subKeyName; int listIndex=-1; // get subkeys info if(RegQueryInfoKey(hKey,NULL,NULL,NULL,&cSubKeys,&cbMaxSubKey,NULL,NULL,NULL,NULL,NULL,NULL)==ERROR_SUCCESS) { for (DWORD i=0; i<cSubKeys; i++) { cbName = MAX_KEY_LENGTH; RegEnumKeyEx(hKey, i,lpName,&cbName,NULL,NULL,NULL,NULL); subKeyName=keyName+"\\"+lpName; RegOpenKey(HKEY_LOCAL_MACHINE, subKeyName, &hsubKey); DWORD dwSize; //get value's size; RegQueryValueEx(hsubKey, TEXT("Display"), NULL, NULL, NULL, &dwSize); char *dwDisplay = new char[dwSize+1]; //get value RegQueryValueEx(hsubKey, TEXT("Display"), NULL, NULL,(LPBYTE)dwDisplay, &dwSize); //add zone's display value to List CString str(dwDisplay); ((CComboBox*)GetDlgItem(IDC_ZONELIST))->AddString(str); kdisplay[i].subkey=lpName; kdisplay[i].display=str; }
二是当地时区的时间转换。
void CTimeZone::getTimeZoneInfoBySubkey(TIME_ZONE_INFORMATION ptzi, CString Subkey) { //open subkey form registry CString keyName = _T("Software\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones"); CString subkeyName=keyName+_T("\\")+Subkey; HKEY hsubKey; RegOpenKey(HKEY_LOCAL_MACHINE, subkeyName, &hsubKey); //copy zone Info DWORD dwBufdlt,dwBufstd,dwBuftzi; unsigned short dwDlt[32]; unsigned short dwStd[32]; DWORD dwtzi; RegQueryValueEx(hsubKey, TEXT("Dlt"), NULL,NULL,(LPBYTE)&dwDlt,&dwBufdlt); RegQueryValueEx(hsubKey, TEXT("Std"), NULL, NULL,(LPBYTE)&dwStd,&dwBufstd); RegQueryValueEx(hsubKey, TEXT("TZI"), NULL, NULL,(LPBYTE)&dwtzi,&dwBuftzi); //assign value to TZI REG_TZI_FORMAT regTZI; ZeroMemory(&ptzi, sizeof(ptzi)); memcpy((LPBYTE)®TZI,(LPBYTE)&dwtzi,dwBuftzi); ptzi.Bias=regTZI.Bias; ptzi.DaylightBias=regTZI.DaylightBias; ptzi.StandardBias=regTZI.StandardBias; ptzi.DaylightDate.wDay=regTZI.DaylightDate.wDay; ptzi.DaylightDate.wHour=regTZI.DaylightDate.wHour; ptzi.DaylightDate.wMilliseconds=regTZI.DaylightDate.wMilliseconds; ptzi.DaylightDate.wMinute=regTZI.DaylightDate.wMinute; ptzi.DaylightDate.wDayOfWeek=regTZI.DaylightDate.wDayOfWeek; ptzi.DaylightDate.wMonth=regTZI.DaylightDate.wMonth; ptzi.DaylightDate.wSecond=regTZI.DaylightDate.wSecond; ptzi.DaylightDate.wYear=regTZI.DaylightDate.wYear; ptzi.DaylightDate.wDay=regTZI.StandardDate.wDay; ptzi.StandardDate.wHour=regTZI.StandardDate.wHour; ptzi.StandardDate.wMilliseconds=regTZI.StandardDate.wMilliseconds; ptzi.StandardDate.wMinute=regTZI.StandardDate.wMinute; ptzi.StandardDate.wDayOfWeek=regTZI.StandardDate.wDayOfWeek; ptzi.StandardDate.wMonth=regTZI.StandardDate.wMonth; ptzi.StandardDate.wSecond=regTZI.StandardDate.wSecond; ptzi.StandardDate.wYear= 96f6 regTZI.StandardDate.wYear; wcscpy(ptzi.DaylightName,dwDlt); wcscpy(ptzi.StandardName,dwStd); //get local time according zone SYSTEMTIME ssutc,ssloc; GetSystemTime(&ssutc); SystemTimeToTzSpecificLocalTime(&ptzi,&ssutc,&ssloc); m_hour=ssloc.wHour; m_minute=ssloc.wMinute; m_second=ssloc.wSecond; m_year=ssloc.wYear; m_month=ssloc.wMonth; m_day=ssloc.wDay; }
这是我觉得难的两部分,其它部分看源码,debug模式与release模式下运行,结果有点不同,我没有研究了,现在又做android了,有兴趣的同学可以继续研究。
源码地址:[http://download.csdn.net/detail/chaixiangyang123/9455301
ps:第一次写博客,怎么发现csdn这么慢呢,汗!
相关文章推荐
- 用注册表文件实现解开被锁定的.reg与inf文件
- 注册表导出管理员密码文件
- 修改注册表实现在桌面上显示Windows版本
- 用注册表清除3389登陆记录的方法
- 常见的注册表修改大全第1/3页
- vbscript 注册表脚本书写
- vbscript Registry 注册表操作实现代码(读写删除)
- vbs 注册表操作代码(添加删除)
- 杀毒除根 巧用注册表防止病毒重新生成
- vbs删除注册表项的代码
- 批处理操作注册表完全攻略(读取注册表/写入注册表等)
- 写给电脑初学者的一些建议(注册表篇)
- CMD下读取/修改/删除注册表项的方法
- C#实现读取注册表监控当前操作系统已安装软件变化的方法
- PowerShell使用Remove-Item命令删除文件、注册表项介绍
- C#通过windows注册表获取软件清单的方法
- 读取注册表根据Office版本获取数据库连接字段
- C#操作注册表的方法详解
- 在DOS方式下对注册表进行操作的代码
- Visual C++中MFC消息的分类