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

📄 phoneui.cpp

📁 usb的skype电话
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	LcdLightDelay=C_LcdLightDelay*2;
			
	OldFont=m_Dc.SelectObject(&font1);
	while(1)
	{
			m_Dc.SelectObject(&font1);
			time=CTime::GetCurrentTime();
			strDate=time.Format("20%y-%m-%d");
			if	(bShow)
				strTime=time.Format("%H:%M");
			else
				strTime=time.Format("%H %M");
			
			Cls();
			rect.left=0;
			rect.top=10;
			rect.right=m_Width;
			rect.bottom=0;
			m_Dc.DrawText(strDate, &rect, DT_CENTER|DT_WORDBREAK|DT_CALCRECT);
			rect.right=m_Width;
			m_Dc.DrawText(strDate, &rect, DT_CENTER|DT_WORDBREAK);
			rect.top=rect.bottom+1;
			rect.bottom=0;
			m_Dc.SelectObject(&font2);
			m_Dc.DrawText(strTime, &rect, DT_CENTER|DT_WORDBREAK|DT_CALCRECT);
			rect.right=m_Width;
			m_Dc.DrawText(strTime, &rect, DT_CENTER|DT_WORDBREAK);

		m_Dc.SelectObject(OldFont);
		Show();

		if(LcdLightDelay)
		{
			LcdLightDelay--;
			if(LcdLightDelay==0)
				LcdLight(FALSE);
		}
		
		if(!WaitEvents(500))
		{
			bShow ^=0x01;
		}
		else
		{
			LcdLight(TRUE);
			LcdLightDelay=C_LcdLightDelay*2;
			
			bShow =0x01;
			switch(m_key)
			{
				case C_KEY_OK:
				SelectFriend();
				break;

				case C_KEY_UP:
				case C_KEY_DOWN:
				SelectCallRecord(0);
				break;

				case C_KEY_INOUT:
				SelectCallRecord(1);				
				break;

				default:
				char Number=DialKey(m_key);
				if(	Number)
					Dial(m_key);
				break;
			}
		}	
	}

}

int CPhoneUI::UserStatusIcon(int status)
{
	switch(status)
	{
		case cusOnline:
		return IDB_STATUS_ONLINE;

		case cusOffline:
		break;

		case cusAway:
		return IDB_STATUS_ONLINE;
		
		case cusNotAvailable:
		break;
		
		case cusDoNotDisturb:
		break;

		case cusInvisible:
		break;

		case cusLoggedOut:
		break;

		case cusSkypeMe:
		return IDB_STATUS_ONLINE;
		
	}
	return 0;
}

int CPhoneUI::SelectFriend(void)
{
	int index, sum;
	CUser				User;
	CUserCollection 	Users;

	CFont	font;
	CFont	*OldFont;
	font.CreatePointFont(148, "Times New Roman");

	index=1;
	while(1)
	{
		Users=pSkype->GetFriends();
		sum=Users.GetCount();
		if(!sum)
			return (DisInformation(IDS_NORECORD, C_INFO_TIMEOUT));
		if(index>sum)
			index=sum;		
		User=Users.GetItem(index);

		RECT	rect;
		CString str;
		int		width;
		
		width=m_Width-8;
		
		OldFont=m_Dc.SelectObject(&font);		
		
		Cls();		
		rect.left=0;
		rect.right=width;
		rect.top=3;
		rect.bottom=m_Height-16;
		str =User.GetHandle();
		DisplayText(&m_Dc, str, rect, DT_CENTER);
		
		m_Dc.SelectObject(OldFont);
		
		rect.left=0;
		rect.right=width;
		rect.top=m_Height-16;
		rect.bottom=m_Height;		
		DisplayString(IDS_CALL, rect, DT_RIGHT);

		int statusIcon=UserStatusIcon(User.GetOnlineStatus());
		if(statusIcon)
		{
			CDC dc;
			CBitmap bitmap;
			bitmap.LoadBitmap( statusIcon );
			dc.CreateCompatibleDC(&m_Dc);
			dc.SelectObject(&bitmap);
			m_Dc.BitBlt(0, m_Height-16, 16, 16, &dc, 0, 0, SRCCOPY);
		}

		ScrollBar(index, sum);
		Show();

		if(!WaitEvents(20000))
			return(-1);
		switch(m_key)
		{
			case C_KEY_DOWN:
			if(index==sum)
				index=1;
			else
				index++;
			break;
			
			case C_KEY_UP:
			if(index==1)
				index=sum;
			else
				index--;
			break;
			
			case C_KEY_OK:
			CallUser(User);
			break;

			case C_KEY_CANCEL:
			return 0;
				
			default:
			break;
		}	

	}
	
}


