图像的显示主要使用picture控件,一般播放器,在初始化时,播放画面的区域背景都是黑色的,在YUV播放器,也如此。但在网上找了很久的资料才实现该功能,其实说白了,代码很简单,在OnPaint函数中将picture画为黑色即可。代码:
//picture控件背景色为黑色
if (m_fShowBlack)
{
CRect rtTop;
CStatic *pWnd = (CStatic*)GetDlgItem(IDC_VIDEO);
CDC *cDc = pWnd->GetDC();
pWnd->GetClientRect(&rtTop);
cDc->FillSolidRect(rtTop.left, rtTop.top, rtTop.Width(), rtTop.Height(),RGB(0,0,0));
Invalidate(FALSE);
}
下面实现主窗口的缩放。主要针对界面上各种按钮的位置的摆放。使用到MoveWindow和SetWindowPos两个函数。由于按钮较多,使用数组存储其ID:
// 各类按钮
m_nStartX[0][0] = IDC_STATIC_FRAMECNT;
m_nStartX[0][1] = IDC_SLIDER1;
m_nStartX[0][2] = IDC_BUTTON_OPEN;
m_nStartX[0][3] = IDC_BUTTON_SAVE;
m_nStartX[0][4] = IDC_BUTTON_PLAY;
m_nStartX[0][5] = IDC_BUTTON_STOP;
m_nStartX[0][6] = IDC_BUTTON_PREV;
m_nStartX[0][7] = IDC_BUTTON_NEXT;
m_nStartX[0][8] = IDC_BUTTON_FIRST;
m_nStartX[0][9] = IDC_BUTTON_LAST;
m_nStartX[0][10] = IDC_BUTTON_SET;
CRect rect;
for (int i = 0; i < 10; i++)
{
GetDlgItem(m_nStartX[0][i])->GetWindowRect(rect);
ScreenToClient(rect);
m_nStartX[1][i] = rect.left;
}
实现OnSize函数:
// 窗口缩放
// todo:只能宽、高同时缩放
void CYUVPlayerDlg::OnSize(UINT nType, int cx, int cy)
{
if (!m_fInit) return;
// if (cx<=333 || cy <= 343) return;
CDialogEx::OnSize(nType, cx, cy);
CWnd *pWnd = GetDlgItem(IDC_VIDEO);
if (pWnd)
{
pWnd->MoveWindow(0, 0, cx, cy-26-20-21-4-4);
pWnd->Invalidate();
pWnd->UpdateData();
}
// 最右边的按钮
pWnd = GetDlgItem(m_nStartX[0][10]);
if (pWnd)
{
pWnd->SetWindowPos(NULL,cx-30-2,cy-26-4,0,0,SWP_NOZORDER|SWP_NOSIZE);
}
int startx = 2;
// 帧数统计
pWnd = GetDlgItem(m_nStartX[0][0]);
if (pWnd)
{
pWnd->SetWindowPos(NULL,startx+m_nStartX[1][0],cy-26-20-21-4,0,0,SWP_NOZORDER|SWP_NOSIZE);
}
// 滚动条
pWnd = GetDlgItem(m_nStartX[0][1]);
if (pWnd)
{
//pWnd->MoveWindow(startx+0, cy-26-26, cx, cy-26-20-21);
//pWnd->Invalidate();
pWnd->SetWindowPos( NULL,startx+m_nStartX[1][1],cy-26-26-4,cx,26,SWP_NOZORDER);
}
// 水平位置相同的按钮
for (int i = 2; i < 10; i++)
{
pWnd = GetDlgItem(m_nStartX[0][i]);
if (pWnd)
{
pWnd->SetWindowPos(NULL,startx+m_nStartX[1][i],cy-26-4,0,0,SWP_NOZORDER|SWP_NOSIZE);
}
}
}
李迟 2015.8.15晚