- •Методические рекомендации
- •План лекции
- •Интерфейс графического устройства
- •Программирование, основанное на ресурсах
- •Управления памятью
- •Документы и их представление
- •Контрольные вопросы
- •Редактирование функций.
- •Изучение работы приложения.
- •Самостоятельная работа.
- •Добавление своего класса.
- •Домашняя работа.
- •Лекция 2. Основы программирования. Работа с классом Вид. Методические рекомендации:
- •Интерфейс графического устройства
- •Работа с gdi объектами
- •Пример создания нового gdi объекта
- •Режимы преобразования координат
- •Режимы преобразования координат с постоянным масштабом
- •Режимы преобразования координат с переменным масштабом
- •Замечание
- •Координатные пространства mfc
- •Пример использования режимов преобразования координат
- •Работа с окнами, содержащими полосы прокрутки
- •Линейки прокрутки
- •Различные способы прокрутки
- •Прием ввода с клавиатуры
- •Контрольные вопросы
- •Обработка сообщений от мыши.
- •Задание для самостоятельной домашней разработки.
- •Лекция 3. Меню. Панели инструментов и строки состояния Методические рекомендации
- •Меню Windows
- •Обновление командного пользовательского интерфейса
- •Класс cMenu
- •Создание контекстных меню
- •Панели элементов управления и каркас приложений
- •Панель инструментов
- •Растровое изображение панели инструментов
- •Состояния кнопок Любая кнопка может находиться в следующих состояниях
- •Всплывающие подсказки
- •Строка состояния
- •Определение секций в строке состояния
- •Строка сообщений
- •Индикатор состояния
- •Управление строкой состояния
- •Контрольные вопросы:
- •Добавление переменных-членов.
- •Добавление функции OnMouseMove.
- •Программирование команд контекстного меню.
- •Программирование команд главного меню.
- •Домашняя работа.
- •Лекция 4. Диалоговые окна и стандартные элементы управления Методические рекомендации
- •Работа с модальным диалоговым окном
- •Стандартные элементы управления
- •Работа с немодальными диалоговыми окнами
- •Пользовательские сообщения
- •Принадлежность диалогового окна
- •Контрольные вопросы
- •Создание класса “диалогового окна”.
- •Добавление переменных-членов класса вашего диалогового окна.
- •Написание инициализирующего кода
- •Присваивание переменным начальных значений.
- •Самостоятельная работа.
- •Домашнее задание.
- •Лекция 5. Обработка сообщений Windows и программирование многопоточных приложений Методические рекомендации
- •Обработка сообщений в однопоточной программе
- •Передача управления
- •Таймеры
- •Обработка в периоды простоя
- •Программирование многопоточных приложений
- •Функция рабочего потока и запуск потока
- •Общение основного потока с рабочим
- •Общение рабочего потока с основным
- •Синхронизация потоков с использованием событий
- •Блокировка потоков
- •Критические секции
- •Потоки пользовательского интерфейса
- •Контрольные вопросы
- •Домашнее задание.
- •Задание для самостоятельной работы
- •Управление процессом Пример 1.
- •2. Замена образа процеса Пример 2. Использование функции exec.
- •Пример 3. Использование неименованного канала.
- •Пример 4. Создание именованного канал с именем "fifo".
- •3. Сигналы.
- •Пример 5. Использование сигналов.
- •Пример 6. Сообщения.
- •Пример 7. Сообщения.
- •Пример 8. Разделение памяти.
- •Пример 9. Использование семафоров.
- •Пример 10. Создание процесса вWindows.
- •Пример 11. Использование неименованного канала.
- •Пример 12. Использование именованного канала.
- •Пример 13. Использование разделяемой памяти File Mapping.
- •Пример 14. Использование Mailslot.
- •Пример 15. Использование событий.
Написание инициализирующего кода
Инициализацию элементов управления лучше всего производить в функции OnInitDialog. Эта функция является обработчиком сообщения WM_ INITDIALOG, поэтому запустите Class Wizard, и создайте ее. А затем добавьте в нее следующий код.
BOOL Ankets::OnInitDialog()
{
// Преобразуем идентификатор списка в указатель на этот список.
// Note: Нельзя пытаться обратиться к элементу управления,
// преобразовав его идентификатор, если у него есть переменная-
// член из категории Control.
CListBox* pList=(CListBox*) GetDlgItem(IDC_LIST1);
CSliderCtrl* pSlid=(CSliderCtrl*) GetDlgItem(IDC_SLIDER1);
// Инициализация списка
pList->InsertString(-1,"Окрошка");
// Добавляем новый элемент в список. -1 означает, что
// данный элемент добавляется в конец списка.
pList->InsertString(-1,"Пельмени");
pList->InsertString(-1,"Картошка");
pList->InsertString(-1,"Блинчики");
pList->InsertString(-1,"Пирожки");
///////////////////////////////////////////////////
//Инициализация ползунка. Установка максимального и
//минимального значений.
pSlid->SetRange(0,100);
return CDialog::OnInitDialog();
}
Присваивание переменным начальных значений.
Если нужно, то можно установить начальные значения переменных в функции, откуда происходит вызов диалогового окна. В нашем случае это обработчик сообщения поступающего от пункта меню. Поэтому при помощи ClassWizard создайте обработчик сообщения поступающего от пункта “модальный” и добавьте в него следующий код.
void CMainFrame::OnMenuModal()
{
//Note: Не забудьте в начале данного класса подключить
// описание класса Ankets, при помощи команды
// #include "Ankets.h"
//Создание переменной my_dialog
Ankets my_dialog;
//Пример присваивания начального значения списку
my_dialog.m_eat="Блинчики";
//Вызов модального диалогового окна
my_dialog.DoModal();
}
Самостоятельная работа.
Добавьте вывод введенной информации в окно приложения. Для до вызова DoModal получите указатель на текущий контекст устройства, и в нем выведите текст на экран.
Добавление немодального диалогового окна. Добавьте ресурс “диалоговое окно”, и создайте для него класс CNemodal, производный от CDialog. Не забудьте в свойствах ресурса установить свойство Visible.
Добавление нового конструктора. Так как AppWizard изначально генерирует модальный конструктор, то нам он не подходит. Поэтому мы должны создать новый немодальный конструктор и еще функцию создания немодального диалогового окна. Эти функции должны быть объявлены как Public. Также необходимо добавить закрытую переменную, в которой будет храниться указатель на объект CView.
private:
// Переменная указатель на объект Cview.
CView* m_pView;
………………………………..
//Немодальный конструктор
CNemodal::CNemodal(CView *pView)
{
//Сохраняем указатель на переданный экземпляр класса CView
m_pView=pView;
}
// Функция создания немодального окна
BOOL CNemodal::Create()
{
// Создание немодального окна
return CDialog::Create(CNemodal::IDD);
}
Чтобы при генерации модального окна не происходило ошибок, вставьте в модальный конструктор следующую строчку:
m_pView=NULL;
Добавление нового идентификатора сообщения. Добавьте в файл Nemodal.h следующее описание:
#define WM_GOODBYE WM_USER+5
Редактирование функций OnOK и OnCancel. Добавьте обработчики кнопок Ok и Cancel, и отредактируйте их следующим образом:
// Вызывается когда пользователь нажимает
// кнопку Ok
void CNemodal::OnOK()
{
// Если созданное диалоговое окно создано
// при помощи немодального конструктора то отсылаем
// сообщение WM_GOODBYE
if (m_pView != NULL)
{
// Если немодальное окно, то тогда обновляем данные,
// и посылаем сообщение WM_GOODBYE от кнопки OK
UpdateData(TRUE);
m_pView->PostMessage(WM_GOODBYE,IDOK);
}
else
// Если же модальное окно, то пользуемся
// стандартной функцией.
CDialog::OnOK();
}
// Вызывается когда пользователь нажимает
// кнопку Cancel
void CNemodal::OnCancel()
{
// Если созданное диалоговое окно создано
// при помощи немодального конструктора то отсылаем
// сообщение WM_GOODBYE
if (m_pView != NULL)
{
// Если немодальное окно, то посылаем сообщение
// WM_GOODBYE от кнопки CANCEL
m_pView->PostMessage(WM_GOODBYE,IDCANCEL);
}
else
// Если же создано модальное окно,
// то пользуемся стандартной функцией.
CDialog::OnCancel();
}
Редактирование класса CL4_1View. Для того чтобы Вы могли работать с немодальным диалоговым окном необходимо в классе CL4_1View создать указатель на экземпляр диалогового окна. Для этого добавьте в заголовочный файл следующие строки.
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//Определение класса CNemodal
//для того чтобы не надо было
//подключать заголовочный файл
// к каждому классу
class CNemodal;
// Создание переменной указывающей на
// объекты класса CNemodal.
private:
CNemodal* m_pDlg;
Создание обработчика сообщения WM_GOODBYE. Добавьте в класс CL4_1View обработчик сообщения WM_GOODBYE. Сделать это придется вручную, так как это нестандартное сообщение. Для этого сначала необходимо добавить макрос в таблицу сообщений, связывающий данное сообщение с конкретной функцией – обработчиком. А затем добавить саму функцию.
Добавление макроса
BEGIN_MESSAGE_MAP(CL4_1View, CView)
// Макрос связывающий сообщение с функцией-обработчиком
ON_MESSAGE(WM_GOODBYE,OnGoodbye)
//{{AFX_MSG_MAP(CL4_1View)
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_MENU_NEMODAL, OnMenuNemodal)
ON_WM_RBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
Добавление прототипа
protected:
// Прототип функции-обработчика собщения WM_GOODBYE
afx_msg void CL4_1View::OnGoodbye(UINT wParam, LONG lParam);
//{{AFX_MSG(CL4_1View)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMenuNemodal();
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
Добавление функции
// Функция - обработчик сообщения WM_GOODBYE
void CL4_1View::OnGoodbye(UINT wParam, LONG lParam)
{
// Уничтожаем немодальное окно
m_pDlg->DestroyWindow();
}
Вызов немодального окна. Для того чтобы добавить в Вашу программу возможность вызова немодального окна необходимо создать в классе CL4_1View обработчик сообщения ON_COMMAND, которое посылается пунктом меню “Немодальное”.
// Обработчик пункта "Немодальное"
void CL4_1View::OnMenuNemodal()
{
//Если указатель на окно равен 0
//(Если окно не создано)
if (m_pDlg->GetSafeHwnd()==0)
{
//Создаем окно
m_pDlg->Create();
}
}