- •Методические рекомендации
- •План лекции
- •Интерфейс графического устройства
- •Программирование, основанное на ресурсах
- •Управления памятью
- •Документы и их представление
- •Контрольные вопросы
- •Редактирование функций.
- •Изучение работы приложения.
- •Самостоятельная работа.
- •Добавление своего класса.
- •Домашняя работа.
- •Лекция 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. Использование событий.
Пример 10. Создание процесса вWindows.
Показывает создание процесса и наследование хендла. Модуль "Project1", приведённый ниже, запускается с параметром в командной строке, задающим имя создаваемого файла. Создаётся файл, в него записывается фраза " Это было ". Затем формируется командная строка, содержащая имя нового процесса "Project2" и наследуемый хендл файла, и запускается процесс, который дописывает в тот же файл слово "наследование".
Project1.cpp
#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include <process.h>
#pragma argsused
int main( int argc, char* argv[] )
{
DWORD dwWriten;
char st[9], st1[30];
PROCESS_INFORMATION piProcInfo;
STARTUPINFO siStartInfo;
HANDLE hY; //Хендл файла
SECURITY_ATTRIBUTES saY; // Атрибуты файла
if (argc!=2)
exit(1);
saY.nLength=sizeof(SECURITY_ATTRIBUTES); //Задание
saY.lpSecurityDescriptor=NULL; //атрибутов
saY.bInheritHandle=true; //наследуется хендл
//Создание файла
hY=CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ |
FILE_SHARE_WRITE, &saY, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
printf("Parent PID %d\n Inherited HANDLE of File %d\n",getpid(),hY);
WriteFile(hY,"Это было ",9,&dwWriten,NULL); //Записать в файл строку
ZeroMemory(&siStartInfo, sizeof(STARTUPINFO)); //подготовка
siStartInfo.cb = sizeof(STARTUPINFO); // STARTUPINFO для нового процесса
// Формирование командной строки нового процесса
itoa((int)hY,st,10);
strcpy(st1,"project2.exe ");
strcat(st1,st);
// Создание нового процесса
CreateProcess(NULL,
st1, // командная строка
NULL, // атрибуты SECURITY_PROCESS
NULL, // атрибуты безопасности первичной нити
TRUE, // разрешить наследование хендлов
CREATE_NEW_CONSOLE, // флаги
NULL, // использование родительского окружения
NULL, // использование родительского каталога
&siStartInfo, // STARTUPINFO
&piProcInfo); // PROCESS_INFORMATION
printf("Press any key to continue\n");
getchar();
exit(0);
}
Project2.cpp
#include <vcl.h>
#pragma hdrstop
#include <vcl.h>
#include <stdio.h>
#include <process.h>
#pragma argsused
int main( int argc, char* argv[] )
{
HANDLE hY;
DWORD dWriten;
if (argc!=2)
exit(1);
hY=(HANDLE)(unsigned int)atoi(argv[1]); //Получение наследуемого хендла
printf("Child PID %d\n Inherited HANDLE of File %d\n",getpid(),hY);
if(WriteFile(hY, "наследие", 8, &dWriten, NULL) = = true) //Дописать в файл
{ printf("Write comlete\n");}
else
printf("Write missing\n");
printf("Press any key to continue\n");
getchar();
return 0;
}
Пример 11. Использование неименованного канала.
Программа передаёт и считывает из канала строку символов "hello".
#include <vcl.h>
#pragma hdrstop
#pragma argsused
#include <stdio.h>
int main(int argc, char* argv[])
{
char str[5];
bool tt;
HANDLE hRead,hWrite;
DWORD dwWriten;
tt=CreatePipe(
&hRead,
&hWrite,
NULL, // указатель на SECURITY_ATTRIBUTES
0 // Число байт в канале по умолчанию
);
WriteFile(hWrite,"Hello",5,&dwWriten,NULL);
ReadFile(hRead,str,5,&dwWriten,NULL);
printf("Pipe declared %s",str);
getchar();
return 0;
}