Condividi tramite


Passaggio 2: Aggiungere un comando del menu per catturare un fotogramma del poster

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEnginee Acquisizione audio/video in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente di usare un nuovo codice MediaPlayer, IMFMediaEngine e Acquisizione audio/video in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

[Questa API non è supportata e potrebbe essere modificata o non disponibile in futuro.]

Questo argomento è il passaggio 2 di , Catturare un Fotogramma di un Poster.

Aggiungere quindi un comando per l'utente per acquisire un frame poster da un file. Crea una voce di menu con un ID risorsa di IDM_BITMAP e aggiungi la seguente istruzione case alla procedura della finestra.

case WM_COMMAND:
    switch (LOWORD(wparam))
    {
    case IDM_BITMAP:
        {
            HRESULT hr = DoShowBitmap(hwnd, &pbmi);
            if (SUCCEEDED(hr))
            {
                pBuffer = reinterpret_cast<BYTE*>(pbmi) + 
                    sizeof(BITMAPINFOHEADER);
                InvalidateRect(hwnd, NULL, TRUE);
            }
            else
            {
                MessageBox(hwnd, TEXT("Cannot display the image."),
                    TEXT("Error"), MB_OK | MB_ICONERROR);
            }
        }
        break;  // IDM_BITMAP
    }
    break;  // WM_COMMAND

La funzione DoShowBitmap restituirà il buffer allocato in pbmi. Supponendo che la funzione abbia esito positivo, l'indirizzo della bitmap (

pBuffer

) può essere calcolato come offset di pbmi. Nella funzione DoShowBitmap visualizzare una finestra di dialogo Apri file per consentire all'utente di scegliere un file e quindi chiamare la funzione GetBitmap definita dall'applicazione, che recupererà la bitmap:

HRESULT DoShowBitmap(HWND hwnd, BITMAPINFOHEADER** ppbmih)
{
    OPENFILENAME ofn;       // common dialog box structure
    // Initialize OPENFILENAME (not shown).
    // Display the Open File dialog box.  
    if (GetOpenFileName(&ofn) != TRUE) // failed to open file
    {
        return E_FAIL;
    }
    return GetBitmap(ofn.lpstrFile, ppbmih);
}

Avanti: Passaggio 3: Implementare la funzione Frame-Grabbing

acquisire un fotogramma del poster