📄 phoneui.cpp
字号:
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 + -