Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

C/C++ - вопросы и ответы.


Информационный Канал Subscribe.Ru


C/C++ - вопросы и ответы

Выпуск № 3
Cайт : SoftMaker.fatal.ru
Архив рассылки : SoftMaker.fatal.ru
Количество подписчиков : 13

В этом выпуске

От ведущего
MFC - простое и сложное
Подписчикам
Вопросы
Ответы

От ведущего


  Здравствуйте, уважаемые подписчики.
  Сегодня начинает работу новый раздел, посвященный преимущественно библиотеке MFC. Я надеюсь, он понравится вам. В нем я попробую освещать некоторые, не совсем известные возможности библиотеки, расскажу про полезные недокументированные функции и классы. Надеюсь, это окажется полезным для вас.
  Как всегда, Вы можете отправить свои пожелания, кликнув по этой ссылке.

Искренне Ваш. С уважением, Вахтуров Виктор.

MFC - простое и сложное [Форматирование строк]


  Итак, начнем.   Этот выпуск раздела вводный, а поэтому сегодня рассмотрим совсем несложную и небольшую, но нужную тему - 'форматирование строк'.

  Должно быть, для вас это весьма обыденно - отформатировать некоторую информацию в виде строки. Действительно, ведь среди библиотечных функций C достаточно много тех, что служат именно для этой цели (например sprintf, _snprintf, и.т.д.). В MFC для хранения строк есть класс CString. Соответственно, среди его методов есть функции :

void Format( LPCTSTR lpszFormat, ... );
void Format( UINT nFormatID, ... );
и
void FormatV( LPCTSTR lpszFormat, va_list argList );

принимающие в качестве параметров указатель на строку - шаблон (или идентификатор строкового ресурса), используемую для форматирования, а также список аргументов, значения которых будут использоваться для "подстановки" в шаблон. Все это весьма тривиально.
  Вспомним также, что в библиотеке MFC есть пара глобальных вспомогательных функций для той же цели, только выполняющих более "специализированные" задачи.
Это функции :

void AfxFormatString1( CString& rString, UINT nIDS, LPCTSTR lpsz1 );
и
void AfxFormatString2( CString& rString, UINT nIDS, LPCTSTR lpsz1, LPCTSTR lpsz2 );

Как видно из прототипов, им передается ссылка на строку, идентификатор ресурса и указатель (а в случае AfxFormatString2 - 2 указателя) на строку (строки).
Выполняют эти функции следующее : они загружают строковый ресурс, соответствующий идентификатору nIDS и используют его как шаблон. Шаблон представляет из себя строку вида :
' Какой то текст %1 Какой то текст %1 Какой то текст %1 Какой то текст ' в случае AfxFormatString1 и
' Какой то текст %1 Какой то текст %2 Какой то текст %1 Какой то текст ' в случае AfxFormatString2
в обоих случаях все %1 (и %2 в случае AfxFormatString2) будут заменены содержимым строк lpsz1 (и lpsz2). В случае AfxFormatString2 %1 заменяется на содержимое строки lpsz1, а %2 на содержимое строки lpsz2.
Зачем же в библиотеку были включены эти функции ? Очевидно, они достаточно широко используются. Действительно, они используются при форматировании строк сообщений, выводимых в MessageBox - ах. Также очевидно, что в некоторых случаях их использование весьма удобно.

  А теперь, если не возражаете, посмотрим на реализацию этих функций :

void AFXAPI AfxFormatString1(CString& rString, UINT nIDS, LPCTSTR lpsz1)
{
  AfxFormatStrings(rString, nIDS, &lpsz1, 1);
}

void AFXAPI AfxFormatString2(CString& rString, UINT nIDS, LPCTSTR lpsz1, LPCTSTR lpsz2)
{
  LPCTSTR rglpsz[2];
  rglpsz[0] = lpsz1;
  rglpsz[1] = lpsz2;
  AfxFormatStrings(rString, nIDS, rglpsz, 2);
}

  Что же это за функция AfxFormatStrings ?
В моем MSDN нет упоминания о ней, но тем не менее, она продекларирована в AFXWIN.H и может быть свободно использована. Это перегруженная функция, и ее прототипы выглядят так :

