📄 interface.cpp
字号:
//
// for( int i=0; i<MAX_BUTTONS; i++ ) {
// SetWindowPos(p->ga_pSkinBtns[i]->GetSafeHwnd(),HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_SHOWWINDOW);
// }
DeferWindowPos( hDwp, p->WndTitle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_SHOWWINDOW);
DeferWindowPos( hDwp, p->WndTrack,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_SHOWWINDOW);
DeferWindowPos( hDwp, p->WndVol,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_SHOWWINDOW);
DeferWindowPos( hDwp, p->WndPlayList,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_SHOWWINDOW);
for( int i=0; i<MAX_BUTTONS; i++ ) {
DeferWindowPos( hDwp, p->ga_pSkinBtns[i]->GetSafeHwnd(),HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_SHOWWINDOW);
}
::EndDeferWindowPos( hDwp );
} else {
ShowWindow( p->WndTitle, SW_HIDE);
ShowWindow( p->WndTrack, SW_HIDE);
ShowWindow( p->WndVol, SW_HIDE);
ShowWindow( p->WndPlayList, SW_HIDE);
for( int i=0; i<MAX_BUTTONS; i++ ) {
ShowWindow(p->ga_pSkinBtns[i]->GetSafeHwnd(), SW_HIDE);
}
}
// SendMessage( (HWND)p->Win.Wnd, WM_SETREDRAW, TRUE, 0 );
}
//调整各控件的位置
static void Resize(intface* p)
{
RECT r;
bool_t Rotated = IsOrientationChanged();
DEBUG_MSG(DEBUG_VIDEO,T("Resize begin"));
if (Rotated) {
p->Player->Set(p->Player,PLAYER_ROTATEBEGIN,NULL,0);
p->Player->Set(p->Player,PLAYER_RESETVIDEO,NULL,0);
if (!p->Win.ToolBarHeight) {
p->VolResizeNeeded2 = 1; // toolbar position may change later
if (p->WndVol && IsWindowVisible(p->WndVol)) { //if (p->WndVolBack && IsWindowVisible(p->WndVolBack))
ShowVol(p,0);
p->VolResizeNeeded2 = 2;
}
ShowSkinButtons( p, 0 );
} else {
p->VolResizeNeeded = 1;
}
if (p->Win.FullScreen) {
PostMessage((HWND)p->Win.Wnd,MSG_PLAYER,PLAYER_FULLSCREEN,0);
}
}
p->Offset.x = 0;
p->Offset.y = 0;
ClientToScreen((HWND)p->Win.Wnd,&p->Offset);
if (!p->Win.FullScreen) {
#if !defined(TARGET_WINCE) && defined(MAXIMIZE_FULLSCREEN)
WINDOWPLACEMENT Place;
Place.length = sizeof(Place);
GetWindowPlacement(p->Win.Wnd,&Place);
if (Place.showCmd != SW_MAXIMIZE)
#endif
{
GetClientRect((HWND)p->Win.Wnd,&r);
if (r.right != p->ClientRect.right || r.bottom != p->ClientRect.bottom) {
bool_t Skin = p->Skin[p->SkinNo].Valid;
int TrackHeight = 0;
p->TitleHeight = 0;
p->ClientRect = r;
r.top += p->Win.ToolBarHeight;
if (p->WndTrack) { //播放进度条
int nThumb = WinUnitToPixelY(&p->Win, p->pTrackSlider->m_rcThumbPicSelArea.bottom );
SendMessage(p->WndTrack, TBM_SETTHUMBLENGTH, nThumb, 0);
if (p->TrackThumb != nThumb)
{
p->TrackThumb = nThumb; // avoid calling this regulary because it shows the trackbar
}
}
if (p->WndTitle) { //标题条
p->TitleTimeWidth = 0;
p->TitleFontSize = 9;//TITLEFONT;
p->TitleFont = (HFONT)WinFont(&p->Win,&p->TitleFontSize,0);
p->TitleHeight = WinUnitToPixelY(&p->Win,8); //WinUnitToPixelY(&p->Win,TITLEHEIGHT);
p->TitleBorder = WinUnitToPixelX(&p->Win,1); //3);
p->TitleWidth = p->rtTitle.right - p->rtTitle.left;//r.right - r.left;
if (Skin) {
skinitem* i = &p->Skin[p->SkinNo].Item[SKIN_TITLE];
p->TitleWidth = i->Rect.Width;
p->TitleHeight = i->Rect.Height;
MoveWindow(p->WndTitle,r.left + i->Rect.x,r.top + i->Rect.y,p->TitleWidth,p->TitleHeight,TRUE);
} else {
if (p->Win.ToolBarHeight) {
r.bottom -= p->TitleHeight;
MoveWindow(p->WndTitle,r.left,r.bottom,p->TitleWidth,p->TitleHeight,TRUE);
} else {
MoveWindow(p->WndTitle,r.left,r.top,p->TitleWidth,p->TitleHeight,TRUE);
r.top += p->TitleHeight;
}
}
p->TitleTop = (p->TitleHeight-WinUnitToPixelY(&p->Win,p->TitleFontSize))/2;
//add by zy
MoveWindow(p->WndTitle, p->rtTitle.left, p->rtTitle.top,
p->rtTitle.right - p->rtTitle.left, p->rtTitle.bottom - p->rtTitle.top,
TRUE);
/////////////////////////////////////////////////////////////////////////////////////////////
}
//add by zy
if( p->WndVol ) {
int nThumb = WinUnitToPixelY(&p->Win, p->pVolSlider->m_rcThumbPicSelArea.bottom );
SendMessage(p->WndVol, TBM_SETTHUMBLENGTH, nThumb, 0);
}
/////////////////////////////////////////////////////////////////////////////////////////////
//add by zy
if (p->WndPlayList) { //播放列表
p->PLFontSize = 8;//9;//TITLEFONT;
p->PLFont = (HFONT)WinFont(&p->Win,&p->PLFontSize,0);
MoveWindow(p->WndPlayList, p->rtPlayList.left, p->rtPlayList.top, p->rtPlayList.right - p->rtPlayList.left, p->rtPlayList.bottom - p->rtPlayList.top, TRUE);
/////////////////////////////////////////////////////////////////////////////////////////////
}
p->SkinArea.x = r.left;
p->SkinArea.y = r.top;
p->SkinArea.Width = r.right - r.left;
p->SkinArea.Height = r.bottom - r.top;
//test 测试改变播放区域
//p->SkinArea.x += 50;
//p->SkinArea.y += 50;
//p->SkinArea.Width -= 100;
//p->SkinArea.Height -= 90;
p->SkinArea.x = p->DispAreaRect.left;
p->SkinArea.y = p->DispAreaRect.top;
p->SkinArea.Width = p->DispAreaRect.right - p->DispAreaRect.left;
p->SkinArea.Height= p->DispAreaRect.bottom - p->DispAreaRect.top;
if (!Skin) {
p->SkinViewport = p->SkinArea;
} else {
p->SkinViewport = p->Skin[p->SkinNo].Item[SKIN_VIEWPORT].Rect;
p->SkinViewport.x += p->SkinArea.x;
p->SkinViewport.y += p->SkinArea.y;
}
if (p->Win.ToolBarHeight && !p->VolResizeNeeded) {
ResizeVolume(p);
}
}
p->Viewport = p->SkinViewport;
p->Viewport.x += p->Offset.x;
p->Viewport.y += p->Offset.y;
p->Player->Set(p->Player,PLAYER_SKIN_VIEWPORT,&p->Viewport,sizeof(rect));
p->Player->Set(p->Player,PLAYER_UPDATEVIDEO,NULL,0);
if (p->VolResizeNeeded) {
ResizeVolume(p);
p->VolResizeNeeded = 0;
}
}
} else {
GetClientRect((HWND)p->Win.Wnd,&r);
p->Viewport.x = r.left + p->Offset.x;
p->Viewport.y = r.top + p->Offset.y;
p->Viewport.Width = r.right - r.left;
p->Viewport.Height = r.bottom - r.top;
}
if (Rotated) {
p->Player->Set(p->Player,PLAYER_ROTATEEND,NULL,0);
}
DEBUG_MSG4(DEBUG_VIDEO,T("Resize end %d,%d,%d,%d"),p->Viewport.x,p->Viewport.y,p->Viewport.Width,p->Viewport.Height);
}
static BOOL CALLBACK EnumCheck(HWND Wnd, LPARAM lParam )
{
intface* p = (intface*) lParam;
RECT r;
if (Wnd == p->Win.Wnd)
return 0;
if (IsWindowVisible(Wnd))
{
GetWindowRect(Wnd,&r);
if (p->Viewport.x < r.right &&
p->Viewport.x + p->Viewport.Width > r.left &&
p->Viewport.y < r.bottom &&
p->Viewport.y + p->Viewport.Height > r.top)
{
p->Overlap = 1;
return 0;
}
}
return 1;
}
static void UpdateHotKey(intface* p,bool_t State,bool_t NoKeep)
{
int i;
if (!p->AllKeys)
{
for (i=0;i<HOTKEYCOUNT;++i)
if (p->HotKey[i])
{
if (State)
{
if (!WinEssentialKey(p->HotKey[i]))
WinRegisterHotKey(&p->Win,HotKey[i],p->HotKey[i]);
}
else
if (NoKeep || !(p->HotKey[i] & HOTKEY_KEEP))
WinUnRegisterHotKey(&p->Win,HotKey[i]);
else
if (WinEssentialKey(p->HotKey[i])) //essential keys -> register in the background
WinRegisterHotKey(&p->Win,HotKey[i],p->HotKey[i]);
}
}
else
{
WinAllKeys(State);
if (!State && !NoKeep)
for (i=0;i<HOTKEYCOUNT;++i)
if (p->HotKey[i] & HOTKEY_KEEP)
WinRegisterHotKey(&p->Win,HotKey[i],p->HotKey[i]);
}
}
static void UpdateSleepTimer(intface* p)
{
#if defined(TARGET_WINCE)
if (p->Play>0 || p->FFwd>0)
{
SleepTimerReset();
SetTimer((HWND)p->Win.Wnd,TIMER_SLEEP,SLEEP_CYCLE,NULL);
}
else
KillTimer((HWND)p->Win.Wnd,TIMER_SLEEP);
#endif
}
static void UpdateTitleScroll(intface* p)
{
if (p->Focus && p->TitleNameSize < p->TitleNameWidth)
{
if (p->TitleNameOffset >= p->TitleNameWidth - p->TitleNameSize)
p->TitleNameOffset = p->TitleNameWidth - p->TitleNameSize;
SetTimer((HWND)p->Win.Wnd,TIMER_TITLESCROLL,TITLESCROLL_CYCLE,NULL);
}
else
{
p->TitleNameOffset = 0;
p->ScrollMode = 0;
KillTimer((HWND)p->Win.Wnd,TIMER_TITLESCROLL);
}
}
static void TitleScroll(intface* p)
{
if (p->ScrollMode<TITLESCROLL_WAIT)
++p->ScrollMode;
else
if (p->ScrollMode==TITLESCROLL_WAIT)
{
p->TitleNameOffset += 3;
if (p->TitleNameOffset >= p->TitleNameWidth - p->TitleNameSize)
{
p->TitleNameOffset = p->TitleNameWidth - p->TitleNameSize;
++p->ScrollMode;
}
InvalidateRect(p->WndTitle,NULL,1);
}
else
if (p->ScrollMode<TITLESCROLL_WAIT*2+1)
++p->ScrollMode;
else
{
p->TitleNameOffset -= 3;
if (p->TitleNameOffset<=0)
{
p->TitleNameOffset=0;
p->ScrollMode = 0;
}
InvalidateRect(p->WndTitle,NULL,1);
}
UpdateTitleScroll(p);
}
static bool_t ShowVideo(intface* p)
{
bool_t b = p->Focus;
if (!b)
p->Player->Get(p->Player,PLAYER_SHOWINBACKGROUND,&b,sizeof(b));
return b;
}
static void UpdateClippingTimer(intface* p)
{
if (p->Clipping && ShowVideo(p))
SetTimer((HWND)p->Win.Wnd,TIMER_CLIPPING,CLIPPING_CYCLE,NULL);
else
KillTimer((HWND)p->Win.Wnd,TIMER_CLIPPING);
}
static bool_t IsOverlay(intface* p)
{
bool_t b = 0;
p->Player->Get(p->Player,PLAYER_VIDEO_OVERLAY,&b,sizeof(b));
return b;
}
static bool_t IsOverlapped(intface* p)
{
if (!p->Win.FullScreen || p->Wait)
{
// check for overlapping top-level windows
p->Overlap = 0;
EnumWindows(EnumCheck,(LPARAM)p);
if (p->Overlap)
return 1;
}
return 0;
}
static void UpdateClipping(intface* p,bool_t Suggest,bool_t HotKey)
{
if (p->Clipping != Suggest)
{
KillTimer((HWND)p->Win.Wnd,TIMER_CLIPPING2);
if (!Suggest && IsOverlapped(p))
return; // overlapping window -> clipping still needed
p->Clipping = Suggest;
p->Player->Set(p->Player,PLAYER_CLIPPING,&p->Clipping,sizeof(bool_t));
if (HotKey)
UpdateHotKey(p,!p->Clipping,0);
UpdateClippingTimer(p);
}
}
static void RefreshButton(intface* p,int No,bool_t* State,int Id,int Off,int On)
{
int i;
bool_t b;
if (p->Player->Get(p->Player,No,&b,sizeof(b)) != ERR_NONE)
b = -1;
switch (No)
{
case PLAYER_PLAY: i = SKIN_PLAY; break;
case PLAYER_FFWD: i = SKIN_FFWD; break;
case PLAYER_MUTE: i = SKIN_MUTE; break;
case PLAYER_FULLSCREEN: i = SKIN_FULLSCREEN; break;
case PLAYER_REPEAT: i = SKIN_REPEAT; break;
default: i = -1; break;
}
if (i>=0 && p->Skin[p->SkinNo].Item[i].Pushed != b)
{
p->Skin[p->SkinNo].Item[i].Pushed = b;
SkinDrawItem(p->Skin+p->SkinNo,p->Win.Wnd,i,&p->SkinArea);
}
//令按钮状态更新
int n;
switch (No)
{
case PLAYER_PLAY:
n = GetButtonInfoIndex(IF_PLAYPAUSE); break;
//case PLAYER_FFWD:
// n = GetButtonInfoIndex(IF_FASTFORWARD); break;
case PLAYER_MUTE:
n = GetButtonInfoIndex(IF_OPTIONS_MUTE); break;
case PLAYER_FULLSCREEN:
n = GetButtonInfoIndex(IF_OPTIONS_FULLSCREEN); break;
case PLAYER_REPEAT:
n = GetButtonInfoIndex(IF_OPTIONS_REPEAT); break;
case PLAYER_SHUFFLE:
n = GetButtonInfoIndex(IF_OPTIONS_SHUFFLE); break;
default: n = -1; break;
}
if( n>=0 && n<MAX_BUTTONS ) {
CQSkinButton* pBtn = p->ga_pSkinBtns[n];
if( pBtn ) {
pBtn->SetCheck( (int)b );
}
}
if (State && b != *State)
{
if (b == -1 || *State == -1)
SendMessage((HWND)p->Win.WndTB,TB_ENABLEBUTTON,Id,MAKELPARAM(b!=-1,0));
*State = b;
if (b != -1)
{
SendMessage((HWND)p->Win.WndTB,TB_CHECKBUTTON,Id,MAKELPARAM(b,0));
if (On>=0)
SendMessage((HWND)p->Win.WndTB,TB_CHANGEBITMAP,Id,MAKELPARAM(p->Win.BitmapNo+(b?On:Off),0));
}
}
}
static void SetTrackThumb(HWND Wnd, bool_t State)
{ //return; //暂时
int Style = GetWindowLong(Wnd,GWL_STYLE);
if ((Style & TBS_NOTHUMB) != (State?0:TBS_NOTHUMB))
{
Style ^= TBS_NOTHUMB;
SetWindowLong(Wnd,GWL_STYLE,Style);
}
}
static void UpdateTitleTime(intface* p)
{
if (p->WndTitle)
{
tick_t Time;
if (p->Player->Get(p->Player,PLAYER_POSITION,&Time,sizeof(tick_t)) == ERR_NONE)
{
Time = (Time / TICKSPERSEC) * TICKSPERSEC;
if (Time<0)
Time=0;
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -