您的位置:首页 > 编程语言 > C语言/C++

c++ MFC 可改变时区的模拟时钟

2016-03-08 11:15 519 查看
这个作品是为参加某编程大赛写的,结果没过,可能是没打包成release模式吧。模拟时钟还好说,难的是时区的获得。

我觉得难点有两个,一是访问注册表获得时区列表,二是当地时区的时间转换。里面的时区函数特别麻烦,参数很多,还有作为输出值的参数(可理解为返回值)理解这点很重要。

一是访问注册表获得时区列表,源码如下:`

//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这么慢呢,汗!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息