int CPhoneUI::CallStatusIcon(int type, int status)
{

	if(status==clsMissed)
		return IDB_CALLMISSED;

	if((type==cltIncomingPSTN) || (type==cltIncomingP2P ))
		return IDB_CALLIN;

	if(status==clsFailed )
		return IDB_CALLOUTFAILED;
	
	return IDB_CALLOUT;
}

/*----------------------------------------------------------------------------
; 选择通话记录
; 0:全部 1:call in  2:call out
----------------------------------------------------------------------------*/
int CPhoneUI::SelectCallRecord(int type)
{
	long index, sum;
	CCall call;
	CCallCollection calls;

	CFont	font;
	CFont	*OldFont;
	font.CreatePointFont(148, "Times New Roman");

	POSITION pos;		
	CList<CCall, CCall&> CallList;
	
	index=1;
	while(1)
	{
		calls=pSkype->GetCalls("");
		CallList.RemoveAll();
		if(type==0)
		{
			for(int i=1; i<=calls.GetCount(); i++)
			{
				call=calls.GetItem(i);
				CallList.AddTail(call);
			}
		}
		else
		{
			int type0, type1, type2;
			if(type==1)
			{
				type1=cltIncomingPSTN;
				type2=cltIncomingP2P ;
			}
			else
			{
				type1=cltOutgoingPSTN;
				type2=cltOutgoingP2P;
			}
				
			for(int i=1; i<=calls.GetCount(); i++)
			{
				call=calls.GetItem(i);
				type0= call.GetType();
				if(type0==type1 || type0==type2)
					CallList.AddTail(call);
			}
		}	
		
		sum=CallList.GetCount();
		if(!sum)
			return (DisInformation(IDS_NORECORD, C_INFO_TIMEOUT));
		if(index>sum)
			index=sum;

		pos=CallList.FindIndex(index-1);
		call=CallList.GetAt(pos);

		RECT rect;
		CString str;
		int		width;
		UINT	format;
		
		width=m_Width-8;			
		Cls();	

		TRACE( "call.GetStatus %d \n", call.GetStatus());
		TRACE( "call.GetType %d \n", call.GetType());
			
		CDC dc;
		CBitmap bitmap;
		bitmap.LoadBitmap( CallStatusIcon(call.GetType(), call.GetStatus()) );
		dc.CreateCompatibleDC(&m_Dc);
		dc.SelectObject(&bitmap);
		m_Dc.BitBlt(0, 0, 16, 16, &dc, 0, 0, SRCCOPY);
		m_Dc.MoveTo(0,17);
		m_Dc.LineTo(m_Width,17);

		rect.left=18;
		rect.right=width;
		rect.top=0;
		rect.bottom=0;
		COleDateTime CallTime=call.GetTimestamp();
		str=CallTime.Format("%m/%d/%y %H:%M");
		m_Dc.DrawText(str, &rect, DT_LEFT|DT_CALCRECT);
		rect.right=width;
		m_Dc.DrawText(str, &rect, DT_LEFT);
		
		OldFont=m_Dc.SelectObject(&font);	
		
		rect.top=rect.bottom+5;		
		str= call.GetPartnerHandle();
		m_Dc.DrawText(str, &rect, DT_LEFT|DT_CALCRECT);
		if(rect.right>width)
			format=DT_LEFT;
		else
			format=DT_CENTER;
		rect.right=width;
		m_Dc.DrawText(str, &rect, format);

		m_Dc.SelectObject(OldFont);		
		
		rect.left=0;
		rect.right=width;
		rect.top=m_Height-16;
		rect.bottom=m_Height;
		DisplayString(IDS_CALL, rect, DT_RIGHT);
		ScrollBar(index, sum);
		Show();

		if(!WaitEvents(20000))
			return(-1);
		switch(m_key)
		{
			case C_KEY_DOWN:
			if(index==sum)
				index=1;
			else
				index++;
			break;
			
			case C_KEY_UP:
			if(index==1)
				index=sum;
			else
				index--;
			break;
			
			case C_KEY_OK:
			CallList.RemoveAll();
			return( CallUser( call) );
			break;

			case C_KEY_CANCEL:
			CallList.RemoveAll();
			return 0;

			case C_KEY_INOUT:
			index=1;
			if(type==2)	
				type=0;
			else
				type++;
			break;
			
			default:
			break;
		}	

	}
}




int CPhoneUI::CallUser(CCall call)
{
	return( CallUser(call.GetPartnerHandle()) );
}

int CPhoneUI::CallUser(CUser user)
{
	if(user.GetIsBlocked())
		return (DisInformation(IDS_USERISBLOCKED, C_INFO_TIMEOUT));
	return ( CallUser(user.GetHandle()) );
}

