Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Фролов Александр. Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT - royallib.ru.doc
Скачиваний:
98
Добавлен:
11.03.2016
Размер:
905.62 Кб
Скачать

Листинг 4.4. Файл DialogDlg.Cpp

#include "stdafx.h"

#include "Dialog.h"

#include "DialogDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

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

// Описание класса CAboutDlg, который используется для

// управления диалоговой панелью About. Методы этого класса

// определены ниже

class CAboutDlg : public CDialog {

public:

 CAboutDlg();

 // Dialog Data

 //{{AFX_DATA(CAboutDlg)

 enum { IDD = IDD_ABOUTBOX };

 //}}AFX_DATA

 // В следующем блоке 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;

}

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

Файл DialogDlg.cpp содержит таблицу сообщений класса CDialogDlg. Таблица включает три макрокоманды. Как видите, они расположены в блоке AFX_MSG_MAP, поэтому для управления ими используется ClassWizard.

BEGIN_MESSAGE_MAP(CDialogDlg, CDialog)

 //{{AFX_MSG_MAP(CDialogDlg)

 ON_WM_SYSCOMMAND()

 ON_WM_PAINT()

 ON_WM_QUERYDRAGICON()

 //}}AFX_MSG_MAP

END_MESSAGE_MAP()

При помощи ClassWizard вы можете обнаружить, что макрокоманды выполняют обработку сообщений WM_SYSCOMMAND, WM_PAINT, WM_QUERYDRAGICON, вызывая для этого методы OnSysCommand, OnPaint и OnQueryDragIcon.