📄 epgwnd.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 + -