{mRadio frame}
const
  frm_back:pAnsiChar = 'Frame background';
const
  FrameWnd:HWND = 0;
  FrameId:integer = -1;
  OldEditProc:pointer=nil;
  pattern:pWideChar=nil;
  current: THANDLE = 0;
var
  FrameCtrl:PControl;
  colorhook:THANDLE;
  hbr:HBRUSH;
  frm_bkg:TCOLORREF;

function RadioFrameProc( Sender: PControl; var Msg: TMsg; var Rslt:Integer ): boolean;
begin
  result:=false;
  rslt:=0;

  case Msg.message of

    WM_DESTROY: begin
      hVolFrmCtrl:=0;
      DeleteObject(hbr);
    end;

    WM_SHOWWINDOW: begin
      Rslt:=1;
      with Sender^ do
        hVolFrmCtrl:=Children[1].Handle;
    end;

    WM_CTLCOLORSTATIC: begin
//      SetBkColor(msg.wParam, frm_bkg);
      Rslt:=hbr;
      result:=True;
    end;

    WM_CONTEXTMENU: begin
      CallService('mRadio/Settings',0,0);
    end;

    WM_HSCROLL: begin
       case loword(msg.wParam) of
         SB_THUMBTRACK: begin
//           gVolume:=Hiword(msg.wParam);
           Service_RadioSetVolume(Hiword(msg.wParam){gVolume},2);
         end;
         SB_ENDSCROLL: begin
//           gVolume:=SendMessage(msg.lParam,TBM_GETPOS,0,0);
           Service_RadioSetVolume({Hiword(msg.wParam)}SendMessage(msg.lParam,TBM_GETPOS,0,0){gVolume},2)
         end;
       end;
    end;

  end;
end;

function DoAction(action:integer):integer;
begin
  result:=Service_RadioMute(0,1);
end;

function ColorReload(wParam:WPARAM;lParam:LPARAM):int;cdecl;
var
  cid:TColourID;
//  wnd:HWND;
//  i:integer;
begin
  result:=0;
  cid.cbSize:=SizeOf(cid);
  StrCopy(cid.group,cPluginName);
  StrCopy(cid.name ,frm_back);
  frm_bkg:=CallService(MS_COLOUR_GETA,dword(@cid),0);
  if hbr<>0 then DeleteObject(hbr);
  hbr:=CreateSolidBrush(frm_bkg);

  FrameCtrl.Children[1].Width := FrameCtrl.Children[1].Width-1;
  FrameCtrl.Children[1].Width := FrameCtrl.Children[1].Width+1;

  FrameCtrl.InvalidateEx;
  FrameCtrl.Update;
end;

function GetIcon(action:integer;stat:integer=AST_NORMAL):cardinal;
begin
  case stat of
    AST_NORMAL : result:=CallService(MS_SKIN2_GETICON,0,dword(IcoBtnOn));
    AST_PRESSED: result:=CallService(MS_SKIN2_GETICON,0,dword(IcoBtnOff));
  else
    result:=0;
  end;
end;

procedure MyErase(DummySelf, Sender:PControl; DC:HDC);
begin
end;

procedure MyEraseFrame(DummySelf, Sender:PControl; DC:HDC);
var
  rc:TRECT;
begin
  GetClientRect(Sender.Handle, rc);
  Sender.Canvas.Brush.Color := frm_bkg;
  Sender.Canvas.FillRect(rc);
end;

function CreateFrameWindow(parent:HWND):THANDLE;
var
  TB:PTrackbar;
begin
  result:=0;

  FrameCtrl:=NewAlienPanel(parent,esNone);
  if FrameCtrl<>nil then
  begin
    result:=FrameCtrl.GetWindowHandle;
    with FrameCtrl^ do
    begin
      // Button
      btnMute:=CreateIcoButton(FrameCtrl,GetIcon,DoAction,IDC_RADIO_MUTE);
      with btnMute^ do
      begin
        SetSize(16,16);
        SetPosition(FrameCtrl.Width-18,0);
        Anchor(false,true,true,false);

        AsCheckbox:=true;
      end;

      // Trackbar
      TB:=NewTrackbar(FrameCtrl,[trbTooltips,trbNoTicks,trbBoth,trbNoBorder],nil);
      with TB^ do
      begin
        SetSize(FrameCtrl.Width-24,18);
        SetPosition(2,0);
        Anchor(true,true,true,false);

        RangeMin:=0;
        RangeMax:=100;
        PageSize:=20;

        OnEraseBkGnd:=TOnPaint(MakeMethod(nil, @MyErase));
      end;

      AttachProc(@RadioFrameProc);
    end;

    with FrameCtrl^ do
    begin
      MinWidth :=80;
      MinHeight:=20;
      Height:=18;
      Anchor(true,true,true,true);
//      OnMessage:=TOnMessage(MakeMethod(nil, @MyEraseFrame));
      OnEraseBkGnd:=TOnPaint(MakeMethod(nil, @MyEraseFrame));
{
      OnPaint    :=FrameCtrl.Paint;
      OnResize   :=FrameCtrl.FrameResize;
      OnMouseDown:=FrameCtrl.MouseDown;
}
    end;
  end;
end;

procedure CreateFrame(parent:HWND);
var
  Frame:TCLISTFrame;
//  wnd:HWND;
//  tmp:cardinal;
  tr:TRECT;
  cid:TColourID;
begin
  if ServiceExists(MS_CLIST_FRAMES_ADDFRAME)=0 then
    exit;
  if parent=0 then
    parent:=CallService(MS_CLUI_GETHWND,0,0);

  FrameWnd:=CreateFrameWindow(parent);

  if FrameWnd<>0 then
  begin
    GetWindowRect(FrameWnd,tr);
    FillChar(Frame,SizeOf(Frame),0);
    with Frame do
    begin
      cbSize  :=SizeOf(Frame);
      hWnd    :=FrameWnd;
      hIcon   :=0;
      align   :=alTop;
      height  :=tr.bottom-tr.top+2;
      if IsAnsi then
      begin
        Flags   :=F_VISIBLE or F_NOBORDER;
        name.a  :=cPluginName;
        TBName.a:=cPluginName + ' volume control';
      end
      else
      begin
        Flags   :=F_VISIBLE or F_NOBORDER or F_UNICODE;
        name.w  :=cPluginName;
        TBName.w:=cPluginName + ' volume control';
      end;
    end;

    FrameId:=CallService(MS_CLIST_FRAMES_ADDFRAME,dword(@Frame),0);
    if FrameId>=0 then
    begin
      CallService(MS_CLIST_FRAMES_UPDATEFRAME,FrameId, FU_FMPOS);

      cid.cbSize:=SizeOf(cid);
      cid.flags :=0;
      StrCopy(cid.group,cPluginName);
      StrCopy(cid.dbSettingsGroup,cPluginName);

      StrCopy(cid.name   ,frm_back);
      StrCopy(cid.setting,'frame_back');
      cid.defcolour:=COLOR_3DFACE;
      cid.order    :=0;
      ColourRegister(@cid);

      hbr:=0;
      colorhook:=HookEvent(ME_COLOUR_RELOAD,@ColorReload);
      ColorReload(0,0);
      Service_RadioSetVolume(gVolume,0);
    end;
  end;
end;

procedure DestroyFrame;
begin
  if FrameId>=0 then
  begin
    UnhookEvent(colorhook);
    CallService(MS_CLIST_FRAMES_REMOVEFRAME,FrameId,0);
    FrameId:=-1;
  end;
  FrameCtrl.Free;
  //  DestroyWindow(FrameWnd);
  FrameWnd:=0;
end;