⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 page1.cpp

📁 C语言课程设计案例精编
💻 CPP
📖 第 1 页 / 共 2 页
字号:


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 + -