int CPhoneUI::CallUser(LPCTSTR Target)
{
	CFont	font;
	CFont	*OldFont;
	font.CreatePointFont(148, "Times New Roman");

	Cls();
	RECT	rect;
	rect.left=0;
	rect.top=2;
	rect.right=m_Height;
	rect.bottom=0;
	DisplayString(IDS_CALLING, rect, DT_LEFT);

	OldFont=m_Dc.SelectObject(&font);	
	rect.left=0;
	rect.top=rect.bottom+3;
	rect.right=m_Width;
	rect.bottom=m_Height;
	DisplayText(&m_Dc, Target, rect, DT_CENTER);
	m_Dc.SelectObject(OldFont);		
	Show();

	CCall	call;
	call=pSkype->PlaceCall(Target, "", "", "");
	while(1)
	{
		long status=call.GetStatus();
		if(status==clsInProgress)
			return(InCalling(call));
		if(CallErrStatus(status))
			return(0);

		if(WaitEvents(100))
		{
			switch(m_key)
			{
				case C_KEY_CANCEL:
				CallFinish(call);
				return 0;
				break;
			}
		}
	}
}


void CPhoneUI::OnCallStatus(CCall *call, long Status)
{
	TRACE("CPhoneUI::OnCallStatus %x \n", Status);

	if(Status!=clsRinging)
		return;
	
	long calltype=call->GetType();
	if( (calltype==cltIncomingPSTN) ||(calltype==cltIncomingP2P ))
	{
		m_NewCallId=call->GetId();
		m_Events |=C_MASK_NEWCALLIN;
		SetEvent(EventWait);	
	}	
}	

int CPhoneUI::NewCallIn(void)
{
	int result;
	if(!b_InCall)
		SetVolume(m_Volume_Ring);
	

	CCall call;
	call=pSkype->GetCall(m_NewCallId);

	Cls();
	CString str;
	RECT  rect;
	rect.left=0;
	rect.top=16;
	rect.right=m_Width;
	rect.bottom=0;
	str=call.GetPartnerHandle();
	m_Dc.DrawText(str, &rect, DT_CENTER|DT_WORDBREAK|DT_CALCRECT);
	rect.right=m_Width;
	m_Dc.DrawText(str, &rect, DT_CENTER|DT_WORDBREAK);
	rect.top=rect.bottom;
	DisplayString(IDS_CALLINGYOU, rect, DT_CENTER|DT_WORDBREAK);
	Show();

	while(1)
	{
		long status=call.GetStatus();
		if(status==clsInProgress )
		{		
			InCalling(call);
			result=1;
			goto NewCallInEnd;			
		}
		else if( status!=clsRinging)
			return 0;
		
		if(WaitEvents(100))
		{
			switch(m_key)
			{
				case C_KEY_OK:
				InCalling(call);
				result=1;
				goto NewCallInEnd;
			

				case C_KEY_CANCEL:
				CallFinish(call);
				result=0;
				goto NewCallInEnd;
			}
		}
		
	}
	
NewCallInEnd:	
	if(!b_InCall)
		SetVolume(m_Volume_Normal);
	return(result);
}

int CPhoneUI::InCalling(CCall &call)
{
	int result;

	b_InCall=TRUE;
	SetVolume(m_Volume_InCall);
	
	long calltype=call.GetType();
	if( (calltype==cltIncomingPSTN) ||(calltype==cltIncomingP2P ))
	{
		if(call.GetStatus()==clsRinging)
			call.Answer();
	}

	RECT rect;
	CString str;
	CString str0="";
	CTime	t0;
	CTimeSpan	time;

	t0=CTime::GetCurrentTime();
	while(1)
	{
		time=CTime::GetCurrentTime()-t0;
		str=time.Format("%M:%S");
		if(str!=str0)
		{
			str0=str;	
			Cls();	
			rect.left=0;
			rect.right=m_Width;
			rect.top=10;
			rect.bottom=0;
			str=call.GetPartnerHandle();
			m_Dc.DrawText(str, &rect, DT_CENTER|DT_WORDBREAK|DT_CALCRECT);
			rect.right=m_Width;
			m_Dc.DrawText(str, &rect, DT_CENTER|DT_WORDBREAK);
			rect.top=rect.bottom;
			
			m_Dc.DrawText(str0, &rect, DT_CENTER|DT_WORDBREAK|DT_CALCRECT);
			rect.right=m_Width;
			m_Dc.DrawText(str0, &rect, DT_CENTER|DT_WORDBREAK);
			Show();
		}	

		if(WaitEvents(100))
		{
			switch(m_key)
			{
				case C_KEY_CANCEL:
				CallFinish(call);
				result=0;
				goto InCallEnd;
				
				case C_KEY_OK:
				break;
			}
		}
		else
		{
			long status;
			status=call.GetStatus();
			if(CallErrStatus(status))
			{
				result=0;
				goto InCallEnd;
			}	
				
		}
	}
InCallEnd:	
	b_InCall=FALSE;
	SetVolume(m_Volume_Normal);
	return(result);
}


