1. 程式人生 > >我的YUV播放器MFC小筆記:設定picture控制元件背景為黑色、視窗縮放

我的YUV播放器MFC小筆記:設定picture控制元件背景為黑色、視窗縮放

影象的顯示主要使用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晚