Инфоурок Информатика КонспектыИдеология программирования под Windows

Идеология программирования под Windows

Скачать материал

Идеология программирования под Windows

Под термином WINDOWS-программирование можно подразумевать все, что угодно, но в большинстве своем это означает "событийное" программирование. Именно эта концепция используется в Windows. Она кардинально отличается от того, как писались программы для DOS. Если в DOS программа представлялась единым целым и опрашивала в цикле клавиатуру, мышь, порты и пр. и в зависимости от того, нажата ли клавиша, передвинулась мышь, выполняла определенные действия. В Windows этот процесс опроса берет на себя сама система и если произошло какое-то действие (событие), то сообщает (посылает вашей программе сообщение) об этом. А программа фактически состоит из отдельных функций, каждая из которых обрабатывает определенные (клавиатура, мышь) сообщения и соответствующим образом реагирует на них (т.е. реагирует на событие). Очевидно, что события могут быть разными - это не только клавиатура и мышь, а например закрытие окна, изменение его размеров, завершение работы Windows, появление новых данных в буфере обмена и пр. Причем программа может реагировать только на определенные сообщения, а остальные, будут обработаны системой.

Наиболее важным моментом при программировании для Windows является интерфейс прикладного программирования - (Application Programming Interface, API) - это набор самых различных функций, с помощью которых приложение может взаимодействовать с Windows.

API содержит около 2000 функций! Кроме этого в него входит несколько сотен сообщений, макросов и предопределенных констант. С одной стороны все это облегчает работу программиста, а с другой требует изучения многих томов литературы. Но здесь же следует вспомнить, что из десятков тысяч слов русского языка средний человек использует от силы пять тысяч.

Win32 API реализован на следующих платформах: Win32s (интерфейс Win32s # свободно распространяемое подмножество API Win32, работающее под ОС Windows 3.x на процессорах 80386 и старше), Windows 95/98/NT/2000/XP/2003, Windows CE.

Все Win32-платформы содержат Win32-функции, а значит, можно вызывать любую из функций интерфейса Win32 API независимо от того на какой платформе компилируется приложение. Но реализация реализации рознь.

Все Win32-функции существовуют на каждой платформе, но поддерживаются на некоторых из них только частично.

Win32 API в основном состоит из трех компонентов: Kernel, User и GDI, которые обеспечивают интерфейс с базовой OS, управление окнами и приложениями и предоставляет поддержку графики.

    Знание WinAPI очень полезно, но в случае использования соответсвующих систем программирования не является обязательным. Если использовать Borlan Pascal или Borland С++, то знание API просто необходимо. В случае использования т.н. RAD-систем (системы быстрой разработки приложений), таких как Delphi, С++ Builder, Visual Basic, Visual C++ и им подобных знание WinAPI особо не требуется (но приветствуется). Все вышеперечисленные системы (а также множество других) являются ответом на вопрос "И где это делают?".

Программирование с применением API, представляет непростую задачу. Особенно трудоемким является процесс отладки таких программ. Поэтому все современные интегрированные средства программирования позволяют в значительной степени автоматизировать, написание таких программ. Но и здесь имеются свои проблемы. Для того чтобы разобраться, как написать самостоятельно программу с использованием API, достаточно изучить коды программ написанных другими программистами.

Основные общие свойства Windows-платформ.

Систему Windows часто называют операционной системой передачи сообщений. В основе системы лежит механизм, транслирующий практически каждое событие (нажатие клавиши, перемещение мыши, истечение времени таймера) в сообщение.

Типичное приложение построено на основе цикла сообщений, который принимает эти сообщения и отправляет их к соответствующим функциям – обработчикам сообщений. Хотя сообщения передаются приложениям, они адресованы не им, а другим основополагающим компонентам операционной системы – окнам.

С точки зрения пользователя, окно - это прямоугольная область экрана, которую занимает каждая программа Windows. Хотя одна программа может создать несколько окон, всегда имеется одно окно верхнего уровня, которое называется “главным окном” приложения.

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

·                     Окно – это гораздо больше, чем просто прямоугольная область на экране компьютера; оно представляет некую абстрактную сущность, через которую взаимодействуют пользователь и компьютер.

Приложения, потоки и окна

В многозадачных (но не многопоточных) операционных системах наименьшей единицей выполнения является задача или процесс. Механизм распределения задач в этих операционных системах переключается между этими задачами; многозадачность выполняется между двумя или более процессами.

В противоположность этому в многопоточной системе наименьшей единицей выполнения является поток, не процесс. Задача или процесс могут состоять из одного или более потоков (обычно один определяется как главный поток). Организация нового потока требует меньше системных ресурсов, потоки одного процесса имеют доступ к одному адресному пространству; переключение между потоками одного и того же процесса требует незначительных расходов ресурсов системы.

Типичное Win32-приложение состоит из одного или более потоков, которые выполняются параллельно (потоки можно понимать как многозадачность в рамках отдельного приложения, например, один поток обрабатывает данные, вводимые пользователем, в то время как другой поток занят передачей документа на принтер).

·                     Окно всегда принадлежит какому-то потоку; поток может владеть одним или несколькими окнами или вообще ни одним.

Поток, выполняющий какие-либо операции, не имеющий ни окон, ни очереди сообщений, ни цикла сообщений, называется обычно рабочим потоком, в противоположность более совершенному, обрабатывающему очередь сообщений потоку пользовательского интерфейса.

Все окна находятся в иерархической зависимости: некоторые из них являются окнами верхнего уровня, другие подчинены своим родительским окнам.

В Windows существует множество типов окон.

Самыми очевидными типами окон являются большие прямоугольные окна, связанные с приложениями, и диалоговые панели, которые можно переместить, изменить их размеры, максимизировать или минимизировать.

Менее очевидно, что многие элементы, отображаемые внутри главного или диалогового окна, сами по себе являются окнами.

Каждая кнопка, поле ввода, полоса прокрутки, окно списка, пиктограмма, даже фон экрана обрабатывается операционной системой как окно.

Классы окон

Основное поведение окна определяется классом окон. Класс окна (не путать с понятием “класс” языка программирования C++) несет информацию о начальном внешнем виде окна, пиктограмме по умолчанию, курсоре и ресурсе меню, связанном с окном; и, что, возможно, более важно – об адресе функции, называемой оконной процедурой.

Когда приложение обрабатывает сообщения, оно обычно делает это посредством вызова функции DispatchMessage для каждого принятого сообщения - это происходит в так называемом цикле сообщений. В свою очередь, функция DispatchMessage вызывает соответствующую оконную процедуру, проверяя, для какого класса окна предназначено сообщение. Именно эта оконная процедура (функция окна) действительно обрабатывает сообщение, переданное окну.

Функция окна анализирует это сообщение и его параметры, а затем, при необходимости, выполняет некоторые действия.

Можно считать, что единственная для каждого окна функция окна реализует все методы окна как объекта. В языке C++, напротив, каждый метод объекта (класс) реализуется отдельной функцией, называемой обычно функцией-членом. Для реализации методов функция окна анализирует сообщение и однозначно определяет нужный метол.

Рассмотрим, какие типы классов окон существуют.

Существует множество стандартных классов окон, предусмотренных самой операционной системой Windows. Эти системные глобальные классы реализуют функциональные возможности общих элементов управления.

Любое приложение может использовать эти классы в своих окнах; например, реализовать элемент управления – поле ввода, используя класс окна Edit.

Приложение также может определять собственные классы окон с помощью функции RegisterClass. Эта функция позволяет программисту реализовать поведение окна, не являющегося частью ни одного из поддерживаемых системой глобальных классов.

Например, таким образом, типичное приложение реализует функциональные возможности своего главного окна, регистрирует пиктограмму главного окна и ресурса меню.

В Windows предусмотрен механизм наследования. Он реализуется с использованием так называемых классов окна. Перед созданием окна, необходима регистрация класса окна.

Для каждого класса окна определяется функция окна. При создании окна необходимо указать, к какому классу окна оно будет принадлежать и, соответственно, какую функцию окна будет использовать для обработки сообщений. Приложения могут создавать собственные оконные классы окна и свои функции окна (и следовательно свои методы), или использовать стандартные, определенные в Windows классы окна.

Например, можно создать окно изображающее кнопку и для него определить функцию окна, которая будет обрабатывать сообщения от мыши. Эта функция будет обрабатывать сообщения, и рисовать кнопку в нажатом и отжатом состоянии. Но в Windows уже определен класс окна, соответствующий кнопке.

Типы сообщений

Существует много разновидностей сообщений, представляющих события на разных уровнях. Каждое простое событие, каждое простое действие посылается в виде сообщения окну для обработки.

Приложению приходит множество сообщений, однако приложение не должно заботиться о смысле каждого отдельного сообщения. Вместо обработки всех возможных сообщений приложение имеет свободу выбора; необработанные сообщения передаются в функции обработки сообщений операционной системы по умолчанию.

Приходящее приложению Windows-сообщение состоит из нескольких частей, для его представления используется структура MSG. Приведем описание структуры, применяющейся для представления сообщения, т.е. описывающей тип сообщения:

    typedef struct tagMSG 
    {             HWND   hwnd;                     // окно, которому посылается это сообщение
                   UINT      message;                // значение самого сообщение
                   WPARAM             wParam;  // для передачи дополнительной информации
                   LPARAM              lParam;   // для передачи дополнительной информации
                   DWORD               time;                       // время, когда произошло событие
                   POINT    pt;                          // точка, где произошло события (для мыши)
    } MSG; 

Элемент структуры hwnd однозначно идентифицирует окно, которому посылается это сообщение. Каждое окно в Windows имеет такой идентификатор. Элемент message идентифицирует само сообщение. Этот элемент может иметь сотни различных значений, означающих одно из многих сотен различных сообщений, которые могут получать приложения Windows.

Для идентификаторов сообщений обычно используются символьные представления (WM_PAINT, WM_TIMER), а не числовые значения. Эти символьные значения определены в стандартных файлах заголовков Windows (приложению необходимо включать в свой исходный текст только файл windows.h – он содержит директивы #include для остальных файлов).

Сообщения можно разделить на несколько групп в зависимости от их функций. Самой насыщенной группой сообщений является группа сообщений управления окнами. Символьные идентификаторы для этих сообщений начинаются с WM_. Эта группа настолько велика, что ее уместно еще раз разбить на категории. Эти категории включают:

·                     сообщения DDE (dynamic data exchange),

·                     сообщения буфера обмена (clipboard),

·                     сообщения мыши,

·                     сообщения клавиатуры,

·                     сообщения неклиентской (non-client) области окна,

·                     сообщения MDI (multiple-document interface),

·                     и многие другие типы.

Перечисленные категории несколько неточны, не всегда строго определены; они просто служат для удобства программистов, чтобы можно было представить картину множества событий управления окнами. Множество сообщений WM_ также не фиксировано, оно растет по мере добавления новых возможностей операционной системы.

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

Приложения также могут определять собственные сообщения.

·                     Первый способ пригоден только для случая, если сообщение пересылается между окнами (частями) одного и того же приложения. Для этого необходимо определить символическое имя нового сообщения при помощи директивы #define, например:

    #define   СимволическоеИмяОдногоСообщения           (WM_USER+1)
    #define    СимволическоеИмяДругогоСообщения          (WM_USER+2)

·                     Вторым способом определения собственного сообщения является использование функции RegisterWindowMessage, которая возвращает уникальный идентификатор для сообщения. Использование собственных типов сообщений, полученных таким способом, позволяет частям приложения связываться между собой; разные приложения также могут обмениваться информацией таким способом. Однако для взаимодействия приложений доступны более мощные механизмы, например, отображаемые в память файлы.

Вызов функций Windows

Существование цикла сообщений – не единственный механизм, посредством которого приложение взаимодействует с Windows. Windows предлагает огромное количество системных вызовов для выполнения большого разнообразия задач, включая управление потоками, работу с окнами, обработку файлов, управление памятью, графический сервис, коммуникацию и много других функций.

Службы GDI. Функции GDI используются для выполнения основных независимых от устройства графических операций над контекстом устройства. Контекст устройства – это интерфейс для определенного графического устройства. Его можно использовать для получения информации об устройстве и выполнения графического вывода на это устройство. Информация, которая может быть получена через контекст устройства, содержит его подробное описание. Технология устройства (векторная или растровая), его тип, имя, разрещающая способность, цветовые возможности, возможности шрифтов – все это можно получить, вызвав контекст соответствующего устройства.

Службы пользователя. Модуль User (модуль пользователя) поддерживает системные вызовы для работы с элементами пользовательского интерфейса. Они включают в себя функции обработки окон, диалоговых панелей, меню, текстовых и графических курсоров, элементов управления, буфера обмена и многих других понятий. Именно благодаря функциям модуля User становятся доступными высокоуровневые компоненты пользовательского интерфейса.

Службы ядра системы. Службы ядра обычно относятся к категории управления файлами, памятью, процессами, потоками и ресурсами. Это не полный список, но все же эти категории описывают самые часто используемые функции модуля Kernel.

Другие API. Windows – это намного больше, чем возможности, реализованные в рассматриваемых выше трех основных модулях. Существует множество модулей, других API, каждый реализующий свое определенное множество функциональных возможностей. Рассмотрим кратко некоторые из наиболее широко используемых API.

·                     Функции общих элементов управления используются для работы с новыми элементами управления (расширяющими множество стандартных элементов управления).

·                     Общие диалоговые окна содержат поддерживаемые системой диалоговые окна для открытия файла, выбора цвета из цветовой палитры, выбора шрифта из множества инсталлированных в системе, определения операции поиска или поиска с заменой. Эти диалоговые окна можно использовать по умолчанию или их функции можно изменять через новые шаблоны диалоговых окон и оконных процедур.

·                     MCI (multimedia control interface) предоставляет собой интерфейс управления средствами мультимедиа. Через функции MCI приложения легко могут получить доступ к видео-, аудио- и MIDI-возможностям Windows.
Существует несколько групп функций, связанных с сетью: например, WinSock – библиотека Windows Sockets, WinInet – библиотека Windows Internet API и др.

Оконная функция – функция обратного вызова

Программисты хорошо знакомы с понятием вызова операционной системы для выполнения каких-то действий. Например, программисты на C используют функцию fopen для открытия файла. Библиотечные функции, поставляемые компилятором, содержат код, который фактически вызывает для открытия файла операционную систему. Здесь все просто. Но операционная система Windows ведет себя иначе.

Хотя в Windows имеется очень много доступных программисту функций, Windows также и сама посылает вызовы программе, особенно оконной процедуре. Оконная процедура связана с классом окна, который программа регистрирует с помощью вызова функции RegisterClass. Окно, создаваемое на основе этого класса, использует оконную процедуру для обработки всех сообщений окна. Windows посылает сообщения окну, вызывая оконную процедуру.

Рассмотрим примеры, когда Windows вызывает оконную процедуру:

·                     первый раз при создании окна;

·                     при последующем удалении окна;

·                     при изменении размеров окна, при его перемещении, при его свертывании;

·                     при выборе пункта меню;

·                     при манипуляции с полосами прокрутки или с мышью;

·                     чтобы сообщить ей о необходимости перерисовать рабочую область.

Все эти вызовы имеют форму сообщений. В большинстве Windows-программ основная часть программы направлена на обработку этих сообщений. Свыше 200 различных сообщений, которые Windows может отправить оконной процедуре, идентифицируются именами, которые начинаются с cимволов WM_ и определяются в заголовочных файлах Windows.

Фактически, идея функции, находящейся в программе, но которая вызывается не из самой программы, не является абсолютно новой в традиционном программировании. Функции signal в языке С может перехватить нажатие комбинации клавиш <Ctrl+Break>. В Windows эта идея расширена и пронизывает всю систему.

Любое событие, относящееся к окну, передается оконной процедуре в виде сообщения. Затем оконная процедура соответствующим образом реагирует на это сообщение или передает сообщение в функцию DefWindowProc для обработки его по умолчанию.

Синхронные и асинхронные сообщения

Итак, передача окну сообщений означает вызов операционной системой Windows оконной процедуры. Но в программах для Windows имеется и цикл обработки сообщений, который берет сообщения из очереди сообщений, вызывая функцию GetMessage, и отправляет их оконной процедуре, вызывая функцию DispatchMessage.

Одни и те же сообщения могут быть и синхронные (queued), и асинхронные (nonqueued). Синхронными сообщениями называются сообщения, которые Windows помещает в очередь сообщений программы, и которые извлекаются и диспетчеризируются в цикле обработки сообщений. Асинхронные сообщения передаются непосредственно окну, когда Windows вызывает оконную процедуру.

·                     Говорят, что синхронные сообщения помещаются (отправляются) в очередь сообщений (post), а асинхронные посылаются прямо в оконную процедуру (send).

Структура программ для Windows очень проста, поскольку у них имеется только одно центральное место обработки сообщений. В результате оконная процедура получает все предназначенные для окна сообщения, как синхронные, так и асинхронные.

Синхронными становятся сообщения, в основном, тогда, когда они являются результатом пользовательского ввода путем нажатия клавиш (например, WM_KEYDOWN или WM_KEYUP), это символы, введенные с клавиатуры (WM_CHAR), результат движения мыши (WM_MOUSEMOVE) и щелчков кнопки мыши (WM_LBUTTONDOWN). Кроме этого, синхронные сообщения включают в себя сообщения таймера (WM_TIMER), сообщение о выходе из программы (WM_QUIT), а также все сообщения, которые помещаются в очередь сообщений посредством вызова приложением функции PostMessage.

Сообщения становятся асинхронными во всех остальных случаях. Часто асинхронные сообщения являются результатом вызова определенных функций Windows или непосредственным результатом вызова функции SendMessage.

Очевидно, что процесс этот сложен, но, большая часть сложностей ложится на Windows, а не пользовательские программы.

С позиции оконной процедуры совершенно не важно, для обработки какого сообщения и кем она вызвана. Оконная процедура может что-то сделать с этими сообщениями, а может и проигнорировать их. По этой причине оконную процедуру назвали конечным пунктом обработки (ultimate hook). Сообщения извещают оконную процедуру почти обо всем, что влияет на окно.

Например, когда WinMain вызывает функцию CreateWindow, Windows отправляет оконной процедуре асинхронное сообщение WM_CREATE. КогдаWinMain вызывает UpdateWindow, Windows отправляет оконной процедуре асинхронное сообщение WM_PAINT.

Сообщения не похожи на аппаратные прерывания. Во время обработки в оконной процедуре одного сообщения программа не может быть прервана другим сообщением. Только в этом случае, если оконная процедура вызвала функцию, которая сама стала источником нового сообщения, то оконная процедура начнет обрабатывать это новое сообщение еще до того, как функция вернет управление программе.

Цикл обработки сообщений и оконная процедура работают не параллельно. Когда оконная процедура обрабатывает сообщение, то это результат вызова функции DispatchMessage в WinMain. DispatchMessage не завершается до тех пор, пока оконная процедура не обработала сообщение.

Часто возникает необходимость того, чтобы оконная функция сохраняла информацию, полученную в сообщении, и использовала ее при обработке другого сообщения. Тогда эту информацию следует описывать в оконной процедуре в виде статических переменных, либо хранить в глобальных переменных.

Разделение аппаратных ресурсов

Одним из наиболее существенных свойств Windows является то, что под его управлением можно одновременно запускать на выполнение несколько программ. Различные приложения делят между собой эти ограниченные ресурсы, распределение которых осуществляет операционная оболочка Windows.

Программируя для Windows, нельзя забывать о том, что все аппаратные ресурсы являются разделяемыми, и для их правильного использования следует придерживаться определенных правил.

Так, если программа для MS-DOS имеет доступ ко всей свободной оперативной памяти и может обращаться к этой памяти так, как захочется программисту, то в Windows, где одновременно может выполняться несколько программ, память является разделяемым ресурсом.

Другим примером разделяемого ресурса является дисплей. Программируя в MS-DOS, можно в любой момент переключить режим видеоадаптера, изменить цвет или даже напрямую обратится контроллеру и что-то записать в видеопамять. Такая техника полностью исключается при программировании в Windows. Дисплей - разделяемый системный ресурс, и обращаться к нему можно только так, как позволяет Windows.

Одной из основных целей создателей Windows являлось обеспечение визуального доступа к большинству приложениям одновременно. Для этого каждому приложению выделяется часть экрана для взаимодействия с пользователем. В Windows каждое приложение в любой момент времени имеет доступ к определенной части экрана. Таким образом, экран в Windows - разделяемый ресурс, средством разделения которого является окно приложения.

Итак, два важных вывода.

Во-первых, загруженная на выполнение программа не забирает на себя полностью все ресурсы - эти ресурсы выделяются приложению при помощи специальных механизмов.

Во-вторых, в каждый момент времени программа не знает, какая именно область экрана принадлежит окну приложения, поскольку пользователь в любой момент может переместить окно и изменить его размеры (для определения координат окна нужно обратиться к специальной функции Windows).

 

 

 

Просмотрено: 0%
Просмотрено: 0%
Скачать материал
Скачать материал "Идеология программирования под Windows"

Методические разработки к Вашему уроку:

Получите новую специальность за 3 месяца

Медиатор

Получите профессию

Няня

за 6 месяцев

Пройти курс

Рабочие листы
к вашим урокам

Скачать

Краткое описание документа:

В данном конспекте изложена идеология программирования под Windows. Основные свойства и правила программирование. Например, можно создать окно изображающее кнопку и для него определить функцию окна, которая будет обрабатывать сообщения от мыши. Эта функция будет обрабатывать сообщения, и рисовать кнопку в нажатом и отжатом состоянии. Но в Windows уже определен класс окна, соответствующий кнопке.

Скачать материал

Найдите материал к любому уроку, указав свой предмет (категорию), класс, учебник и тему:

6 625 819 материалов в базе

Скачать материал

Другие материалы

Разработка урока в соответствии с ФГОС по теме: "Организация вычислений. Относительные, абсолютные и смешанные ссылки" 9 класс
  • Учебник: «Информатика», Босова Л.Л., Босова А.Ю.
  • Тема: 3.2.1. Относительные, абсолютные и смешанные ссылки
  • 09.01.2021
  • 245
  • 9
«Информатика», Босова Л.Л., Босова А.Ю.

Вам будут интересны эти курсы:

Оставьте свой комментарий

Авторизуйтесь, чтобы задавать вопросы.

  • Скачать материал
    • 21.06.2020 207
    • DOCX 87.5 кбайт
    • Оцените материал:
  • Настоящий материал опубликован пользователем Евстратова Любовь Андреевна. Инфоурок является информационным посредником и предоставляет пользователям возможность размещать на сайте методические материалы. Всю ответственность за опубликованные материалы, содержащиеся в них сведения, а также за соблюдение авторских прав несут пользователи, загрузившие материал на сайт

    Если Вы считаете, что материал нарушает авторские права либо по каким-то другим причинам должен быть удален с сайта, Вы можете оставить жалобу на материал.

    Удалить материал
  • Автор материала

    Евстратова Любовь Андреевна
    Евстратова Любовь Андреевна
    • На сайте: 3 года и 3 месяца
    • Подписчики: 0
    • Всего просмотров: 99497
    • Всего материалов: 211

Ваша скидка на курсы

40%
Скидка для нового слушателя. Войдите на сайт, чтобы применить скидку к любому курсу
Курсы со скидкой

Курс профессиональной переподготовки

Интернет-маркетолог

Интернет-маркетолог

500/1000 ч.

Подать заявку О курсе

Курс повышения квалификации

Использование компьютерных технологий в процессе обучения информатике в условиях реализации ФГОС

36 ч. — 144 ч.

от 1700 руб. от 850 руб.
Подать заявку О курсе
  • Сейчас обучается 140 человек из 44 регионов

Курс профессиональной переподготовки

Информатика: теория и методика преподавания с применением дистанционных технологий

Учитель информатики

300 ч. — 1200 ч.

от 7900 руб. от 3950 руб.
Подать заявку О курсе

Курс повышения квалификации

Использование нейросетей в учебной и научной работе: ChatGPT, DALL-E 2, Midjourney

36/72 ч.

от 1700 руб. от 850 руб.
Подать заявку О курсе
  • Сейчас обучается 561 человек из 73 регионов

Мини-курс

Soft-skills современного педагога

3 ч.

780 руб. 390 руб.
Подать заявку О курсе
  • Сейчас обучается 40 человек из 17 регионов

Мини-курс

Патологии нервной системы у детей: от перинатального периода до нарушений поведения

4 ч.

780 руб. 390 руб.
Подать заявку О курсе
  • Сейчас обучается 34 человека из 23 регионов

Мини-курс

Стимулирование интереса к обучению у детей дошкольного возраста

6 ч.

780 руб. 390 руб.
Подать заявку О курсе