int CPhoneUI::CallErrStatus(long status)
{
	long strid;
	
	switch(status)
	{
		case clsFailed:
		strid=IDS_CALLFAILD;
		break;

		case clsFinished:
		strid=IDS_CALLFINISHED;
		break;

		case clsMissed:
		strid=IDS_CALLMISSED;
		break;

		case clsRefused:
		strid=IDS_CALLREFUSED;
		break;
		
		case clsBusy:
		strid=IDS_CALLBUSY;
		break;

		case clsCancelled:
		strid=IDS_CALLCANCELLED;
		break;

		default:
		return(0);
	}	
	DisInformation(strid, 15000);
	return(1);	
}	


int CPhoneUI::CallFinish(CCall &call)
{
	CString str;
	str.Format("SET CALL %d STATUS FINISHED",call.GetId());
	pSkype->SendCommand(pSkype->GetCommand(888, str, "call finished ", FALSE, 00));
	KeyEvent(); 			//清除按键消息
	return (0);
}

int CPhoneUI::DialKey(UCHAR key)
{
	switch(key)
	{
		case C_KEY_0:
		return '0';
	
		case C_KEY_1:
		return '1';

		case C_KEY_2:
		return '2';

		case C_KEY_3:
		return '3';

		case C_KEY_4:
		return '4';
		
		case C_KEY_5:
		return '5';

		case C_KEY_6:
		return '6';

		case C_KEY_7:
		return '7';

		case C_KEY_8:
		return '8';

		case C_KEY_9:
		return '9';

		case C_KEY_X:
		return '*';

		case C_KEY_J:
		return '#';
	}	
	return 0;
}	

int CPhoneUI::ChackDialKeys(CString strKeys)
{
	CString str1, str2;
	int len, minlen=8;
	
	len=strKeys.GetLength();
	if(len<3)
		goto	err_number;
	
	str1=strKeys.Left(1);
	str2=strKeys.Left(2);
	if(str1=="+")
	{
		strKeys=strKeys.Right(strKeys.GetLength()-1);
	}	
	else if(str2=="00")	
	{
		strKeys=strKeys.Right(strKeys.GetLength()-2);
	}	
	else
		goto err_number;

	str1=strKeys.Left(1);
	if(str1=="1")
		minlen=11;
	else
		minlen=8;
	len=strKeys.GetLength();
	if(len>=minlen)
		return 1;
		
err_number:
	DisInformation( IDS_INVALIDNUMBER, 3000);
	return 0;
}	

int CPhoneUI::Dial(UCHAR key)
{
	int		maxkeys=20;
	CString strKeys=DialKey(key);
	
	CFont	font;
	CFont	*OldFont;
	font.CreatePointFont(160, "Times New Roman");

	while(1)
	{
		Cls();
		RECT	rect;
		rect.left=0;
		rect.top=2;
		rect.right=m_Height;
		rect.bottom=0;
		DisplayString(IDS_DIAL, rect, DT_LEFT);
		
		OldFont=m_Dc.SelectObject(&font);	
		rect.left=0;
		rect.top=rect.bottom+3;
		rect.right=m_Width;
		rect.bottom=m_Height;
		DisplayText(&m_Dc, strKeys, rect, DT_CENTER);
		m_Dc.SelectObject(OldFont); 	
		Show();

		if(!WaitEvents(20000))
			return(-1);
		switch(m_key)
		{			

			case C_KEY_OK:
			if(ChackDialKeys(strKeys))
				CallUser(strKeys.GetBuffer(100));
			break;

			case C_KEY_CANCEL:
			if(m_KeyFlag)				//长按 清除内容
					strKeys="";
			else
			{
				if(strKeys!="")			//逐个清除
					strKeys=strKeys.Left(strKeys.GetLength()-1);
				else					
					return 0;
			}

			case C_KEY_0:					//第一个0 长按变 +
			if((strKeys=="0") || (strKeys=="+"))
			{
				if(m_KeyFlag)
				{
					strKeys="+";
					break;
				}	
			}	

			default:
			if	(strKeys.GetLength()>=maxkeys)
				break;
			
			char Number=DialKey(m_key);
			if(	Number)
				strKeys += Number;
			break;
		}
	}
}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -