Microsoft Visual C++ и MFC. Программирование для Win95 и WinNT

       

Класс главной диалоговой панели приложения


Большой интерес представляет файл DialogDlg.h, показанный в листинге 4.3. Этот класс содержит объявление класса главной диалоговой панели приложения CDialogDlg.

Класс CDialogDlg наследуется от базового класса CDialog, определенного в библиотеке классов MFC. Конструктор класса имеет один необязательный параметр pParent, используемый для передачи индекса главного окна приложения. Приложение Dialog не имеет главного окна. Роль главного окна выполняет сама диалоговая панель, поэтому параметр pParent не используется.

Непосредственно после объявления конструктора класса следует объявление элементов данных класса, которые добавлены средствами MFC AppWizard или ClassWizard. Они расположены между двумя комментариями AFX_DATA. Не рекомендуется вручную изменять код приложения, расположенный между этими комментариями.

После блока AFX_DATA следует блок AFX_VIRTUAL. В этом блоке MFC AppWizard и ClassWizard добавляют объявления переопределенных виртуальных методов базового класса.

Сначала в этом блоке объявлен только один метод DoDataExchange, переопределенный в нашем проекте. Этот метод применяется для связывания с органами управления диалоговой панели элементов управляющего ей класса.

Практически со всеми приложениями связана пиктограмма, которая будет отображаться при минимизации приложения. Обычно эта пиктограмма определяется на этапе регистрации класса главного окна приложения. Приложение Dialog не имеет настоящего главного окна. Вместо него используется диалоговая панель. Поэтому отображение пиктограммы приложения не происходит автоматически и мы должны управлять этим сами. Идентификатор пиктограммы m_hIcon определен в классе CDialogDlg после блока AFX_VIRTUAL.

Диалоговая панель CDialogDlg будет обрабатывать ряд сообщений. Объявления обработчиков сообщений созданных средствами MFC AppWizard или ClassWizard располагаются между двумя комментариями AFX_MSG, образующими блок AFX_MSG.

После создания проекта в классе CDialogDlg объявлены 4 обработчика сообщений OnInitDialog, OnSysCommand, OnPaint и OnQueryDragIcon. Эти методы определены в файле DialogDlg.cpp, описанном ниже.


      // В следующем блоке ClassWizard размещает переопределение

      // виртуальных методов

      //{{AFX_VIRTUAL(CAboutDlg)

protected:



      // Поддержка DDX/DDV

      virtual void DoDataExchange(CDataExchange* pDX);

      //}}AFX_VIRTUAL

// Implementation

protected:

      //{{AFX_MSG(CAboutDlg)

      //}}AFX_MSG

      DECLARE_MESSAGE_MAP()

};

// Конструктор класса CAboutDlg

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

      //{{AFX_DATA_INIT(CAboutDlg)

      //}}AFX_DATA_INIT

}

// Метод DoDataExchange класса CAboutDlg

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

      CDialog::DoDataExchange(pDX);

      //{{AFX_DATA_MAP(CAboutDlg)

      //}}AFX_DATA_MAP

}

// Таблица сообщений класса CAboutDlg

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

      //{{AFX_MSG_MAP(CAboutDlg)

             // Класс CAboutDlg не обрабатывает никаких сообщений

      //}}AFX_MSG_MAP

END_MESSAGE_MAP()

//////////////////////////////////////////////////////////////

// Ниже определены различные методы класса CDialogDlg

// Конструктор класса CDialogDlg

CDialogDlg::CDialogDlg(CWnd* pParent /*=NULL*/)

      : CDialog(CDialogDlg::IDD, pParent)

{

      //{{AFX_DATA_INIT(CDialogDlg)

             // В этом блоке ClassWizard размещает инициализацию

             // элементов данных класса

      //}}AFX_DATA_INIT

      // Вызов LoadIcon не требует последующего вызова

      // DestroyIcon, если вы используете программный интерфейс

      // Win32

      m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

// Метод DoDataExchange класса CDialogDlg

void CDialogDlg::DoDataExchange(CDataExchange* pDX)

{

      CDialog::DoDataExchange(pDX);

      //{{AFX_DATA_MAP(CDialogDlg)

             // Здесь ClassWizard размещает вызовы методов DDX и DDV

      //}}AFX_DATA_MAP

}

// Таблица сообщений класса CDialogDlg

BEGIN_MESSAGE_MAP(CDialogDlg, CDialog)

      //{{AFX_MSG_MAP(CDialogDlg)



      ON_WM_SYSCOMMAND()

      ON_WM_PAINT()

      ON_WM_QUERYDRAGICON()

      //}}AFX_MSG_MAP

END_MESSAGE_MAP()

// Метод OnInitDialog класса CDialogDlg

BOOL CDialogDlg::OnInitDialog()

{

      CDialog::OnInitDialog();

      // Добавление строки "About..." к системному меню приложения

      // Проверяем, что идентификатор IDM_ABOUTBOX относится к

      // системным командам

      ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

      ASSERT(IDM_ABOUTBOX < 0xF000);

      CMenu* pSysMenu = GetSystemMenu(FALSE);

      CString strAboutMenu;

      strAboutMenu.LoadString(IDS_ABOUTBOX);

      if (!strAboutMenu.IsEmpty())

      {

             pSysMenu->AppendMenu(MF_SEPARATOR);

             pSysMenu->AppendMenu(MF_STRING,

                                                                                IDM_ABOUTBOX, strAboutMenu);

      }

      // Выбираем пиктограмму для диалоговой панели. Если главное

      // окно приложения не является диалоговой панелью, этот код

      // не нужен

      SetIcon(m_hIcon,TRUE);  // выбираем пиктограмму большого

                                                                      // размера

      SetIcon(m_hIcon,FALSE); // выбираем пиктограмму маленького

                                                                      // размера

     

      // TODO: Здесь вы можете выполнить дополнительную

      // инициализацию

     

      return TRUE; 

}

// Метод OnSysCommand класса CDialogDlg

void CDialogDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

      if ((nID & 0xFFF0) == IDM_ABOUTBOX)

      {

             CAboutDlg dlgAbout;

             dlgAbout.DoModal();

      }

      else

      {

             CDialog::OnSysCommand(nID, lParam);

      }

}

// Если вы добавили кнопку минимизации к диалоговой панели,

// следующий код нужен, чтобы отобразить пиктограмму

// Метод OnPaint класса CDialogDlg

void CDialogDlg::OnPaint()



{

      if (IsIconic())

      {

             CPaintDC dc(this); // контекст устройства

             SendMessage(WM_ICONERASEBKGND,

                                                                (WPARAM) dc.GetSafeHdc(), 0);

             // Выравниваем по центру пиктограмму

             int cxIcon = GetSystemMetrics(SM_CXICON);

             int cyIcon = GetSystemMetrics(SM_CYICON);

             CRect rect;

             GetClientRect(&rect);

             int x = (rect.Width() - cxIcon + 1) / 2;

             int y = (rect.Height() - cyIcon + 1) / 2;

             // Отображаем пиктограмму

             dc.DrawIcon(x, y, m_hIcon);

      }

      else

      {

             CDialog::OnPaint();

      }

}

// Данный метод вызывается для определения формы курсора,

// отображаемого, когда пользователь переносит

// минимизированное окно

// Метод OnQueryDragIcon класса CDialogDlg

HCURSOR CDialogDlg::OnQueryDragIcon()

{

      return (HCURSOR) m_hIcon;

}


Содержание раздела