📄 page1.cpp
字号:
void CPage1::OnCheckMinimize()
{
UpdateData(true);
::WritePrivateProfileString("Settings","Minimize",m_check_minimize? "1":"0",".\\Settings.ini");
}
void CPage1::OnViewdate()
{
((CPageDlg*)AfxGetMainWnd())->ShowDateDlg();
}
void CPage1::OnShowflash()
{
((CPageDlg*)AfxGetMainWnd())->ShowFlashClockDlg();
}
void CPage1::OnShowSmall()
{
UpdateData(true);
::WritePrivateProfileString("Settings","ShowSmall",m_check_bShowSmall? "1":"0",".\\Settings.ini");
}
void CPage1::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
BYTE m=(BYTE)m_sld.GetPos();
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); //取得SetLayeredWindowAttributes函数指针
if(fun)
fun(AfxGetMainWnd()->GetSafeHwnd(),0,m,2);
FreeLibrary(hInst);
};
CString str;
str.Format("窗体的透明度:%%%d",100 * m / 255);
SetDlgItemText(IDC_SLD,str);
/* CString str2;
str2.Format("%d",m);
::WritePrivateProfileString("Settings","nTrans",str2,".\\Settings.ini");
*/
CPropertyPage::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CPage1::OnStaticLink()
{
::ShellExecute(NULL,"open","http://www.ctgu.edu.cn",NULL,NULL,SW_SHOW);
}
BEGIN_EVENTSINK_MAP(CPage1, CPropertyPage)
//{{AFX_EVENTSINK_MAP(CPage1)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void CPage1::OnJiaozheng()
{
SetDlgItemText(IDC_TEXTOUT,"");
m_cc.GetLBText(m_cc.GetCurSel(),m_szIPAddr);
WSADATA WSAData;
::WSAStartup (MAKEWORD(2,0), &WSAData); // Call "WSAStartup"显示szDescription字串,并简要提供了一些版本资讯。MAKEWORD(2,0)将第一个参数设定为0x0200(表示2.0版本)
EditPrintf ("Started up %hs\r\n", WSAData.szDescription);
/* 第一个参数AF_INET是一个位址种类,表示此处是某种Internet位址。
第二个参数表示资料以资料流的形式传回,而不是以资料封包的形式传回
(我们需要的资料只有4个位元组长,而资料封包适用于较大的资料块)。
最后一个参数是一个协定,我们指定使用的Internet协定是TCP。它是RFC-868所定义的两个协定之一。
socket函数的传回值储存在SOCKET型态的变数中,以便后面的Socket函数的调用。 */
m_sock = ::socket (AF_INET, SOCK_STREAM, IPPROTO_TCP) ;
if (m_sock == INVALID_SOCKET)
{
EditPrintf ( "Socket 创建失败! #%i\r\n", ::WSAGetLastError ()) ;
::WSACleanup () ;
return ;
}
EditPrintf ("Socket %i 已经成功创建!\r\n", m_sock) ;
/* Call "WSAAsyncSelect"
WSAAsynchSelect是另一个Windows特有的Socket函数。此函数用于避免因Internet回应过慢而造成应用程序当住。
在WinSock文件中,有些函数与「阻碍性(blocking)」有关。也就是说,它们不能保证立即把控制项权传回给程序。
WSAAsyncSelect函数强制阻碍性的函数转为非阻碍性的,即在函数执行完之前把控制项传回给程序。
函数的结果以讯息的形式报告给应用程序。WSAAsyncSelect函数让应用程序指定讯息和接收讯息的视窗的数值。
使用程序定义的一个讯息,该讯息称为WM_SOCKET_NOTIFY,最后一个参数来指定讯息发送的条件,
特别在连结和接收资料时(FD_CONNECT | FD_READ) */
if (SOCKET_ERROR== ::WSAAsyncSelect(m_sock,GetSafeHwnd(),WM_SOCKET_NOTIFY,FD_CONNECT|FD_READ))
{
EditPrintf ("WSAAsyncSelect 错误: #%i.\r\n",::WSAGetLastError ());
::closesocket (m_sock);
::WSACleanup ();
return;
}
/* Call "connect" with IP address and time-server port
将sin_port设定为埠号,这里是时间协定的埠号,RFC-868显示为37。
但不要像我最初时那样,将此栏位设为37。当大多数数字通过Internet时,
结构的这个埠号栏位必须是「big endian」的,即最高的位元组排第一个。
Intel微处理器是little endian。幸运的是,htons(「host-to-network short」)函数使位元组翻转
用inet_addr函数将储存在m_szIPAddr字串中的伺服器位址转化为无正负号长整数 */
static struct sockaddr_in sa ;
sa.sin_family = AF_INET ; //#define AF_INET 2 (internetwork: UDP, TCP, etc.)
sa.sin_port = ::htons (IPPORT_TIMESERVER) ; //#define IPPORT_TIMESERVER 37
sa.sin_addr.S_un.S_addr = ::inet_addr (m_szIPAddr) ;
::connect(m_sock, (SOCKADDR*) &sa, sizeof(sa)) ;
/* connect函数通常已经会阻碍著后面程序的执行,这是因为连结成功以前需要花些时间。
然而,由于调用了WSAAsyncSelect,所以connect不会等待连结,事实上,它会立即传回SOCKET_ERROR的值。
并不是出现了错误,这只是表示现在还没有连线成功而已。NETTIME也不会检查这个传回值,只是调用::WSAGetLastError而已。
如果::WSAGetLastError传回WSAEWOULDBLOCK(即函数的执行通常要受阻,但这里并没有受阻),那就一切都还很正常。 */
if (WSAEWOULDBLOCK != ::WSAGetLastError ())
{
EditPrintf ("连接错误: #%i.\r\n", ::WSAGetLastError ()) ;
::closesocket (m_sock) ;
::WSACleanup () ;
return;
}
EditPrintf ( "正在连接: %hs...", m_szIPAddr) ;
/* 连结最终完成时,主对话框由WM_SOCKET_NOTIFY消息-NETTIME在WSAAsyncSelect函数中指定的程序自订讯息所通知。
lParam的低字组等于FD_CONNECT,高字组表示错误。这时的错误可能是程序不能连结到指定的伺服器。
NETTIME还列出了其他伺服器,供您选择,让您可以试试其他的伺服器。
如果一切顺利,那么NETTIME将调用recv(「receive:接收」)函数来读取资料.
设定了一个计时器,只是在程序视窗中显示句点,以指示程序正在执行。*/
SetTimer (1, 1000, NULL);
}
void CPage1::OnSocketNotify(WPARAM wp,LPARAM lp)
{
WORD wEvent = WSAGETSELECTEVENT (lp) ; // ie, LOWORD
WORD wError = WSAGETSELECTERROR (lp) ; // ie, HIWORD
//处理WSAAsyncSelect中指定得两种事件 FD_CONNECT | FD_READ
switch (wEvent)
{
case FD_CONNECT:
EditPrintf ("\r\n");
if (wError)
{
EditPrintf ( "连接错误: #%i.", wError);
return ;
}
EditPrintf ( "已成功连接到时间服务器: %hs.\r\n", m_szIPAddr) ;
/* 调用recv(「receive:接收」)函数来读取资料.
该调用将产生WM_SOCKET_NOTIFY讯息,这时带有FD_READ的事件代码。产生一个WSAEWOULDBLOCK错误以表示函数通常受阻,
但这时没有受阻。理论上来说(当然这不大可能),函数至少能传回资料的一部分,然后透过再次调用以获得其余的32个位元组值。
(char *) &m_ulTime, 4意味著,用4个位元组来储存m_ulTime变数
最后一个参数MSG_PEEK表示只是读此资料,并不将其从输入伫列中删除WM_SOCKET_NOTIFY讯息 */
::recv (m_sock, (char *) &m_ulTime, 4, MSG_PEEK);
EditPrintf ( "正在接受数据,请稍候...");
return ;
case FD_READ:
KillTimer (1);
EditPrintf ( "\r\n");
if (wError)
{
EditPrintf ( "FD_READ 错误! #%i.", wError);
return ;
}
/* 获得其余的32个位元值,这时最后的参数是0,用于从伫列中删除WM_SOCKET_NOTIFY讯息。
接收的32位元的m_ulTime值是从1990年1月1日开始的0:00 UTC秒数
但最高顺序的位元组是第一个位元组,因此该值必须通过ntohl(「network-to-host long」)函数处理来调整位元组顺序,
以便Intel微处理器能够处理。然后调用ChangeSystemTime函数。 */
::recv(m_sock, (char *) &m_ulTime, 4, 0) ;
m_ulTime = ::ntohl (m_ulTime) ;
EditPrintf ( "接受的时间为从1900年1月1日起 %u 秒 \r\n", m_ulTime) ;
//改变系统时间
this->ChangeSystemTime() ;
}
}
void CPage1::ChangeSystemTime()
{
FILETIME ftNew ;
SYSTEMTIME stOld, stNew ;
::GetLocalTime (&stOld) ; //首先取得目前的本地时间
stNew.wYear = 1900 ;
stNew.wMonth = 1 ;
stNew.wDay = 1 ;
stNew.wHour = 0 ;
stNew.wMinute = 0 ;
stNew.wSecond = 0 ;
stNew.wMilliseconds = 0 ;
::SystemTimeToFileTime (&stNew, &ftNew);
/* 将SYSTEMTIME结构设定为1900年1月1日午夜(0时)。
并将这个SYSTEMTIME结构传递给SystemTimeToFileTime,将此结构转化为FILETIME结构。
FILETIME实际上只是由两个32位元的DWORD一起组成64位元的整数,
用来表示从1601年1月1日至今间隔为100奈秒(nanosecond)的间隔数。 */
LARGE_INTEGER li ; //64位大整数
li = * (LARGE_INTEGER *) &ftNew;
li.QuadPart += (LONGLONG) 10000000 * m_ulTime;
ftNew = * (FILETIME *) &li;
::FileTimeToSystemTime (&ftNew, &stNew);
if (::SetSystemTime (&stNew)) //调用SetSystemTime来设定时间
{
::GetLocalTime (&stNew);
this->FormatUpdatedTime (&stOld, &stNew); //最初的本地时间和新的本地时间一起传递给FormatUpdatedTime 这个函数用::GetTimeFormat函数和::GetDateFormat函数将时间转化为ASCII字串。
}
else
EditPrintf ("不能设置新的日期和时间!");
}
void CPage1::FormatUpdatedTime(SYSTEMTIME *pstOld, SYSTEMTIME *pstNew)
{
TCHAR szDateOld [64], szTimeOld [64], szDateNew [64], szTimeNew [64] ;
::GetDateFormat (LOCALE_USER_DEFAULT, LOCALE_NOUSEROVERRIDE | DATE_SHORTDATE,
pstOld, NULL, szDateOld, sizeof (szDateOld)) ;
::GetTimeFormat (LOCALE_USER_DEFAULT, LOCALE_NOUSEROVERRIDE |TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT,
pstOld, NULL, szTimeOld, sizeof (szTimeOld)) ;
::GetDateFormat (LOCALE_USER_DEFAULT, LOCALE_NOUSEROVERRIDE | DATE_SHORTDATE,
pstNew, NULL, szDateNew, sizeof (szDateNew)) ;
::GetTimeFormat (LOCALE_USER_DEFAULT, LOCALE_NOUSEROVERRIDE |TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT,
pstNew, NULL, szTimeNew, sizeof (szTimeNew)) ;
EditPrintf ( "\r\n系统的日期和时间已成功更改:"
"\r\n以前\t%s, %s.%03i \r\n现在\t%s, %s.%03i.",
szDateOld, szTimeOld, pstOld->wMilliseconds,
szDateNew, szTimeNew, pstNew->wMilliseconds) ;
}
void CPage1::EditPrintf(TCHAR *szFormat, ...)
{
TCHAR szBuffer [1024];
va_list pArgList; //typedef char * va_list;
va_start (pArgList, szFormat);
::wvsprintf (szBuffer, szFormat, pArgList);
va_end (pArgList);
m_edit.SetSel(-1,-1); //将插入光标放于最后
m_edit.ReplaceSel(szBuffer);
m_edit.ScrollWindow(0,0); //滚动到插入点
}
void CPage1::OnTimer(UINT nIDEvent)
{
EditPrintf(".");
CPropertyPage::OnTimer(nIDEvent);
}
void CPage1::OnSelchangeCombo1()
{
m_cc.GetLBText(m_cc.GetCurSel(),m_szIPAddr);
MessageBox(m_szIPAddr);
}
void CPage1::OnJiance()
{
EditPrintf("\r\n\r\n\t正在检测网络连接...");
DWORD dwFlag;
if(!InternetGetConnectedState(&dwFlag, 0))
{
//MessageBox("网络未连接。");
SetDlgItemText(IDC_TEXTOUT,"\r\n\r\n\t未连接到网络...");
m_cc.EnableWindow(false);
GetDlgItem(IDC_JIAOZHENG)->EnableWindow(false);
}
else if(dwFlag & INTERNET_CONNECTION_MODEM)
{
SetDlgItemText(IDC_TEXTOUT,"\r\n\r\n\t采用调治解调器上网...");
m_cc.EnableWindow(true);
GetDlgItem(IDC_JIAOZHENG)->EnableWindow(true);
}
else if(dwFlag & INTERNET_CONNECTION_LAN)
{
SetDlgItemText(IDC_TEXTOUT,"\r\n\r\n\t采用网卡通过局域网上网...");
m_cc.EnableWindow(true);
GetDlgItem(IDC_JIAOZHENG)->EnableWindow(true);
}
else if(dwFlag & INTERNET_CONNECTION_PROXY)
{
SetDlgItemText(IDC_TEXTOUT,"\r\n\r\n\t使用代理服务器上网...");
m_cc.EnableWindow(true);
GetDlgItem(IDC_JIAOZHENG)->EnableWindow(true);
}
}
BOOL CPage1::PreTranslateMessage(MSG* pMsg)
{
m_ToolTip.RelayEvent(pMsg);
return CPropertyPage::PreTranslateMessage(pMsg);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -