Опубликован: 17.08.2010 | Доступ: свободный | Студентов: 999 / 59 | Оценка: 4.11 / 3.89 | Длительность: 29:38:00
Самостоятельная работа 8:

Работа MFC с GDI (GDI+)

Создание каркаса приложения

  • Создайте новый проект MFC App C++ под названием Graphics на основе диалога
    Таблица настройки мастера создания заготовки приложения
    Свойство проекта Значение
    Вкладка Application Type
    Application Type Dialog Based
    Resource language: Английский (США)
    Project style: MFC standard
    Use of MFC: Use MFC in a static library
    Вкладка User Interface Features
    Main frame styles: System menu - важно!!!
    About box - важно!!!
    Dialog title: Graphics
    Вкладка Advanced Features
    Все сбросить!
  • После создания мастером главной формы удалите из диалога все элементы управления
  • Русифицируйте ресурсы диалоговых окон с идентификаторами IDD_GRAPHICS_DIALOG и IDD_ABOUTBOX
  • Измените заголовок главного диалогового окна, указав фамилию, номер и название лабораторной работы
  • Измените свойство Minimize Box главного диалогового окна на True
  • Отредактируйте диалоговый ресурс IDD_ABOUTBOX
  • Замените иконку приложения на любую иную по выбору
Разработка дизайна главного диалогового окна

Окно должно содержать три группы переключателей:

  1. Для задания инструмента рисования
  2. Для выбора фигуры рисования
  3. Для выбора кисти, пера или рисунка

Окно должно иметь две кнопки:

  1. Кнопку вызова стандартного диалога File Open для выбора рисунка
  2. Кнопку завершения приложения
    • Разработайте показанный дизайн окна с соблюдением отмеченных рекомендаций


      • Управляющие элементы радиокнопок каждой группы располагайте строго в последовательности сверху вниз
      • Каждому первому переключателю группы установите свойство Group в значение True
      • Измените сгенерированные автоматически ID на более осмысленные в соответствии с названием, например, IDC_RPEN, IDC_RBRUSH и т.д., а для кнопок: IDC_BBITMAP, IDC_BEXIT

      Переодически стройте приложение для контроля возможных ошибок

      После создания диалогового окна нужно назначить по одной переменной для каждой группы переключателей. Для этого нужно создать целочисленную переменную для первого переключателя каждой группы. Для всех последующих переключателей группы назначенная переменная будет принимать последовательно возрастающие значения в порядке возрастания значений их идентификаторов. Именно по этой причине важно создавать все переключатели группы по порядку. Если добавление выполнялось не по порядку, в режиме Format/Tab Order можно установить нужный порядок следования.

    • Для первых переключателей каждой группы назначьте переменные в соответствии с таблицей
      Переменные для управления переключателями
      Объект Переменная Категория Тип Доступ
      IDC_RPEN m_iTool Value int public
      IDC_RLINE m_iShape Value int int
      IDC_RBLACK m_iColor Value public public

      Для этого выделите каждый первый переключатель группы и через контекстное меню вызывайте мастер Add Variable. Поля мастера заполняйте по образцу


      Мастер добавит код

      Файл GraphicsDlg.h
      class CGraphicsDlg : public CDialog
      {
      ....................................................
      public:
        // Для управления переключателями группы Tool
        int m_iTool;
        // Для управления переключателями группы Shape
        int m_iShape;
        // Для управления переключателями группы Color
        int m_iColor;
      };
      Файл GraphicsDlg.cpp
      CGraphicsDlg::CGraphicsDlg(CWnd* pParent /*=NULL*/)
        : CDialog(CGraphicsDlg::IDD, pParent)
        , m_iTool(0)
        , m_iShape(0)
        , m_iColor(0)
      {
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
      }
      Файл GraphicsDlg.cpp
      void CGraphicsDlg::DoDataExchange(CDataExchange* pDX)
      {
        CDialog::DoDataExchange(pDX);
        DDX_Radio(pDX, IDC_RPEN, m_iTool);
        DDX_Radio(pDX, IDC_RLINE, m_iShape);
        DDX_Radio(pDX, IDC_RBLACK, m_iColor);
      }
    • Создайте обработчик для клавиши Exit. Введите в обработчик код OnOK()
    • Запустите приложение и убедитесь, что переключатели каждой группы работают независимо
    • Установите, чтобы при запуске приложения в группе Color был выделен переключатель White. Для этого измените в конструкторе класса CGraphicsDlg индекс инициализации переменной группы

      Файл GraphicsDlg.cpp
      CGraphicsDlg::CGraphicsDlg(CWnd* pParent /*=NULL*/)
        : CDialog(CGraphicsDlg::IDD, pParent)
        , m_iTool(0)
        , m_iShape(0)
        , m_iColor(7)
      {
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
      }

Добавление диалогового окна для рисования

Добавим окно для использования в качестве холста рисования. Оно будет открыто во все время работы приложения. На нем не будет никаких управляющих элементов - только холст.

  • Раскройте дерево ресурсов проекта и, вызывая для каждого типа ресурса контекстное меню, обратите внимание, как меняется название последней опции контекстного меню Insert с добавлением имени типа ресурса
  • На узле Dialog из контекстного меню выполните опцию Insert Dialog
  • Удалите из нового диалогового окна, которое мы будем в дальнейшем использовать как холст, все элементы управления
  • Выделите диалоговое окно и в панели свойств установите свойство System Menu в значение False. Убедитесь, что сразу исчезнет системная кнопка закрытия окна. Это исключает возможность для пользователя закрыть окно до окончания работы всего приложения
  • Присвойте заголовку окна значение "Холст"
  • Присвойте окну идентификатор ресурса IDD_PAINT_DLG. Обратите внимание, что для диалоговых окон принято применять префикс IDD_, а для элементов управления - IDC_
  • Щелкните правой кнопкой мыши на диалоговом окне холста и выполните опции Add Class контекстного меню. Заполните поля мастера создания класса, управляющего диалоговым окном, так


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

Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .