📄 epgpf.c
字号:
#include"dvbutils.h"
#include"FavGroup.h"
#include"dvbepg.h"
#include"osdcommctrl.h"
#define IDC_CHNUM 1
#define IDC_CHNAME 2//控件记忆当前播出SERVICE的索引
#define IDC_SIGNAL 3
#define IDC_PF 4//记忆当前SERVICE播出节目的时间长度(单位:秒)
#define IDT_SIGNAL 100
//主窗口记忆当前SERVICE播出节目的开始时间(单位:秒)
static void SetPFData(HWND hwnd,DWORD startTime,DWORD duration)
{
HWND hpfLst=GetDlgItem(hwnd,IDC_PF);
SetWindowLong(hwnd,GWL_USERDATA,startTime);
SetWindowLong(hpfLst,GWL_USERDATA,duration);
TRACE("SetPF Data %08X dur=%d secs\r\n",startTime,duration);
}
static void GetPFData(HWND hwnd,DWORD*startTime,DWORD*duration)
{
HWND hpfLst=GetDlgItem(hwnd,IDC_PF);
if(startTime)
*startTime=GetWindowLong(hwnd,GWL_USERDATA);
if(duration)
*duration=GetWindowLong(hpfLst,GWL_USERDATA);
TRACE("GetPF Data start=%08X dur=%d sec\r\n",*startTime,*duration);
}
static int UpdatePFInfo(HWND hwndPF,const SERVICELOCATOR*s)
{//如果找不到指定Service的数据则返回-1,否则返回event数量
SECTIONDB*sdb;
SECTIONDATA*sd;
int ret=0,secFind=0;
SendMessage(hwndPF,LB_RESETCONTENT,0,0);
LockDVBSI();
sdb=GetEITPFDB();
if(sdb){
int i=0;
sd=sdb->sections;
while(sd&&secFind<2){
USHORT netid=GetEitNetID(sd->Data);
USHORT tsid=GetEitStreamID(sd->Data);
USHORT sid=GetEitServiceID(sd->Data);
if(s->netId==netid&&s->tsId==tsid&&s->serviceId==sid){
int ec=GetEitEventCount(sd->Data);
PrDbgPrintf("Find SchedulePF of service %d.%d.%d SEQ %d EventCount=%d\n",
netid,tsid,sid,i++,ec);
secFind++;
if(ec){
DVBEvent evt;
SYSTEMTIME evtLocalTime;
char tstr[256],name[256];
GetEitEvent(sd->Data,&evt,0);
if(GetSectionNo(sd->Data)==0){
FILETIME ft;
DWORD dur=UTC2Seconds(evt.duration);
SystemTimeToFileTime(&evtLocalTime,&ft);
SetPFData(GetParent(hwndPF),ft.dwLowDateTime,dur);
}
MJDToLocalTime(&evtLocalTime,evt.mjdDate,evt.utcTime);
sprintf(tstr,"%02d:%02d-%02X:%02X:%02X ",
evtLocalTime.wHour,evtLocalTime.wMinute,
evt.duration>>16,(evt.duration>>8)&0xFF,evt.duration&0xFF);
GetShortEventName(&evt,(char*)name,NULL,NULL);
strcat(tstr,name);
SendMessage(hwndPF,LB_ADDSTRING,0,(LPARAM)tstr);
ret++;
}
}
sd=sd->next;
}
}
UnlockDVBSI();
return (secFind==0)?-1:ret;
}
static LRESULT EPGPFProc(HWND hwnd,UINT msgId,UINT wParam,UINT lParam)
{
switch(msgId){
case WM_KEYDOWN:
switch(wParam){
case VK_UP:
case VK_DOWN:
{
INT num=(INT)GetWindowLong(GetDlgItem(hwnd,IDC_CHNAME),GWL_USERDATA);
FAVGROUP*fav=FindFavGroupByID(GROUP_ALL);
HWND chnum=GetDlgItem(hwnd,IDC_CHNAME);
if(fav&&fav->serviceCount){
unsigned char str[16],sname[256];
SERVICELOCATOR svc;
HWND hpf=GetDlgItem(hwnd,IDC_PF);
num+=wParam==VK_DOWN?-1:1;
num=(num+fav->serviceCount)%fav->serviceCount;
sprintf((char*)str,"%d",num);
GetServiceInFavGroup(fav,num,&svc);
SetWindowText(chnum,(char*)str);
PlayByService(&svc);
GetServiceName(&svc,NULL,(char*)sname,NULL);
SetWindowText(GetDlgItem(hwnd,IDC_CHNAME),(char*)sname);
TRACE("Goto service %d '%s'\r\n",num,(char*)sname);
SetWindowLong(GetDlgItem(hwnd,IDC_CHNAME),GWL_USERDATA,num);
UpdatePFInfo(hpf,&svc);
}
}break;
default:
if(((wParam>='0')&&(wParam<='9'))||(wParam==VK_DELETE)||(wParam==VK_BACK)
||(wParam==VK_LEFT)||(wParam==VK_RIGHT))
SendMessage(GetDlgItem(hwnd,IDC_CHNUM),msgId,wParam,lParam);
else
DefWindowProc(hwnd,msgId,wParam,lParam);
break;
}
break;
case WM_COMMAND:
switch(LOWORD(wParam)){
case IDC_CHNUM:
{//频道数字改变的时候自动修改频道名字
INT idx=GetDlgItemInt(hwnd,IDC_CHNUM,NULL,FALSE);
FAVGROUP*grp=FindFavGroupByID(GROUP_ALL);
SERVICELOCATOR*sc;
if(grp&&(idx<grp->serviceCount)){
char sname[128];
sc=grp->Services+idx;
GetServiceName(sc,NULL,sname,NULL);
SetDlgItemText(hwnd,IDC_CHNAME,sname);
}
}break;
}break;
case WM_SCHEDULE:
{
SERVICELOCATOR sl=*(SERVICELOCATOR*)wParam;
HWND hpf=GetDlgItem(hwnd,IDC_PF);
SERVICELOCATOR svc;
GetCurrentService(&svc);
if((sl.serviceId==svc.serviceId)&&(lParam<0x50))
UpdatePFInfo(hpf,&sl);
}
break;
case WM_TIMER:
{
SYSTEMTIME nowst;
FILETIME nowft;
DWORD start,dur;
PRTunerStatus st;
GetPFData(hwnd,&start,&dur);
GetLocalTime(&nowst);
SystemTimeToFileTime(&nowst,&nowft);
if(start&&dur){
HWND hp=GetDlgItem(hwnd,IDC_SIGNAL);
INT pos=(nowft.dwLowDateTime-start);//%dur;
TRACE("start=%u dur=%d pos=%d\r\n",start,dur,pos);
SendMessage(hp,PBM_SETRANGE,0,MAKELPARAM(0,dur));
SendMessage(hp,PBM_SETPOS,pos,0);
}
PrTunerGetStatus(0,&st);
//SendMessage(GetDlgItem(hwnd,IDC_SIGNAL),PBM_SETPOS,st.level,0);
}break;
case WM_ERASEBKGND:
FillRect((HDC)wParam,NULL,(HBRUSH)(COLOR_WINDOWTEXT+1));
break;
case WM_CTLCOLORSTATIC:
{
SetBkColor((HDC)wParam,RGB(255,0,0));
}break;
case WM_DESTROY:
case WM_CLOSE:
RegisterEPGNotify(NULL);
default:return DefWindowProc(hwnd,msgId,wParam,lParam);
}
return 0;
}
HWND CreateEPGPFWnd(void)
{
SERVICELOCATOR sc;
char sname[128];
HWND hwnd=CreateMainWindow("EPGPF",WS_VISIBLE|WS_TABSTOP,40,450,640,90,EPGPFProc);
// CreateWindow("EditBox",NULL,WS_VISIBLE|WS_TABSTOP|WS_CHILD|ES_NUMBER,0,0,50,20,hwnd,(HMENU)IDC_CHNUM,NULL,NULL);
CreateWindow("Static",NULL,WS_VISIBLE|WS_CHILD|SS_CENTER,0,0,160,25,hwnd,(HMENU)IDC_CHNAME,NULL,NULL);
CreateWindow("Progress",NULL,WS_VISIBLE|WS_CHILD|/*PBS_MARQUEE|*/PBS_SMOOTH,160,20,480,5,hwnd,(HMENU)IDC_SIGNAL,NULL,NULL);
CreateWindow("ListBox",NULL,WS_VISIBLE|WS_CHILD|WS_BORDER|LBS_NOTIFY|LBS_WRAP,0,26,650,60,hwnd,(HMENU)IDC_PF,NULL,NULL);
GetCurrentService(&sc);
RegisterEPGNotify(hwnd);
if(GetServiceName(&sc,NULL,sname,NULL)){
FAVGROUP*grp=FindFavGroupByID(GROUP_ALL);
if(grp){
SetWindowLong(GetDlgItem(hwnd,IDC_CHNAME),GWL_USERDATA,FindServiceInFavGroup(grp,&sc));
}
SetDlgItemText(hwnd,IDC_CHNAME,sname);
}
SetTimer(hwnd,IDT_SIGNAL,500,NULL);
return hwnd;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -