00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "stdafx.h"
00026 #include "mplayerc.h"
00027 #include "PlayerInfoBar.h"
00028 #include "MainFrm.h"
00029
00030
00031
00032
00033 IMPLEMENT_DYNAMIC(CPlayerInfoBar, CDialogBar)
00034 CPlayerInfoBar::CPlayerInfoBar(int nFirstColWidth) : m_nFirstColWidth(nFirstColWidth)
00035 {
00036 }
00037
00038 CPlayerInfoBar::~CPlayerInfoBar()
00039 {
00040 }
00041
00042 void CPlayerInfoBar::SetLine(CString label, CString info)
00043 {
00044 if(info.IsEmpty())
00045 {
00046 RemoveLine(label);
00047 return;
00048 }
00049
00050 for(size_t idx = 0; idx < m_label.GetCount(); idx++)
00051 {
00052 CString tmp;
00053 m_label[idx]->GetWindowText(tmp);
00054 if(label == tmp)
00055 {
00056 m_info[idx]->GetWindowText(tmp);
00057 if(info != tmp) m_info[idx]->SetWindowText(info);
00058 return;
00059 }
00060 }
00061
00062 CAutoPtr<CStatusLabel> l(new CStatusLabel(true, false));
00063 l->Create(label, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|SS_OWNERDRAW, CRect(0,0,0,0), this);
00064 m_label.Add(l);
00065
00066 CAutoPtr<CStatusLabel> i(new CStatusLabel(false, true));
00067 i->Create(info, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|SS_OWNERDRAW, CRect(0,0,0,0), this);
00068 m_info.Add(i);
00069
00070 Relayout();
00071 }
00072
00073 void CPlayerInfoBar::GetLine(CString label, CString& info)
00074 {
00075 info.Empty();
00076
00077 for(size_t idx = 0; idx < m_label.GetCount(); idx++)
00078 {
00079 CString tmp;
00080 m_label[idx]->GetWindowText(tmp);
00081 if(label == tmp)
00082 {
00083 m_info[idx]->GetWindowText(tmp);
00084 info = tmp;
00085 return;
00086 }
00087 }
00088 }
00089
00090 void CPlayerInfoBar::RemoveLine(CString label)
00091 {
00092 for(size_t i = 0; i < m_label.GetCount(); i++)
00093 {
00094 CString tmp;
00095 m_label[i]->GetWindowText(tmp);
00096 if(label == tmp)
00097 {
00098 m_label.RemoveAt(i);
00099 m_info.RemoveAt(i);
00100 break;
00101 }
00102 }
00103
00104 Relayout();
00105 }
00106
00107 void CPlayerInfoBar::RemoveAllLines()
00108 {
00109 m_label.RemoveAll();
00110 m_info.RemoveAll();
00111
00112 Relayout();
00113 }
00114
00115 BOOL CPlayerInfoBar::Create(CWnd* pParentWnd)
00116 {
00117 return CDialogBar::Create(pParentWnd, IDD_PLAYERINFOBAR, WS_CHILD|WS_VISIBLE|CBRS_ALIGN_BOTTOM, IDD_PLAYERINFOBAR);
00118 }
00119
00120 BOOL CPlayerInfoBar::PreCreateWindow(CREATESTRUCT& cs)
00121 {
00122 if(!CDialogBar::PreCreateWindow(cs))
00123 return FALSE;
00124
00125 m_dwStyle &= ~CBRS_BORDER_TOP;
00126 m_dwStyle &= ~CBRS_BORDER_BOTTOM;
00127
00128 return TRUE;
00129 }
00130
00131 CSize CPlayerInfoBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
00132 {
00133 CRect r;
00134 GetParent()->GetClientRect(&r);
00135 r.bottom = r.top + m_label.GetCount() * 17 + (m_label.GetCount() ? 4 : 0);
00136 return r.Size();
00137 }
00138
00139 void CPlayerInfoBar::Relayout()
00140 {
00141 CRect r;
00142 GetParent()->GetClientRect(&r);
00143
00144 int w = m_nFirstColWidth, h = 17, y = 2;
00145
00146 for(size_t i = 0; i < m_label.GetCount(); i++)
00147 {
00148 CDC* pDC = m_label[i]->GetDC();
00149 CString str;
00150 m_label[i]->GetWindowText(str);
00151 w = max(w, pDC->GetTextExtent(str).cx);
00152 m_label[i]->ReleaseDC(pDC);
00153 }
00154
00155 for(size_t i = 0; i < m_label.GetCount(); i++, y += h)
00156 {
00157 m_label[i]->MoveWindow(1, y, w - 10, h);
00158 m_info[i]->MoveWindow(w + 10, y, r.Width()-(w+10)-1, h);
00159 }
00160 }
00161
00162 BEGIN_MESSAGE_MAP(CPlayerInfoBar, CDialogBar)
00163 ON_WM_ERASEBKGND()
00164 ON_WM_SIZE()
00165 ON_WM_LBUTTONDOWN()
00166 END_MESSAGE_MAP()
00167
00168
00169
00170
00171
00172 BOOL CPlayerInfoBar::OnEraseBkgnd(CDC* pDC)
00173 {
00174 for(CWnd* pChild = GetWindow(GW_CHILD); pChild; pChild = pChild->GetNextWindow())
00175 {
00176 CRect r;
00177 pChild->GetClientRect(&r);
00178 pChild->MapWindowPoints(this, &r);
00179 pDC->ExcludeClipRect(&r);
00180 }
00181
00182 CRect r;
00183 GetClientRect(&r);
00184
00185 CMainFrame* pFrame = ((CMainFrame*)GetParentFrame());
00186
00187 if(pFrame->m_pLastBar != this || pFrame->m_fFullScreen)
00188 r.InflateRect(0, 0, 0, 1);
00189
00190 if(pFrame->m_fFullScreen)
00191 r.InflateRect(1, 0, 1, 0);
00192
00193 pDC->Draw3dRect(&r, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DHILIGHT));
00194
00195 r.DeflateRect(1, 1);
00196
00197 pDC->FillSolidRect(&r, 0);
00198
00199 return TRUE;
00200 }
00201
00202 void CPlayerInfoBar::OnSize(UINT nType, int cx, int cy)
00203 {
00204 CDialogBar::OnSize(nType, cx, cy);
00205
00206 Relayout();
00207
00208 Invalidate();
00209 }
00210
00211 void CPlayerInfoBar::OnLButtonDown(UINT nFlags, CPoint point)
00212 {
00213 CMainFrame* pFrame = ((CMainFrame*)GetParentFrame());
00214 if(!pFrame->m_fFullScreen)
00215 {
00216 MapWindowPoints(pFrame, &point, 1);
00217 pFrame->PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
00218 }
00219 }