Перечисление записей в метафайле в C#

Пример Отображение метафайла Windows (wmf) в C# < / a> показывает, как рисовать метафайл. В этом примере показано, как перечислять записи в метафайле, представляющие его команды рисования, и рисовать только некоторые из них.

Когда вы вводите имя метафайла и нажимаете кнопку Enumerate, следующий код перечисляет записи метафайла в ListBox слева от программы.

// Перечислить метафайл, чтобы перечислить его записи.
private void btnEnumerate_Click(object sender, EventArgs e)
{
    // Очистка списка записей.
    lstRecords.Items.Clear();

    // Очистим PictureBox.
    Bitmap bm = new Bitmap(picResults.ClientSize.Width,
        picResults.ClientSize.Height);
    using (Graphics gr = Graphics.FromImage(bm))
    {
        gr.Clear(picResults.BackColor);
        picResults.Image = bm;
    }

    // Перечислить записи метафайла.
    try
    {
        Metafile mf = new Metafile(txtFileName.Text);

        this.CreateGraphics().EnumerateMetafile(
            mf, new PointF(0, 0),
            ListRecords);

        btnDraw.Enabled = true;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Программа очищает ListBox, делает Bitmap подходящей для области рисования и очищает ее. Затем открывается метафайл.

Обычно вы используете класс Graphics для рисования метафайла. Этот класс предоставляет метод EnumerateMetafile, поэтому программа создает объект Graphics и вызывает EnumerateMetafile, передавая ему метафайл, точку, в которой метафайл должен использовать как источник (который на самом деле не используется, пока мы просто перечисляем записи), и метод обратного вызова. Метод EnumerateMetafile вызывает метод обратного вызова ListRecords для каждой записи метафайла.

Следующий код показывает метод ListRecords.

// Добавьте эту запись в список.
private bool ListRecords(EmfPlusRecordType record_type, int flags,
    int data_size, IntPtr data, PlayRecordCallback callback_data)
{
    lstRecords.Items.Add(record_type.ToString());
    return true;
}

Этот код просто добавляет имя каждой записи метафайла в ListBox программы. Он возвращает true, чтобы продолжить перечисление. (Если метод возвратил false, перечисление остановится, прежде чем перечислять все записи.)

После того, как вы перечислите записи, вы можете выбрать некоторые из них в ListBox. Затем, когда вы нажимаете кнопку «Рисовать», программа снова перечисляет записи метафайла, на этот раз используя следующий метод DrawRecords в качестве метода обратного вызова.

private int NextRecordNumber;

// Нарисуем запись, если она не выбрана в списке.
private bool DrawRecords(EmfPlusRecordType record_type, int flags,
    int data_size, IntPtr data, PlayRecordCallback callback_data)
{
    // Посмотрим, выбрана ли эта запись.
    if (lstRecords.SelectedIndices.Contains(NextRecordNumber))
    {
        Console.WriteLine("Skipping " + record_type.ToString());
        NextRecordNumber++;
        return true;
    }
    NextRecordNumber++;

    byte[] data_array = null;
    if (! data.Equals(IntPtr.Zero))
    {
        // Копирование неуправляемых данных записи в управляемую
        // байтовый буфер, который мы можем передать в PlayRecord.
        data_array = new byte[data_size];
        Marshal.Copy(data, data_array, 0, data_size);
    }

    // Воспроизведение записи.
    TheMetafile.PlayRecord(record_type, flags,
        data_size, data_array);

    // Продолжаем перечисление.
    return true;
}

Переменная NextRecordNumber отслеживает индекс следующей записи метафайла. Метод DrawRecords начинается с проверки того, выбран ли этот номер записи в ListBox. Если запись выбрана, метод отображает сообщение в окне консоли и пропускает его.

Если запись метафайла не выбрана, код использует метод PlayMetafile метафайла для рисования текущей записи метафайла. (Переменные NextRecordNumber и TheMetafile инициализируются в коде, который вызывает EnumerateMetafile.)

Это позволяет вам изучить метафайл, чтобы узнать, какие записи он содержит.

Источник: http://csharphelper.com/blog/2016/12/enumerate-the-records-in-a-metafile-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector