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

📄 favorite.c

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