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

📄 epgwnd.c

📁 MiniWinOuterSM MiniWinOuterSM
💻 C
字号:
// epgWindow.c: implementation of the epgWindow class.
//
//////////////////////////////////////////////////////////////////////

#include"dvbutils.h"
#include<stdio.h>
#include<string.h>
#include"dvbepg.h"
#include"osdcommctrl.h"
#define MAX_SERVICE_COUNT 8
#define WM_EVENT_UPDATE WM_LAST+0x1000
#define IDC_GROUPS		1
#define IDC_GRPSERVICE	2
#define IDC_WEEK		3
#define IDC_SCHEDULE	4
#define IDC_CONTEXT		5
#define IDC_VIEW		6
#define IDC_DATETIME	7
#define IDC_DESCRIPTOR	8
static SERVICELOCATOR CurrentService;
int GetAllService(HWND hwnd,FAVGROUP*fav);
static int UpdateScheduleInfo(HWND hch,SECTIONDB*db,int week)
{
	int evtCount=0;
	DWORD t1=GetTickCount();
	LockWindowUpdate(hch);
	SendMessage(hch,LVM_DELETEALLITEMS,0,0);
	if(db!=NULL){
		SECTIONDATA*sd;
		SYSTEMTIME curTime;
		FILETIME CurFt;
		GetLocalTime(&curTime);
		SystemTimeToFileTime(&curTime,&CurFt);
		sd=db->sections;
		if(sd&&sd->Data)
			TRACE("Update EITS %d.%d.%d=%dSections\r\n",GetEitNetID(sd->Data),
			GetEitStreamID(sd->Data),GetEitServiceID(sd->Data),db->Count);
		while(sd){
			int i,ec=GetEitEventCount(sd->Data);
			for(i=0;i<ec;i++){
				DVBEvent evt;
				int idx;
				UINT duration;
				char tstr[256],name[256],txt[256];
				FILETIME ft;
				SYSTEMTIME evtLocalTime;
				LVITEM lv;
				GetEitEvent(sd->Data,&evt,i);
				MJDToLocalTime(&evtLocalTime,evt.mjdDate,evt.utcTime);
				//MJDToSystemTime(&est,evt.mjdDate,evt.utcTime);
				if(evtLocalTime.wDayOfWeek!=week)continue;
				sprintf(tstr,"%02d:%02d",evtLocalTime.wHour,evtLocalTime.wMinute);
				duration=UTC2Seconds(evt.duration);
				SystemTimeToFileTime(&evtLocalTime,&ft);
				ZeroMemory(&lv,sizeof(lv));
				lv.pszText=tstr;
				lv.mask=LVIF_TEXT|LVIF_PARAM;
				lv.iItem=evtCount+i;
				lv.lParam=ft.dwLowDateTime;
				idx=ListView_InsertItem(hch,&lv);
				lv.lParam=0;
				ListView_GetItem(hch,&lv);
				if( (ft.dwLowDateTime<CurFt.dwLowDateTime)  && 
					( ft.dwLowDateTime+duration>CurFt.dwLowDateTime) ){
					ListView_SetItemState(hch,idx,LVIS_FOCUSED | LVIS_SELECTED,LVIS_FOCUSED | LVIS_SELECTED ); 
					ListView_EnsureVisible(hch,idx,0);
					//Make sure Current Event is selected and Visible
				}
				sprintf(tstr,"%02X:%02X",evt.duration>>16,(evt.duration>>8)&0xFF);
				ListView_SetItemText(hch,idx,1,tstr);
				GetShortEventName(&evt,name,NULL,NULL);
				ListView_SetItemText(hch,idx,2,name);
				GetShortEventName(&evt,name,txt,NULL);
				ListView_SetItemText(hch,idx,3,txt);
			}
			evtCount+=ec;
			sd=sd->next;
		}
	}
	LockWindowUpdate(NULL);
	TRACE("UpdateScheduleInfo used %d ms\r\n",GetTickCount()-t1);
	return evtCount;
}

static int imgidx=0;
#define IDT_AD 100
extern void DumpSectionDB(SECTIONDB*sDB);
static LRESULT WINAPI EpgWndProc(HWND hwnd,UINT msgID,WPARAM wParam,LPARAM lParam)
{
	switch(msgID){
	case WM_COMMAND:
		{
			switch(wParam){
			case MAKELONG(IDC_GROUPS,OPN_SELCHANGE)://分组改变事件处理
				{
					INT idx=SendMessage((HWND)lParam,OPT_GETCURSEL,0,0);
					FAVGROUP*fav=(FAVGROUP*)SendMessage((HWND)lParam,OPT_GETITEMDATA,idx,0);
					HWND hs=GetDlgItem(hwnd,IDC_GRPSERVICE);
					GetAllService(hs,(FAVGROUP*)fav);
				}break;
			case MAKELONG(IDC_WEEK,OPN_SELCHANGE)://分组改变事件处理
				TRACE("WEEK CHANGE\r\n");
				//pass throught
			case MAKELONG(IDC_GRPSERVICE,LBN_SELCHANGE)://Service切换事件处理
				{
					HWND hgrpsvc=GetDlgItem(hwnd,IDC_GRPSERVICE);
					int idx=SendMessage(hgrpsvc,LB_GETCURSEL,0,0);
					SERVICELOCATOR*svr=(SERVICELOCATOR*)SendMessage(hgrpsvc,LB_GETITEMDATA,idx,0);
					SECTIONDB*sdb;
					HWND hweek=GetDlgItem(hwnd,IDC_WEEK);
					HWND hSch=GetDlgItem(hwnd,IDC_SCHEDULE);
					INT week=SendMessage(hweek,OPT_GETCURSEL,0,0);
					if( (svr!=NULL) && ((UINT)svr!=LB_ERR)){
						PlayByService(svr);
						CurrentService=*svr;
						sdb=LockScheduleDB(svr);//PlayByService会自动发送接收EITSchedule的请求
						if(sdb==NULL||sdb->sections==NULL){
							TRACE("EPG::Request(%d.%d.%d)\r\n",svr->netId,svr->tsId,svr->serviceId);
							//RequestEPG(svr,REQUEST_EITSCH);
						}else 
							UpdateScheduleInfo(hSch,sdb,week);
						UnlockScheduleDB(svr);//PlayByService会自动发送接收EITSchedule的请求
					}
				}
				break;
			default:break;
			}
		}break;
	case WM_DRAWITEM:
		{
			LPDRAWITEMSTRUCT ds=(LPDRAWITEMSTRUCT)lParam;
			RECT rc=ds->rcItem;
			if(ds->CtlType==ODT_LISTBOX){
			#define SVCNO_WIDTH 60
				CHAR text[128];
				HRGN rgnLeft,rgnRC;
				HBRUSH hb,hb1;
				HRGN rgnRight =CreateRoundRectRgn(rc.left, rc.top, rc.right,rc.bottom, 15,15);
				if(ds->itemState&(ODS_SELECTED|ODS_FOCUS)){
					hb = CreateSolidBrush(RGB(211,150,35));
					hb1=CreateSolidBrush(RGB(160,190,222));
				}else{ 
					hb = CreateSolidBrush(RGB(32,64,128));
					hb1=CreateSolidBrush(RGB(60,120,200));
				}
				rgnRC=CreateRectRgn(rc.left+SVCNO_WIDTH,rc.top,rc.right,rc.bottom);
				rgnLeft=CreateRectRgn(0,0,0,0);
				CombineRgn(rgnLeft,rgnRight,rgnRC,RGN_DIFF);
				CombineRgn(rgnRight,rgnRight,rgnLeft,RGN_DIFF);
				
				FillRgn(ds->hDC,rgnLeft,hb1);
				FrameRgn(ds->hDC,rgnLeft,hb,1,1);
				GetRgnBox(rgnLeft,&rc);
				sprintf(text,"%d",ds->itemID+1);
				SetTextColor(ds->hDC,GetSysColor(COLOR_CAPTIONTEXT));
				DrawText(ds->hDC,text,-1,&rc,DT_RIGHT|DT_VCENTER|DT_SINGLELINE);

				FillRgn(ds->hDC,rgnRight,hb);
				FrameRgn(ds->hDC,rgnRight, hb1, 2, 1);

				SetTextColor(ds->hDC,(ds->itemState&ODS_SELECTED)?RGB(0,0,0):RGB(255,255,255));
				DeleteObject((HGDIOBJ)rgnRight);
				DeleteObject((HGDIOBJ)rgnLeft);
				DeleteObject((HGDIOBJ)rgnRC);
				SendMessage(ds->hwndItem,LB_GETTEXT,ds->itemID,(LPARAM)text);
				SetBkMode(ds->hDC, TRANSPARENT);
				rc=ds->rcItem;rc.left+=SVCNO_WIDTH+10;
				DrawText(ds->hDC,text,sizeof(text),&rc,DT_LEFT|DT_VCENTER|DT_SINGLELINE);
				DeleteObject((HGDIOBJ)hb);
				DeleteObject((HGDIOBJ)hb1);		
			}
		}break;
	case WM_TIMER:
		{
			CHAR stime[64];
			SYSTEMTIME tnow;
			GetLocalTime(&tnow);
			sprintf(stime,"%d/%d/%d %02d:%02d:%02d",tnow.wYear,tnow.wMonth,tnow.wDay,
				tnow.wHour,tnow.wMinute,tnow.wSecond);
			SetDlgItemText(hwnd,IDC_DATETIME,stime);
			{
				HWND hgrpsvc=GetDlgItem(hwnd,IDC_GRPSERVICE);
				int idx=SendMessage(hgrpsvc,LB_GETCURSEL,0,0);
				if(idx>=0){
					CHAR name[128];
					SERVICELOCATOR*svr=(SERVICELOCATOR*)SendMessage(hgrpsvc,LB_GETITEMDATA,idx,0);
					SECTIONDB*sdb;
					if(svr==NULL)break;
					sdb=LockScheduleDB(svr);//PlayByService会自动发送接收EITSchedule的请求
					GetServiceName(svr,NULL,name,NULL);
					TRACE("***[%s] %d.%d.%d has %d EIT Sections\r\n",
						name,svr->netId,svr->tsId,svr->serviceId,sdb?sdb->Count:0);
					if(sdb)UnlockScheduleDB(svr);
				}
			}
		}break;
	case WM_SCHEDULE:
		{
			SERVICELOCATOR s;
			SECTIONDB*db;
			s=*(SERVICELOCATOR*)wParam;
			if(lParam<0x50)break;
			if((CurrentService.netId!=s.netId)||(CurrentService.tsId!=s.tsId)||(CurrentService.serviceId!=s.serviceId))
				break;
			db=LockScheduleDB(&s);
			UpdateScheduleInfo(GetDlgItem(hwnd,IDC_SCHEDULE),db,0);
			PrDbgPrintf("Update EITS %d.%d.%d\n",s.netId,s.tsId,s.serviceId);
			DumpSectionDB(db);
			UnlockScheduleDB(&s);
		}break;
	case WM_NOTIFY:
		{
			NMHDR *nmhdr = (PVOID)lParam;
			NMLVKEYDOWN*key=(NMLVKEYDOWN*)nmhdr;
			if(wParam ==IDC_SCHEDULE){
				if(nmhdr->code == NM_CUSTOMDRAW) {
					NMLVCUSTOMDRAW *nmlvcd = (PVOID)nmhdr;
					SYSTEMTIME stnow;
					FILETIME ft;
					switch(nmlvcd->nmcd.dwDrawStage) {
					case CDDS_PREPAINT:
						return CDRF_NOTIFYITEMDRAW;
					case CDDS_ITEMPREPAINT:
						GetLocalTime(&stnow);
						SystemTimeToFileTime(&stnow,&ft);
						if(nmlvcd->nmcd.lItemlParam/*-8*3600*/<ft.dwLowDateTime){
							if(nmlvcd->nmcd.uItemState!=0)
								nmlvcd->clrTextBk =CLR_DEFAULT;
							else{
								nmlvcd->clrTextBk =RGB(200,200,200);
							}
							return CDRF_DODEFAULT;
						}
						return CDRF_NOTIFYSUBITEMDRAW;
					case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
						if(nmlvcd->nmcd.dwItemSpec%2){
							nmlvcd->clrTextBk =CLR_DEFAULT;
						}else
							nmlvcd->clrTextBk =RGB(200,200,250);
						return CDRF_NOTIFYPOSTPAINT;
					case CDDS_ITEMPOSTPAINT | CDDS_SUBITEM:
						return CDRF_DODEFAULT;
					}
					return CDRF_DODEFAULT;
				}else if(nmhdr->code==LVN_ITEMCHANGED){
					LPNMLISTVIEW lv=(LPNMLISTVIEW)lParam;
					SetWindowLong(lv->hdr.hwndFrom,GWL_USERDATA,lv->iItem);
				}else if(nmhdr->code==LVN_KEYDOWN){
					LPNMLVKEYDOWN lk=(LPNMLVKEYDOWN)lParam;
					CHAR desc[256];
					LVITEM itm;	
					itm.mask=LVIF_TEXT;
					itm.iItem=GetWindowLong(lk->hdr.hwndFrom,GWL_USERDATA);
					itm.iSubItem=3;
					itm.pszText=desc;
					itm.cchTextMax=256;
					ListView_GetItem(lk->hdr.hwndFrom,&itm);
					if(lk->wVKey==VK_RETURN)
						MessageBox(hwnd,desc,"节目简介",0);
				}
			}
		}break;
	case WM_DELETEITEM:
		{
			LPDELETEITEMSTRUCT ds=(LPDELETEITEMSTRUCT)lParam;
			if(ds->CtlID==IDC_GRPSERVICE){
				SERVICELOCATOR*loc=(SERVICELOCATOR*)ds->itemData;
				PrFree(loc);
			}
		}break;
	case WM_DESTROY:
	case WM_CLOSE:
		RegisterEPGNotify(NULL);
	default:return DefWindowProc(hwnd,msgID,wParam,lParam);
	}
	return 0;
}

static void CreateListView(HWND hwnd,int count)
{
	int i;
	LVCOLUMN lc;
	char *titles[]={"Start","Duration","Name","Description"};
	int width[]={120,160,300,100};
	HWND hv=CreateWindowEx(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES,"ListView",NULL,
		WS_TABSTOP|WS_CHILD|WS_VSCROLL|WS_VISIBLE|LVS_SHOWSELALWAYS//|LVS_SINGLESEL
		|LVS_NOCOLUMNHEADER|LVS_REPORT,//|LVS_OWNERDRAWFIXED,
		3,242,592,180,hwnd,(HMENU)IDC_SCHEDULE,NULL,NULL);
	for(i=0;i<4;i++){
		lc.pszText=titles[i];
		lc.cx=width[i];
		lc.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_FMT;
		lc.fmt=i==0?LVCFMT_RIGHT:LVCFMT_LEFT;
		SendMessage(hv,LVM_INSERTCOLUMN,i,(LPARAM)&lc);
	}
	LockWindowUpdate(hv);
	for(i=0;i<count;i++){
		LVITEM lv;
		char tstr[32];		sprintf(tstr,"Test%d",i);
		lv.pszText=tstr;	lv.mask=LVIF_TEXT;
		lv.iSubItem=0;		lv.iItem=i;			
		ListView_InsertItem(hv,&lv);
		lv.iSubItem=1;		ListView_SetItem(hv,&lv);
		lv.iSubItem=2;		ListView_SetItem(hv,&lv);
		lv.iSubItem=3;		ListView_SetItem(hv,&lv);
	}
	
	LockWindowUpdate(NULL);
}
HWND CreateEpgWnd(void)
{
	HWND ch,hweek;
	SERVICELOCATOR lastPlayed;
	int i;
	FAVGROUP*grp;
	SYSTEMTIME tnow;
	HWND epgWnd=CreateMainWindow("EPG Guide",WS_OVERLAPPEDWINDOW,60,20,600,480,EpgWndProc);
	HWND hg=CreateWindow("Select",NULL,WS_TABSTOP|WS_VISIBLE|
		WS_CHILD|WS_BORDER|OPS_NOLABEL,5,1,250,25,epgWnd,(HMENU)IDC_GROUPS,NULL,NULL);
	ch=CreateWindow("Listbox",NULL,WS_TABSTOP|WS_VSCROLL|WS_VISIBLE|WS_CHILD|LBS_OWNERDRAWFIXED|LBS_HASSTRINGS|LBS_NOTIFY|LBS_WRAP,
		5,30,250,180,epgWnd,(HMENU)IDC_GRPSERVICE,NULL,NULL);
	CreateWindow("Static",NULL,WS_VISIBLE|WS_CHILD|WS_BORDER|SS_LEFT,
			5,215,250,25,epgWnd,(HMENU)IDC_DATETIME,NULL,NULL);
	hweek=CreateWindow("Select",NULL,WS_TABSTOP|WS_VISIBLE|WS_CHILD|WS_BORDER|OPS_SHOWARROWALWAYS|OPS_NOLABEL,
		255,215,340,25,epgWnd,(HMENU)IDC_WEEK,NULL,NULL);
	SendMessage(ch,LB_SETITEMHEIGHT,0,MAKELPARAM(30,0));
	CreateWindow("syslink",NULL,WS_VISIBLE|WS_CHILD|WS_BORDER,5,425,590,38,epgWnd,(HMENU)888,NULL,NULL);
	SetDlgItemText(epgWnd,888,"<a href=\"\"> [left right]</a>Change Group<a href=\"\">[up down]</a>Select Service");
#ifdef _WIN32
	CreateListView(epgWnd,200);
#else
	CreateListView(epgWnd,0);
#endif
	grp=GetFirstFavGroup();
	if(grp==NULL)
	{
	    CreateDefaultGroup(1);
	    UpdateAllGroup();
	    grp=GetFirstFavGroup();
	}
	GetCurrentService(&lastPlayed);
	RegisterEPGNotify(epgWnd);
	while(grp){
		if(grp->serviceCount){
			INT idx=SendMessage(hg,OPT_ADDSTRING,0,(LPARAM)grp->name);
			SendMessage(hg,OPT_SETITEMDATA,idx,(LPARAM)grp);
			if(idx==0){
				SendMessage(hg,OPT_SETCURSEL,0,0);
			}
		}
		grp=grp->next;
	}
	
	for(i=0;i<7;i++){
		char str[32];
		sprintf(str,"星期 %d  ",i);
		SendMessage(hweek,OPT_ADDSTRING,0,(LPARAM)str);
	}
	GetLocalTime(&tnow);
	SendMessage(hweek,OPT_SETCURSEL,tnow.wDayOfWeek,0);
	SetTimer(epgWnd,IDT_AD,1000,NULL);
	ShowWindow(epgWnd,SW_SHOW);
	return epgWnd;
}


⌨️ 快捷键说明

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