void AFXAPI AfxFormatStrings(CString& rString, UINT nIDS, LPCTSTR const* rglpsz, int nString);
void AFXAPI AfxFormatStrings(CString& rString, LPCTSTR lpszFormat, LPCTSTR const* rglpsz, int nString);

Эта функция также принимает на входе ссылку на строку, которая будет содержать результат, идентификатор строкового ресурса, либо строку шаблона и массив указателей на строки, содержимое которых будет подставлено вместо соответствующих маркеров %1, %2, %3...%Y, %Z. Надо заметить, что макеры в строке - шаблоне долзны состоять из одного символа % и одного символа-цифры, либо одного символа-буквы (заглавной латинской). Тогда строка с индексом 0 в массиве строк будет подставлена на место всех %1, стока с индексом 1 - на место всех %2, строка с индексом 9 - на место всех %A, и.т.д.
Для того, чтобы пояснить выше написанное, приведу небольшой фрагмент кода :

CString str;

LPCTSTR rglpsz[12];
rglpsz[0] = "Text 0";
rglpsz[1] = "Text 1";
rglpsz[2] = "Text 2";
rglpsz[3] = "Text 3";
rglpsz[4] = "Text 4";
rglpsz[5] = "Text 5";
rglpsz[6] = "Text 6";
rglpsz[7] = "Text 7";
rglpsz[8] = "Text 8";
rglpsz[9] = "Text 9";
rglpsz[10] = "Text 10";
rglpsz[11] = "Text 11";

CString strFormat = "0 : %1 1 : %2 2 : %3 3 : %4 4 : %5 5 : %6 "
  "6 : %7 7 : %8 8 : %9 9 : %A 10 : %B 11 : %C "
  "3 : %4 10 : %B";

AfxFormatStrings(str, (LPCTSTR) strFormat, rglpsz, 12);

  Содержимое строки str теперь должно быть таким :

"0 : Text 0 1 : Text 1 2 : Text 2 3 : Text 3 4 : Text 4 5 : Text 5 6 : Text 6 7 : Text 7 8 : Text 8 9 : Text 9 10 : Text 10 11 : Text 11 3 : Text 3 10 : Text 10"

Надеюсь, это все проясняет. Действительно, это весьма полезная функция. Правда, недокументированная.
И напоследок приведу прототип еще одной весьма полезной, но малоизвестной функции :

BOOL AFXAPI AfxExtractSubString(CString& rString, LPCTSTR lpszFullString, int iSubString, TCHAR chSep = '\n');

Думаю, название и прототип говорят сами за себя.

    На этом на сегодня все.

Подписчикам

  Дабы заранее разрешить возможные недоразумения, прошу Вас помнить, что Вопросы публикуются в рассылке только один раз. Поэтому, если Вам не ответили в этой рассылке, или ваш вопрос не был опубликован, пришлите его еще раз. Не стоит отвечать на вопрос, который был задан в предыдущей рассылке (за исключением случая, когда он снова опубликован в этой).
Для того, чтобы задать свой вопрос, пришлите письмо по этой ссылке.
Для того, чтобы ответить на вопрос, надо кликнуть по ссылке "ответить", расположенной под текстом вопроса.
Обо всех ошибках, замеченных в данной рассылке, а также своих предложениях и пожеланиях пишите сюда.

Вопросы

  Для того, чтобы задать свой вопрос, кликните этой ссылке.
Вы можете задавать любые вопросы, касающиеся программирования на языке C и C++. Это могут быть вопросы касающиеся как конструкций языка, применения библиотек классов, шаблонов (таких как MFC или STL), использования компиляторов, так и самой философии программирования на C или C++. Здесь нет ограничений - спрашивайте и получайте ответы.

Вопрос № 1
Автор Nimnul
Не подскажет ли уважаемый All, как бы мне из моей проги выдвинуть и задвинуть лоток CDROM ?
Ответить на вопрос

Ответы

  В данной рассылке нет ответов, так как не было задано вопросов в предыдущей.
Задавайте свои вопросы, и Вы обязятельно получите ответ.

Всего доброго. До встречи в следующей рассылке.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное