Поделиться через


Шаг 2. Добавление команды меню для захвата рамки плаката

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

[Этот API не поддерживается и может быть изменен или недоступен в будущем.]

Этот раздел — шаг 2 захвата рамки плаката.

Затем добавьте команду для пользователя, чтобы получить фрейм плаката из файла. Создайте пункт меню с идентификатором ресурса IDM_BITMAP и добавьте следующий оператор case в процедуру окна:

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

Функция DoShowBitmap вернет выделенный буфер в pbmi. Если функция выполнена успешно, адрес растрового рисунка (

pBuffer

) можно вычислить как смещение от pbmi. В функции DoShowBitmap отобразите диалоговое окно Открыть файл , чтобы пользователь выбрал файл, а затем вызовите определяемую приложением функцию GetBitmap, которая извлекает точечный рисунок:

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);
}

Далее: Шаг 3. Реализация функции Frame-Grabbing

Захват рамки плаката