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

📄 epgpf.c

📁 MiniWinOuterSM MiniWinOuterSM
💻 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 + -