таймер windows программирование
При написании программы использовались следующие функции WinAPI:
ReleaseDC
Функция ReleaseDC
Функция ReleaseDC освобождает контекст устройства (DC) для использования другими приложениями. Действие функции ReleaseDC зависит от типа контекста устройства (DC). Она освобождает только общий и контекст устройства (DC) окна. Она не имеет никакого действия на контексты устройства класса или частный DC.
Синтаксис:
int ReleaseDC(
HWND hWnd, // дескриптор окнаhDC // дескриптор контекста устройства (DC)
);
Параметры:
[in] Дескриптор окна, контекст устройства (DC) которого должен быть освобожден.
[in] Дескриптор контекста устройства (DC), который будет освобожден.
Возвращаемые значения:
Возвращаемое значение указывает, был ли контекст устройства (DC) освобожден. Если контекст устройства был освобожден, возвращаемое значение равно 1.
Если контекст устройства (DC) не был освобожден, величина возвращаемого значения - ноль.
Замечания:
Приложение должно вызывать функцию ReleaseDC для каждого вызова функции GetWindowDC и для каждого вызова функции GetDC <https://vsokovikov.narod.ru/New_MSDN_API/D_context/fn_getdc.htm>, которые извлекают общий контекст устройства.
Приложение не может использовать функцию ReleaseDC, чтобы освободить контекст устройства (DC), который создавался при помощи вызова функции CreateDC <https://vsokovikov.narod.ru/New_MSDN_API/D_context/fn_createdc.htm>; вместо этого оно должно использовать функцию DeleteDC <https://vsokovikov.narod.ru/New_MSDN_API/D_context/fn_deletedc.htm>. Функция ReleaseDC должна вызваться из того же самого потока, который вызвал GetDC.
Функция GetDC
Функция GetDC извлекает дескриптор дисплейного контекста устройства (DC) для рабочей области заданного окна или для всего экрана. Вы можете использовать возвращенный дескриптор в последующих функциях GDI, чтобы рисовать в контексте устройства.
|
Функция GetDCEx <https://vsokovikov.narod.ru/New_MSDN_API/D_context/fn_getdcex.htm> - это улучшенная GetDC, который дает приложению больше контроля, как и происходит ли отсечение по границам в рабочей области.
Синтаксис:
HDC GetDC(hWnd // дескриптор окна
);
Параметры:
hWnd
[in] Дескриптор окна, контекст устройства (DC) которого должен извлечься. Если это значение - ПУСТО (NULL), GetDC извлекает контекст устройства (DC) для всего экрана.
Windows 98/Me, Windows 2000/XP: Чтобы получить контекст устройства (DC) для конкретного экранного монитора, используйте функцию EnumDisplayMonitors и CreateDC <https://vsokovikov.narod.ru/New_MSDN_API/D_context/fn_createdc.htm>.
Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - дескриптор контекста устройства (DC) для рабочей области заданного окна.
Если функция завершается ошибкой, возвращаемое значение - ПУСТО (NULL).
Windows NT/2000/XP: Чтобы получать дополнительные сведения об ошибке, вызовите GetLastError <https://vsokovikov.narod.ru/New_MSDN_API/Debbag_error/fn_getlasterror.htm>.
Замечания:
Функция GetDC извлекает общий, для класса, или частный контекст устройства (DC) в зависимости от стиля класса заданного окна. Для класса и частного контекстов устройства (DC), функция GetDC оставляет предварительно назначенные атрибуты неизменными. Однако, для общих контекстов устройства (DC), GetDC назначает атрибуты контексту устройства (DC) по умолчанию, каждый раз, когда он извлекается. Например, заданный по умолчанию шрифт System, который является растровым шрифтом. Поскольку это так, дескриптор общего контекста устройства (DC), возвращенный при помощи GetDC, не говорит Вам, какой шрифт, цвет или кисть были использованы, когда выводилось окно. Чтобы определить шрифт, вызовите функцию GetTextFace <https://vsokovikov.narod.ru/New_MSDN_API/Fonts_text/fn_gettextface.htm>.
|
Обратите внимание! на то, что дескриптор контекста устройства (DC) может быть использован в любой момент только одиночным потоком.
После рисования общим контекстом устройства (DC), должна вызваться функция ReleaseDC <https://vsokovikov.narod.ru/New_MSDN_API/D_context/fn_releasedc.htm>, чтобы освободить контекст устройства. Для DC класса и частный контексты устройства не должны освобождаться. Функция ReleaseDC должна вызываться из того же самого потока, который вызвал GetDC. Число контекстов устройства (DC) ограничено только доступной памятью.
Функция TextOut
Функция TextOut записывает строку символов в заданном месте, используя текущий выбранный шрифт, цвет фона и цвет текста.
Синтаксис:
BOOL TextOut(
HDC hdc, // дескриптор DCnXStart, // x-координата начальной позицииnYStart, // y-координата начальной позицииlpString, // строка символовcbString // число символов
);
Параметры:
[in] Дескриптор контекста устройства.
[in] Устанавливает x-координату, в логических координатах, контрольной точки, которую система использует для выравнивания строки.
[in] Устанавливает y-координату, в логических координатах, контрольной точки, которую система использует для выравнивания строки.
[in] Указатель на строку, которую нужно написать. Строка не должна завершаться нуль-терминатором, так как параметр cbString задает длину строки.
[in] Устанавливает длину строки. Для функции ANSI, это количество BYTE (байтов), а для функции Unicode, это является количеством WORD (слов).
|
Обратите внимание!, что для функции ANSI, символы в кодовых страницах SBCS (Набора однобайтовых символов) занимают один байт каждый, в то время как большинство символов в кодовых страницах DBCS (Набора двухбайтовых символов) занимают два байта; для функций Unicode большинство текущих заданных символов Unicode (которые в формате Basic Multilingual Plane (BMP) занимают одно слово (WORD), в то время как заменители символа Unicode - два слова (WORD).95/98/Me: Это значение не может превышать 8192.
Возвращаемые значения:
Если функция завершается успешно, величина возвращаемого значения - не ноль.
Если функция завершается с ошибкой, величина возвращаемого значения - ноль.
Windows NT/2000/XP: Чтобы получать расширенные данные об ошибках, вызовите функцию GetLastError <https://vsokovikov.narod.ru/New_MSDN_API/Debbag_error/fn_getlasterror.htm>.
Замечания:
Хотя это и не истина, но в большинстве случаев Windows 95/98/Me поддерживает версию Unicode этой функции также, как версии ANSI.
Интерпретация контрольной точки зависит от текущего режима выравнивания текста. Приложение может получить этот режим, при помощи вызова функции GetTextAlign <https://vsokovikov.narod.ru/New_MSDN_API/Fonts_text/fn_gettextalign.htm>; прикладная программа может изменять этот режим, вызывая функцию SetTextAlign <https://vsokovikov.narod.ru/New_MSDN_API/Fonts_text/fn_settextalign.htm>.
По умолчанию, текущая позиция не используется и не модифицируется этой функцией. Однако, приложение может вызывать функцию SetTextAlign с параметром fMode установленным в TA_UPDATECP, чтобы разрешить системе использовать и модифицировать текущую позицию каждый раз, когда прикладная программа вызывает функцию TextOut для заданного контекста устройства. Когда этот флажок установлен, система игнорирует параметры nXStart и nYStart при последующих вызовах TextOut.
Когда внутри функции TextOut помещается квадратные скобки пути, система создает маршрут для текста TrueType, который включает в себя каждый символ плюс его знакоместо. Созданный регион является знакоместом без текста, а не текст непосредственно. Вы можете получить этот регион, заключая контур текста TrueType, при помощи установки, перед размещением в функции TextOut квадратных скобок пути, прозрачного режима фона. Ниже следует типовой код, который демонстрирует эту процедуру.
// Получим рабочий прямоугольник окна(hwnd, &r);
// УСТАНОВКА: устанавливается прозрачный режим фона,
// регион является непосредственно текстом
// SetBkMode(hdc, TRANSPARENT);
// квадратная скобка открывает путь(hdc);
// отправим какой-либо текст всем
TCHAR text[ ] = "Defenestration can be hazardous";(hdc,r.left,r.top,text, ARRAYSIZE(text));
// Заключим квадратной скобкой путь(hdc);
// Получим регион из этого пути(hdc, RGN_AND);
// Это создает тот же самый результат, что и SelectClipPath()
// SelectClipRgn(hdc, PathToRegion(hdc));
// Заполните регион градациями серого цвета
FillRect(hdc, &r, GetStockObject(GRAY_BRUSH));
Функция MessageBox
Функция MessageBox создает, показывает на экране и использует окно сообщения. Окно сообщения содержит определяемое программой сообщение и заголовок, плюс любая комбинация предопределенных значков и командных кнопок.
Синтаксис:
int MessageBox(hWnd,lpText,lpCaption,uType
);
Параметры:
hWnd
[in] Дескриптор окна владельца, которое создает окно сообщения. Если этот параметр - ПУСТО (NULL), окно сообщения не имеет окна владельца.
[in] Указатель на символьную строку с нулем в конце, которая содержит сообщение показываемое на экране.
[in] Указатель на символьную строку с нулем в конце, которая содержит заголовок диалогового окна (окна сообщения). Если этот параметр - ПУСТО (NULL), используется заданный по умолчанию заголовок Error (Ошибка).
[in] Устанавливает содержание и режим работы диалогового окна. Этим параметром может быть комбинация флажков из ниже перечисленных групп флажков.
Чтобы обозначить кнопки, показываемые на экране в окне сообщения, задайте одно из ниже перечисленных значений.
Значение | Предназначение |
MB_ABORTRETRYIGNORE | Окно сообщения содержит три командных кнопки: Прекратить (Abort), Поторить (Retry) и Пропустить (Ignore). |
MB_CANCELTRYCONTINUE | Microsoft® Windows® 2000/XP: Окно сообщения содержит три командных кнопки: Отменить (Cancel), Попытаться снова (Try Again), Продолжить (Continue). Используйте этот тип окна сообщения вместо типа MB_ABORTRETRYIGNORE. |
MB_HELP | Windows 95/98/Me, Windows NT® 4.0 и выше: Добавляет в окно сообщения кнопку Справка (Help). Когда пользователь щелкает по кнопке Справка (Help) или нажимает клавишу F1, система отправляет владельцу сообщение WM_HELP. |
MB_OK | Окно сообщения содержит одну командную кнопку: OK. Это - значение по умолчанию. |
MB_OKCANCEL | Окно сообщения содержит две командных кнопки: OK и Отменить (Cancel). |
MB_RETRYCANCEL | Окно сообщения содержит две командных кнопки: Поторить (Retry) и Отменить (Cancel). |
MB_YESNO | Окно сообщения содержит две командных кнопки: Да (Yes) и Нет (No). |
MB_YESNOCANCEL | Окно сообщения содержит три командных кнопки: Да (Yes), Нет (No) и Отменить (Cancel). |
Чтобы показать на экране значок в окне сообщения, установите одно из ниже перечисленных значений.
Значение | Предназначение |
MB_ICONEXCLAMATION | В окне сообщения появляется иконка знака восклицания. |
MB_ICONWARNING | В окне сообщения появляется иконка знака восклицания. |
MB_ICONINFORMATION | В окне сообщения появляется значок, состоящий из строчной буквы i в круге. |
MB_ICONASTERISK | В окне сообщения появляется значок, состоящий из строчной буквы i в круге. |
MB_ICONQUESTION | В окне сообщения появляется иконка знака вопроса. |
MB_ICONSTOP | В окне сообщения появляется значок стоп-сигнала. |
MB_ICONERROR | В окне сообщения появляется значок стоп-сигнала. |
MB_ICONHAND | В окне сообщения появляется значок стоп-сигнала. |
Чтобы указать основную кнопку (по умолчанию), установите одно из ниже перечисленных значений.
Значение | Предназначение |
MB_DEFBUTTON1 | Первая кнопка - основная (кнопка используемая по умолчанию). MB_DEFBUTTON1 - значение по умолчанию, если MB_DEFBUTTON2, MB_DEFBUTTON3, или MB_DEFBUTTON4 не определены. |
MB_DEFBUTTON2 | Вторая кнопка - основная кнопка. |
MB_DEFBUTTON3 | Третья кнопка - основная кнопка. |
MB_DEFBUTTON4 | Четвертая кнопка - основная кнопка. |
Чтобы указать модальность диалогового окна, установите одно из ниже перечисленных значений.
Значение | Предназначение |
MB_APPLMODAL | Пользователь должен ответить окну сообщения перед продолжением работы в окне, идентифицированном параметром hWnd. При этом, пользователь может перемещаться в окна других потоков и работать в этих окнах. В зависимости от иерархии окон в приложении, пользователь может быть в состоянии перемещаться в другие окна в пределах потока. Все дочерние окна родителя окна сообщения автоматически блокируются, однако всплывающие окна - не блокируются. MB_APPLMODAL является значением по умолчанию, если ни MB_SYSTEMMODAL, ни MB_TASKMODAL не определены. |
MB_SYSTEMMODAL | То же самое, что и MB_APPLMODAL за исключением того, что окно сообщения имеет стиль WS_EX_TOPMOST. Используйте работающие в системном режиме (недоступном для пользователя) окна сообщения, чтобы уведомить пользователя о серьезных, потенциально разрушительных ошибках, которые требуют немедленного внимания (например, выход за пределы объема памяти). Этот флажок не имеет никакого влияния на способность пользователя взаимодействовать с другими окнами, а не только связанными с hWnd. |
MB_TASKMODAL | То же самое, что и MB_APPLMODAL за исключением того, что все окна верхнего уровня, принадлежащие текущему потоку блокируются, если параметр hWnd равен ПУСТО (NULL). Используйте этот флажок тогда, когда вызывающая программа или библиотека не имеют доступного дескриптора окна, но тем не менее должны воспрепятствовать вводу данных в другие окна в вызывающем потоке, не приостанавливая работу других потоков. |
Чтобы устанавливать другие параметры, используйте одно или несколько нижеследующих значений.
Возвращаемое значение:
Если окно сообщения имеет кнопку Отменить (Cancel), то функция возвращает значение IDCANCEL, если или обрабатывается клавиша ESC, или выбрана кнопка Отменить (Cancel). Если окно сообщения не имеет кнопки Отменить (Cancel), нажатия ESC не имеет никакого действия.
Если функция завершается ошибкой, возвращаемое значение равняется нулю. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError <https://vsokovikov.narod.ru/New_MSDN_API/Debbag_error/fn_getlasterror.htm>.
Если функция завершается успешно, возвращаемое значение - одно из ниже перечисленных значений пункта меню.
Значение | Предназначение |
IDABORT | Была выбрана кнопка Прекратить (Abort). |
IDCANCEL | Была выбрана кнопка Отменить (Cancel). |
IDCONTINUE | Была выбрана кнопка Продолжить (Continue). |
IDIGNORE | Была выбрана кнопка Пропустить (Ignore). |
IDNO | Была выбрана кнопка Нет (No). |
IDOK | Была выбрана кнопка OK. |
IDRETRY | Была выбрана кнопка Поторить (Retry). |
IDTRYAGAIN | Была выбрана кнопка Попытаться снова (Try Again). |
IDYES | Была выбрана кнопка Да (Yes). |
Когда Вы используете работающее в системном (недоступном) режиме окно сообщения, которое обращает внимание на то, что в системе мало памяти, строки, на которые указывают параметры lpText и lpCaption не должны браться из файла ресурса, потому что попытка загрузить ресурс может завершиться ошибкой.
Если Вы создаете окно сообщения, в то время, когда диалоговое окно присутствует, используйте дескриптор блока диалога как параметр hWnd. Параметр hWnd не должен идентифицировать дочернее окно, такое как орган управления в блоке диалога.95/98/Me: Система может поддержать максимум 16 364 дескриптора окна.
Windows NT/2000/XP: Значение MB_SERVICE_NOTIFICATION изменялось, начиная с Windows NT 4.0. Windows NT 4.0 предусматривает совместимость вниз для существовавших до этого услуг, преобразуя старое значение в новое при исполнении функции MessageBox. Это преобразование делалось только для исполняемых программ, которые имеют номер версии меньше чем 4.0, как устанавливалось компоновщиком.
Чтобы построить сервисный модуль, который использует MB_SERVICE_NOTIFICATION и может выполниться и в Windows ® Microsoft NT 3.x и в Windows NT 4.0, Вы можете сделать одно из ниже перечисленного.
· Во время компоновки программы, установите номер версии меньше, чем 4.0
· Во время компоновки программы, установите версию 4.0. В период исполнения, используйте функцию GetVersionEx, чтобы проверить версию системы. Затем при запуске в Windows NT 3.x, используйте MB_SERVICE_NOTIFICATION_NT3X; а в Windows NT 4.0, используйте MB_SERVICE_NOTIFICATION.
Функция ExitProcess
Функция ExitProcess заканчивает работу процесса и всех его потоков.
Синтаксис:ExitProcess(uExitCode // код выхода для всех потоков
);
Параметры:
[in] Определяет код выхода для процесса, и для всех потоков, которые завершают работу в результате вызова этой функции. Используйте функцию GetExitCodeProcess <https://vsokovikov.narod.ru/New_MSDN_API/Process_thread/fn_getexitcodeprocess.htm>, чтобы получить значение выхода из процесса. Используйте функцию GetExitCodeThread <https://vsokovikov.narod.ru/New_MSDN_API/Process_thread/fn_getexitcodethread.htm>, чтобы получить значение выхода из потока.
Возвращаемые значения:
У этой функции нет возвращаемого значения.
Замечания:
Функция ExitProcess - предпочтительный метод завершения процесса. Эта функция обеспечивает чистое отключение процесса. Такое завершение включает в себя вызов функций точек входа всех связанных динамически подключаемых библиотек (DLL) со значениями, указывающими, что процесс отключается от DLL. Если процесс заканчивается путем вызова TerminateProcess <https://vsokovikov.narod.ru/New_MSDN_API/Process_thread/fn_terminateprocess.htm>, DLL, к которым процесс подключен, не уведомляются о завершении процесса. После того, как все связанные DLL исполнили любое значение завершения, эта функция завершает работу текущего процесса.
Завершение процесса происходит по нижеследующим причинам:
. Все дескрипторы объектов, открытые процессом, закрываются.
. Все потоки в процессе завершают свою работу по исполнению кода.
. Состояние объекта процесса становится сигнальным, удовлетворяя любые потоки, которые ждали завершения процесса.
. Состояния всех потоков процесса, становятся сигнальными, удовлетворяя любые потоки, которые ждали завершения работы потоков.
. Состояние завершения процесса изменяется из STILL_ACTIVE в значение выхода процесса.
Завершение процесса не заставляет дочерние процессы закончить свою работу.
Завершение процесса необязательно удаляет объект процесса из операционной системы. Объект процесса удаляется тогда, когда закрывается последний дескриптор процесса.
Функции ExitProcess, ExitThread <https://vsokovikov.narod.ru/New_MSDN_API/Process_thread/fn_exitthread.htm>, CreateThread <https://vsokovikov.narod.ru/New_MSDN_API/Process_thread/fn_createthread.htm>, CreateRemoteThread <https://vsokovikov.narod.ru/New_MSDN_API/Process_thread/fn_createremotethread.htm> и процесс, который запущен, (как результат вызова CreateProcess), в пределах процесса переводятся между собой в последовательный режим. Одновременно в адресном пространстве может происходить только одно из этих событий. Это означает нижеследующие ограничения выполнения:
· В ходе запуска процесса и процедуры инициализации DLL, новые потоки могут быть созданы, но они не начинают исполнение кода до тех пор, пока не будет сделана инициализация DLL для процесса.
· Одновременно только один поток в процессе может быть инициализирован или отключен процедурой в DLL.
· Функция ExitProcess не возвращает значения до тех пор, пока в потоках не отработают в их DLL процедуры инициализации или отключения.
Функция GetModuleHandle
Функция GetModuleHandle извлекает дескриптор указанного модуля, если файл был отображен в адресном пространстве вызывающего процесса.
Чтобы избежать состояний гонки, описанных в разделе Замечаний, используйте функцию GetModuleHandleEx <https://vsokovikov.narod.ru/New_MSDN_API/DLL/fn_getmodulehandleex.htm>.
Синтаксис:
HMODULE GetModuleHandle(
LPCTSTR lpModuleName);
Параметры:
lpModuleName
[in] Указатель на символьную строку с нулем в конце, которая содержит имя модули (или.dll или.exe файл). Если расширение имени файла опускается, в конец добавляется заданное по умолчанию библиотечное расширение.dll. Символьная строка имени файла может включать в себя конечный символ точки (.), который указывает, что имя модуля не имеет расширения. Строка не должна определять путь. Когда определяется путь, убедитесь, что используются обратные слэши (\), а не прямые слэши (/). Имя сравнивается (независимо от ситуации) с именами модулей в текущий момент отображаемыми в адресном пространстве вызывающего процесса.
Если этот параметр - NULL, GetModuleHandle возвращает дескриптор файла, используемый, чтобы создать вызывающий процесс (.exe файл).
Возвращаемые значения:
Если функция завершается успешно, возвращаемое значение - дескриптор указанного модули.
Если функция завершается ошибкой, возвращаемое значение - NULL. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError <https://vsokovikov.narod.ru/New_MSDN_API/Debbag_error/fn_getlasterror.htm>.
Замечания
Возвращенный дескриптор - не глобальный или наследуемый. Его нельзя дублировать или использовать другим процессом.
Если lpModuleName не включает в себя путь и имеется больше, чем один загруженный модуль с тем же самым базовым именем и расширением, функция извлекает дескриптор модуля, который был загружен сначала.
Функция GetModuleHandle возвращает дескриптор отображаемого модуля без увеличения на единицу ее итогового числа ссылок. Поэтому, используйте осторожно при передаче дескриптора функции FreeLibrary <https://vsokovikov.narod.ru/New_MSDN_API/DLL/fn_freelibrary.htm>, потому что такое выполнение может заставить модуль DLL преждевременно прекратить отображение.
Эта функция должна использоваться тщательно в многопоточном приложении. Нет никакой гарантии, что дескриптор модуля остается допустимым в промежутке времени когда эта функция возвращает дескриптор и, когда он используется. Например, поток извлекает дескриптор модуля, но прежде, чем он использует этот дескриптор, второй поток освобождает модуль. Если система загружает другой модуль, он может многократно использовать дескриптор модуля, который был недавно освобожден. Поэтому, первый поток получит дескриптор модуля другой, а не предназначенный.
Функция DialogBoxParam
Функция DialogBoxParam создает модальное диалоговое окно из шаблона ресурса блока диалога. Перед показом диалогового окна на экране, функция передает в процедуру блока диалога определяемое программой значение, такое как параметр lParam сообщения WM_INITDIALOG <https://vsokovikov.narod.ru/New_MSDN_API/Dlg_box/notify_wm_initdialog.htm>. Прикладная программа может использовать это значение, чтобы инициализировать органы управления диалогового окна.
Синтаксис:
INT_PTR DialogBoxParam(hInstance,lpTemplateName,hWndParent,lpDialogFunc,dwInitParam
);
Параметры:
[in] Дескриптор модуля, исполняемый файл которого содержит шаблон диалогового окна.
lpTemplateName
[in] Определяет шаблон диалогового окна. Этот параметр - или указатель на строку символов с нуль-терминатором в конце, которая определяет имя шаблона диалогового окна, или целочисленное значение, которое определяет идентификатор ресурса шаблона блока диалога. Если параметр определяет идентификатор ресурса, его старшее слово должно быть нуль, а младшее слово должно содержать этот идентификатор. Вы можете использовать макрокоманду MAKEINTRESOURCE, чтобы создать это значение.
[in] Дескриптор окна, которое владеет диалоговым окном.
[in] Указатель на процедуру диалогового окна. Дополнительную информацию о процедуре диалогового окна, см. в описании DialogProc <https://vsokovikov.narod.ru/New_MSDN_API/Dlg_box/fn_dialogproc.htm>.
[in] Устанавливает значение, передаваемое процедуре диалогового окна в параметре lParam сообщения WM_INITDIALOG.
Возвращаемое значение
Если функция завершается успешно, возвращаемое значение - значение параметра nResult, заданного при вызове к функции EndDialog <https://vsokovikov.narod.ru/New_MSDN_API/Dlg_box/fn_enddialog.htm>, используемой, чтобы завершить работу диалогового окна.
Если функция завершается ошибкой, потому что параметр hWndParent недопустим, возвращаемое значение равняется нулю. В этой ситуации функция возвращает нуль для совместимости с предыдущими версиями Microsoft ® Windows ®. Если функция завершается ошибкой по любой другой причине, возвращаемое значение равно - (минус)1. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError <https://vsokovikov.narod.ru/New_MSDN_API/Debbag_error/fn_getlasterror.htm>.
Замечания:
Чтобы создать диалоговое окно, функция DialogBoxParam использует функцию CreateWindowEx <https://vsokovikov.narod.ru/New_MSDN_API/Window/fn_createwindowex.htm>. Затем DialogBoxParam отправляет сообщение WM_INITDIALOG (и сообщение WM_SETFONT <https://vsokovikov.narod.ru/New_MSDN_API/Window/msg_wm_setfont.htm>, если шаблон определяет стиль DS_SETFONT или DS_SHELLFONT) процедуре диалогового окна. Функция показывает на экране диалоговое окно (независимо от того, определяет ли шаблон стиль WS_VISIBLE), блокирует окно владельца, и начинает свой собственный цикл обработки сообщений, чтобы извлекать и распределять сообщения для диалогового окна.
Когда процедура диалогового окна вызывает функцию EndDialog, DialogBoxParam разрушает диалоговое окно, заканчивает цикл обработки сообщений, включает окно владельца (если ранее оно работало) и возвращает параметр nResult, заданный процедурой диалогового окна, когда она вызвала EndDialog.
Функция EndDialog
Функция EndDialog уничтожает модальное диалоговое окно, заставляя систему закончить любую обработку информации диалогового окна.
Синтаксис:
BOOL EndDialog(hDlg,_PTR nResult
);
Параметры:
[in] Дескриптор уничтожаемого диалогового окна.
nResult
[in] Устанавливает значение, возвращаемое прикладной программе из функции, которая создала диалоговое окно.
Возвращаемое значение:
Если функция завершается успешно, возвращаемое значение не нуль.
Если функция завершается ошибкой, возвращаемое значение равняется нулю. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError <https://vsokovikov.narod.ru/New_MSDN_API/Debbag_error/fn_getlasterror.htm>.
Замечания:
Диалоговые окна, созданные функциями DialogBox <https://vsokovikov.narod.ru/New_MSDN_API/Dlg_box/fn_dialogbox.htm>, DialogBoxParam <https://vsokovikov.narod.ru/New_MSDN_API/Dlg_box/fn_dialogboxparam.htm>, DialogBoxIndirect <https://vsokovikov.narod.ru/New_MSDN_API/Dlg_box/fn_dialogboxindirect.htm> и DialogBoxIndirectParam <https://vsokovikov.narod.ru/New_MSDN_API/Dlg_box/fn_dialogboxindirectparam.htm> должны быть разрушены при помощи использования функции EndDialog. Приложение вызывает EndDialog из процедуры диалогового окна; функция не должна использоваться для какой-либо другой цели.
Процедура диалогового окна может вызывать EndDialog в любое время, даже в ходе обработки сообщения WM_INITDIALOG <https://vsokovikov.narod.ru/New_MSDN_API/Dlg_box/notify_wm_initdialog.htm>. Если ваша прикладная программа вызывает функцию в то время, когда обрабатывается WM_INITDIALOG, диалоговое окно разрушается до того, как оно показывается и до того, как в нем будет установлен фокус ввода.
Функция EndDialog немедленно не уничтожает диалоговое окно. Вместо этого, она устанавливает флажок и дает возможность процедуре диалогового окна возвратить управление системе. Система проверяет флажок перед попыткой восстановить следующее сообщение из очереди прикладных программ. Если флажок установлен, система заканчивает цикл сообщений, уничтожает диалоговое окно и использует значение в nResult как возвращаемое значение из функции, которая создала диалоговое окно.
Функция SendMessage
Функция SendMessage отправляет заданное сообщение окну или окнам. Функция вызывает оконную процедуру для заданного окна и не возвращает значение до тех пор, пока оконная процедура не обработает сообщение.
Чтобы отправить сообщение и возвратить немедленно значение, используйте функцию SendMessageCallback <https://vsokovikov.narod.ru/New_MSDN_API/Message_queue/fn_sendmessagecallback.htm> или SendNotifyMessage <https://vsokovikov.narod.ru/New_MSDN_API/Message_queue/fn_sendnotifymessage.htm>. Чтобы поместить сообщение в очередь сообщений потока и возвратить немедленно значение, используйте функцию PostMessage <https://vsokovikov.narod.ru/New_MSDN_API/Message_queue/fn_postmessage.htm> или PostThreadMessage <https://vsokovikov.narod.ru/New_MSDN_API/Message_queue/fn_postthreadmessage.htm>.
Синтаксис:
LRESULT SendMessage(hWnd,Msg,wParam,lParam
);
Параметры:
[in] Дескриптор окна, оконная процедура которого примет сообщение. Если этот параметр - HWND_BROADCAST, сообщение отправляется всем окнам верхнего уровня в системе, включая заблокированные или невидимые, не имеющие владельца, перекрывающие и выскакивающие окна; но сообщение не отправляется дочерним окнам.
[in] Определяет сообщение, которое будет отправлено.
[in] Определяет дополнительную конкретизирующую сообщение информацию.
[in] Определяет дополнительную конкретизирующую сообщение информацию.
Возвращаемые значения:
Величина возвращаемого значения определяет результат обработки сообщения; он зависит от отправленного сообщения.
Замечания:
Прикладные программы, которые связываются, применяя флажок HWND_BROADCAST, должны использовать функцию RegisterWindowMessage <https://vsokovikov.narod.ru/New_MSDN_API/Message_queue/fn_registerwindowmessage.htm>, чтобы получить уникальное сообщение для связи между приложениями.
Система совершает сортировку только системных сообщений (которые в диапазоне от 0 до WM_USER <https://vsokovikov.narod.ru/New_MSDN_API/Message_queue/notify_wm_user.htm>). Чтобы отправлять другие сообщения (которые значением выше WM_USER) другому процессу, Вы должны сделать специальную сортировку (маршалинг).
Если заданное окно было создано вызывающим потоком, оконная процедура вызывается немедленно как подпрограмма. Если заданное окно было создано другим потоком, система переключается на этот поток и вызывает соответствующую оконную процедуру. Сообщения, отправляемые между потоками обрабатываются, только тогда, когда принимающий поток выполняет изъятие кода сообщения. Отправляющий поток блокируется до тех пор, пока принимающий поток не обработает сообщение. Однако, отправляющийся поток будет обрабатывать поступающие асинхронные (внеочередные) сообщения пока ожидает обработку своего сообщения. Чтобы воспрепятствовать этому, используйте функцию SendMessageTimeout <https://vsokovikov.narod.ru/New_MSDN_API/Message_queue/fn_sendmessagetimeout.htm> с установленным флажком SMTO_BLOCK. Для получения дополнительной информации о внеочередных сообщениях, см. Не поставленные в очередь (асинхронные) сообщения <https://vsokovikov.narod.ru/New_MSDN_API/Message_queue/nonqueued_messages.htm>.
Функция SetTimer
Функция SetTimer создает таймер с указанным значением времени простоя.
Синтаксис:
UINT_PTR SetTimer(hWnd,_PTR nIDEvent,uElapse,lpTimerFunc
);
Параметры:
hWnd
[in] Дескриптор окна, которое связано с таймером. Это окно должно быть собственностью вызывающего потока. Если этот параметр NULL, никакое окно не связано с таймером, а параметр nIDEIvent игнорируется.
[in] Указывает идентификатор таймера отличный от нуля. Если параметр hWnd - NULL, этот параметр игнорируется. Если параметр hWnd - не NULL, и у окна, указанного hWnd уже есть таймер со значением nIDEvent, то существующий таймер заменяется новым таймером. Когда SetTimer заменяет таймер, то таймер возвращается в исходное положение. Поэтому, сообщение должно отправляться после того, как текущее значение времени простоя истекает, а раньше установленное значение времени простоя игнорируется.
[in] Указывает значение времени простоя, в миллисекундах.NT/2000/XP: Если uElapse больше, чем USER_TIMER_MAXIMUM, блокировка по времени устанавливается в 1.2000/XP: Если uElapse меньше, чем USER_TIMER_MINIMUM, блокировка по времени устанавливается в USER_TIMER_MINIMUM.Server 2003: Если uElapse больше, чем USER_TIMER_MAXIMUM, блокировка по времени устанавливается в USER_TIMER_MAXIMUM.XP SP2/Windows Server 2003 SP1: Если uElapse меньше, чем USER_TIMER_MINIMUM, блокировка по времени устанавливается в USER_TIMER_MINIMUM. Если uElapse больше, чем USER_TIMER_MAXIMUM, блокировка по времени устанавливается в USER_TIMER_MAXIMUM.
[in] Указатель на функцию, которая уведомляет, когда значение времени простоя истекает. Для получения дополнительной информации о функции, см. описание TimerProc <https://vsokovikov.narod.ru/New_MSDN_API/Timers/fn_timerproc.htm>. Если параметр lpTimerFunc - NULL, система помещает уведомление WM_TIMER <https://vsokovikov.narod.ru/New_MSDN_API/Timers/notify_wm_timer.htm> в очередь прикладной программы. Член hwnd структуры MSG <https://vsokovikov.narod.ru/New_MSDN_API/Message_queue/str_msg.htm> содержит в себе значение параметра hWnd.
Возвращаемое значение
Если функция завершается успешно, а параметр hWnd - NULL, возвращаемое значение - целое число, идентифицирующее новый таймер. Приложение может передать это значение в функцию KillTimer <https://vsokovikov.narod.ru/New_MSDN_API/Timers/fn_killtimer.htm>, чтобы уничтожить таймер.
Если функция завершается успешно, а hWnd параметр - не NULL, тогда возвращаемое значение - целое число отличное от нуля. Приложение может передать значение параметра nIDEvent в функцию KillTimer, чтобы уничтожить таймер.
Если при создании таймера функция завершается ошибкой, возвращаемое значение - нуль. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError <https://vsokovikov.narod.ru/New_MSDN_API/Debbag_error/fn_getlasterror.htm>.
Замечания:
Приложение может обработать сообщения WM_TIMER включением оператора выбора WM_TIMER в оконной процедуре или указывая функцию обратного вызова TimerProc, когда создается таймер. Когда Вы указываете функцию обратного вызова TimerProc, оконная процедура по умолчанию вызывает функцию обратного вызова, когда он обрабатывает WM_TIMER. Поэтому, Вы должны распределить сообщения в вызывающем потоке, даже тогда, когда Вы используете TimerProc вместо того, чтобы обработать WM_TIMER обычным путем.
Параметр wParam сообщения WM_TIMER содержит значение параметра nIDEvent.
Идентификатор таймера nIDEvent, указывается связанным окном. Другое окно может иметь свой собственный таймер, у которого есть тот же самый идентификатор что и таймер, собственность другого окна. Таймеры индивидуальны.может многократно использовать идентификаторы (ID) таймера в случае, где hWnd - NULL.
Текст программы
// файл timer.rc
// определение констант
#define WS_SYSMENU 0x00080000L
#define WS_MINIMIZEBOX 0x00020000L
#define WS_MAXIMIZEBOX 0x00010000L
// стиль - кнопка
#define BS_PUSHBUTTON 0x00000000L
// кнопка в окне должна быть видимой
#define WS_VISIBLE 0x10000000L
// центрировать текст на кнопке
#define BS_CENTER 0x00000300L
// стиль кнопки
#define WS_CHILD 0х40000000L
// возможность фокусировать элемент
// при помощи клавиши TAB
#define WS_TABSTOP 0x00010000L
#define DS_3DLOOK 0x0004L
//определение диалогового окнаDIALOG 0, 0, 240, 120
STYLE WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | DS_3DLOOK
CAPTION "Пример диалогового окна с таймером"8, "Arial"
{
// кнопка, идентификатор 5"Выход", 5, "button", BS_PUSHBUTTON
| BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
180, 76, 50, 14
}
; файл timer.inc
; константы
; сообщение приходит при закрытии окна
WM_CLOSE equ 10h_INITDIALOG equ 110h_COMMAND equ 111h_TIMER equ 113h
; прототипы внешних процедурMASMReleaseDC@8:NEAR
EXTERN GetDC@4:NEARTextOutA@20:NEARMessageBoxA@16:NEARExitProcess@4:NEARGetModuleHandleA@4:NEARDialogBoxParamA@20:NEAREndDialog@8:NEARSendMessageA@16:NEARSetTimer@16:NEARKillTimer@8:NEARReleaseDC:NEARGetDC:NEARTextOutA:NEARMessageBoxA:NEARExitProcess:NEARGetModuleHandleA:NEARDialogBoxParamA:NEAREndDialog:NEARSendMessageA:NEARSetTimer:NEARKillTimer:NEAR@8 = ReleaseDC@4 = GetDC@20 = TextOutA@16 = MessageBoxA@4 = ExitProcess@4 = GetModuleHandleA@20 = DialogBoxParamA@8 = EndDialog@16 = SendMessageA@16 = SetTimer@8 = KillTimer
; структуры
; структура сообщенияSTRUC
MSHWND DD?DD?DD?DD?DD?DD?ENDS
; файл timer.asm
P
; плоская модель
.MODEL FLAT, stdcalltimer.inc
; директивы компоновщику для подключения библиотекMASM
; для компоновщика LINK.EXEc:\masm32\lib\user32.libc:\masm32\lib\kernel32.libc:\masm32\lib\gdi32.lib
; для компоновщика TLINK32.EXEc:\tasm32\lib\import32.lib
;-------------------------------------------------
; сегмент данных
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'MSGSTRUCT <?>DD 0; дескриптор приложенияDB "DIAL1",0DD 0
TEXT DB 0DB 'Сообщение',0DB 'Выход по таймеру',0
_DATA ENDS
; сегмент кода
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
; получить дескриптор приложения0
CALL GetModuleHandleA@4[HINST], EAX
;----------------------------------------0OFFSET WNDPROC0OFFSET PA[HINST]DialogBoxParamA@20EAX,-1KOL
KOL:
;----------------------------------------0ExitProcess@4
;----------------------------------------
; процедура окна
; расположение параметров в стеке
; [EBP+014Н]; LPARAM
; [EBP+10Н]; WAPARAM
; [EBP+0CH]; MES
; [EBP+8]; HWNDPROCEBPEBP,ESPEBXESIEDI
;---------------DWORD PTR [EBP+0CH],WM_CLOSE
JNE L1
; здесь реакция на закрытие окна:
; удалить таймер1; идентификатор таймера
PUSH DWORD PTR [EBP+08H]
CALL KillTimer@8
; закрыть диалог0
PUSH DWORD PTR [EBP+08H]EndDialog@8FINISH:DWORD PTR [EBP+0CH], WM_INITDIALOG
JNE L5
; здесь начальная инициализация
; установить таймер0; параметр = NULL1000; интервал 1 с.1; идентификатор таймераDWORD PTR [EBP+08H]
CALL SetTimer@16FINISH:DWORD PTR [EBP+0CH], WM_COMMANDL2
; кнопка выхода?WORD PTR [EBP+10H],5FINISHL3:DWORD PTR [EBP+0CH],WM_TIMER
JNE FINISH
; не пора ли заканчивать?COUNT,9
; выход без предупрежденияL3
; выход через сообщениеL4
; пришло сообщение таймера
; подготовить текст
MOV EAX, COUNT
ADD EAX,49
MOV TEXT, AL
; получить контекст
PUSH DWORD PTR [EBP+08H]GetDC@4
; запомнить контекстEAX
; вывести значение счетчика1OFFSET TEXT
PUSH 1010EAXTextOutA@20
; удалить контекстEAXEAX
PUSH DWORD PTR [EBP+08H]
CALL ReleaseDC@8
; увеличить счетчикCOUNTFINISH:COUNT
; сообщение о выходе по таймеру
PUSH 0OFFSET CAPOFFSET MESDWORD PTR [EBP+08H]; дескриптор окнаMessageBoxA@16L3:EDIESIEBXEBPEAX,016ENDP
;-------------------------------------------------
_TEXT ENDSSTART