- •Методические рекомендации
- •План лекции
- •Интерфейс графического устройства
- •Программирование, основанное на ресурсах
- •Управления памятью
- •Документы и их представление
- •Контрольные вопросы
- •Редактирование функций.
- •Изучение работы приложения.
- •Самостоятельная работа.
- •Добавление своего класса.
- •Домашняя работа.
- •Лекция 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. Использование событий.
Пример 12. Использование именованного канала.
Программа передаёт и считывает из канала строку символов "hello". И сервер и клиент функционируют в одном процессе.
#include <vcl.h>
#pragma hdrstop
#pragma argsused
#include <stdio.h>
int main(int argc, char* argv[])
{
DWORD dwWRriten;
DWORD dwErrorCode;
bool tt;
HANDLE hNamedPipe = CreateNamedPipe(
"\\\\.\\pipe\\PipeFile", //name pipe
PIPE_ACCESS_DUPLEX, // pipe open mode
PIPE_TYPE_BYTE | PIPE_NOWAIT, // pipe-specific modes
1, // maximum number of instances
100, // output buffer size, in bytes
100, // input buffer size, in bytes
100, // time-out time, in milliseconds
NULL);
//Вторая точка канала клиент
HANDLE hClientPipe=CreateFile(
"\\\\.\\pipe\\PipeFile", // pointer to name of the file
GENERIC_READ | GENERIC_WRITE, // access (read-write) mode
FILE_SHARE_READ |FILE_SHARE_WRITE,
NULL, // pointer to security attributes
OPEN_EXISTING , // how to create
FILE_ATTRIBUTE_SYSTEM, // file attributes
0 // handle to file with attributes to copy
);
char chInBuf[]="Hello";
char chOutBuf[100];
WriteFile(hNamedPipe,chInBuf,sizeof(chInBuf),&dwWRriten,NULL); //запись в канал
ReadFile(hClientPipe,chOutBuf,sizeof(chInBuf),&dwWRriten,NULL)) ; //чтение из канала
printf("NamedPipe declared %s",chOutBuf);
CloseHandle(hNamedPipe); // handle to object
getchar();
return 0;
}
Пример 13. Использование разделяемой памяти File Mapping.
Процесс1 создаёт File Mapping присоединяется нему и пересылает в память 10 чисел. Процесс 2 присоединяется к тому же File Mapping читает и выводит записанные числа.
process1.cpp
#include <vcl.h>
#pragma hdrstop
#pragma argsused
int main()
{
unsigned char *pview,i;
LPMSG msg;
HANDLE hfilemap;
hfilemap=CreateFileMapping(NULL,NULL,PAGE_READWRITE,0,10,"lpName");
pview=(unsigned char *)MapViewOfFile(hfilemap,FILE_MAP_ALL_ACCESS,0,0,0);
for (i = 1; i<=10; i++)
{*pview=i; pview++;}
// Ожидает закрытия окна
while (GetMessage(msg, NULL, 0, 0))
DispatchMessage(msg);
}
process2.cpp
#include <vcl.h>
#include <stdio.h>
//#pragma hdrstop
//#pragma argsused
int main(int argc, char* argv[])
{
HANDLE hMapFile;
unsigned char* pbyte,i;
hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE,"lpName");
pbyte=(unsigned char*)MapViewOfFile(hMapFile, // Handle to mapping object.
FILE_MAP_ALL_ACCESS, // Read/write permission.
0, // Max. object size.
0, // Size of hFile.
0); // Map entire file.
for (i=1;i<=10;i++)
printf("%d\n",*pbyte++);
getchar();
}
Пример 14. Использование Mailslot.
Сервер создаёт Mailslot и ждёт сообщения, клиент подключается к Mailslot и посылает сообщение.
Server.cpp
#include <vcl.h>
#include <stdio.h>
#pragma hdrstop
#pragma argsused
int main(int argc, char* argv[])
{
DWORD dwErrorCode, cbMessage, cMessage=0,dwRead;
char chOutBuf[100];
HANDLE hMailslot;
hMailslot=CreateMailslot(
"\\\\.\\mailslot\\mailslotFile",
0,
0,
NULL
);
for(;cMessage==0;)
GetMailslotInfo(
hMailslot,
(LPDWORD) NULL, // no maximum message size
&cbMessage, // size of next message
&cMessage, // number of messages
(LPDWORD) NULL // no read time-out
);
ReadFile(hMailslot,chOutBuf,cbMessage,&dwRead,NULL);
printf("Mailslot declared %s",chOutBuf);
CloseHandle(hMailslot); // handle to object
getchar();
return 0;
}
Client.cpp
#include <vcl.h>
#include <stdio.h>
#pragma hdrstop
#pragma argsused
int main(int argc, char* argv[])
{
DWORD dwWrite;
char chOutBuf[]="Pass Message from Mailfile";
HANDLE hMailslot;
hMailslot = CreateFile("\\\\.\\mailslot\\mailslotFile",
GENERIC_WRITE,
FILE_SHARE_READ, // required to write to a mailslot
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
bool fResult = WriteFile(hMailslot,
chOutBuf,
(DWORD) lstrlen(chOutBuf) + 1, // include terminating null
&dwWrite,
(LPOVERLAPPED) NULL);
getchar();
return 0;
}