📄 favorite.c
字号:
// FavoriteEditor.c: implementation of the FavoriteEditor class.
//
//////////////////////////////////////////////////////////////////////
#include "dvbutils.h"
#include"osdcommctrl.h"
#include"keyboard.h"
#define SYNC_DATA 0xB8B8B8B8
#define IDC_GROUPS 100
#define IDC_EDITGRP 101
#define IDC_ADDGRP 102
#define IDC_DELGRP 103
#define IDC_ALLSERVICE 104
#define IDC_GRPSERVICE 105
#define IDC_FAVINFO 200
//static int GetAllService(HWND hwnd,FAVGROUP*fav,int mode);
////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
int GetAllService(HWND hwnd,FAVGROUP*fav)
{//获取分组数据并添加到hwnd说对应的ListBox列表框
int i;
DWORD t1;
SERVICELOCATOR cur;
GetCurrentService(&cur);
if(fav==NULL) return 0;
t1=GetTickCount();
LockWindowUpdate(hwnd);
SendMessage(hwnd,LB_RESETCONTENT,0,0);
SendMessage(hwnd,LB_INITSTORAGE,fav->serviceCount,0);
for(i=0;i<fav->serviceCount&&i<fav->Capacity;i++){
char provider[256],name[256];
SERVICELOCATOR*s=PrMalloc(sizeof(SERVICELOCATOR));
*s=fav->Services[i];
GetServiceName(s,provider,name,NULL);
SendMessage(hwnd,LB_ADDSTRING,0,(LPARAM)name);
SendMessage(hwnd,LB_SETITEMDATA,i,(LPARAM)s);
if( (s->netId==cur.netId) && (s->tsId==cur.tsId)
&& (s->serviceId==cur.serviceId) )
SendMessage(hwnd,LB_SETCURSEL,i,0);
}
LockWindowUpdate(NULL);
TRACE("GetAllService(GRP=%08X) used %d ms\r\n",fav,GetTickCount()-t1);
return fav->serviceCount;
}
static LRESULT WINAPI FavEditProc(HWND hwnd,UINT msgID,WPARAM wParam,LPARAM lParam)
{//分组增删改
switch(msgID){
case WM_DESTROY://这里窗口退出的时候保存对分组的修改
if(GetWindowLong(hwnd,GWL_USERDATA)){
int rc=MessageBox(hwnd,"数据已经被修改,是否保存","Info",MB_OKCANCEL);
if(rc==IDOK){//退出确认数据保存
char data[1024*64];
FILE *f=fopen("fav.dat","wb+");
rc=SaveDVBData((unsigned char*)data);
fwrite(data,rc,1,f);
fclose(f);
}
}
DefWindowProc(hwnd,msgID,wParam,lParam);
break;
case WM_COMMAND:
switch(wParam){
case MAKELONG(IDC_EDITGRP,BN_CLICKED)://编辑按钮单击事件处理
CreateKeyboardWnd();
SetWindowLong(hwnd,GWL_USERDATA,1);
break;
case MAKELONG(IDC_ADDGRP,BN_CLICKED)://添加按钮单击事件处理
{
HWND hg;
int idx;
FAVGROUP*fav=CreateFavGroup("Group",1);
AddFavGroup(fav);
hg=GetDlgItem(hwnd,IDC_GROUPS);
idx=SendMessage(hg,CB_ADDSTRING,0,(LPARAM)fav->name);
SendMessage(hg,CB_SETITEMDATA,idx,(LPARAM)fav);
SendMessage(hg,CB_SETCURSEL,idx,0);
SetWindowLong(hwnd,GWL_USERDATA,1);
}break;
case MAKELONG(IDC_DELGRP,BN_CLICKED):////删除按钮单击事件处理
SetWindowLong(hwnd,GWL_USERDATA,1);
break;
case MAKELONG(IDC_ALLSERVICE,LBN_RETURN):
case MAKELONG(IDC_GRPSERVICE,LBN_RETURN):
{
}break;
}break;
case WM_DELETEITEM:
{
LPDELETEITEMSTRUCT ds=(LPDELETEITEMSTRUCT)lParam;
if(ds->CtlID==IDC_ALLSERVICE){
SERVICELOCATOR*loc=(SERVICELOCATOR*)ds->itemData;
PrFree(loc);
}
}break;
case WM_VKEYTOITEM:
{
UINT vkey = LOWORD(wParam); // virtual-key code
UINT nCaretPos = HIWORD(wParam); // caret position
HWND hwndLB =(HWND)lParam; // handle to list box
HWND hgrp=GetDlgItem(hwnd,IDC_GRPSERVICE);
HWND has=GetDlgItem(hwnd,IDC_ALLSERVICE);
char stxt[64];
DWORD data;
FAVGROUP*fav;
int count=SendMessage(hwndLB,LB_GETCOUNT,0,0);
int index=SendMessage(hwndLB,LB_GETCURSEL,0,0);
SendMessage(hwndLB,LB_GETTEXT,index,(LPARAM)stxt);
data=SendMessage(hwndLB,LB_GETITEMDATA,index,0);
TRACE("WM_VKEYTOIREM hwndLB=%08X Key=%d\r\n",hwndLB,vkey);
if( (count<1) || (index<0) )return -1;
if(GetDlgCtrlID(hwndLB)==IDC_ALLSERVICE){
int idx=SendMessage(hgrp,LB_ADDSTRING,0,(LPARAM)stxt);
SendMessage(hgrp,LB_SETITEMDATA,idx,data);
if(fav)
AddServiceToFavGroup(fav,(SERVICELOCATOR*)data);
SendMessage(has,LB_DELETESTRING,index,0);
}else{
int idx=SendMessage(has,LB_ADDSTRING,0,(LPARAM)stxt);
SendMessage(has,LB_SETITEMDATA,idx,data);
if(fav)
DeleteServiceFromFavGroup(fav,(SERVICELOCATOR*)data);
SendMessage(hgrp,LB_DELETESTRING,index,0);
}
SetWindowLong(hwnd,GWL_USERDATA,1);
}break;
default:return DefWindowProc(hwnd,msgID,wParam,lParam);
}
return 0;
}
HWND CreateFavoriteEditWnd()
{
FAVGROUP*grp;
HWND fav=CreateMainWindow("Favorite Editor",WS_VISIBLE|WS_OVERLAPPEDWINDOW,100,95,500,320,FavEditProc);
HWND hgrps=CreateWindow("Select",NULL,WS_TABSTOP|WS_VISIBLE|WS_BORDER|
WS_CHILD|CBS_DROPDOWNLIST|OPS_NOLABEL,5,5,240,25,fav,(HMENU)IDC_GROUPS,NULL,NULL);
CreateWindow("Button","Edit",WS_TABSTOP|WS_VISIBLE|WS_CHILD,250,5,70,25,fav,(HMENU)IDC_EDITGRP,NULL,NULL);
CreateWindow("Button","Add",WS_TABSTOP|WS_VISIBLE|WS_CHILD|WS_BORDER|BS_CHECKBOX,335,5,70,25,fav,(HMENU)IDC_ADDGRP,NULL,NULL);
CreateWindow("Button","Del",WS_TABSTOP|WS_VISIBLE|WS_CHILD|WS_BORDER|BS_RADIOBUTTON,420,5,70,25,fav,(HMENU)IDC_DELGRP,NULL,NULL);
CreateWindow("Listbox",NULL,WS_TABSTOP|WS_VSCROLL|WS_VISIBLE|WS_BORDER|WS_CHILD|
WS_VSCROLL| LBS_WANTKEYBOARDINPUT|LBS_NOTIFY,5,35,240,250,fav,(HMENU)IDC_ALLSERVICE,NULL,NULL);
//FavServiceEditProc
CreateWindow("Listbox",NULL,WS_TABSTOP|WS_VSCROLL|WS_VISIBLE|WS_BORDER|WS_CHILD|
WS_VSCROLL| LBS_WANTKEYBOARDINPUT|LBS_NOTIFY,250,35,240,250,fav,(HMENU)IDC_GRPSERVICE,NULL,NULL);
//FavServiceEditProc Service of Selected Group
GetAllService(GetDlgItem(fav,IDC_ALLSERVICE),FindFavGroupByID(GROUP_ALL));
grp=GetFirstFavGroup();
while(grp){
if((grp->FavId&BOUQUET_FAVID_PREFIX)){
INT idx=SendMessage(hgrps,OPT_ADDSTRING,0,(LPARAM)grp->name);
SendMessage(hgrps,OPT_SETITEMDATA,idx,(LPARAM)grp);
SendMessage(hgrps,CB_SETCURSEL,0,0);
}
grp=grp->next;
}
return fav;
}
//====================FAVORITE GROUP 选择================
//完成按照分组模式播放节目的功能
static LRESULT WINAPI FavoriteWndProc(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,CB_GETCURSEL,0,0);
HWND hsvc=GetDlgItem(hwnd,IDC_GRPSERVICE);
FAVGROUP*fav=(FAVGROUP*)SendMessage((HWND)lParam,OPT_GETITEMDATA,idx,0);
SendMessage(hsvc,LB_RESETCONTENT,0,0);
GetAllService(hsvc,fav);
}break;
case MAKELONG(IDC_GRPSERVICE,LBN_RETURN):
{//如果选择了新的Service则播出该Service
int idx=SendMessage((HWND)lParam,LB_GETCURSEL,0,0);
if(idx>=0){
SERVICELOCATOR*svr=(SERVICELOCATOR*)SendMessage((HWND)lParam,LB_GETITEMDATA,idx,0);
PlayByService(svr);
}
}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_ERASEBKGND:
FillRect((HDC)wParam,NULL,(HBRUSH)(COLOR_ACTIVEBORDER+4));
return 1;
case WM_KEYDOWN:
switch(wParam){
case VK_LEFT:
case VK_RIGHT:
SendMessage(GetDlgItem(hwnd,IDC_GROUPS),msgID,wParam,lParam);
break;
case VK_UP: //左右键直接发给分组控件,从而减少用户遥控按键次数,
case VK_DOWN: //通过避免焦点转移从而减少用户遥控按键次数
case VK_RETURN:
case VK_PAGE_DOWN:
case VK_PAGE_UP:
SendMessage(GetDlgItem(hwnd,IDC_GRPSERVICE),msgID,wParam,lParam);
break;
default:
if(isdigit(wParam)||isalpha(wParam))
SendMessage(GetDlgItem(hwnd,IDC_GRPSERVICE),WM_CHAR,wParam,lParam);
else
DefWindowProc(hwnd,msgID,wParam,lParam);break;
}break;
case WM_DELETEITEM:
{
LPDELETEITEMSTRUCT ds=(LPDELETEITEMSTRUCT)lParam;
if(ds->CtlID==IDC_GRPSERVICE){
SERVICELOCATOR*loc=(SERVICELOCATOR*)ds->itemData;
PrFree(loc);
}
}break;
default:return DefWindowProc(hwnd,msgID,wParam,lParam);
}
return 0;
}
HWND CreateFavoriteWnd(void)
{//建立并显示分组选择/播出窗口
FAVGROUP*grp;
HWND favWnd,grpWnd,svcWnd;
favWnd=CreateMainWindow("Favorite Service",WS_TABSTOP|WS_OVERLAPPEDWINDOW,
50,50,300,460,FavoriteWndProc);
grpWnd=CreateWindow("Select",NULL,WS_VISIBLE|WS_TABSTOP|WS_BORDER|WS_CHILD
|OPS_NOLABEL,5,5,280,25,favWnd,(HMENU)IDC_GROUPS,NULL,NULL);
svcWnd=CreateWindow("Listbox",NULL,
WS_VISIBLE|WS_TABSTOP|WS_CHILD|LBS_NOTIFY|LBS_HASSTRINGS|LBS_OWNERDRAWFIXED|LBS_WRAP,
5,35,280,320,favWnd,(HMENU)IDC_GRPSERVICE,NULL,NULL);
SendMessage(svcWnd,LB_SETITEMHEIGHT,0,MAKELPARAM(40,0));
CreateWindow("syslink",NULL,WS_VISIBLE|WS_CHILD,5,360,280,60,favWnd,(HMENU)IDC_FAVINFO,NULL,NULL);
SetDlgItemText(favWnd,IDC_FAVINFO,"<a href=\"\"> [left right]</a>Change Group<a href=\"\">[up down]</a>Select Service");
grp=GetFirstFavGroup();
while(grp){//获取所有的分组数据
if(grp->serviceCount){
INT idx=SendMessage(grpWnd,OPT_ADDSTRING,0,(LPARAM)grp->name);
SendMessage(grpWnd,OPT_SETITEMDATA,idx,(LPARAM)grp);
SendMessage(grpWnd,OPT_SETCURSEL,0,0);
}
grp=grp->next;
}
#ifdef _WIN32
while(SendMessage(svcWnd,LB_GETCOUNT,0,0)<18)
{
int cnt=SendMessage(svcWnd,LB_GETCOUNT,0,0);
CHAR txt[64];
sprintf(txt,"Service %d",cnt);
SendMessage(svcWnd,LB_ADDSTRING,0,(LPARAM)txt);
}
#endif
ShowWindow(favWnd,SW_SHOW);
return favWnd;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -