ОК, держитесь)))
1. Откат позволяет использовать кнопку, выполняющую автоматически генерируемую команду
undo для отмены изменений, сделанных при прошлом запуске программы. Как работает, я уже писал, повторюсь. Если строка отката команды указана, то она будет дописываться к создаваемой строке undo при выполнении команды. То есть, при выполнении команды
c2 в строку отката будет записана она же - то есть, команда возврата изменений, внесенных командой
c2 (ведь команда действует, как переключатель). При выполнении команды
c1, включающей заголовок, в строку отката попадет команда
c0, выключающая его, и так далее (команды, дописываемые к строке отката, мы указываем сами). При этом, если команда содержит условие успеха (второй параметр), оно будет проверено перед выполнением команды. Если условие истинно, команда не выполнится, и откат не добавится - ведь ничего не сделано (например, если в ТК команда переключает состояние элемента, а мы хотим наверняка выключить его, мы указываем ключ в wincmd.ini и значение, которое будет при включенном элементе). Если же условие ложно, то есть, команду надо выполнять, команда выполняется, затем делается маленькая пауза (ее длительность можно задать параметром
/d), и условие выполнения проверяется еще раз -
если оно стало истинным, откат добавляется (то есть, команда выполнилась успешно). Это позволяет при отмене выключения элемента не выключать его, если вдруг выключение было провалено.
2. Какие функции? В разделе
[Actions] можно использовать только имена команд из раздела
[Items], разделенные пробелами.
3. Здесь не мешало бы вам, молодой человек, не полениться почитать справку по API-функции
ShowWindow, всё и узнаете - значение параметра просто передается ей. Насчет переключателя развернутости напишу в конце поста.
4. Эффект есть от каждой, просто ты его не замечаешь

- ширина окна изменяется всего на 1 пиксель. А обе они вместе просто заставляют окно перерисовать себя, не меняясь в размере (размер изменяется и возвращается обратно).
5. И правда. Посмотрю в отладчике, что я изменил, что перестала. Ага, нашел ошибку. Добавил одно, сломал другое. Завтра выложу исправленную.
6. Не понял вопроса. Команда
mv в примере просто имитирует клик на пункте системного меню
Переместить.
7. Смотри
6, так как
mv и
begin_move - два названия одного действия. Оно так и работает, как ты написал - вызываешь её, система слушается клаву и мышь, перемещая окно, потом щелкаешь мышью, окно остается на той позиции, куда его перенесли. Но так устроено, что окно не бегает за мышью, пока его не "пихнешь" стрелками с клавы.
8. А как ты себе это представляешь? Команда
move_down просто опускает окно ровно на 100 пикселей, вызывая API-функцию
SetWindowPos. Больше она ничего не делает.
9. cx,
cy - ширина и высота окна. А включение стиля
topmost запрещает перекрывать окно другими окнами без этого стиля, даже если они имеют фокус (обычно окна всех полноэкранныех игр и и.т.п. имеют этот стиль, чтобы другие программы не выскакивали поверх них). По наличию стиля topmost в системе есть два типа окон - с ним и без него:). Те, которые без него, всегда располагаются под теми, которые с ним. А между собой и те и другие ведут себя как обычно - сделал окно активным, оно стало на передний план. Сделал другое окно активным - оно стало на передний план, при необходимости перекрыв остальные. Проверять состояние флага
topmost пока нельзя, так как он относится к числу расширенных стилей, проверяемых в другом месте (наверное, добавлю параметр функциям
style,
is_style для расширенных стилей).
10. Опишу, что и как делают все команды. Все подробности - в описании API-функций:
- show вызывает ShowWindow;
move вызывает GetWindowRect, чтобы получить текущие размер и позицию окна, а затем вызывает SetWindowPos с новыми параметрами;
set_style вызывает GetWindowLong с параметром GWL_STYLE, получая текущий стиль и устанавливает новое значение стиля, вызывая SetWindowLong (стили описаны здесь);
msg вызывает SendMessage с заданными параметрами для окна ТК;
tcm вызывает SendMessage с параметрами WM_USER+51 и номером внутренней команды (ТК обрабатывает такое сообщение, выполняя команду);
is_style вызывает GetWindowLong с угадай каким параметром (верно, GWL_STYLE
) и возвращает 1 или 0 в зависимости от типа сравнения стиля;
tcini вызывает GetPrivateProfileString, читая заданный параметр заданной секции файла wincmd.ini, и сравнивает с указанным в команде, возвращая 1 или 0 в зависимости от результата сравнения (или от наличия ключа - если ключа нет, возвращается значение, указанное в параметре error_value - то есть, некоторое значение по умолчанию).
Ссылки, которые я привожу - на официальный источник, там же указаны числовые значения параметров. Если на английском читать лень, в инете море сайтов, где описания этих функций переведены на русский - оставляю за читателем право самостоятельно найти их.
А мой инишник практически не отличается от входящего в дистрибутив (разве что со временными командами для отладки). Так что смотри его, и пусть вопросы отпадают автоматически.
Пару слов и мыслей о переключателе развернутости. Вызов функции
ShowWindow не допускает обратимых действий, это не флаги, которые можно изменять
исключающим ИЛИ. Здесь нужно при наличии флага восстанавливать окно, а при его отсутствии - разворачивать, и больше ничего. Остается понять, можно ли замутить это на имеющейся базе. Если нет, то есть идейка - добавить символ
| для разделения команды, выполняемой при истинном условии, и команды, выполняемой при ложном:
Код: Выделить всё
mmax=show(3)|show(9), is_style(&$01000000), mmax
То есть, при ложном
is_style(&$01000000) (то есть, если стиля
WS_MAXIMIZED у окна нет) будет выполняться
show(3), в противном случае -
show(9). И в любом случае дописывать откат. Или даже так:
Код: Выделить всё
mmax=show(3), is_style(&$01000000), mmax |show(9), is_style(!&$01000000), mmax
То есть, если условие истинно еще до выполнения основной команды, то будет произведена попытка выполнить команду, указанную после
| (в нашем случае при развернутом окне оно не будет развернуто, но напротив будет выполнена команда восстановления, а если же окно изначально не развернуто, оно будет просто развернуто). И откат у основной команды и else-команды свой.