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

Visual C++ - расширенное программирование


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


Visual C++ - расширенное программирование

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

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

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

От ведущего


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

  Как всегда, Вы можете отправить свои пожелания, кликнув по этой ссылке.

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

MFC - простое и сложное [Стандартные ресурсы библиотеки MFC (часть 2)]


  Сегодня мы продолжим и закончим тему стандартных ресурсов библиотеки MFC.

  Рассмотреть осталось совсем немного : ресурсы изображений и строк.

  Сразу оговорюсь. К настоящей статье, а также к статье, опубликованной в прошлой рассылке (продолжением которой является данная) написан демонстрационный пример, наглядно иллюстрирующий все то, о чем шла речь в этих статьях. Исходники этого примера Вы можете скачать на странице сайта рассылки : http://SoftMaker.fatal.ru/articles/MFC/ud_0001.htm.

  В конце данной статьи я дам некоторые пояснения относительно работы этого примера.

  Итак, начнем с изображений.

  Рассмотрим файл AFXRES.H на предмет выявления идентификаторов ресурсов изображений. Обычно имена констант идентификаторов стандартных ресурсов изображений библиотеки MFC начинаются с "AFX_IDB_". Таких идентификаторов в файле AFXRES.H мне удалось обнаружить всего четыре :

  AFX_IDB_MINIFRAME_MENU
  AFX_IDB_CHECKLISTBOX_NT
  AFX_IDB_CHECKLISTBOX_95
  AFX_IDB_TRUETYPE

  Ресурс изображения AFX_IDB_MINIFRAME_MENU содержит небольшое изображение, которое обычно выводилось в левой части заголовка инструментальных окон (со стилями WS_EX_TOOLWINDOW, WS_CAPTION) в старых версиях Windows (но и сегодня, скомпилировав некоторые демонстрационные примеры из комплекта поставки справочной системы MSDN можно увидеть такое оформление).

  Ресурсы AFX_IDB_CHECKLISTBOX_NT и AFX_IDB_CHECKLISTBOX_95 содержат группы изображений, которые могут быть отображены как иконки состояния элемента списка ListControl - а.

  Ресурс AFX_IDB_TRUETYPE содержит изображение, обычно выводимое в выпадающие списки при отображении в них названий и типов доступных шрифтов. Это изображение определенно может быть использовано для аналогичных целей.

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

  Определенно, подавляющее большинство идентификаторов ресурсов, определенных в файле AFXRES.H - это идентификаторы ресурсов строк. Здесь можно встретить такие идентификаторы как : AFX_IDS_SCSIZE и AFX_IDS_SCMOVE, обычно также внесенные в таблицу строк приложения при генерации проекта с помощъю мастера Visual C++. Это ресурсы строк, сопоставленные пунктам системмного меню приложения (оно обычно доступно при щелчке на иконке приложения в заголовке главного окна-рамки).

И такие как : AFX_IDS_OPENFILE, AFX_IDS_SAVEFILE (я думаю, названия идентификаторов вызывают определенные ассоциации).

Здесь собраны идентификаторы ресурсов строк сообщений, требующихся для обработки исключений MFC, идентификаторы строк сообщений об ошибках (AFX_IDP_INVALID_FILENAME, AFX_IDP_FAILED_TO_OPEN_DOC), сообщений об ошибках механизма DDV, сериализации MFC, а также MAPI, ошибок, возникающих при работе с файлами и базами данных.

Интересна группа идентификаторов строк AFX_IDS_COLOR_* (таких как AFX_IDS_COLOR_WNDBACKGND, AFX_IDS_COLOR_WNDTEXT). Эти строки содержат названия соответствующих элементов пользовательского интерфейса, что может быть легко использовано при разработке собственных приложений.

Некоторые из этих строк (особо интересные вынесены на вкладку "Строки") примера к статье.

Одним словом, смотрите пример, и это все прояснит. Просмотрите также файл AFXRES.H - это даст Вам большее представление о группах идентификаторов ресурсов, содержащихся там.

  А теперь, как я и обещал, вкратце рассмотрим пример к статье.

  Это программа, главное окно которой представляет стандартный Property Sheet, состоящий из четырех страниц. Четвертая страница (About) - информационная и содержит информацию о примере.

  Рассмотрим первые три страницы свойств.

  Первая страница свойств реализуется классом CCursorPage. На ней расположен список, содержащий изображения курсоров (рассмотрены в предыдущей статье) и названия из идентификаторов.

Интересной для рассмотрения функцией здесь является функция CursorToIcon, преобразующая курсор в иконку. Она нужна для того, чтобы выводить изображения курсоров в списке.

Так как эта функция невелика по объему, рассмотрим здесь ее код :

  HICON CCursorPage::CursorToIcon(HCURSOR hCursor)
  {
    HICON hResult = NULL;

    if(hCursor != NULL)
    {
      ICONINFO info;

      if(GetIconInfo((HICON) hCursor, &info))
      {
        if(!info.fIcon)
        {
          info.fIcon = TRUE;
          hResult = ::CreateIconIndirect(&info);
        }
      }
    }

    return hResult;
  }

  Как видно, идея создания иконки на основе курсора весьма проста. Действительно, курсоры и иконки весьма схожи по своему "внутреннему устройству" - в обоих случаях "основу" составляют два изображения : изображение-маска, служащая для определения прозрачных и непрозрачных областей и, собственно, изображение, выводимое на экран в виде курсора или иконки. Отличие курсора от иконки состоит в том, что для него определена "горячая точка" - "hot spot", служащая для определения позиции указателя.

Все эти данные (манипуляторы изображений, координаты горячей точки, и.т.д.) можно получить для курсоров и для иконок в виде полей структуры ICONINFO, заполняемой при вызове API-функции GetIconInfo.

Мы лишь меняем флаг признака того, что это иконка (поле fIcon) в структуре ICONINFO и создаем на основе этих же данных иконку, манипулятор которой и возвращает функция.

  Вторая страница свойств реализуется классом CBitmapPage. На ней расположен список, содержащий имена идентификаторов изображений, рассмотренных выше. При выборе элемента списка загружается соответствующий ресурс, отображаемый слева в элементе управления Static.

  С третьей страницей вообще все просто - строковые ресурсы загружаются и в список заносятся их идентификаторы и содержимое ресурсов.

  Иными словами - лучше один раз увидеть чем сто раз услышать - смотрите пример.

  Кстати, четвертая страница - страница About тоже не бесполезна. Она хорошо иллюстрирует способ помещения в ресурсы приложения метафайла и последующий вывод его в окно диалога.

  Надеюсь, я Вас не совсем замучал высокими материями. В следующий раз мы рассмотрим что нибудь более веселое. Например то, как за пару часов набросать в Visual C++ интерфейс файлового менеджера (как в Windows Commander), или же как обогатить интерфейс своего приложения. А может быть, я расскажу о том, как "поломать" архитектуру "документ-облик" MFC и обойтись без класса документа.

  Еще многое впереди - мы научимся создавать собственные элементы управления и целые библиотеки элементов управления, пройдем по всем этапам диспетчеризации сообщений в MFC, узнаем как писать собственные макросы элементов карты сообщений, и многое другое.


    А пока Все.

Автор статьи : Вахтуров Виктор.  


Подписчикам

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

Вопросы

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

  К сожалению, вопросов сегодня нет.

Ответы

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

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

Любой из материалов, опубликованных в этой рассылке, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.


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

В избранное