
Использование системного окна прогресса на Ассемблере
Системное окно прогресса - удобный инструмент в тех случаях, когда нет возможности возиться с кастомизацией или созданием нестандартных элементов, или хочется сделать все максимально приближенным к системному интерфейсу, независимо от платформы, где будет запускаться ваше приложение. И очень странно, что нет никакой информации о реализации этого диалогового окна на Ассемблере, хотя все делается достаточно просто. Начинаем с описания интерфейса, GUID'ов и констант.Code (Assembler) : Убрать нумерацию
- ; GUID {F8383852-FCD3-11D1-A6B9-006097DF5BD4}
- CLSID_ProgressDialog \
- dd 0F8383852h
- dw 0FCD3h
- dw 011D1h
- db 0A6h, 0B9h, 000h, 060h, 097h, 0DFh, 05Bh, 0D4h
- ; GUID {EBBC7C04-315E-11D2-B62F-006097DF5BD4}
- IID_IProgressDialog \
- dd 0EBBC7C04h
- dw 0315Eh
- dw 011D2h
- db 0B6h, 02Fh, 000h, 060h, 097h, 0DFh, 05Bh, 0D4h
- ; IID_IProgressDialog Interface
- struct IProgressDialog
- ; IUnknown
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- ; IProgressDialog
- StartProgressDialog dd ?
- StopProgressDialog dd ?
- SetTitle dd ?
- SetAnimation dd ?
- HasUserCancelled dd ?
- SetProgress dd ?
- SetProgress64 dd ?
- SetLine dd ?
- SetCancelMsg dd ?
- Timer dd ?
- ends
- PDTIMER_RESET = 0x00000001
- PDTIMER_PAUSE = 0x00000002
- PDTIMER_RESUME = 0x00000003
- PROGDLG_NORMAL = 0x00000000
- PROGDLG_MODAL = 0x00000001
- PROGDLG_AUTOTIME = 0x00000002
- PROGDLG_NOTIME = 0x00000004
- PROGDLG_NOMINIMIZE = 0x00000008
- PROGDLG_NOPROGRESSBAR = 0x00000010
- PROGDLG_MARQUEEPROGRESS = 0x00000020
- PROGDLG_NOCANCEL = 0x00000040
Начинается все с инициализации COM-системы и создания объекта окна прогресса. Затем настраивается его внешний вид: заголовок, текст в главной (первой) строчке, текст в двух дополнительных строчках, а также текст, который появится, если пользователь нажмет кнопку отмены. Инициализировать индикатор прогресса начальным и максимальным значением не обязательно, но вроде как рекомендуется, последуем совету. Владельцем окна прогресса может быть как ваше приложение, так и, например, окно рабочего стола.
Code (Assembler) : Убрать нумерацию
- ; Создать объект
- invoke CoCreateInstance,CLSID_ProgressDialog,NULL,\
- CLSCTX_ALL,IID_IProgressDialog,pProgress
- ; Установить заголовок
- mov eax,[pProgress]
- mov eax,[eax]
- stdcall dword [eax+IProgressDialog.SetTitle],[pProgress],\
- szTitle
- ; Установить текстовые строки
- mov eax,[pProgress]
- mov eax,[eax]
- stdcall dword [eax+IProgressDialog.SetLine],[pProgress],\
- 1,szLine1,FALSE,NULL
- mov eax,[pProgress]
- mov eax,[eax]
- stdcall dword [eax+IProgressDialog.SetLine],[pProgress],\
- 2,szLine2,FALSE,NULL
- ; Установить сообщение об остановке процесса
- mov eax,[pProgress]
- mov eax,[eax]
- stdcall dword [eax+IProgressDialog.SetCancelMsg],[pProgress],\
- szCancel
- ; Инициализировать индикатор прогресса
- mov eax,[pProgress]
- mov eax,[eax]
- stdcall dword [eax+IProgressDialog.SetProgress],[pProgress],\
- 0,100
Code (Assembler) : Убрать нумерацию
- ; Сбросить таймер для автоподсчета времени
- mov eax,[pProgress]
- mov eax,[eax]
- stdcall dword [eax+IProgressDialog.Timer],[pProgress],\
- PDTIMER_RESET,NULL
- ; Запустить прогресс
- mov eax,[pProgress]
- mov eax,[eax]
- stdcall dword [eax+IProgressDialog.StartProgressDialog],[pProgress],\
- [hwnddlg],NULL,\
- PROGDLG_MODAL+PROGDLG_AUTOTIME,\
- NULL
Code (Assembler) : Убрать нумерацию
- ; Кнопка отмены нажата?
- mov eax,[pProgress]
- mov eax,[eax]
- stdcall dword [eax+IProgressDialog.HasUserCancelled],[pProgress]
- cmp eax,TRUE
- je .loc_cancel
Code (Assembler) : Убрать нумерацию
- ; Обновить прогресс выполнения
- mov eax,[pProgress]
- mov eax,[eax]
- stdcall dword [eax+IProgressDialog.SetProgress],[pProgress],\
- [percent],100
Code (Assembler) : Убрать нумерацию
- ; Остановить диалог
- mov eax,[pProgress]
- mov eax,[eax]
- stdcall dword [eax+IProgressDialog.StopProgressDialog],[pProgress]
- ; Прибраться за собой
- mov eax,[pProgress]
- mov eax,[eax]
- stdcall dword [eax+IProgressDialog.Release],[pProgress]
В приложении пример программы с исходным текстом, которая выводит окно прогресса и обрабатывает связанные с ним события.
Просмотров: 732 | Комментариев: 2

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(02.02.2023 в 19:50):
Обнови

Nemo
(02.02.2023 в 19:49):
То же в x84 https://www.justbeamit.com/gwr6f
Кстати, GUID Helper 1.5 -> в интерфейсе IProgressDialog ошибка
Нет функции HasUserCancelled
Кстати, GUID Helper 1.5 -> в интерфейсе IProgressDialog ошибка
Нет функции HasUserCancelled

Добавить комментарий
Заполните форму для добавления комментария
