Алекс Jenter - Программирование на Visual C++. Архив рассылки
- Название:Программирование на Visual C++. Архив рассылки
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алекс Jenter - Программирование на Visual C++. Архив рассылки краткое содержание
РАССЫЛКА ЯВЛЯЕТСЯ ЧАСТЬЮ ПРОЕКТА RSDN, НА САЙТЕ КОТОРОГО ВСЕГДА МОЖНО НАЙТИ ВСЮ НЕОБХОДИМУЮ РАЗРАБОТЧИКУ ИНФОРМАЦИЮ, СТАТЬИ, ФОРУМЫ, РЕСУРСЫ, ПОЛНЫЙ АРХИВ ПРЕДЫДУЩИХ ВЫПУСКОВ РАССЫЛКИ И МНОГОЕ ДРУГОЕ.
Программирование на Visual C++. Архив рассылки - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Для повышения производительности Regex кэширует в памяти все регулярные выражения. Поэтому повторного разбора при каждом очередном использовании не происходит. Такой подход несколько уменьшает разницу в производительности компилируемых и интерпретируемых регулярных выражений.
В качестве примера использования регулярных выражений мы создали .Net-приложение, использующее регулярные выражения для поиска в тексте.

Рис.2. Приложение RegExpTest
Мода – великая вещь, поэтому писать приложение следует не на Java, не на VB, а на C#. Это модно, и доказывает, что автор не стоит на месте, а работает над собой.
Отрывки кода этого примера приведены в Листинге 1. Само приложение можно скачать с нашего
ftp-сайта.Листинг 1. Использование регулярных выражений в C#
// Класс для хранения информации о найденном вхождении
protected class MyItem {
public MyItem(string Match, int Index, int Len) {
this.Match = Match;
this.Index = Index;
this.Len = Len;
}
public override string ToString() {
return Index.ToString() + ", " + Len.ToString() + ", " + Match;
}
public string Match;
public int Index;
public int Len;
}
…
protected void Parce() {
int iCountMatchs = 0;
try {
// Очищаем лист-бокс
listBox1.Items.Clear();
statusBar1.Text = "Parsing…";
// создаем объект re, задавая в его конструкторе
// шаблон и опции
Regex re = new Regex(tbPattern.Text, tbOptions.Text);
// Выполняем поиск заданного выше шаблона внутри
// текста и текстового поля
tbTextForSearch MatchCollection mc = re.Matches(tbTextForSearch.Text);
iCountMatchs = mc.Count;
// Выводим информацию о количестве найденных вхождений…
statusBar1.Text = "Load list (" + iCountMatchs.ToString() + ")…";
// …и заносим информацию о них в лист-бокс.
listBox1.BeginUpdate();
foreach(Match m in mc) {
// Для хранения информации о найденном вхождении
// мы используем созданный нами класс MyItem.
// Элементы управления (типа лист-бокса) в .Net
// позволяют хранить вместо текстового значения
// объект, а при отображении текста в строке вызывают
// метод – ToString. Так что объект любого класса,
// реализующего метод ToString, может выступать в
// качестве элемента лист-бокса.
listBox1.Items.Add(new MyItem(m.ToString(), m.Index, m.Length));
}
} catch(Exception e1) {
MessageBox.Show(e1.ToString(), "Error");
} finally {
listBox1.EndUpdate();
statusBar1.Text = "Done " + iCountMatchs.ToString();
}
}
Это только краткое ведение в регулярные выражения и их использование. Если вы хотите лучше разобраться в этом, попробуйте потренироваться в создании регулярных выражений самостоятельно. Практика показывает, что разбор чужих регулярных выражений практически бесполезен, читать их почти невозможно. Однако лучше научиться пользоваться ими – это часто упрощает жизнь.
ВОПРОС – ОТВЕТ
Как вывести на экран картинку в JPEG/GIF/PNG/др. формате?
7 способов как это сделать
Автор: Павел Блудов
Демонстрационное приложение (WTL) DrawImg (50kb)
Сегодня практически все программы используют различные картинки в качестве элементов интерфейса. Даже существует API функция ::LoadImage(), умеющая загружать файлы в формате bmp, ico и cur. Этого достаточно для панелей управления и диалогов. Но если размер картинки превышает 100x100 пикселов и их нужно несколько, файлы формата bmp использовать не удобно. Хочется что-то вроде jpg или gif.
Тут ::LoadImage() нам уже не помошник. Придется использовать специальные библиотеки. Наибольшей популярностью пользуются:
Independent JPEG Group
Portable Network Graphics
TIFF Software
Intel(R) JPEG Library
Image Library
CXImage
Small JPEG Decoder Library
Все они хорошо документированны и снабжены примерами. Подробное рассмотрение этих библиотек займет слишком много времени и выходит за рамки этой статьи. Давайте лучше уделим внимание некоторым специальным API, предназначенным для работы с файлами изображений.
Самый "официальный" способ. Появился вместе с OLE32 и работает до сих пор. Функции OleLoadPicture(Ex)и OleLoadPicturePathумеют загружать картинки в формате BMP, GIF, JPEG, ICO, WMF, и EMF:
#include
HRESULT Load(LPCTSTR szFile) {
CComPtr pStream;
// Load the file to a memory stream
HRESULT hr = FileToStream(szFile, &pStream);
if (SUCCEEDED(hr)) {
// Decode the picture
hr = ::OleLoadPicture(
pStream, // [in] Pointer to the stream that contains picture's data
0, // [in] Number of bytes read from the stream (0 == entire)
true, // [in] Loose original format if true
IID_IPicture, // [in] Requested interface
(void**)&m_pPicture // [out] IPictire object on success
);
}
return hr;
}
HRESULT DrawImg(HDC hdc, const RECT& rcBounds) {
if (m_pPicture) {
// Get the width and the height of the picture
long hmWidth = 0, hmHeight = 0;
m_pPicture->get_Width(&hmWidth);
m_pPicture->get_Height(&hmHeight);
// Convert himetric to pixels
int nWidth = MulDiv(hmWidth, ::GetDeviceCaps(hdc, LOGPIXELSX), HIMETRIC_INCH);
int nHeight = MulDiv(hmHeight, ::GetDeviceCaps(hdc, LOGPIXELSY), HIMETRIC_INCH);
// Display the picture using IPicture::Render
return m_pPicture->Render(
hdc, // [in] Handle of device context on which to render the image
rcBounds.left, // [in] Horizontal position of image in hdc
rcBounds.top, // [in] Vertical position of image in hdc
rcBounds.right - rcBounds.left, // [in] Horizontal dimension of destination rect.
rcBounds.bottom - rcBounds.top, // [in] Vertical dimension of destination rect.
0, // [in] Horizontal offset in source picture
hmHeight, // [in] Vertical offset in source picture
hmWidth, // [in] Amount to copy horizontally in source picture
-hmHeight, // [in] Amount to copy vertically in source picture
&rcBounds // [in, optional] Pointer to position of destination for a metafile hdc
);
}
return E_UNEXPECTED;
}
Достоинства: правильно работает с прозрачными картинками.
Недостатки: не поддерживает анимированный GIF (см. также CPicturEx). Не поддерживает PNG.
Недостаток ::LoadImage() с лихвой исправили в GDI+. Объект Gdiplus::Imageумеет загружать картинки в формате bmp, gif, jpeg, png, TIFF, EXIF, WMF, и EMF:
#include
HRESULT Load(LPCTSTR szFile) {
USES_CONVERSION;
Интервал:
Закладка: