Condividi tramite


Passaggio 2: Aggiungere un comando di menu per afferrare un frame poster

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture 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 può essere modificata o non disponibile in futuro.]

Questo argomento è il passaggio 2 dell'acquisizione di un frame poster.

Aggiungere quindi un comando per l'utente per afferrare un frame poster da un file. Creare una voce di menu con un ID risorsa di IDM_BITMAP e aggiungere l'istruzione case seguente 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 da 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 recupera 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);
}

Passaggio 3: Implementare la funzione Frame-Grabbing

Afferrare una cornice poster