MVV
|
Posted: Thu Jun 10, 2010 22:14 Post subject: |
|
|
ОК, держитесь)))
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 не допускает обратимых действий, это не флаги, которые можно изменять исключающим ИЛИ. Здесь нужно при наличии флага восстанавливать окно, а при его отсутствии - разворачивать, и больше ничего. Остается понять, можно ли замутить это на имеющейся базе. Если нет, то есть идейка - добавить символ | для разделения команды, выполняемой при истинном условии, и команды, выполняемой при ложном:
Code: | mmax=show(3)|show(9), is_style(&$01000000), mmax |
То есть, при ложном is_style(&$01000000) (то есть, если стиля WS_MAXIMIZED у окна нет) будет выполняться show(3), в противном случае - show(9). И в любом случае дописывать откат. Или даже так:
Code: | mmax=show(3), is_style(&$01000000), mmax |show(9), is_style(!&$01000000), mmax |
То есть, если условие истинно еще до выполнения основной команды, то будет произведена попытка выполнить команду, указанную после | (в нашем случае при развернутом окне оно не будет развернуто, но напротив будет выполнена команда восстановления, а если же окно изначально не развернуто, оно будет просто развернуто). И откат у основной команды и else-команды свой. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|