unit main; {$DEFINE DEBUG} interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, OleCtrls, Dialogs, Menus, WMPLib_TLB; type TForm1 = class(TForm) WindowsMediaPlayer1: TWindowsMediaPlayer; MainMenu1: TMainMenu; mniFile: TMenuItem; mniFile_OpenFile: TMenuItem; mniFile_Info: TMenuItem; N1: TMenuItem; mniFile_Exit: TMenuItem; mniDVD: TMenuItem; mniDVD_MenuTitle: TMenuItem; mniDVD_MenuRoot: TMenuItem; mniDVD_Chapter: TMenuItem; N2: TMenuItem; mniDVD_MenuResume: TMenuItem; mniDVD_MenuBack: TMenuItem; N3: TMenuItem; mniDVD_Audio: TMenuItem; mniOpt: TMenuItem; mniOpt_OriginalSize: TMenuItem; OpenDialog1: TOpenDialog; procedure FormCreate (Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormResize (Sender: TObject); procedure mniFile_OpenFileClick(Sender: TObject); procedure mniFile_InfoClick(Sender: TObject); procedure mniFile_ExitClick(Sender: TObject); procedure mniDVD_MenuTitleClick(Sender: TObject); procedure mniDVD_MenuRootClick(Sender: TObject); procedure mniDVD_MenuResumeClick(Sender: TObject); procedure mniDVD_MenuBackClick(Sender: TObject); procedure mniDVD_ChapterClick(Sender: TObject); procedure mniDVD_AudioClick(Sender: TObject); procedure WindowsMediaPlayer1DomainChange(Sender: TObject; const strDomain: WideString); procedure WindowsMediaPlayer1OpenStateChange(Sender: TObject; NewState: Integer); procedure WindowsMediaPlayer1PlayStateChange(Sender: TObject; NewState: Integer); private { Private 宣言 } protected procedure WndProc(var Msg: TMessage); override; public { Public 宣言 } end; var Form1: TForm1; implementation uses {$IFDEF DEBUG} myDebug, {$ENDIF} general; {$R *.dfm} //メニューを開いたときの動作 procedure TForm1.WndProc(var Msg: TMessage); //Playlistにはチャプターだけでなくタイトルも格納されるのでタイトルとチャプターを区別する function lfnb_IsChapter(sFile: WideString): Boolean; var ls_Str: WideString; i, li_Pos: Integer; begin Result := False; if (gfnbMediaIsDVD(sFile)) then begin //DVD ls_Str := Copy(sFile, 10, MAXINT); //ドライブ、タイトルを除去 for i := 1 to 2 do begin li_Pos := Pos('/', ls_Str); if (li_Pos = 0) then begin Exit; end else begin ls_Str := Copy(ls_Str, li_Pos +1, MAXINT); end; end; li_Pos := Pos('?', ls_Str); if (li_Pos > 0) then begin ls_Str := Copy(ls_Str, 1, li_Pos -1); end; try //エラーにならなければチャプター StrToInt(ls_Str); Result := True; except end; end; end; var i, li_Width: Integer; l_Dvd: IWMPDvd; l_NewControls: IWMPControls3; begin if (Msg.Msg = WM_INITMENU) and (Msg.WParam = wParam(Menu.Handle)) then begin //DVD l_Dvd := IWMPPlayer4(WindowsMediaPlayer1.ControlInterface).dvd; // mniDVD.Enabled := l_Dvd.isAvailable['dvd'] and F_Dvd.isAvailable['dvdDecoder']; mniDVD_MenuTitle.Enabled := l_Dvd.isAvailable['titleMenu']; mniDVD_MenuRoot.Enabled := l_Dvd.isAvailable['topMenu']; mniDVD_MenuResume.Enabled := l_Dvd.isAvailable['resume']; mniDVD_MenuBack.Enabled := l_Dvd.isAvailable['back']; //チャプター gpcMenuSubMenuFree(mniDVD_Chapter); mniDVD_Chapter.Enabled := l_Dvd.isAvailable['dvd'] and (WindowsMediaPlayer1.currentPlaylist.count > 0); if (mniDVD_Chapter.Enabled) then begin li_Width := Length(IntToStr(WindowsMediaPlayer1.currentPlaylist.count -1)); //チャプターは1から始まる for i := 1 to WindowsMediaPlayer1.currentPlaylist.count do begin if (lfnb_IsChapter(WindowsMediaPlayer1.currentPlaylist.Item[i-1].sourceURL)) then begin mniDVD_Chapter.Add(NewItem( Format('%*d %s', [li_Width, i, WindowsMediaPlayer1.currentPlaylist.Item[i-1].name]), 0, False, True, mniDVD_ChapterClick, 0, Format('mniDVD_Chapter_%d', [i]) )); //プレイリストのインデックスをTagにセット with mniDVD_Chapter.Items[i-1] do begin Tag := (i-1); RadioItem := True; Checked := WindowsMediaPlayer1.currentMedia.isIdentical[WindowsMediaPlayer1.currentPlaylist.Item[i-1]]; end; end; end; end; //音声 gpcMenuSubMenuFree(mniDVD_Audio); l_NewControls := IWMPControls3(WindowsMediaPlayer1.controls); mniDVD_Audio.Enabled := (l_NewControls.audioLanguageCount > 1); if (mniDVD_Audio.Enabled) then begin li_Width := Length(IntToStr(l_NewControls.audioLanguageCount)); //音声メニューは1から始まる for i := 1 to l_NewControls.audioLanguageCount do begin mniDVD_Audio.Add(NewItem( Format('%*d %s %s', [li_Width, i, l_NewControls.getLanguageName(l_NewControls.getAudioLanguageID(i)), l_NewControls.getAudioLanguageDescription(i)]), 0, False, True, mniDVD_AudioClick, 0, Format('mniDVD_Audio_%d', [i-1]) )); with mniDVD_Audio.Items[i-1] do begin Tag := i; AutoCheck := True; RadioItem := True; Checked := (i = l_NewControls.currentAudioLanguageIndex); end; end; end; end; inherited; end; procedure TForm1.FormCreate(Sender: TObject); begin {$IFDEF DEBUG} myDebug.gpcProcessMessages(False); {$ENDIF} WindowsMediaPlayer1.Align := alClient; Tag := 1; end; //破棄 procedure TForm1.FormDestroy(Sender: TObject); begin Tag := 0; end; //リサイズ procedure TForm1.FormResize(Sender: TObject); begin gpcWMPSetBounds(WindowsMediaPlayer1, WindowsMediaPlayer1.BoundsRect); end; //開く procedure TForm1.mniFile_OpenFileClick(Sender: TObject); //var // ls_File: WideString; begin // if (gfnbOpenFileDialog(ls_File)) then begin if (OpenDialog1.Execute) then begin // WindowsMediaPlayer1.currentPlaylist.appendItem(IWMPPlayer4(WindowsMediaPlayer1.ControlInterface).newMedia(ls_File)); // WindowsMediaPlayer1.controls.playItem(WindowsMediaPlayer1.currentPlaylist.Item[0]); WindowsMediaPlayer1.URL := OpenDialog1.FileName; WindowsMediaPlayer1.controls.play; end; end; //情報 {$WARN SYMBOL_PLATFORM OFF} procedure TForm1.mniFile_InfoClick(Sender: TObject); var i, k, li_Width: Integer; ls_Name: WideString; l_Media: IWMPMedia3Disp; begin if not(Assigned(WindowsMediaPlayer1.currentMedia)) then Exit; l_Media := IWMPMedia3Disp(WindowsMediaPlayer1.currentMedia); li_Width := Length(IntToStr(l_Media.attributeCount -1)); for i := 0 to l_Media.attributeCount -1 do begin ls_Name := l_Media.getAttributeName(i); myDebug.gpcDebugAdd(WideFormat('%*d %s %s %s', [li_Width, i, ls_Name, l_Media.getItemInfo(ls_Name), l_Media.getItemInfoByAtom(i)])); if (l_Media.getAttributeCountByType(ls_Name, '') > 1) then begin for k := 0 to l_Media.getAttributeCountByType(ls_Name, '') -1 do begin myDebug.gpcDebugAdd(WideFormat(' %2d %s', [k, TrimLeft(l_Media.getItemInfoByType(ls_Name, '', k))])); end; end; end; end; {$WARN SYMBOL_PLATFORM ON} //終了 procedure TForm1.mniFile_ExitClick(Sender: TObject); begin Close; end; //タイトルメニュー procedure TForm1.mniDVD_MenuTitleClick(Sender: TObject); begin IWMPPlayer4(WindowsMediaPlayer1.ControlInterface).dvd.titleMenu; end; //ルートメニュー procedure TForm1.mniDVD_MenuRootClick(Sender: TObject); begin IWMPPlayer4(WindowsMediaPlayer1.ControlInterface).dvd.topMenu; end; //レジューム procedure TForm1.mniDVD_MenuResumeClick(Sender: TObject); begin IWMPPlayer4(WindowsMediaPlayer1.ControlInterface).dvd.resume; end; //戻る procedure TForm1.mniDVD_MenuBackClick(Sender: TObject); begin IWMPPlayer4(WindowsMediaPlayer1.ControlInterface).dvd.back; end; //チャプター再生 procedure TForm1.mniDVD_ChapterClick(Sender: TObject); begin WindowsMediaPlayer1.controls.currentItem := WindowsMediaPlayer1.currentPlaylist.Item[TComponent(Sender).Tag]; end; //音声変更 procedure TForm1.mniDVD_AudioClick(Sender: TObject); begin IWMPControls3(WindowsMediaPlayer1.controls).currentAudioLanguageIndex := TComponent(Sender).Tag; end; procedure TForm1.WindowsMediaPlayer1DomainChange(Sender: TObject; const strDomain: WideString); begin {$IFDEF DEBUG} if (Tag = 0) then Exit; myDebug.gpcDebugAdd('DomainChange', strDomain); {$ENDIF} end; procedure TForm1.WindowsMediaPlayer1OpenStateChange(Sender: TObject; NewState: Integer); const lci_WMPHEIGHT = 64; //WindowsMediaPlayerのコントロール部分の高さ(多分64で固定) begin if (Tag = 0) then Exit; {$IFDEF DEBUG} myDebug.gpcDebugAddOpenState(NewState); {$ENDIF} if (NewState = wmposMediaOpen) then begin if (mniOpt_OriginalSize.Checked) and (WindowsMediaPlayer1.currentMedia.imageSourceWidth > 0) and (WindowsMediaPlayer1.currentMedia.imageSourceHeight > 0) then begin Self.SetBounds( Left, Top, WindowsMediaPlayer1.currentMedia.imageSourceWidth + (Width - ClientWidth), WindowsMediaPlayer1.currentMedia.imageSourceHeight + (Height - ClientHeight + lci_WMPHEIGHT) ); end; end; end; procedure TForm1.WindowsMediaPlayer1PlayStateChange(Sender: TObject; NewState: Integer); begin {$IFDEF DEBUG} if (Tag = 0) then Exit; myDebug.gpcDebugAddOpenState(NewState); {$ENDIF} end; end.